Merge "Doc Update: Update list of widget classes" into ics-mr0
diff --git a/Android.mk b/Android.mk
index f41130b..586eb4a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -396,8 +396,6 @@
# (see development/build/sdk.atree)
web_docs_sample_code_flags := \
-hdf android.hasSamples 1 \
- -samplecode $(sample_dir)/AccessibilityService \
- resources/samples/AccessibilityService "Accessibility Service" \
-samplecode $(sample_dir)/AccelerometerPlay \
resources/samples/AccelerometerPlay "Accelerometer Play" \
-samplecode $(sample_dir)/ActionBarCompat \
@@ -434,8 +432,10 @@
resources/samples/NFCDemo "NFC Demo" \
-samplecode $(sample_dir)/NotePad \
resources/samples/NotePad "Note Pad" \
- -samplecode $(sample_dir)/SampleSpellCheckerService \
- resources/samples/SampleSpellCheckerService "Spell Checker" \
+ -samplecode $(sample_dir)/SpellChecker/SampleSpellCheckerService \
+ resources/samples/SpellChecker/SampleSpellCheckerService "Spell Checker Service" \
+ -samplecode $(sample_dir)/SpellChecker/HelloSpellChecker \
+ resources/samples/SpellChecker/HelloSpellChecker "Spell Checker Client" \
-samplecode $(sample_dir)/SampleSyncAdapter \
resources/samples/SampleSyncAdapter "Sample Sync Adapter" \
-samplecode $(sample_dir)/RandomMusicPlayer \
diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
index 41a3eaca..e5a5e98 100644
--- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java
@@ -463,20 +463,34 @@
* @return The string representation.
*/
public static String feedbackTypeToString(int feedbackType) {
- switch (feedbackType) {
- case FEEDBACK_AUDIBLE:
- return "FEEDBACK_AUDIBLE";
- case FEEDBACK_HAPTIC:
- return "FEEDBACK_HAPTIC";
- case FEEDBACK_GENERIC:
- return "FEEDBACK_GENERIC";
- case FEEDBACK_SPOKEN:
- return "FEEDBACK_SPOKEN";
- case FEEDBACK_VISUAL:
- return "FEEDBACK_VISUAL";
- default:
- return null;
+ StringBuilder builder = new StringBuilder();
+ builder.append("[");
+ while (feedbackType > 0) {
+ final int feedbackTypeFlag = 1 << Integer.numberOfTrailingZeros(feedbackType);
+ feedbackType &= ~feedbackTypeFlag;
+ if (builder.length() > 1) {
+ builder.append(", ");
+ }
+ switch (feedbackTypeFlag) {
+ case FEEDBACK_AUDIBLE:
+ builder.append("FEEDBACK_AUDIBLE");
+ break;
+ case FEEDBACK_HAPTIC:
+ builder.append("FEEDBACK_HAPTIC");
+ break;
+ case FEEDBACK_GENERIC:
+ builder.append("FEEDBACK_GENERIC");
+ break;
+ case FEEDBACK_SPOKEN:
+ builder.append("FEEDBACK_SPOKEN");
+ break;
+ case FEEDBACK_VISUAL:
+ builder.append("FEEDBACK_VISUAL");
+ break;
+ }
}
+ builder.append("]");
+ return builder.toString();
}
/**
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index 1ba8eee..4f3405b8 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -499,7 +499,7 @@
if (response != null) {
try {
if (result == null) {
- onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "null bundle");
+ response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE, "null bundle");
return;
}
if (Log.isLoggable(TAG, Log.VERBOSE)) {
@@ -1541,8 +1541,15 @@
mAuthenticator = null;
IAccountManagerResponse response = getResponseAndClose();
if (response != null) {
- onError(AccountManager.ERROR_CODE_REMOTE_EXCEPTION,
- "disconnected");
+ try {
+ response.onError(AccountManager.ERROR_CODE_REMOTE_EXCEPTION,
+ "disconnected");
+ } catch (RemoteException e) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Session.onServiceDisconnected: "
+ + "caught RemoteException while responding", e);
+ }
+ }
}
}
@@ -1551,8 +1558,15 @@
public void onTimedOut() {
IAccountManagerResponse response = getResponseAndClose();
if (response != null) {
- onError(AccountManager.ERROR_CODE_REMOTE_EXCEPTION,
- "timeout");
+ try {
+ response.onError(AccountManager.ERROR_CODE_REMOTE_EXCEPTION,
+ "timeout");
+ } catch (RemoteException e) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "Session.onTimedOut: caught RemoteException while responding",
+ e);
+ }
+ }
}
}
diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java
index 7863102..5b8addf 100644
--- a/core/java/android/app/StatusBarManager.java
+++ b/core/java/android/app/StatusBarManager.java
@@ -22,6 +22,7 @@
import android.os.RemoteException;
import android.os.IBinder;
import android.os.ServiceManager;
+import android.util.Slog;
import android.view.View;
import com.android.internal.statusbar.IStatusBarService;
@@ -61,8 +62,17 @@
StatusBarManager(Context context) {
mContext = context;
- mService = IStatusBarService.Stub.asInterface(
- ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ }
+
+ private synchronized IStatusBarService getService() {
+ if (mService == null) {
+ mService = IStatusBarService.Stub.asInterface(
+ ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+ if (mService == null) {
+ Slog.w("StatusBarManager", "warning: no STATUS_BAR_SERVICE");
+ }
+ }
+ return mService;
}
/**
@@ -71,8 +81,9 @@
*/
public void disable(int what) {
try {
- if (mService != null) {
- mService.disable(what, mToken, mContext.getPackageName());
+ final IStatusBarService svc = getService();
+ if (svc != null) {
+ svc.disable(what, mToken, mContext.getPackageName());
}
} catch (RemoteException ex) {
// system process is dead anyway.
@@ -85,7 +96,10 @@
*/
public void expand() {
try {
- mService.expand();
+ final IStatusBarService svc = getService();
+ if (svc != null) {
+ svc.expand();
+ }
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);
@@ -97,7 +111,10 @@
*/
public void collapse() {
try {
- mService.collapse();
+ final IStatusBarService svc = getService();
+ if (svc != null) {
+ svc.collapse();
+ }
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);
@@ -106,8 +123,11 @@
public void setIcon(String slot, int iconId, int iconLevel, String contentDescription) {
try {
- mService.setIcon(slot, mContext.getPackageName(), iconId, iconLevel,
+ final IStatusBarService svc = getService();
+ if (svc != null) {
+ svc.setIcon(slot, mContext.getPackageName(), iconId, iconLevel,
contentDescription);
+ }
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);
@@ -116,7 +136,10 @@
public void removeIcon(String slot) {
try {
- mService.removeIcon(slot);
+ final IStatusBarService svc = getService();
+ if (svc != null) {
+ svc.removeIcon(slot);
+ }
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);
@@ -125,7 +148,10 @@
public void setIconVisibility(String slot, boolean visible) {
try {
- mService.setIconVisibility(slot, visible);
+ final IStatusBarService svc = getService();
+ if (svc != null) {
+ svc.setIconVisibility(slot, visible);
+ }
} catch (RemoteException ex) {
// system process is dead anyway.
throw new RuntimeException(ex);
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 9542874..9ad33a5 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -46,9 +46,15 @@
* {@link #onBackup(ParcelFileDescriptor, BackupDataOutput, ParcelFileDescriptor) onBackup()}
* and {@link #onRestore(BackupDataInput, int, ParcelFileDescriptor) onRestore()} methods,
* and provide the name of its backup agent class in its {@code AndroidManifest.xml} file via
- * the <code><a
- * href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>
+ * the <code>
+ * <a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>
* tag's {@code android:backupAgent} attribute.
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about using BackupAgent, read the
+ * <a href="{@docRoot}guide/topics/data/backup.html">Data Backup</a> developer guide.</p></div>
+ *
* <h3>Basic Operation</h3>
* <p>
* When the application makes changes to data that it wishes to keep backed up,
diff --git a/core/java/android/app/backup/BackupAgentHelper.java b/core/java/android/app/backup/BackupAgentHelper.java
index d47ca22..45daead 100644
--- a/core/java/android/app/backup/BackupAgentHelper.java
+++ b/core/java/android/app/backup/BackupAgentHelper.java
@@ -42,6 +42,12 @@
* {@link BackupAgentHelper} framework. See the {@link BackupHelper} interface
* documentation for details.
*
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about using BackupAgentHelper, read the
+ * <a href="{@docRoot}guide/topics/data/backup.html">Data Backup</a> developer guide.</p>
+ * </div>
+ *
* @see BackupHelper
* @see FileBackupHelper
* @see SharedPreferencesBackupHelper
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index 80656a1..6eebed2 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -41,10 +41,15 @@
* of how the operation then proceeds.
* <p>
* Several attributes affecting the operation of the backup and restore mechanism
- * can be set on the <code><a
- * href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>
+ * can be set on the <code>
+ * <a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>
* tag in your application's AndroidManifest.xml file.
*
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about using BackupManager, read the
+ * <a href="{@docRoot}guide/topics/data/backup.html">Data Backup</a> developer guide.</p></div>
+ *
* @attr ref android.R.styleable#AndroidManifestApplication_allowBackup
* @attr ref android.R.styleable#AndroidManifestApplication_backupAgent
* @attr ref android.R.styleable#AndroidManifestApplication_killAfterRestore
diff --git a/core/java/android/bluetooth/BluetoothDeviceProfileState.java b/core/java/android/bluetooth/BluetoothDeviceProfileState.java
index 48d0203..7addd4a 100644
--- a/core/java/android/bluetooth/BluetoothDeviceProfileState.java
+++ b/core/java/android/bluetooth/BluetoothDeviceProfileState.java
@@ -110,6 +110,7 @@
private BluetoothHeadset mHeadsetService;
private BluetoothPbap mPbapService;
private boolean mPbapServiceConnected;
+ private boolean mAutoConnectionPending;
private static final String BLUETOOTH_ADMIN_PERM = android.Manifest.permission.BLUETOOTH_ADMIN;
private BluetoothDevice mDevice;
@@ -272,6 +273,10 @@
public void onServiceConnected(int profile, BluetoothProfile proxy) {
synchronized(BluetoothDeviceProfileState.this) {
mHeadsetService = (BluetoothHeadset) proxy;
+ if (mAutoConnectionPending) {
+ sendMessage(AUTO_CONNECT_PROFILES);
+ mAutoConnectionPending = false;
+ }
}
}
public void onServiceDisconnected(int profile) {
@@ -360,8 +365,9 @@
// Don't auto connect to docks.
break;
} else {
- if (mHeadsetService != null &&
- mHeadsetService.getPriority(mDevice) ==
+ if (mHeadsetService == null) {
+ mAutoConnectionPending = true;
+ } else if (mHeadsetService.getPriority(mDevice) ==
BluetoothHeadset.PRIORITY_AUTO_CONNECT &&
mHeadsetService.getDevicesMatchingConnectionStates(
new int[] {BluetoothProfile.STATE_CONNECTED,
diff --git a/core/java/android/content/SharedPreferences.java b/core/java/android/content/SharedPreferences.java
index 4d9ee54..bdc38d6 100644
--- a/core/java/android/content/SharedPreferences.java
+++ b/core/java/android/content/SharedPreferences.java
@@ -30,6 +30,12 @@
* <p><em>Note: currently this class does not support use across multiple
* processes. This will be added later.</em>
*
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about using SharedPreferences, read the
+ * <a href="{@docRoot}guide/topics/data/data-storage.html#pref">Data Storage</a>
+ * developer guide.</p></div>
+ *
* @see Context#getSharedPreferences
*/
public interface SharedPreferences {
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 4225393..7d683a5 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -990,8 +990,8 @@
mBound = false;
mContext.unbindService(this);
}
- mSyncWakeLock.setWorkSource(null);
mSyncWakeLock.release();
+ mSyncWakeLock.setWorkSource(null);
}
@Override
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index c30675b..e593d5b 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -2174,6 +2174,7 @@
info.screenOrientation = target.info.screenOrientation;
info.taskAffinity = target.info.taskAffinity;
info.theme = target.info.theme;
+ info.softInputMode = target.info.softInputMode;
info.uiOptions = target.info.uiOptions;
Activity a = new Activity(mParseActivityAliasArgs, info);
diff --git a/core/java/android/database/CursorWindow.java b/core/java/android/database/CursorWindow.java
index a18a721..a1be121 100644
--- a/core/java/android/database/CursorWindow.java
+++ b/core/java/android/database/CursorWindow.java
@@ -55,6 +55,7 @@
public int mWindowPtr;
private int mStartPos;
+ private final String mName;
private final CloseGuard mCloseGuard = CloseGuard.get();
@@ -85,6 +86,8 @@
private static native boolean nativePutDouble(int windowPtr, double value, int row, int column);
private static native boolean nativePutNull(int windowPtr, int row, int column);
+ private static native String nativeGetName(int windowPtr);
+
/**
* Creates a new empty cursor window and gives it a name.
* <p>
@@ -100,6 +103,7 @@
*/
public CursorWindow(String name, boolean localWindow) {
mStartPos = 0;
+ mName = name;
mWindowPtr = nativeCreate(name, sCursorWindowSize, localWindow);
if (mWindowPtr == 0) {
throw new CursorWindowAllocationException("Cursor window allocation of " +
@@ -130,6 +134,7 @@
throw new CursorWindowAllocationException("Cursor window could not be "
+ "created from binder.");
}
+ mName = nativeGetName(mWindowPtr);
mCloseGuard.open("close");
}
@@ -157,6 +162,14 @@
}
/**
+ * Gets the name of this cursor window.
+ * @hide
+ */
+ public String getName() {
+ return mName;
+ }
+
+ /**
* Closes the cursor window and frees its underlying resources when all other
* remaining references have been released.
*/
@@ -478,7 +491,7 @@
}
acquireReference();
try {
- nativeCopyStringToBuffer(mWindowPtr, row, column, buffer);
+ nativeCopyStringToBuffer(mWindowPtr, row - mStartPos, column, buffer);
} finally {
releaseReference();
}
@@ -778,4 +791,9 @@
String s = (buff.length() > 980) ? buff.substring(0, 980) : buff.toString();
return "# Open Cursors=" + total + s;
}
+
+ @Override
+ public String toString() {
+ return getName() + " {" + Integer.toHexString(mWindowPtr) + "}";
+ }
}
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index 00d7ce8..f990be6 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -306,10 +306,6 @@
/** Used to find out where this object was created in case it never got closed. */
private final Throwable mStackTrace;
- // System property that enables logging of slow queries. Specify the threshold in ms.
- private static final String LOG_SLOW_QUERIES_PROPERTY = "db.log.slow_query_threshold";
- private final int mSlowQueryThreshold;
-
/** stores the list of statement ids that need to be finalized by sqlite */
private final ArrayList<Integer> mClosedStatementIds = new ArrayList<Integer>();
@@ -1559,11 +1555,6 @@
String editTable) {
verifyDbIsOpen();
BlockGuard.getThreadPolicy().onReadFromDisk();
- long timeStart = 0;
-
- if (false || mSlowQueryThreshold != -1) {
- timeStart = System.currentTimeMillis();
- }
SQLiteDatabase db = getDbConnection(sql);
SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(db, sql, editTable);
@@ -1574,24 +1565,6 @@
cursorFactory != null ? cursorFactory : mFactory,
selectionArgs);
} finally {
- if (false || mSlowQueryThreshold != -1) {
-
- // Force query execution
- int count = -1;
- if (cursor != null) {
- count = cursor.getCount();
- }
-
- long duration = System.currentTimeMillis() - timeStart;
-
- if (false || duration >= mSlowQueryThreshold) {
- Log.v(SQLiteCursor.TAG,
- "query (" + duration + " ms): " + driver.toString() + ", args are "
- + (selectionArgs != null
- ? TextUtils.join(",", selectionArgs)
- : "<null>") + ", count is " + count);
- }
- }
releaseDbConnection(db);
}
return cursor;
@@ -1967,7 +1940,6 @@
setMaxSqlCacheSize(DEFAULT_SQL_CACHE_SIZE);
mFlags = flags;
mPath = path;
- mSlowQueryThreshold = SystemProperties.getInt(LOG_SLOW_QUERIES_PROPERTY, -1);
mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace();
mFactory = factory;
mPrograms = new WeakHashMap<SQLiteClosable,Object>();
diff --git a/core/java/android/database/sqlite/SQLiteDebug.java b/core/java/android/database/sqlite/SQLiteDebug.java
index 94960791..cc057e0 100644
--- a/core/java/android/database/sqlite/SQLiteDebug.java
+++ b/core/java/android/database/sqlite/SQLiteDebug.java
@@ -18,6 +18,8 @@
import java.util.ArrayList;
+import android.os.Build;
+import android.os.SystemProperties;
import android.util.Log;
/**
@@ -65,6 +67,28 @@
Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE);
/**
+ * True to enable database performance testing instrumentation.
+ * @hide
+ */
+ public static final boolean DEBUG_LOG_SLOW_QUERIES = Build.IS_DEBUGGABLE;
+
+ /**
+ * Determines whether a query should be logged.
+ *
+ * Reads the "db.log.slow_query_threshold" system property, which can be changed
+ * by the user at any time. If the value is zero, then all queries will
+ * be considered slow. If the value does not exist, then no queries will
+ * be considered slow.
+ *
+ * This value can be changed dynamically while the system is running.
+ * @hide
+ */
+ public static final boolean shouldLogSlowQuery(long elapsedTimeMillis) {
+ int slowQueryMillis = SystemProperties.getInt("db.log.slow_query_threshold", -1);
+ return slowQueryMillis >= 0 && elapsedTimeMillis > slowQueryMillis;
+ }
+
+ /**
* Contains statistics about the active pagers in the current process.
*
* @see #getPagerStats(PagerStats)
diff --git a/core/java/android/database/sqlite/SQLiteQuery.java b/core/java/android/database/sqlite/SQLiteQuery.java
index 7db0914..faf6cba 100644
--- a/core/java/android/database/sqlite/SQLiteQuery.java
+++ b/core/java/android/database/sqlite/SQLiteQuery.java
@@ -18,6 +18,7 @@
import android.database.CursorWindow;
import android.os.SystemClock;
+import android.text.TextUtils;
import android.util.Log;
/**
@@ -32,6 +33,7 @@
private static native int nativeFillWindow(int databasePtr, int statementPtr, int windowPtr,
int startPos, int offsetParam);
+
private static native int nativeColumnCount(int statementPtr);
private static native String nativeColumnName(int statementPtr, int columnIndex);
@@ -80,8 +82,24 @@
acquireReference();
try {
window.acquireReference();
+ int startPos = window.getStartPosition();
int numRows = nativeFillWindow(nHandle, nStatement, window.mWindowPtr,
- window.getStartPosition(), mOffsetIndex);
+ startPos, mOffsetIndex);
+ if (SQLiteDebug.DEBUG_LOG_SLOW_QUERIES) {
+ long elapsed = SystemClock.uptimeMillis() - timeStart;
+ if (SQLiteDebug.shouldLogSlowQuery(elapsed)) {
+ Log.d(TAG, "fillWindow took " + elapsed
+ + " ms: window=\"" + window
+ + "\", startPos=" + startPos
+ + ", offset=" + mOffsetIndex
+ + ", filledRows=" + window.getNumRows()
+ + ", countedRows=" + numRows
+ + ", query=\"" + mSql + "\""
+ + ", args=[" + (mBindArgs != null ?
+ TextUtils.join(", ", mBindArgs.values()) : "")
+ + "]");
+ }
+ }
mDatabase.logTimeStat(mSql, timeStart);
return numRows;
} catch (IllegalStateException e){
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index caad6fd..68f02476 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -1687,15 +1687,18 @@
* aggressive than {@link #FOCUS_MODE_CONTINUOUS_VIDEO}. Auto focus
* starts when the parameter is set.
*
- * <p>If applications call {@link #autoFocus(AutoFocusCallback)} in this
- * mode, the focus callback will immediately return with a boolean that
- * indicates whether the focus is sharp or not. The apps can then decide
- * if they want to take a picture immediately or to change the focus
- * mode to auto, and run a full autofocus cycle. The focus position is
- * locked after autoFocus call. If applications want to resume the
- * continuous focus, cancelAutoFocus must be called. Restarting the
- * preview will not resume the continuous autofocus. To stop continuous
- * focus, applications should change the focus mode to other modes.
+ * <p>Applications can call {@link #autoFocus(AutoFocusCallback)} in
+ * this mode. If the autofocus is in the middle of scanning, the focus
+ * callback will return when it completes. If the autofocus is not
+ * scanning, the focus callback will immediately return with a boolean
+ * that indicates whether the focus is sharp or not. The apps can then
+ * decide if they want to take a picture immediately or to change the
+ * focus mode to auto, and run a full autofocus cycle. The focus
+ * position is locked after autoFocus call. If applications want to
+ * resume the continuous focus, cancelAutoFocus must be called.
+ * Restarting the preview will not resume the continuous autofocus. To
+ * stop continuous focus, applications should change the focus mode to
+ * other modes.
*
* @see #FOCUS_MODE_CONTINUOUS_VIDEO
*/
diff --git a/core/java/android/nfc/NfcFragment.java b/core/java/android/nfc/NfcFragment.java
index 17278dc..d6b15ad 100644
--- a/core/java/android/nfc/NfcFragment.java
+++ b/core/java/android/nfc/NfcFragment.java
@@ -48,7 +48,10 @@
FragmentManager manager = activity.getFragmentManager();
Fragment fragment = manager.findFragmentByTag(FRAGMENT_TAG);
if (fragment != null) {
- manager.beginTransaction().remove(fragment).commit();
+ // We allow state loss at this point, because the state is only
+ // lost when activity is being paused *AND* subsequently destroyed.
+ // In that case, the app will setup foreground dispatch again anyway.
+ manager.beginTransaction().remove(fragment).commitAllowingStateLoss();
}
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index e344197..438c536 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -1095,6 +1095,16 @@
}
}
+ private static long computeWakeLock(Timer timer, long batteryRealtime, int which) {
+ if (timer != null) {
+ // Convert from microseconds to milliseconds with rounding
+ long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which);
+ long totalTimeMillis = (totalTimeMicros + 500) / 1000;
+ return totalTimeMillis;
+ }
+ return 0;
+ }
+
/**
*
* @param sb a StringBuilder object.
@@ -1109,9 +1119,7 @@
long batteryRealtime, String name, int which, String linePrefix) {
if (timer != null) {
- // Convert from microseconds to milliseconds with rounding
- long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which);
- long totalTimeMillis = (totalTimeMicros + 500) / 1000;
+ long totalTimeMillis = computeWakeLock(timer, batteryRealtime, which);
int count = timer.getCountLocked(which);
if (totalTimeMillis != 0) {
@@ -1735,6 +1743,8 @@
Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats();
if (wakelocks.size() > 0) {
+ long totalFull = 0, totalPartial = 0, totalWindow = 0;
+ int count = 0;
for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
: wakelocks.entrySet()) {
Uid.Wakelock wl = ent.getValue();
@@ -1754,6 +1764,44 @@
// Only print out wake locks that were held
pw.println(sb.toString());
uidActivity = true;
+ count++;
+ }
+ totalFull += computeWakeLock(wl.getWakeTime(WAKE_TYPE_FULL),
+ batteryRealtime, which);
+ totalPartial += computeWakeLock(wl.getWakeTime(WAKE_TYPE_PARTIAL),
+ batteryRealtime, which);
+ totalWindow += computeWakeLock(wl.getWakeTime(WAKE_TYPE_WINDOW),
+ batteryRealtime, which);
+ }
+ if (count > 1) {
+ if (totalFull != 0 || totalPartial != 0 || totalWindow != 0) {
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" TOTAL wake: ");
+ boolean needComma = false;
+ if (totalFull != 0) {
+ needComma = true;
+ formatTimeMs(sb, totalFull);
+ sb.append("full");
+ }
+ if (totalPartial != 0) {
+ if (needComma) {
+ sb.append(", ");
+ }
+ needComma = true;
+ formatTimeMs(sb, totalPartial);
+ sb.append("partial");
+ }
+ if (totalWindow != 0) {
+ if (needComma) {
+ sb.append(", ");
+ }
+ needComma = true;
+ formatTimeMs(sb, totalWindow);
+ sb.append("window");
+ }
+ sb.append(" realtime");
+ pw.println(sb.toString());
}
}
}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 5faab36..17a882d 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -326,6 +326,13 @@
public static final String HOST = getString("ro.build.host");
/**
+ * Returns true if we are running a debug build such as "user-debug" or "eng".
+ * @hide
+ */
+ public static final boolean IS_DEBUGGABLE =
+ SystemProperties.getInt("ro.debuggable", 0) == 1;
+
+ /**
* Returns the version string for the radio firmware. May return
* null (if, for instance, the radio is not currently on).
*/
diff --git a/core/java/android/service/textservice/package.html b/core/java/android/service/textservice/package.html
new file mode 100644
index 0000000..0b5113b
--- /dev/null
+++ b/core/java/android/service/textservice/package.html
@@ -0,0 +1,40 @@
+<HTML>
+<BODY>
+<p>Provides classes that allow you to create spell checkers in a manner similar to the
+input method framework (for IMEs).</p>
+
+<p>To create a new spell checker, you must implement a service that extends {@link
+android.service.textservice.SpellCheckerService} and extend the {@link
+android.service.textservice.SpellCheckerService.Session} class to provide spelling suggestions based
+on text provided by the interface's callback methods. In the {@link
+android.service.textservice.SpellCheckerService.Session} callback methods, you must return the
+spelling suggestions as {@link android.view.textservice.SuggestionsInfo} objects. </p>
+
+<p>Applications with a spell checker service must declare the {@link
+android.Manifest.permission#BIND_TEXT_SERVICE} permission as required by the service. The service
+must also declare an intent filter with {@code <action
+android:name="android.service.textservice.SpellCheckerService" />} as the intent’s action and should
+include a {@code <meta-data>} element that declares configuration information for the spell
+checker. For example:</p>
+
+<pre>
+<service
+ android:label="@string/app_name"
+ android:name=".SampleSpellCheckerService"
+ android:permission="android.permission.BIND_TEXT_SERVICE" >
+ <intent-filter >
+ <action android:name="android.service.textservice.SpellCheckerService" />
+ </intent-filter>
+ <meta-data
+ android:name="android.view.textservice.scs"
+ android:resource="@xml/spellchecker" />
+</service>
+</pre>
+
+<p>For example code, see the sample <a
+href="{@docRoot}resources/samples/SpellChecker/SampleSpellCheckerService/index.html">Spell
+Checker service</a> app, and the sample <a
+href="{@docRoot}resources/samples/SpellChecker/HelloSpellChecker/index.html">Spell
+Checker client</a> app.</p>
+</BODY>
+</HTML>
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index fe32a5f..93a9d50 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -224,4 +224,9 @@
* Block until the given window has been drawn to the screen.
*/
void waitForWindowDrawn(IBinder token, in IRemoteCallback callback);
+
+ /**
+ * Device has a software navigation bar (separate from the status bar).
+ */
+ boolean hasNavigationBar();
}
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 64d3d31..2b254af 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -194,6 +194,9 @@
*/
public static final int FX_SURFACE_DIM = 0x00020000;
+ /** @hide */
+ public static final int FX_SURFACE_SCREENSHOT = 0x00030000;
+
/** Mask used for FX values above @hide */
public static final int FX_SURFACE_MASK = 0x000F0000;
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 5e104f9..3441f7e 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -292,8 +292,7 @@
if (!sHasPermanentMenuKeySet) {
IWindowManager wm = Display.getWindowManager();
try {
- sHasPermanentMenuKey = wm.canStatusBarHide() && !res.getBoolean(
- com.android.internal.R.bool.config_showNavigationBar);
+ sHasPermanentMenuKey = wm.canStatusBarHide() && !wm.hasNavigationBar();
sHasPermanentMenuKeySet = true;
} catch (RemoteException ex) {
sHasPermanentMenuKey = false;
diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java
index 83df8a5..b657204 100644
--- a/core/java/android/view/VolumePanel.java
+++ b/core/java/android/view/VolumePanel.java
@@ -352,6 +352,10 @@
sc.seekbarView.setProgress(mAudioManager.getLastAudibleStreamVolume(sc.streamType));
final boolean muted = isMuted(sc.streamType);
sc.icon.setImageResource(muted ? sc.iconMuteRes : sc.iconRes);
+ if (sc.streamType == AudioManager.STREAM_RING && muted
+ && mAudioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER)) {
+ sc.icon.setImageResource(R.drawable.ic_audio_ring_notif_vibrate);
+ }
sc.seekbarView.setEnabled(!muted);
}
@@ -695,8 +699,14 @@
expand();
} else if (v.getTag() instanceof StreamControl) {
StreamControl sc = (StreamControl) v.getTag();
- mAudioManager.setRingerMode(mAudioManager.isSilentMode()
- ? AudioManager.RINGER_MODE_NORMAL : AudioManager.RINGER_MODE_SILENT);
+ boolean vibeInSilent = Settings.System.getInt(mContext.getContentResolver(),
+ System.VIBRATE_IN_SILENT, 1) == 1;
+ int newMode = mAudioManager.isSilentMode()
+ ? AudioManager.RINGER_MODE_NORMAL
+ : (vibeInSilent
+ ? AudioManager.RINGER_MODE_VIBRATE
+ : AudioManager.RINGER_MODE_SILENT);
+ mAudioManager.setRingerMode(newMode);
// Expand the dialog if it hasn't been expanded yet.
if (mShowCombinedVolumes && !isExpanded()) expand();
}
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 17bdff2..2e19bf6 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1010,6 +1010,11 @@
public int adjustSystemUiVisibilityLw(int visibility);
/**
+ * Specifies whether there is an on-screen navigation bar separate from the status bar.
+ */
+ public boolean hasNavigationBar();
+
+ /**
* Print the WindowManagerPolicy's state into the given stream.
*
* @param prefix Text to print at the front of each line.
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index b0ecf09..5ee1b8a 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -607,23 +607,31 @@
// character or the existing selection, so it will not get cleared
// above.
mGotDelete = false;
+ // Prefer sending javascript events, so when adding one character,
+ // don't replace the unchanged text.
+ if (count > 1 && before == count - 1) {
+ String replaceButOne = s.subSequence(start,
+ start + before).toString();
+ String replacedString = getText().subSequence(start,
+ start + before).toString();
+ if (replaceButOne.equals(replacedString)) {
+ // we're just adding one character
+ start += before;
+ before = 0;
+ count = 1;
+ }
+ }
// Find the last character being replaced. If it can be represented by
- // events, we will pass them to native (after replacing the beginning
- // of the changed text), so we can see javascript events.
- // Otherwise, replace the text being changed (including the last
- // character) in the textfield.
- TextUtils.getChars(s, start + count - 1, start + count, mCharacter, 0);
- KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
- KeyEvent[] events = kmap.getEvents(mCharacter);
- boolean cannotUseKeyEvents = null == events;
- int charactersFromKeyEvents = cannotUseKeyEvents ? 0 : 1;
- if (count > 1 || cannotUseKeyEvents) {
- String replace = s.subSequence(start,
- start + count - charactersFromKeyEvents).toString();
- mWebView.replaceTextfieldText(start, start + before, replace,
- start + count - charactersFromKeyEvents,
- start + count - charactersFromKeyEvents);
- } else {
+ // events, we will pass them to native so we can see javascript events.
+ // Otherwise, replace the text being changed in the textfield.
+ KeyEvent[] events = null;
+ if (count == 1) {
+ TextUtils.getChars(s, start + count - 1, start + count, mCharacter, 0);
+ KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
+ events = kmap.getEvents(mCharacter);
+ }
+ boolean useKeyEvents = (events != null);
+ if (useKeyEvents) {
// This corrects the selection which may have been affected by the
// trackball or auto-correct.
if (DebugFlags.WEB_TEXT_VIEW) {
@@ -633,8 +641,6 @@
if (!mInSetTextAndKeepSelection) {
mWebView.setSelection(start, start + before);
}
- }
- if (!cannotUseKeyEvents) {
int length = events.length;
for (int i = 0; i < length; i++) {
// We never send modifier keys to native code so don't send them
@@ -643,6 +649,12 @@
sendDomEvent(events[i]);
}
}
+ } else {
+ String replace = s.subSequence(start,
+ start + count).toString();
+ mWebView.replaceTextfieldText(start, start + before, replace,
+ start + count,
+ start + count);
}
updateCachedTextfield();
}
@@ -966,8 +978,11 @@
* @param text The new text to place in the textfield.
*/
/* package */ void setTextAndKeepSelection(String text) {
- mPreChange = text.toString();
Editable edit = getText();
+ mPreChange = text;
+ if (edit.toString().equals(text)) {
+ return;
+ }
int selStart = Selection.getSelectionStart(edit);
int selEnd = Selection.getSelectionEnd(edit);
mInSetTextAndKeepSelection = true;
@@ -1075,6 +1090,7 @@
setMaxLength(maxLength);
setHorizontallyScrolling(single);
setInputType(inputType);
+ clearComposingText();
setImeOptions(imeOptions);
setVisibility(VISIBLE);
if (!autoComplete) {
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6e81530..fef9b02 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -4798,16 +4798,7 @@
mTextGeneration = 0;
}
mWebTextView.updateTextSize();
- Rect visibleRect = new Rect();
- calcOurContentVisibleRect(visibleRect);
- // Note that sendOurVisibleRect calls viewToContent, so the coordinates
- // should be in content coordinates.
- Rect bounds = nativeFocusCandidateNodeBounds();
- Rect vBox = contentToViewRect(bounds);
- mWebTextView.setRect(vBox.left, vBox.top, vBox.width(), vBox.height());
- if (!Rect.intersects(bounds, visibleRect)) {
- revealSelection();
- }
+ updateWebTextViewPosition();
String text = nativeFocusCandidateText();
int nodePointer = nativeFocusCandidatePointer();
// This needs to be called before setType, which may call
@@ -4816,7 +4807,6 @@
mWebTextView.setType(nativeFocusCandidateType());
// Gravity needs to be set after setType
mWebTextView.setGravityForRtl(nativeFocusCandidateIsRtlText());
- updateWebTextViewPadding();
if (null == text) {
if (DebugFlags.WEB_VIEW) {
Log.v(LOGTAG, "rebuildWebTextView null == text");
@@ -4827,12 +4817,27 @@
InputMethodManager imm = InputMethodManager.peekInstance();
if (imm != null && imm.isActive(mWebTextView)) {
imm.restartInput(mWebTextView);
+ mWebTextView.clearComposingText();
}
if (isFocused()) {
mWebTextView.requestFocus();
}
}
+ private void updateWebTextViewPosition() {
+ Rect visibleRect = new Rect();
+ calcOurContentVisibleRect(visibleRect);
+ // Note that sendOurVisibleRect calls viewToContent, so the coordinates
+ // should be in content coordinates.
+ Rect bounds = nativeFocusCandidateNodeBounds();
+ Rect vBox = contentToViewRect(bounds);
+ mWebTextView.setRect(vBox.left, vBox.top, vBox.width(), vBox.height());
+ if (!Rect.intersects(bounds, visibleRect)) {
+ revealSelection();
+ }
+ updateWebTextViewPadding();
+ }
+
/**
* Update the padding of mWebTextView based on the native textfield/textarea
*/
@@ -8433,7 +8438,7 @@
// this is sent after finishing resize in WebViewCore. Make
// sure the text edit box is still on the screen.
if (inEditingMode() && nativeCursorIsTextInput()) {
- rebuildWebTextView();
+ updateWebTextViewPosition();
}
break;
case CLEAR_TEXT_ENTRY:
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index e16a8bd..40df168 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -38,6 +38,12 @@
* <p>
* See {@link ListView}, {@link GridView}, {@link Spinner} and
* {@link Gallery} for commonly used subclasses of AdapterView.
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about using AdapterView, read the
+ * <a href="{@docRoot}guide/topics/ui/binding.html">Binding to Data with AdapterView</a>
+ * developer guide.</p></div>
*/
public abstract class AdapterView<T extends Adapter> extends ViewGroup {
@@ -925,7 +931,7 @@
event.setCurrentItemIndex(getSelectedItemPosition());
event.setFromIndex(getFirstVisiblePosition());
event.setToIndex(getLastVisiblePosition());
- event.setItemCount(getAdapter().getCount());
+ event.setItemCount(getCount());
}
private boolean isScrollableForAccessibility() {
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 5077be6..0f462ff 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -32,6 +32,7 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
import android.widget.NumberPicker.OnValueChangeListener;
import com.android.internal.R;
@@ -90,6 +91,12 @@
private final NumberPicker mYearSpinner;
+ private final EditText mDaySpinnerInput;
+
+ private final EditText mMonthSpinnerInput;
+
+ private final EditText mYearSpinnerInput;
+
private final CalendarView mCalendarView;
private Locale mCurrentLocale;
@@ -164,6 +171,7 @@
OnValueChangeListener onChangeListener = new OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ updateInputState();
mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis());
// take care of wrapping of days and months to update greater fields
if (picker == mDaySpinner) {
@@ -214,6 +222,7 @@
mDaySpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
mDaySpinner.setOnLongPressUpdateInterval(100);
mDaySpinner.setOnValueChangedListener(onChangeListener);
+ mDaySpinnerInput = (EditText) mDaySpinner.findViewById(R.id.numberpicker_input);
// month
mMonthSpinner = (NumberPicker) findViewById(R.id.month);
@@ -222,11 +231,13 @@
mMonthSpinner.setDisplayedValues(mShortMonths);
mMonthSpinner.setOnLongPressUpdateInterval(200);
mMonthSpinner.setOnValueChangedListener(onChangeListener);
+ mMonthSpinnerInput = (EditText) mMonthSpinner.findViewById(R.id.numberpicker_input);
// year
mYearSpinner = (NumberPicker) findViewById(R.id.year);
mYearSpinner.setOnLongPressUpdateInterval(100);
mYearSpinner.setOnValueChangedListener(onChangeListener);
+ mYearSpinnerInput = (EditText) mYearSpinner.findViewById(R.id.numberpicker_input);
// show only what the user required but make sure we
// show something and the spinners have higher priority
@@ -709,6 +720,27 @@
mYearSpinner.findViewById(R.id.decrement).setContentDescription(text);
}
+ private void updateInputState() {
+ // Make sure that if the user changes the value and the IME is active
+ // for one of the inputs if this widget, the IME is closed. If the user
+ // changed the value via the IME and there is a next input the IME will
+ // be shown, otherwise the user chose another means of changing the
+ // value and having the IME up makes no sense.
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
+ if (inputMethodManager != null) {
+ if (inputMethodManager.isActive(mYearSpinnerInput)) {
+ mYearSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mMonthSpinnerInput)) {
+ mMonthSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mDaySpinnerInput)) {
+ mDaySpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ }
+ }
+ }
+
/**
* Class for managing state storing/restoring.
*/
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index b4c844b..cf015c4 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -536,6 +536,10 @@
OnClickListener onClickListener = new OnClickListener() {
public void onClick(View v) {
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
+ if (inputMethodManager != null && inputMethodManager.isActive(mInputText)) {
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ }
mInputText.clearFocus();
if (v.getId() == R.id.increment) {
changeCurrentByOne(true);
@@ -571,17 +575,14 @@
mInputText = (EditText) findViewById(R.id.numberpicker_input);
mInputText.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
- InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
if (hasFocus) {
mInputText.selectAll();
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
if (inputMethodManager != null) {
inputMethodManager.showSoftInput(mInputText, 0);
}
} else {
mInputText.setSelection(0, 0);
- if (inputMethodManager != null) {
- inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
- }
validateInputTextView(v);
}
}
@@ -996,17 +997,14 @@
* enabled.
* </p>
*
- * @param wrapSelector Whether to wrap.
+ * @param wrapSelectorWheel Whether to wrap.
*/
- public void setWrapSelectorWheel(boolean wrapSelector) {
- if (wrapSelector && (mMaxValue - mMinValue) < mSelectorIndices.length) {
+ public void setWrapSelectorWheel(boolean wrapSelectorWheel) {
+ if (wrapSelectorWheel && (mMaxValue - mMinValue) < mSelectorIndices.length) {
throw new IllegalStateException("Range less than selector items count.");
}
- if (wrapSelector != mWrapSelectorWheel) {
- // force the selector indices array to be reinitialized
- mSelectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] = Integer.MAX_VALUE;
- mWrapSelectorWheel = wrapSelector;
- // force redraw since we might look different
+ if (wrapSelectorWheel != mWrapSelectorWheel) {
+ mWrapSelectorWheel = wrapSelectorWheel;
updateIncrementAndDecrementButtonsVisibilityState();
}
}
@@ -1206,7 +1204,13 @@
for (int i = 0; i < selectorIndices.length; i++) {
int selectorIndex = selectorIndices[i];
String scrollSelectorValue = mSelectorIndexToStringCache.get(selectorIndex);
- canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint);
+ // Do not draw the middle item if input is visible since the input is shown only
+ // if the wheel is static and it covers the middle item. Otherwise, if the user
+ // starts editing the text via the IME he may see a dimmed version of the old
+ // value intermixed with the new one.
+ if (i != SELECTOR_MIDDLE_ITEM_INDEX || mInputText.getVisibility() != VISIBLE) {
+ canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint);
+ }
y += mSelectorElementHeight;
}
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 0cd14d0..03e6e99 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -55,7 +55,6 @@
* Default animation parameters
*/
private static final int DEFAULT_ANIMATION_DURATION = 400;
- private static final int FADE_IN_ANIMATION_DURATION = 800;
private static final int MINIMUM_ANIMATION_DURATION = 50;
private static final int STACK_RELAYOUT_DURATION = 100;
@@ -222,8 +221,6 @@
* Animate the views between different relative indexes within the {@link AdapterViewAnimator}
*/
void transformViewForTransition(int fromIndex, int toIndex, final View view, boolean animate) {
- ObjectAnimator alphaOa;
-
if (!animate) {
((StackFrame) view).cancelSliderAnimator();
view.setRotationX(0f);
@@ -233,22 +230,9 @@
}
if (fromIndex == -1 && toIndex == getNumActiveViews() -1) {
- // Fade item in
- if (view.getAlpha() == 1) {
- view.setAlpha(0);
- }
transformViewAtIndex(toIndex, view, false);
view.setVisibility(VISIBLE);
-
- ((StackFrame) view).cancelAlphaAnimator();
- if (animate) {
- alphaOa = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 1.0f);
- alphaOa.setDuration(FADE_IN_ANIMATION_DURATION);
- ((StackFrame) view).setAlphaAnimator(alphaOa);
- alphaOa.start();
- } else {
- view.setAlpha(1.0f);
- }
+ view.setAlpha(1.0f);
} else if (fromIndex == 0 && toIndex == 1) {
// Slide item in
((StackFrame) view).cancelSliderAnimator();
@@ -306,13 +290,12 @@
view.setAlpha(1.0f);
view.setVisibility(VISIBLE);
} else if (toIndex == -1) {
- // Fade item out
- ((StackFrame) view).cancelAlphaAnimator();
if (animate) {
- alphaOa = ObjectAnimator.ofFloat(view, "alpha", view.getAlpha(), 0.0f);
- alphaOa.setDuration(STACK_RELAYOUT_DURATION);
- ((StackFrame) view).setAlphaAnimator(alphaOa);
- alphaOa.start();
+ postDelayed(new Runnable() {
+ public void run() {
+ view.setAlpha(0);
+ }
+ }, STACK_RELAYOUT_DURATION);
} else {
view.setAlpha(0f);
}
@@ -485,7 +468,6 @@
}
private static class StackFrame extends FrameLayout {
- WeakReference<ObjectAnimator> alphaAnimator;
WeakReference<ObjectAnimator> transformAnimator;
WeakReference<ObjectAnimator> sliderAnimator;
@@ -493,10 +475,6 @@
super(context);
}
- void setAlphaAnimator(ObjectAnimator oa) {
- alphaAnimator = new WeakReference<ObjectAnimator>(oa);
- }
-
void setTransformAnimator(ObjectAnimator oa) {
transformAnimator = new WeakReference<ObjectAnimator>(oa);
}
@@ -505,17 +483,6 @@
sliderAnimator = new WeakReference<ObjectAnimator>(oa);
}
- boolean cancelAlphaAnimator() {
- if (alphaAnimator != null) {
- ObjectAnimator oa = alphaAnimator.get();
- if (oa != null) {
- oa.cancel();
- return true;
- }
- }
- return false;
- }
-
boolean cancelTransformAnimator() {
if (transformAnimator != null) {
ObjectAnimator oa = transformAnimator.get();
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index a21a087..0a2365e 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -9409,8 +9409,8 @@
return false;
}
- int posX = mPositionX + positionX - getScrollX();
- int posY = mPositionY + positionY - getScrollY();
+ int posX = mPositionX + positionX;
+ int posY = mPositionY + positionY;
// Offset by 1 to take into account 0.5 and int rounding around getPrimaryHorizontal.
return posX >= clip.left - 1 && posX <= clip.right + 1 &&
@@ -9421,7 +9421,8 @@
final int line = mLayout.getLineForOffset(offset);
final int lineBottom = mLayout.getLineBottom(line);
final int primaryHorizontal = (int) mLayout.getPrimaryHorizontal(offset);
- return isVisible(primaryHorizontal, lineBottom);
+ return isVisible(primaryHorizontal + viewportToContentHorizontalOffset(),
+ lineBottom + viewportToContentVerticalOffset());
}
public void onScrollChanged() {
@@ -9891,14 +9892,16 @@
if (suggestionInfo.suggestionIndex == DELETE_TEXT) {
final int spanUnionStart = editable.getSpanStart(mSuggestionRangeSpan);
int spanUnionEnd = editable.getSpanEnd(mSuggestionRangeSpan);
- // Do not leave two adjacent spaces after deletion, or one at beginning of text
- if (spanUnionEnd < editable.length() &&
- Character.isSpaceChar(editable.charAt(spanUnionEnd)) &&
- (spanUnionStart == 0 ||
- Character.isSpaceChar(editable.charAt(spanUnionStart - 1)))) {
+ if (spanUnionStart >= 0 && spanUnionEnd > spanUnionStart) {
+ // Do not leave two adjacent spaces after deletion, or one at beginning of text
+ if (spanUnionEnd < editable.length() &&
+ Character.isSpaceChar(editable.charAt(spanUnionEnd)) &&
+ (spanUnionStart == 0 ||
+ Character.isSpaceChar(editable.charAt(spanUnionStart - 1)))) {
spanUnionEnd = spanUnionEnd + 1;
+ }
+ editable.replace(spanUnionStart, spanUnionEnd, "");
}
- editable.replace(spanUnionStart, spanUnionEnd, "");
hide();
return;
}
@@ -10559,7 +10562,7 @@
mPositionX = (int) (mLayout.getPrimaryHorizontal(offset) - 0.5f - mHotspotX);
mPositionY = mLayout.getLineBottom(line);
- // Take TextView's padding into account.
+ // Take TextView's padding and scroll into account.
mPositionX += viewportToContentHorizontalOffset();
mPositionY += viewportToContentVerticalOffset();
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index f52e773..afca2db 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -27,8 +27,8 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
import android.widget.NumberPicker.OnValueChangeListener;
import com.android.internal.R;
@@ -79,6 +79,12 @@
private final NumberPicker mAmPmSpinner;
+ private final EditText mHourSpinnerInput;
+
+ private final EditText mMinuteSpinnerInput;
+
+ private final EditText mAmPmSpinnerInput;
+
private final TextView mDivider;
// Note that the legacy implementation of the TimePicker is
@@ -140,6 +146,7 @@
mHourSpinner = (NumberPicker) findViewById(R.id.hour);
mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
+ updateInputState();
if (!is24HourView()) {
if ((oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY)
|| (oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1)) {
@@ -150,8 +157,8 @@
onTimeChanged();
}
});
- EditText hourInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
- hourInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+ mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
+ mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
// divider (only for the new widget style)
mDivider = (TextView) findViewById(R.id.divider);
@@ -167,6 +174,7 @@
mMinuteSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
+ updateInputState();
int minValue = mMinuteSpinner.getMinValue();
int maxValue = mMinuteSpinner.getMaxValue();
if (oldVal == maxValue && newVal == minValue) {
@@ -187,8 +195,8 @@
onTimeChanged();
}
});
- EditText minuteInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
- minuteInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+ mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
+ mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
/* Get the localized am/pm strings and use them in the spinner */
mAmPmStrings = new DateFormatSymbols().getAmPmStrings();
@@ -197,6 +205,7 @@
View amPmView = findViewById(R.id.amPm);
if (amPmView instanceof Button) {
mAmPmSpinner = null;
+ mAmPmSpinnerInput = null;
mAmPmButton = (Button) amPmView;
mAmPmButton.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
@@ -213,13 +222,14 @@
mAmPmSpinner.setDisplayedValues(mAmPmStrings);
mAmPmSpinner.setOnValueChangedListener(new OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ updateInputState();
picker.requestFocus();
mIsAm = !mIsAm;
updateAmPmControl();
}
});
- EditText amPmInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
- amPmInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
+ mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
+ mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
}
// update controls to initial state
@@ -319,7 +329,7 @@
dest.writeInt(mMinute);
}
- @SuppressWarnings("unused")
+ @SuppressWarnings({"unused", "hiding"})
public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
@@ -524,4 +534,25 @@
mAmPmSpinner.findViewById(R.id.decrement).setContentDescription(text);
}
}
+
+ private void updateInputState() {
+ // Make sure that if the user changes the value and the IME is active
+ // for one of the inputs if this widget, the IME is closed. If the user
+ // changed the value via the IME and there is a next input the IME will
+ // be shown, otherwise the user chose another means of changing the
+ // value and having the IME up makes no sense.
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
+ if (inputMethodManager != null) {
+ if (inputMethodManager.isActive(mHourSpinnerInput)) {
+ mHourSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mMinuteSpinnerInput)) {
+ mMinuteSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mAmPmSpinnerInput)) {
+ mAmPmSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0);
+ }
+ }
+ }
}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index e2a2566..3e96c81 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -98,6 +98,10 @@
// in to one common name.
private static final int MAX_WAKELOCKS_PER_UID = 30;
+ // The system process gets more. It is special. Oh so special.
+ // With, you know, special needs. Like this.
+ private static final int MAX_WAKELOCKS_PER_UID_IN_SYSTEM = 50;
+
private static final String BATCHED_WAKELOCK_NAME = "*overflow*";
private static int sNumSpeedSteps;
@@ -2895,12 +2899,10 @@
String wakelockName = in.readString();
Uid.Wakelock wakelock = new Wakelock();
wakelock.readFromParcelLocked(unpluggables, in);
- if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) {
- // We will just drop some random set of wakelocks if
- // the previous run of the system was an older version
- // that didn't impose a limit.
- mWakelockStats.put(wakelockName, wakelock);
- }
+ // We will just drop some random set of wakelocks if
+ // the previous run of the system was an older version
+ // that didn't impose a limit.
+ mWakelockStats.put(wakelockName, wakelock);
}
int numSensors = in.readInt();
@@ -3904,7 +3906,9 @@
public StopwatchTimer getWakeTimerLocked(String name, int type) {
Wakelock wl = mWakelockStats.get(name);
if (wl == null) {
- if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) {
+ final int N = mWakelockStats.size();
+ if (N > MAX_WAKELOCKS_PER_UID && (mUid != Process.SYSTEM_UID
+ || N > MAX_WAKELOCKS_PER_UID_IN_SYSTEM)) {
name = BATCHED_WAKELOCK_NAME;
wl = mWakelockStats.get(name);
}
diff --git a/core/java/com/android/internal/policy/IFaceLockCallback.aidl b/core/java/com/android/internal/policy/IFaceLockCallback.aidl
index 25adbb6..a7b01b2 100644
--- a/core/java/com/android/internal/policy/IFaceLockCallback.aidl
+++ b/core/java/com/android/internal/policy/IFaceLockCallback.aidl
@@ -22,5 +22,6 @@
void unlock();
void cancel();
void reportFailedAttempt();
+ void exposeFallback();
void pokeWakelock();
}
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index 446dab1..18d45f7 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -94,6 +94,15 @@
}
@Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ if (mActionMenuPresenter != null) {
+ mActionMenuPresenter.hideOverflowMenu();
+ mActionMenuPresenter.hideSubMenus();
+ }
+ }
+
+ @Override
public void setSplitActionBar(boolean split) {
if (mSplitActionBar != split) {
if (mActionMenuPresenter != null) {
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 61bce60..e131242 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -285,6 +285,10 @@
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
removeCallbacks(mTabSelector);
+ if (mActionMenuPresenter != null) {
+ mActionMenuPresenter.hideOverflowMenu();
+ mActionMenuPresenter.hideSubMenus();
+ }
}
@Override
diff --git a/core/java/com/android/internal/widget/TransportControlView.java b/core/java/com/android/internal/widget/TransportControlView.java
index 63a3aa5..979eb81 100644
--- a/core/java/com/android/internal/widget/TransportControlView.java
+++ b/core/java/com/android/internal/widget/TransportControlView.java
@@ -86,11 +86,6 @@
*/
private Bundle mPopulateMetadataWhenAttached = null;
- /**
- * Whether to clear the interface next time it is shown (i.e. the generation id changed)
- */
- private boolean mClearOnNextShow;
-
// This handler is required to ensure messages from IRCD are handled in sequence and on
// the UI thread.
private Handler mHandler = new Handler() {
@@ -121,7 +116,10 @@
case MSG_SET_GENERATION_ID:
if (msg.arg2 != 0) {
- mClearOnNextShow = true; // TODO: handle this
+ // This means nobody is currently registered. Hide the view.
+ if (mWidgetCallbacks != null) {
+ mWidgetCallbacks.requestHide(TransportControlView.this);
+ }
}
if (DEBUG) Log.v(TAG, "New genId = " + msg.arg1 + ", clearing = " + msg.arg2);
mClientGeneration = msg.arg1;
@@ -412,7 +410,7 @@
if (DEBUG) Log.v(TAG, "onSaveInstanceState()");
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
- ss.wasShowing = mWidgetCallbacks.isVisible(this);
+ ss.wasShowing = mWidgetCallbacks != null && mWidgetCallbacks.isVisible(this);
return ss;
}
@@ -425,7 +423,7 @@
}
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
- if (ss.wasShowing) {
+ if (ss.wasShowing && mWidgetCallbacks != null) {
mWidgetCallbacks.requestShow(this);
}
}
@@ -449,6 +447,11 @@
}
private void sendMediaButtonClick(int keyCode) {
+ if (mClientIntent == null) {
+ // Shouldn't be possible because this view should be hidden in this case.
+ Log.e(TAG, "sendMediaButtonClick(): No client is currently registered");
+ return;
+ }
// use the registered PendingIntent that will be processed by the registered
// media button event receiver, which is the component of mClientIntent
KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index 0b53850..3fdc79b 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -425,14 +425,10 @@
// Initialize Harfbuzz Shaper
initShaperItem(shaperItem, &font, &fontData, paint, chars, contextCount);
+ bool useSingleRun = false;
+ bool isRTL = forceRTL;
if (forceLTR || forceRTL) {
-#if DEBUG_GLYPHS
- LOGD("computeValuesWithHarfbuzz -- forcing run with LTR=%d RTL=%d",
- forceLTR, forceRTL);
-#endif
- computeRunValuesWithHarfbuzz(shaperItem, paint,
- start, count, forceRTL,
- outAdvances, outTotalAdvance, outGlyphs);
+ useSingleRun = true;
} else {
UBiDi* bidi = ubidi_open();
if (bidi) {
@@ -443,43 +439,50 @@
ubidi_setPara(bidi, chars, contextCount, bidiReq, NULL, &status);
if (U_SUCCESS(status)) {
int paraDir = ubidi_getParaLevel(bidi) & kDirection_Mask; // 0 if ltr, 1 if rtl
- size_t rc = ubidi_countRuns(bidi, &status);
+ ssize_t rc = ubidi_countRuns(bidi, &status);
#if DEBUG_GLYPHS
LOGD("computeValuesWithHarfbuzz -- dirFlags=%d run-count=%d paraDir=%d",
dirFlags, rc, paraDir);
#endif
- if (rc == 1 || !U_SUCCESS(status)) {
- bool isRTL = (paraDir == 1);
-#if DEBUG_GLYPHS
- LOGD("computeValuesWithHarfbuzz -- processing SINGLE run "
- "-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL);
-#endif
- computeRunValuesWithHarfbuzz(shaperItem, paint,
- start, count, isRTL,
- outAdvances, outTotalAdvance, outGlyphs);
+ if (!U_SUCCESS(status) || rc <= 1) {
+ LOGW("computeValuesWithHarfbuzz -- need to force to single run");
+ isRTL = (paraDir == 1);
+ useSingleRun = true;
} else {
int32_t end = start + count;
- for (size_t i = 0; i < rc; ++i) {
- int32_t startRun;
- int32_t lengthRun;
+ for (size_t i = 0; i < size_t(rc); ++i) {
+ int32_t startRun = -1;
+ int32_t lengthRun = -1;
UBiDiDirection runDir = ubidi_getVisualRun(bidi, i, &startRun, &lengthRun);
+ if (startRun == -1 || lengthRun == -1) {
+ // Something went wrong when getting the visual run, need to clear
+ // already computed data before doing a single run pass
+ LOGW("computeValuesWithHarfbuzz -- visual run is not valid");
+ outGlyphs->clear();
+ outAdvances->clear();
+ *outTotalAdvance = 0;
+ isRTL = (paraDir == 1);
+ useSingleRun = true;
+ break;
+ }
+
if (startRun >= end) {
continue;
}
int32_t endRun = startRun + lengthRun;
- if (endRun <= start) {
+ if (endRun <= int32_t(start)) {
continue;
}
- if (startRun < start) {
- startRun = start;
+ if (startRun < int32_t(start)) {
+ startRun = int32_t(start);
}
if (endRun > end) {
endRun = end;
}
lengthRun = endRun - startRun;
- bool isRTL = (runDir == UBIDI_RTL);
+ isRTL = (runDir == UBIDI_RTL);
jfloat runTotalAdvance = 0;
#if DEBUG_GLYPHS
LOGD("computeValuesWithHarfbuzz -- run-start=%d run-len=%d isRTL=%d",
@@ -492,21 +495,30 @@
*outTotalAdvance += runTotalAdvance;
}
}
+ } else {
+ LOGW("computeValuesWithHarfbuzz -- cannot set Para");
+ useSingleRun = true;
+ isRTL = (bidiReq = 1) || (bidiReq = UBIDI_DEFAULT_RTL);
}
ubidi_close(bidi);
} else {
- // Cannot run BiDi, just consider one Run
- bool isRTL = (bidiReq = 1) || (bidiReq = UBIDI_DEFAULT_RTL);
-#if DEBUG_GLYPHS
- LOGD("computeValuesWithHarfbuzz -- cannot run BiDi, considering a SINGLE Run "
- "-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL);
-#endif
- computeRunValuesWithHarfbuzz(shaperItem, paint,
- start, count, isRTL,
- outAdvances, outTotalAdvance, outGlyphs);
+ LOGW("computeValuesWithHarfbuzz -- cannot ubidi_open()");
+ useSingleRun = true;
+ isRTL = (bidiReq = 1) || (bidiReq = UBIDI_DEFAULT_RTL);
}
}
+ // Default single run case
+ if (useSingleRun){
+#if DEBUG_GLYPHS
+ LOGD("computeValuesWithHarfbuzz -- Using a SINGLE Run "
+ "-- run-start=%d run-len=%d isRTL=%d", start, count, isRTL);
+#endif
+ computeRunValuesWithHarfbuzz(shaperItem, paint,
+ start, count, isRTL,
+ outAdvances, outTotalAdvance, outGlyphs);
+ }
+
// Cleaning
freeShaperItem(shaperItem);
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index 722aeea..9725c9ff 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -104,6 +104,11 @@
}
}
+static jstring nativeGetName(JNIEnv* env, jclass clazz, jint windowPtr) {
+ CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr);
+ return env->NewStringUTF(window->name().string());
+}
+
static void nativeWriteToParcel(JNIEnv * env, jclass clazz, jint windowPtr,
jobject parcelObj) {
CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr);
@@ -485,6 +490,8 @@
(void*)nativeDispose },
{ "nativeWriteToParcel", "(ILandroid/os/Parcel;)V",
(void*)nativeWriteToParcel },
+ { "nativeGetName", "(I)Ljava/lang/String;",
+ (void*)nativeGetName },
{ "nativeClear", "(I)V",
(void*)nativeClear },
{ "nativeGetNumRows", "(I)I",
diff --git a/core/jni/android_net_TrafficStats.cpp b/core/jni/android_net_TrafficStats.cpp
index c22b071..7a61432 100644
--- a/core/jni/android_net_TrafficStats.cpp
+++ b/core/jni/android_net_TrafficStats.cpp
@@ -68,6 +68,7 @@
"rmnet1",
"rmnet2",
"rmnet3",
+ "cdma_rmnet4",
"ppp0",
0
};
diff --git a/core/res/res/drawable-hdpi/ic_audio_ring_notif_vibrate.png b/core/res/res/drawable-hdpi/ic_audio_ring_notif_vibrate.png
new file mode 100644
index 0000000..4199106
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_audio_ring_notif_vibrate.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_btn_find_next.png b/core/res/res/drawable-hdpi/ic_btn_find_next.png
deleted file mode 100644
index b696a6b..0000000
--- a/core/res/res/drawable-hdpi/ic_btn_find_next.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_btn_find_prev.png b/core/res/res/drawable-hdpi/ic_btn_find_prev.png
deleted file mode 100644
index 5550c5a..0000000
--- a/core/res/res/drawable-hdpi/ic_btn_find_prev.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_find_next_holo_dark.png b/core/res/res/drawable-hdpi/ic_find_next_holo_dark.png
new file mode 100644
index 0000000..2fe4f81
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_find_next_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_find_previous_holo_dark.png b/core/res/res/drawable-hdpi/ic_find_previous_holo_dark.png
new file mode 100644
index 0000000..d4e9bd1
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_find_previous_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_player_background.9.png b/core/res/res/drawable-hdpi/ic_lockscreen_player_background.9.png
index b187358..fbb75b5 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_player_background.9.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_player_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_ring_notif_vibrate.png b/core/res/res/drawable-mdpi/ic_audio_ring_notif_vibrate.png
new file mode 100644
index 0000000..2d99b76
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_audio_ring_notif_vibrate.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_btn_find_next.png b/core/res/res/drawable-mdpi/ic_btn_find_next.png
deleted file mode 100644
index abdc247..0000000
--- a/core/res/res/drawable-mdpi/ic_btn_find_next.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_btn_find_prev.png b/core/res/res/drawable-mdpi/ic_btn_find_prev.png
deleted file mode 100644
index 4e3da1d..0000000
--- a/core/res/res/drawable-mdpi/ic_btn_find_prev.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_find_next_holo_dark.png b/core/res/res/drawable-mdpi/ic_find_next_holo_dark.png
new file mode 100644
index 0000000..c138916
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_find_next_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_find_previous_holo_dark.png b/core/res/res/drawable-mdpi/ic_find_previous_holo_dark.png
new file mode 100644
index 0000000..d239274
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_find_previous_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_player_background.9.png b/core/res/res/drawable-mdpi/ic_lockscreen_player_background.9.png
index 8cfd1af..17d97c4 100644
--- a/core/res/res/drawable-mdpi/ic_lockscreen_player_background.9.png
+++ b/core/res/res/drawable-mdpi/ic_lockscreen_player_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_ring_notif_vibrate.png b/core/res/res/drawable-xhdpi/ic_audio_ring_notif_vibrate.png
new file mode 100644
index 0000000..122c708
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_audio_ring_notif_vibrate.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_btn_find_next.png b/core/res/res/drawable-xhdpi/ic_btn_find_next.png
deleted file mode 100644
index a334a5d..0000000
--- a/core/res/res/drawable-xhdpi/ic_btn_find_next.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_btn_find_prev.png b/core/res/res/drawable-xhdpi/ic_btn_find_prev.png
deleted file mode 100644
index d7b3177..0000000
--- a/core/res/res/drawable-xhdpi/ic_btn_find_prev.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_find_next_holo_dark.png b/core/res/res/drawable-xhdpi/ic_find_next_holo_dark.png
new file mode 100644
index 0000000..e8226053
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_find_next_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_find_previous_holo_dark.png b/core/res/res/drawable-xhdpi/ic_find_previous_holo_dark.png
new file mode 100644
index 0000000..0ba45876c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/ic_find_previous_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_player_background.9.png b/core/res/res/drawable-xhdpi/ic_lockscreen_player_background.9.png
index 7fb0cbc..393bca6 100644
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_player_background.9.png
+++ b/core/res/res/drawable-xhdpi/ic_lockscreen_player_background.9.png
Binary files differ
diff --git a/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml
index 99ab8a3..ee1ce5f 100644
--- a/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml
+++ b/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml
@@ -62,6 +62,7 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:background="@drawable/lockscreen_password_field_dark"
android:textColor="#ffffffff"
+ android:privateImeOptions="com.google.android.inputmethod.latin.forceAscii"
/>
<!-- Numeric keyboard -->
diff --git a/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml
index 64c002f..254dd3e 100644
--- a/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml
+++ b/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml
@@ -58,6 +58,7 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:background="@drawable/lockscreen_password_field_dark"
android:textColor="#ffffffff"
+ android:privateImeOptions="com.google.android.inputmethod.latin.forceAscii"
/>
<View
diff --git a/core/res/res/layout/keyguard_screen_password_landscape.xml b/core/res/res/layout/keyguard_screen_password_landscape.xml
index e34822d..62f59f6 100644
--- a/core/res/res/layout/keyguard_screen_password_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_password_landscape.xml
@@ -152,6 +152,7 @@
android:background="@null"
android:textColor="?android:attr/textColorPrimary"
android:imeOptions="flagNoFullscreen|actionDone"
+ android:privateImeOptions="com.google.android.inputmethod.latin.forceAscii"
/>
<!-- This delete button is only visible for numeric PIN entry -->
@@ -206,7 +207,7 @@
<!-- Area to overlay FaceLock -->
<TextView android:id="@+id/faceLockAreaView"
- android:visibility="gone"
+ android:visibility="invisible"
android:layout_row="0"
android:layout_column="2"
android:layout_rowSpan="8"
diff --git a/core/res/res/layout/keyguard_screen_password_portrait.xml b/core/res/res/layout/keyguard_screen_password_portrait.xml
index e1280ba..597cfe7 100644
--- a/core/res/res/layout/keyguard_screen_password_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_password_portrait.xml
@@ -117,6 +117,7 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#ffffffff"
android:imeOptions="actionDone"
+ android:privateImeOptions="com.google.android.inputmethod.latin.forceAscii"
/>
<!-- This delete button is only visible for numeric PIN entry -->
@@ -195,7 +196,7 @@
<!-- Area to overlay FaceLock -->
<TextView android:id="@+id/faceLockAreaView"
- android:visibility="gone"
+ android:visibility="invisible"
android:layout_row="3"
android:layout_column="0"
android:layout_rowSpan="2"
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index 2778f4e..1038657 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -162,7 +162,7 @@
<!-- Area to overlay FaceLock -->
<TextView android:id="@+id/faceLockAreaView"
- android:visibility="gone"
+ android:visibility="invisible"
android:layout_row="0"
android:layout_column="1"
android:layout_rowSpan="7"
diff --git a/core/res/res/layout/keyguard_screen_unlock_portrait.xml b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
index 03fc79e..f286ccd 100644
--- a/core/res/res/layout/keyguard_screen_unlock_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
@@ -174,7 +174,7 @@
<!-- Area to overlay FaceLock -->
<TextView android:id="@+id/faceLockAreaView"
- android:visibility="gone"
+ android:visibility="invisible"
android:layout_row="4"
android:layout_column="0"
android:layout_rowSpan="1"
diff --git a/core/res/res/layout/keyguard_transport_control.xml b/core/res/res/layout/keyguard_transport_control.xml
index c951c45..7e2a31c 100644
--- a/core/res/res/layout/keyguard_transport_control.xml
+++ b/core/res/res/layout/keyguard_transport_control.xml
@@ -19,23 +19,28 @@
but rather as include tags for this file or the layout will break. -->
<com.android.internal.widget.TransportControlView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/transport_controls"
- android:background="@drawable/ic_lockscreen_player_background">
+ android:id="@+id/transport_controls">
- <ImageView
- android:id="@+id/albumart"
+ <!-- FrameLayout used as scrim to show between album art and buttons -->
+ <FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_gravity="fill"
- android:scaleType="centerCrop"
- android:adjustViewBounds="false"
+ android:foreground="@drawable/ic_lockscreen_player_background">
+ <!-- We use ImageView for its cropping features, otherwise could be android:background -->
+ <ImageView
+ android:id="@+id/albumart"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="fill"
+ android:scaleType="centerCrop"
+ android:adjustViewBounds="false"
/>
+ </FrameLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="#c8000000"
android:layout_gravity="bottom">
<TextView
android:id="@+id/title"
diff --git a/core/res/res/menu/webview_find.xml b/core/res/res/menu/webview_find.xml
index 74a40aa..526b346 100644
--- a/core/res/res/menu/webview_find.xml
+++ b/core/res/res/menu/webview_find.xml
@@ -16,11 +16,11 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/find_prev"
- android:icon="@drawable/ic_btn_find_prev"
+ android:icon="@drawable/ic_find_previous_holo_dark"
android:showAsAction="always"
/>
<item android:id="@+id/find_next"
- android:icon="@drawable/ic_btn_find_next"
+ android:icon="@drawable/ic_find_next_holo_dark"
android:showAsAction="always"
/>
</menu>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 45834a0..1b5c4cd 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -665,16 +665,11 @@
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Моля, поставете SIM карта."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="7138450788301444298">"SIM картата липсва или е нечетима. Моля, поставете SIM карта."</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"SIM картата ви е деактивирана за постоянно."\n" Моля, свържете се с оператора на безжичната си връзка, за да получите друга."</string>
- <!-- no translation found for lockscreen_transport_prev_description (201594905152746886) -->
- <skip />
- <!-- no translation found for lockscreen_transport_next_description (6089297650481292363) -->
- <skip />
- <!-- no translation found for lockscreen_transport_pause_description (7659088786780128001) -->
- <skip />
- <!-- no translation found for lockscreen_transport_play_description (5888422938351019426) -->
- <skip />
- <!-- no translation found for lockscreen_transport_stop_description (4562318378766987601) -->
- <skip />
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Бутон за предишния запис"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Бутон за следващия запис"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Бутон за пауза"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Бутон за пускане"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Бутон за спиране"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Само спешни обаждания"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Мрежата е заключена"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM картата е заключена с PUK."</string>
@@ -704,14 +699,10 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Отключване"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Включване на звука"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Изключване на звука"</string>
- <!-- no translation found for lockscreen_access_pattern_start (3941045502933142847) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cleared (5583479721001639579) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cell_added (6756031208359292487) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_detected (4988730895554057058) -->
- <skip />
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Фигурата е започната"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Фигурата е изчистена"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Клетката е добавена"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Фигурата е завършена"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index f3aa280..618e114 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -320,13 +320,13 @@
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"odeslání trvalého vysílání"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Umožňuje aplikaci odeslat trvalá vysílání, která přetrvávají i po skončení vysílání. Škodlivé aplikace mohou tablet zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Umožňuje aplikaci odeslat trvalá vysílání, která přetrvávají i po skončení vysílání. Škodlivé aplikace mohou telefon zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti."</string>
- <string name="permlab_readContacts" msgid="6219652189510218240">"čtení dat kontaktů"</string>
+ <string name="permlab_readContacts" msgid="6219652189510218240">"číst data kontaktů"</string>
<string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Umožňuje aplikaci načíst všechna data kontaktů (adresy) uložená v tabletu. Škodlivé aplikace toto oprávnění mohou zneužít a odeslat vaše data dalším lidem."</string>
<string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Umožňuje aplikaci načíst všechna data kontaktů (adresy) uložená ve vašem telefonu. Škodlivé aplikace poté mohou dalším lidem odeslat vaše data."</string>
- <string name="permlab_writeContacts" msgid="644616215860933284">"zápis dat kontaktů"</string>
+ <string name="permlab_writeContacts" msgid="644616215860933284">"zapisovat data kontaktů"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Umožňuje aplikaci změnit kontaktní údaje (adresu) uložené v tabletu. Škodlivé aplikace toto oprávnění mohou zneužít a vymazat či pozměnit kontaktní údaje."</string>
<string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Umožňuje aplikaci změnit kontaktní údaje (adresu) uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit kontaktní údaje."</string>
- <string name="permlab_readProfile" msgid="6824681438529842282">"číst údaje o vašem profilu"</string>
+ <string name="permlab_readProfile" msgid="6824681438529842282">"čtení údajů o vašem profilu"</string>
<string name="permdesc_readProfile" product="default" msgid="6335739730324727203">"Umožňuje aplikaci číst osobní informace o profilu uložené ve vašem zařízení, jako je jméno a kontaktní informace. To znamená, že vás aplikace může identifikovat a odesílat informace o profilu ostatním."</string>
<string name="permlab_writeProfile" msgid="4679878325177177400">"zapisovat do údajů o profilu"</string>
<string name="permdesc_writeProfile" product="default" msgid="6431297330378229453">"Umožňuje aplikaci měnit a přidávat osobní informace o profilu uložené ve vašem zařízení, jako je jméno a kontaktní informace. To znamená, že vás aplikace může identifikovat a odesílat informace o profilu ostatním."</string>
@@ -486,7 +486,7 @@
<string name="permdesc_readDictionary" msgid="1082972603576360690">"Umožní aplikaci číst soukromá slova, jména a fráze, která uživatel mohl uložit do svého slovníku."</string>
<string name="permlab_writeDictionary" msgid="6703109511836343341">"zápis do slovníku definovaného uživatelem"</string>
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Umožní aplikaci zapisovat nová slova do uživatelského slovníku."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"upravit/smazat obsah úlož. USB"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"úprava/mazání obsahu úložiště USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"změna/smazání obsahu karty SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Umožní zápis do úložiště USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Umožní aplikaci zápis na kartu SD."</string>
@@ -700,7 +700,7 @@
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Zapnout zvuk"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Vypnout zvuk"</string>
<string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Bezpečnostní gesto zahájeno"</string>
- <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Bzpečnostní gesto vymazáno"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Bezpečnostní gesto vymazáno"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Buňka přidána"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Bezpečnostní gesto dokončeno"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
@@ -887,7 +887,7 @@
<string name="dialog_alert_title" msgid="2049658708609043103">"Upozornění"</string>
<string name="loading" msgid="1760724998928255250">"Načítání..."</string>
<string name="capital_on" msgid="1544682755514494298">"ZAPNUTO"</string>
- <string name="capital_off" msgid="6815870386972805832">"VYPNOUT"</string>
+ <string name="capital_off" msgid="6815870386972805832">"VYPNUTO"</string>
<string name="whichApplication" msgid="4533185947064773386">"Dokončit akci pomocí aplikace"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Použít jako výchozí nastavení pro tuto činnost."</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Vymažte výchozí hodnoty v Nastavení plochy > Aplikace > Správa aplikací."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 4e98da8..56b24bb 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -215,7 +215,7 @@
<string name="permlab_setDebugApp" msgid="4339730312925176742">"aktiver programfejlretning"</string>
<string name="permdesc_setDebugApp" msgid="5584310661711990702">"Tillader, at en applikation slår fejlretning af en anden applikation til. Ondsindede applikationer kan bruge dette til at standse andre applikationer."</string>
<string name="permlab_changeConfiguration" msgid="8214475779521218295">"skift indstillinger for brugergrænsefladen"</string>
- <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillader, at en applikation ændrer den nuværende konfiguration, f.eks. den lokale eller overordnede skrifttypestørrelse."</string>
+ <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillader, at en applikation ændrer den nuværende konfiguration, f.eks. den lokale eller overordnede skriftstørrelse."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"aktivere biltilstand"</string>
<string name="permdesc_enableCarMode" msgid="5673461159384850628">"Tillader en applikation at aktivere biltilstand."</string>
<string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"standse baggrundsprocesser"</string>
@@ -668,7 +668,7 @@
<string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Knap til forrige nummer"</string>
<string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Knap til næste nummer"</string>
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Pause-knap"</string>
- <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Afspil-knappen"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Afspil-knap"</string>
<string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Stop-knap"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Kun nødopkald"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Netværket er låst"</string>
@@ -986,7 +986,7 @@
<string name="usb_storage_title" msgid="5901459041398751495">"USB er tilsluttet"</string>
<string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Du har fået forbindelse til din computer via USB. Vælg knappen nedenfor, hvis du vil kopiere filer mellem din computer og din Androids USB-lager."</string>
<string name="usb_storage_message" product="default" msgid="4510858346516069238">"Du har fået forbindelse til din computer via USB. Vælg knappen nedenfor, hvis du ønsker at kopiere filer mellem din computer og din Androids SD-kort."</string>
- <string name="usb_storage_button_mount" msgid="1052259930369508235">"Slå USB-lagringen til"</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"Slå USB-lagring til"</string>
<string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Der opstod et problem med at bruge USB-lager til USB-masselager."</string>
<string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Der opstod et problem med at bruge dit SD-kort til USB-masselager."</string>
<string name="usb_storage_notification_title" msgid="8175892554757216525">"USB er tilsluttet"</string>
@@ -999,7 +999,7 @@
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Slå USB-lagring fra"</string>
<string name="usb_storage_stop_error_message" msgid="143881914840412108">"Der opstod et problem med at slå USB-lagringen fra. Sørg for, at du har demonteret USB-værten, og prøv så igen."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Slå USB-lagring til"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Hvis du slår USB-lagring til, vil nogle af de applikationer, som du bruger, stoppe, og de kan være utilgængelige, indtil du slår USB-lagring til igen."</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Hvis du slår USB-lagring til, vil nogle af de applikationer, du bruger, stoppe, og de kan være utilgængelige, indtil du slår USB-lagring fra igen."</string>
<string name="dlg_error_title" msgid="7323658469626514207">"USB-handlingen mislykkedes"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"Tilsluttet som en medieenhed"</string>
@@ -1009,7 +1009,7 @@
<string name="usb_notification_message" msgid="4447869605109736382">"Tryk for at se andre valgmuligheder for USB-tilslutning"</string>
<string name="extmedia_format_title" product="nosdcard" msgid="7980995592595097841">"Formater USB-lager"</string>
<string name="extmedia_format_title" product="default" msgid="8663247929551095854">"Formater SD-kort"</string>
- <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Vil du formatere USB-lager og slette alle filer, som er gemt der? Handlingen kan ikke fortrydes!"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Vil du formatere USB-lageret og slette alle filer, som er gemt der? Handlingen kan ikke fortrydes!"</string>
<string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Er du sikker på, du ønsker at formatere SD-kortet? Alle data på kortet mistes."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formater"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning er tilsluttet"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 4a83ae8..22d750b 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -147,7 +147,7 @@
<string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoptionen"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Display-Sperre"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Ausschalten"</string>
- <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lautlos"</string>
+ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lautlos-Modus"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ton ist AUS."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ton ist AN."</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flugmodus"</string>
@@ -163,7 +163,7 @@
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Meine persönlichen Informationen"</string>
<string name="permgroupdesc_personalInfo" product="tablet" msgid="6975389054186265786">"Direkter Zugriff auf die Kontakte und den Kalender Ihres Tablets"</string>
<string name="permgroupdesc_personalInfo" product="default" msgid="5488050357388806068">"Direkter Zugriff auf die Kontakte und den Kalender Ihres Telefons"</string>
- <string name="permgrouplab_location" msgid="635149742436692049">"Meinen Standort"</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"Ihren Standort"</string>
<string name="permgroupdesc_location" msgid="2430258821648348660">"Ihren physischen Standort überwachen"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Netzwerkkommunikation"</string>
<string name="permgroupdesc_network" msgid="5035763698958415998">"Ermöglicht Anwendungen den Zugriff auf verschiedene Netzwerkfunktionen"</string>
@@ -256,7 +256,7 @@
<string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Ermöglicht einer App, Fenster mit Systemwarnungen anzuzeigen. Schädliche Anwendungen können so die Kontrolle über das gesamte Display übernehmen."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"Allgemeine Animationsgeschwindigkeit einstellen"</string>
<string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Ermöglicht einer App, die allgemeine Animationsgeschwindigkeit (schnellere oder langsamere Animationen) jederzeit anzupassen"</string>
- <string name="permlab_manageAppTokens" msgid="17124341698093865">"Anwendungs-Tokens verwalten"</string>
+ <string name="permlab_manageAppTokens" msgid="17124341698093865">"App-Tokens verwalten"</string>
<string name="permdesc_manageAppTokens" msgid="977127907524195988">"Ermöglicht Anwendungen, Ihre eigenen Tokens zu erstellen und zu verwalten. Hierbei wird die normale Z-Reihenfolge umgangen. Dies sollte nicht für normale Anwendungen benötigt werden."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"Tasten und Steuerungstasten drücken"</string>
<string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Ermöglicht einer App, ihre eigenen Eingabeaktionen (Drücken von Tasten usw.) an andere Anwendungen zu liefern. Schädliche Anwendungen können so die Kontrolle über Ihr Tablet übernehmen."</string>
@@ -674,7 +674,7 @@
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Netzwerk gesperrt"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"PUK-Sperre auf SIM"</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"Weitere Informationen finden Sie in der Bedienungsanleitung oder wenden Sie sich an den Kundendienst."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Bitte PIN-Code eingeben"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Bitte PIN eingeben"</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM-Karte wird entsperrt..."</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Sie haben Ihr Passwort <xliff:g id="NUMBER_0">%d</xliff:g> Mal falsch eingegeben. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string>
@@ -712,7 +712,7 @@
<string name="factorytest_not_system" msgid="4435201656767276723">"Die Aktion FACTORY_TEST wird nur für unter \"/system/app\" gespeicherte Pakete unterstützt."</string>
<string name="factorytest_no_action" msgid="872991874799998561">"Es wurden kein Paket mit der Aktion FACTORY_TEST gefunden."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"Neustart"</string>
- <string name="js_dialog_title" msgid="8143918455087008109">"Die Seite auf \'<xliff:g id="TITLE">%s</xliff:g>\' sagt:"</string>
+ <string name="js_dialog_title" msgid="8143918455087008109">"Die Seite <xliff:g id="TITLE">%s</xliff:g> sagt:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<string name="js_dialog_before_unload" msgid="1901675448179653089">"Von dieser Seite navigieren?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Wählen Sie \"OK\", um fortzufahren, oder wählen Sie \"Abbrechen\", um auf der aktuellen Seite zu bleiben."</string>
<string name="save_password_label" msgid="6860261758665825069">"Bestätigen"</string>
@@ -881,7 +881,7 @@
<string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"Kaum noch Tablet-Speicher frei"</string>
<string name="low_internal_storage_view_text" product="default" msgid="635106544616378836">"Kaum noch Telefonspeicher frei"</string>
<string name="ok" msgid="5970060430562524910">"OK"</string>
- <string name="cancel" msgid="6442560571259935130">"Abbrechen"</string>
+ <string name="cancel" msgid="6442560571259935130">"Abbruch"</string>
<string name="yes" msgid="5362982303337969312">"OK"</string>
<string name="no" msgid="5141531044935541497">"Abbrechen"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Achtung"</string>
@@ -1012,7 +1012,7 @@
<string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"USB-Speicher formatieren und alle darin befindlichen Dateien löschen? Diese Aktion kann nicht rückgängig gemacht werden!"</string>
<string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Möchten Sie die SD-Karte wirklich formatieren? Alle Daten auf Ihrer Karte gehen dann verloren."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging verbunden"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"USB-Debugging deaktivieren: auswählen"</string>
<string name="select_input_method" msgid="6865512749462072765">"Eingabemethode auswählen"</string>
<string name="configure_input_methods" msgid="6324843080254191535">"Eingabemethoden konfigurieren"</string>
@@ -1058,7 +1058,7 @@
<string name="ime_action_default" msgid="2840921885558045721">"Ausführen"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Nummer"\n"mit <xliff:g id="NUMBER">%s</xliff:g> wählen"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Neuer Kontakt"\n"mit <xliff:g id="NUMBER">%s</xliff:g> erstellen"</string>
- <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Die folgenden Anwendungen benötigen die Berechtigung zum aktuellen und zukünftigen Zugriff auf Ihr Konto."</string>
+ <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Die folgenden Apps benötigen die Berechtigung zum aktuellen und zukünftigen Zugriff auf Ihr Konto."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Möchten Sie diese Anfrage zulassen?"</string>
<string name="grant_permissions_header_text" msgid="2722567482180797717">"Zugriffsanfrage"</string>
<string name="allow" msgid="7225948811296386551">"Zulassen"</string>
@@ -1067,7 +1067,7 @@
<string name="permission_request_notification_with_subtitle" msgid="4325409589686688000">"Berechtigung erforderlich"\n"für Konto <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"Eingabemethode"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"Synchronisieren"</string>
- <string name="accessibility_binding_label" msgid="4148120742096474641">"Eingabehilfen"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"Bedienungshilfen"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Hintergrund"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"Hintergrund ändern"</string>
<string name="vpn_title" msgid="8219003246858087489">"VPN ist aktiviert."</string>
@@ -1135,7 +1135,7 @@
<string name="time_picker_increment_hour_button" msgid="2484204991937119057">"Stunde vorstellen"</string>
<string name="time_picker_decrement_hour_button" msgid="4659353501775842780">"Stunde zurückstellen"</string>
<string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Zeit festlegen"</string>
- <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Zeit festlegen (Vormittag)"</string>
+ <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Zeit festlegen"</string>
<string name="date_picker_increment_month_button" msgid="6324978841467899081">"Monat vorstellen"</string>
<string name="date_picker_decrement_month_button" msgid="7304349355000398077">"Monat zurückstellen"</string>
<string name="date_picker_increment_day_button" msgid="4397040141921413183">"Tag vorstellen"</string>
@@ -1178,7 +1178,7 @@
<string name="storage_sd_card" msgid="8921771478629812343">"SD-Karte"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB-Speicher"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"Bearbeiten..."</string>
- <string name="data_usage_warning_title" msgid="1955638862122232342">"Warnung zu Datennutzung"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"Warnung zum Datenverbrauch"</string>
<string name="data_usage_warning_body" msgid="7217480745540055170">"Für Nutzung/Einstell. berühren"</string>
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-/3G-Daten deaktiviert"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G-Daten deaktiviert"</string>
@@ -1191,7 +1191,7 @@
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"WLAN-Datenlimit überschritten"</string>
<string name="data_usage_limit_snoozed_body" msgid="2932736326652880660">"<xliff:g id="SIZE">%s</xliff:g> über dem vorgegebenen Limit"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Hintergrunddaten beschränkt"</string>
- <string name="data_usage_restricted_body" msgid="5087354814839059798">"Beschränk. durch Tippen entfernen"</string>
+ <string name="data_usage_restricted_body" msgid="5087354814839059798">"Beschränkung per Tippen entfernen"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Sicherheitszertifikat"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Dies ist ein gültiges Zertifikat."</string>
<string name="issued_to" msgid="454239480274921032">"Ausgestellt für:"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index ac48934..ac2842f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1080,11 +1080,11 @@
<string name="submit" msgid="1602335572089911941">"Υποβολή"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Η λειτουργία αυτοκινήτου είναι ενεργοποιημένη"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Επιλέξτε για έξοδο από τη λειτουργία αυτοκινήτου."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Σύνδεση μέσω κινητής συσκευής ή σημείου πρόσβασης ενεργή"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"Αγγίξτε για να γίνει διαμόρφωση"</string>
<string name="back_button_label" msgid="2300470004503343439">"Πίσω"</string>
<string name="next_button_label" msgid="1080555104677992408">"Επόμενο"</string>
- <string name="skip_button_label" msgid="1275362299471631819">"Παράβλεψη"</string>
+ <string name="skip_button_label" msgid="1275362299471631819">"Παράλειψη"</string>
<string name="throttle_warning_notification_title" msgid="4890894267454867276">"Υψηλή χρήση δεδομένων κινητής τηλεφωνίας"</string>
<string name="throttle_warning_notification_message" msgid="2609734763845705708">"Αγγίξτε για να μάθετε περισσότερα σχετικά με τη χρήση δεδομένων κινητής τηλεφωνίας"</string>
<string name="throttled_notification_title" msgid="6269541897729781332">"Ξεπεράστηκε το όριο δεδομένων κινητής τηλεφωνίας"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 2df9779..9609c1a 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -668,7 +668,7 @@
<string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Botón para pista anterior"</string>
<string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Botón para pista siguiente"</string>
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Botón Pausa"</string>
- <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Botón Reproducir."</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Botón Reproducir"</string>
<string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Botón Detener"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Sólo llamadas de emergencia"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Red bloqueada"</string>
@@ -701,7 +701,7 @@
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Sonido apagado"</string>
<string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Se inició el patrón"</string>
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Se borró el patrón"</string>
- <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se agregó un celular"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Se agregó una celda."</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Se completó el patrón"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
@@ -983,13 +983,13 @@
<string name="perms_hide" msgid="7283915391320676226"><b>"Ocultar"</b></string>
<string name="perms_show_all" msgid="2671791163933091180"><b>"Mostrar todos"</b></string>
<string name="usb_storage_activity_title" msgid="2399289999608900443">"Almacenamiento masivo USB"</string>
- <string name="usb_storage_title" msgid="5901459041398751495">"conectado al USB"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"Conectado al USB"</string>
<string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Has conectado tu teléfono a tu computadora mediante USB. Selecciona el botón a continuación si deseas copiar los archivos entre tu computadora y el almacenamiento USB de Android."</string>
<string name="usb_storage_message" product="default" msgid="4510858346516069238">"Has conectado tu teléfono a tu computadora mediante USB. Selecciona el botón a continuación si deseas copiar los archivos entre tu computadora y la tarjeta SD de Android."</string>
<string name="usb_storage_button_mount" msgid="1052259930369508235">"Activar el almacenamiento USB"</string>
<string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Hay un problema para utilizar el almacenamiento USB en el almacenamiento masivo USB."</string>
<string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Hay un problema para utilizar tu tarjeta SD en el almacenamiento masivo USB."</string>
- <string name="usb_storage_notification_title" msgid="8175892554757216525">"conectado al USB"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"Conectado al USB"</string>
<string name="usb_storage_notification_message" msgid="7380082404288219341">"Seleccionar para copiar archivos desde o hacia tu computadora."</string>
<string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Desactivar el almacenamiento USB"</string>
<string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Seleccionar para desactivar el almacenamiento USB."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index eced66b..b5409bd 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -148,11 +148,11 @@
<string name="global_action_lock" msgid="2844945191792119712">"Bloqueo de pantalla"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencio"</string>
- <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"El sonido está desactivado. Activar."</string>
- <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"El sonido está activado. Desactivar."</string>
+ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"El sonido está desactivado. Activar"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"El sonido está activado. Desactivar"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modo avión"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avión activado. Desactivar."</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avión desactivado. Activar."</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modo avión activado. Desactivar"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Modo avión desactivado. Activar"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
@@ -302,7 +302,7 @@
<string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Permite que una aplicación lea diversos archivos de registro del sistema. Con este permiso, la aplicación puede ver información general sobre las acciones que se realizan con el tablet (que puede incluir datos personales o privados)."</string>
<string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Permite que una aplicación lea distintos archivos de registro del sistema. Con este permiso, la aplicación puede ver información general sobre las acciones que realizas con el teléfono, que puede incluir datos personales o privados."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"leer/escribir en los recursos propiedad del grupo de diagnóstico"</string>
- <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permite que una aplicación lea y escriba en cualquier recurso propiedad del grupo de diagnóstico como, por ejemplo, archivos in/dev. Este permiso podría afectar a la seguridad y estabilidad del sistema. SÓLO se debe utilizar para diagnósticos específicos de hardware realizados por el fabricante o el operador."</string>
+ <string name="permdesc_diagnostic" msgid="3121238373951637049">"Permite que una aplicación lea y escriba en cualquier recurso propiedad del grupo de diagnóstico como, por ejemplo, archivos in/dev. Este permiso podría afectar a la seguridad y estabilidad del sistema. SOLO se debe utilizar para diagnósticos específicos de hardware realizados por el fabricante o el operador."</string>
<string name="permlab_changeComponentState" msgid="79425198834329406">"habilitar o inhabilitar componentes de la aplicación"</string>
<string name="permdesc_changeComponentState" product="tablet" msgid="4647419365510068321">"Permite que una aplicación cambie si un componente de otra aplicación está habilitado o inhabilitado. Las aplicaciones malintencionadas pueden utilizar este permiso para inhabilitar funciones importantes del tablet. Este permiso se debe utilizar con precaución, ya que es posible que los componentes se vuelvan inservibles, inconsistentes o inestables."</string>
<string name="permdesc_changeComponentState" product="default" msgid="3443473726140080761">"Permite que una aplicación cambie si un componente de otra aplicación está habilitado o inhabilitado. Las aplicaciones malintencionadas pueden utilizar este permiso para inhabilitar funciones importantes del teléfono. Este permiso se debe utilizar con precaución, ya que es posible que los componentes se vuelvan inservibles, inconsistentes o inestables."</string>
@@ -420,7 +420,7 @@
<string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Permite que la aplicación active o desactive el teléfono."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"ejecutar en modo de prueba de fábrica"</string>
<string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Permite la ejecución como prueba de fabricante de nivel inferior, lo que posibilita un acceso completo al hardware del tablet. Solo está disponible cuando un tablet se está ejecutando en modo de prueba."</string>
- <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Ejecutar como prueba de fabricante de nivel inferior, permitiendo un acceso íntegro al hardware del teléfono. Sólo está disponible cuando un teléfono se está ejecutando en modo de prueba."</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Ejecutar como prueba de fabricante de nivel inferior, permitiendo un acceso íntegro al hardware del teléfono. Solo está disponible cuando un teléfono se está ejecutando en modo de prueba."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"establecer fondo de pantalla"</string>
<string name="permdesc_setWallpaper" msgid="6417041752170585837">"Permite que la aplicación establezca el fondo de pantalla del sistema."</string>
<string name="permlab_setWallpaperHints" msgid="3600721069353106851">"establecer el tamaño del fondo de pantalla"</string>
@@ -750,7 +750,7 @@
<string name="permdesc_packageVerificationAgent" msgid="6033195477325381106">"Permite que la aplicación verifique si se puede instalar un paquete."</string>
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"enlazar con un detector de paquetes"</string>
<string name="permdesc_bindPackageVerifier" msgid="2409521927385789318">"Permite hacer solicitudes de detectores de paquetes. Las aplicaciones normales no deberían necesitar este permiso."</string>
- <string name="save_password_message" msgid="767344687139195790">"¿Deseas que el navegador recuerde esta contraseña?"</string>
+ <string name="save_password_message" msgid="767344687139195790">"¿Quieres que el navegador recuerde esta contraseña?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"Ahora no"</string>
<string name="save_password_remember" msgid="6491879678996749466">"Recordar"</string>
<string name="save_password_never" msgid="8274330296785855105">"Nunca"</string>
@@ -889,8 +889,8 @@
<string name="capital_on" msgid="1544682755514494298">"SÍ"</string>
<string name="capital_off" msgid="6815870386972805832">"NO"</string>
<string name="whichApplication" msgid="4533185947064773386">"Completar acción utilizando"</string>
- <string name="alwaysUse" msgid="4583018368000610438">"Utilizar de forma predeterminada para esta acción"</string>
- <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Borrar valores predeterminados en la página de configuración de la pantalla de inicio del teléfono > Aplicaciones > Administrar aplicaciones\"."</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"Usar siempre para esta acción"</string>
+ <string name="clearDefaultHintMsg" msgid="4815455344600932173">"Puedes borrar las acciones predeterminadas en Ajustes > Aplicaciones."</string>
<string name="chooseActivity" msgid="1009246475582238425">"Seleccionar una acción"</string>
<string name="chooseUsbActivity" msgid="7892597146032121735">"Seleccionar una aplicación para el dispositivo USB"</string>
<string name="noApplications" msgid="1691104391758345586">"Ninguna aplicación puede realizar esta acción."</string>
@@ -902,7 +902,7 @@
<string name="anr_activity_process" msgid="7018289416670457797">"La actividad <xliff:g id="ACTIVITY">%1$s</xliff:g> no responde."\n\n"¿Quieres cerrarla?"</string>
<string name="anr_application_process" msgid="7208175830253210526">"La aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> no responde. ¿Quieres cerrarla?"</string>
<string name="anr_process" msgid="306819947562555821">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> no responde."\n\n"¿Quieres cerrarlo?"</string>
- <string name="force_close" msgid="8346072094521265605">"ACEPTAR"</string>
+ <string name="force_close" msgid="8346072094521265605">"Aceptar"</string>
<string name="report" msgid="4060218260984795706">"Informar"</string>
<string name="wait" msgid="7147118217226317732">"Esperar"</string>
<string name="launch_warning_title" msgid="8323761616052121936">"Aplicación redireccionada"</string>
@@ -916,7 +916,7 @@
<string name="android_upgrading_title" msgid="378740715658358071">"Actualizando Android..."</string>
<string name="android_upgrading_apk" msgid="274409861603566003">"Optimizando aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string>
<string name="android_upgrading_starting_apps" msgid="7959542881906488763">"Iniciando aplicaciones"</string>
- <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando arranque..."</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando arranque"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string>
<string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Seleccionar para cambiar a la aplicación"</string>
<string name="heavy_weight_switcher_title" msgid="1135403633766694316">"¿Cambiar de aplicación?"</string>
@@ -983,19 +983,19 @@
<string name="perms_hide" msgid="7283915391320676226"><b>"Ocultar"</b></string>
<string name="perms_show_all" msgid="2671791163933091180"><b>"Mostrar todos"</b></string>
<string name="usb_storage_activity_title" msgid="2399289999608900443">"Almacenamiento USB masivo"</string>
- <string name="usb_storage_title" msgid="5901459041398751495">"Conectado por USB"</string>
- <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Has conectado el teléfono al equipo mediante USB. Toca el botón situado debajo si deseas copiar archivos entre el equipo y el almacenamiento USB del teléfono Android."</string>
- <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Has conectado el teléfono al equipo mediante USB. Toca el botón situado debajo si deseas copiar archivos entre el equipo y la tarjeta SD del teléfono Android."</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"Conexión por USB"</string>
+ <string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Has conectado el dispositivo al ordenador por USB. Toca el si siguiente botón si quieres copiar archivos entre el ordenador y el almacenamiento USB del dispositivo."</string>
+ <string name="usb_storage_message" product="default" msgid="4510858346516069238">"Has conectado el dispositivo al ordenador por USB. Toca el siguiente botón si quieres copiar archivos entre el ordenador y la tarjeta SD del dispositivo."</string>
<string name="usb_storage_button_mount" msgid="1052259930369508235">"Activar almacenamiento USB"</string>
- <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Se ha producido un problema al utilizar el almacenamiento USB para el almacenamiento masivo USB."</string>
+ <string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Se ha producido una incidencia al usar el almacenamiento USB para el almacenamiento masivo USB."</string>
<string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Se ha producido un problema al utilizar la tarjeta SD para el almacenamiento USB masivo."</string>
- <string name="usb_storage_notification_title" msgid="8175892554757216525">"Conectado por USB"</string>
- <string name="usb_storage_notification_message" msgid="7380082404288219341">"Para copiar archivos al/desde el equipo"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"Conexión por USB"</string>
+ <string name="usb_storage_notification_message" msgid="7380082404288219341">"Toca para copiar archivos"</string>
<string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Desactivar almacenamiento USB"</string>
<string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Seleccionar para desactivar USB."</string>
- <string name="usb_storage_stop_title" msgid="660129851708775853">"El almacenamiento USB está en uso."</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"El almacenamiento USB está en uso"</string>
<string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Antes de desactivar el almacenamiento USB, asegúrate de haber desactivado (\"extraído\") el almacenamiento USB del teléfono con Android del equipo."</string>
- <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Antes de desactivar el almacenamiento USB, asegúrate de haber desmontado (\"retirado\") la tarjeta SD del teléfono con Android del equipo."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Antes de desactivar el almacenamiento USB, asegúrate de haber desactivado la tarjeta SD del teléfono en el ordenador."</string>
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Desactivar almacenamiento USB"</string>
<string name="usb_storage_stop_error_message" msgid="143881914840412108">"Se ha producido un problema al desactivar el almacenamiento USB. Asegúrate de haber desactivado el host USB y, a continuación, vuelve a intentarlo."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Activar almacenamiento USB"</string>
@@ -1014,7 +1014,7 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formato"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Dispositivo de depuración USB conectado"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"Seleccionar para inhabilitar la depuración USB"</string>
- <string name="select_input_method" msgid="6865512749462072765">"Seleccionar método de introducción de texto"</string>
+ <string name="select_input_method" msgid="6865512749462072765">"Selecciona un método de introducción de texto"</string>
<string name="configure_input_methods" msgid="6324843080254191535">"Configurar métodos de introducción"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1080,8 +1080,8 @@
<string name="submit" msgid="1602335572089911941">"Enviar"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche."</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"Selecciona esta opción para salir del modo coche."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red activo o zona Wi-Fi"</string>
- <string name="tethered_notification_message" msgid="3067108323903048927">"Toca para iniciar la configuración."</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red/Zona Wi-Fi activo"</string>
+ <string name="tethered_notification_message" msgid="3067108323903048927">"Toca para configurar"</string>
<string name="back_button_label" msgid="2300470004503343439">"Atrás"</string>
<string name="next_button_label" msgid="1080555104677992408">"Siguiente"</string>
<string name="skip_button_label" msgid="1275362299471631819">"Saltar"</string>
@@ -1206,7 +1206,7 @@
<string name="fingerprints" msgid="4516019619850763049">"Huellas digitales:"</string>
<string name="sha256_fingerprint" msgid="4391271286477279263">"Huella digital SHA-256:"</string>
<string name="sha1_fingerprint" msgid="7930330235269404581">"Huella digital SHA-1:"</string>
- <string name="activity_chooser_view_see_all" msgid="180268188117163072">"Ver todas..."</string>
+ <string name="activity_chooser_view_see_all" msgid="180268188117163072">"Ver todo..."</string>
<string name="activity_chooser_view_dialog_title_default" msgid="3325054276356556835">"Seleccionar actividad"</string>
<string name="share_action_provider_share_with" msgid="1791316789651185229">"Compartir con..."</string>
<string name="status_bar_device_locked" msgid="3092703448690669768">"Dispositivo bloqueado"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 2839734..3ef6347 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -345,7 +345,7 @@
<string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"Permet d\'accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de localisation géographique."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"autoriser l\'installation d\'un fournisseur de services de localisation"</string>
<string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Créer des sources de données de localisation factices à des fins de test. Les applications malveillantes peuvent exploiter cette fonction pour remplacer la position géographique et/ou l\'état renvoyé par les sources de données de localisation réelles, telles que le GPS ou les fournisseurs réseau, ou pour surveiller et transmettre votre position géographique à une source externe."</string>
- <string name="permlab_accessFineLocation" msgid="8116127007541369477">"Localisation OK (GPS)"</string>
+ <string name="permlab_accessFineLocation" msgid="8116127007541369477">"Localisation précise (GPS)"</string>
<string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Permet d\'accéder à des sources de localisation précises telles que le système GPS de la tablette, lorsque ces services sont disponibles. Des applications malveillantes peuvent exploiter cette fonctionnalité pour déterminer votre position, ce qui peut entraîner une utilisation accrue de la batterie."</string>
<string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Permet d\'accéder à des sources de localisation précises telles que le système GPS du téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent exploiter cette fonctionnalité pour déterminer votre position, ce qui peut entraîner une utilisation accrue de la batterie."</string>
<string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"Position géo. approximative (selon le réseau)"</string>
@@ -486,11 +486,11 @@
<string name="permdesc_readDictionary" msgid="1082972603576360690">"Permet à une application de lire tous les mots, noms et expressions que l\'utilisateur a pu enregistrer dans son dictionnaire personnel."</string>
<string name="permlab_writeDictionary" msgid="6703109511836343341">"Enregistrement dans le dictionnaire défini par l\'utilisateur"</string>
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permet à une application d\'enregistrer de nouveaux mots dans le dictionnaire personnel de l\'utilisateur."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"modif./suppr. contenu mémoire USB"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"Modifier/Supprimer contenu mémoire USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modifier/supprimer le contenu de la carte SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Autorise une application à écrire sur la mémoire USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Autorise une application à écrire sur la carte SD."</string>
- <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modif./suppr. contenu mémoire interne"</string>
+ <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Modifier/Supprimer contenu mémoire interne"</string>
<string name="permdesc_mediaStorageWrite" product="default" msgid="8232008512478316233">"Permet à une application de modifier le contenu de la mémoire de stockage interne."</string>
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"accéder au système de fichiers en cache"</string>
<string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permet à une application de lire et d\'écrire dans le système de fichiers en cache."</string>
@@ -886,8 +886,8 @@
<string name="no" msgid="5141531044935541497">"Annuler"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Attention"</string>
<string name="loading" msgid="1760724998928255250">"Chargement en cours..."</string>
- <string name="capital_on" msgid="1544682755514494298">"ON"</string>
- <string name="capital_off" msgid="6815870386972805832">"OFF"</string>
+ <string name="capital_on" msgid="1544682755514494298">"OUI"</string>
+ <string name="capital_off" msgid="6815870386972805832">"NON"</string>
<string name="whichApplication" msgid="4533185947064773386">"Continuer avec"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Utiliser cette application par défaut pour cette action"</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Effacer les paramètres par défaut dans les Paramètres de page d\'accueil > Applications > Gérer les applications."</string>
@@ -895,7 +895,7 @@
<string name="chooseUsbActivity" msgid="7892597146032121735">"Sélectionnez une application pour le périphérique USB"</string>
<string name="noApplications" msgid="1691104391758345586">"Aucune application ne peut effectuer cette action."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
- <string name="aerr_application" msgid="932628488013092776">"Malheureusement, l\'application <xliff:g id="APPLICATION">%1$s</xliff:g> s\'est arrêtée."</string>
+ <string name="aerr_application" msgid="932628488013092776">"L\'application \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" s\'est arrêtée."</string>
<string name="aerr_process" msgid="4507058997035697579">"Malheureusement, le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est arrêté."</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="8339738283149696827">"L\'application <xliff:g id="APPLICATION">%2$s</xliff:g> ne répond pas."\n\n"Voulez-vous la fermer ?"</string>
@@ -983,19 +983,19 @@
<string name="perms_hide" msgid="7283915391320676226"><b>"Masquer"</b></string>
<string name="perms_show_all" msgid="2671791163933091180"><b>"Tout afficher"</b></string>
<string name="usb_storage_activity_title" msgid="2399289999608900443">"Stockage de masse USB"</string>
- <string name="usb_storage_title" msgid="5901459041398751495">"Connecté à l\'aide d\'un câble USB"</string>
+ <string name="usb_storage_title" msgid="5901459041398751495">"Connecté par USB"</string>
<string name="usb_storage_message" product="nosdcard" msgid="6631094834151575841">"Vous êtes connecté à votre ordinateur via un câble USB. Appuyez sur le bouton ci-dessous pour copier des fichiers de votre ordinateur vers la mémoire de stockage USB de votre Android, ou inversement."</string>
<string name="usb_storage_message" product="default" msgid="4510858346516069238">"Vous êtes connecté à votre ordinateur via un câble USB. Appuyez sur le bouton ci-dessous pour copier des fichiers de votre ordinateur vers la carte SD de votre Android, ou inversement."</string>
<string name="usb_storage_button_mount" msgid="1052259930369508235">"Activer la mémoire de stockage USB"</string>
<string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Un problème est survenu lors de l\'utilisation de votre mémoire de stockage USB comme mémoire de stockage de masse."</string>
<string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Un problème est survenu lors de l\'utilisation de votre carte SD comme mémoire de stockage de masse USB."</string>
- <string name="usb_storage_notification_title" msgid="8175892554757216525">"Connecté avec un câble USB"</string>
+ <string name="usb_storage_notification_title" msgid="8175892554757216525">"Connecté par USB"</string>
<string name="usb_storage_notification_message" msgid="7380082404288219341">"Activez pour copier des fichiers vers/de votre ordinateur."</string>
<string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Désactiver la mémoire de stockage USB"</string>
<string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Sélectionner pour désactiver la mémoire de stockage USB"</string>
- <string name="usb_storage_stop_title" msgid="660129851708775853">"Mémoire de stockage USB en cours d\'utilisation"</string>
+ <string name="usb_storage_stop_title" msgid="660129851708775853">"Mémoire de stockage USB activée"</string>
<string name="usb_storage_stop_message" product="nosdcard" msgid="1368842269463745067">"Avant de désactiver la mémoire de stockage USB, assurez-vous d\'avoir désinstallé (\"éjecté\") de votre ordinateur la mémoire de stockage USB de votre Android."</string>
- <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Avant de désactiver la mémoire de stockage USB, assurez-vous d\'avoir désinstallé (\"éjecté\") de votre ordinateur la carte SD de votre Android."</string>
+ <string name="usb_storage_stop_message" product="default" msgid="3613713396426604104">"Avant de désactiver la mémoire de stockage USB, assurez-vous d\'avoir désinstallé (\"éjecté\") la carte SD de votre Android depuis votre ordinateur."</string>
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Désactiver la mémoire de stockage USB"</string>
<string name="usb_storage_stop_error_message" msgid="143881914840412108">"Un problème est survenu lors de la désactivation de la mémoire de stockage USB. Assurez-vous que l\'hôte USB a bien été désinstallé, puis réessayez."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Activer la mémoire de stockage USB"</string>
@@ -1012,7 +1012,7 @@
<string name="extmedia_format_message" product="nosdcard" msgid="8296908079722897772">"Formater la mémoire de stockage USB en effaçant tous les fichiers ? Cette action est irréversible."</string>
<string name="extmedia_format_message" product="default" msgid="3621369962433523619">"Voulez-vous vraiment formater la carte SD ? Toutes les données de cette carte seront perdues."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB connecté"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"Sélectionnez cette option pour désactiver le débogage USB."</string>
<string name="select_input_method" msgid="6865512749462072765">"Sélectionner un mode de saisie"</string>
<string name="configure_input_methods" msgid="6324843080254191535">"Configurer les modes de saisie"</string>
@@ -1103,7 +1103,7 @@
<string name="format_error" product="nosdcard" msgid="6299769563624776948">"Impossible d\'effacer la mémoire de stockage USB."</string>
<string name="format_error" product="default" msgid="7315248696644510935">"Impossible d\'effacer la carte SD."</string>
<string name="media_bad_removal" msgid="7960864061016603281">"La carte SD a été retirée sans avoir été désinstallée."</string>
- <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Vérification de la mémoire de stockage USB en cours."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Vérification de la mémoire de stockage USB..."</string>
<string name="media_checking" product="default" msgid="7334762503904827481">"Vérification de la carte SD en cours."</string>
<string name="media_removed" msgid="7001526905057952097">"La carte SD a été retirée."</string>
<string name="media_shared" product="nosdcard" msgid="5830814349250834225">"La mémoire de stockage USB est en cours d\'utilisation par l\'ordinateur."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 62e753f..84d940d 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -665,16 +665,11 @@
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Umetnite SIM karticu."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="7138450788301444298">"Nedostaje SIM kartica ili nije čitljiva. Umetnite SIM karticu."</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"Vaša SIM kartica trajno je onemogućena."\n"Obratite se svom pružatelju bežičnih usluga za dobivanje druge SIM kartice."</string>
- <!-- no translation found for lockscreen_transport_prev_description (201594905152746886) -->
- <skip />
- <!-- no translation found for lockscreen_transport_next_description (6089297650481292363) -->
- <skip />
- <!-- no translation found for lockscreen_transport_pause_description (7659088786780128001) -->
- <skip />
- <!-- no translation found for lockscreen_transport_play_description (5888422938351019426) -->
- <skip />
- <!-- no translation found for lockscreen_transport_stop_description (4562318378766987601) -->
- <skip />
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Gumb Prethodni zapis"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Gumb Sljedeći zapis"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Gumb Pauza"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Gumb Reprodukcija"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Gumb Zaustavi"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Samo hitni pozivi"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Mreža je zaključana"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM kartica je zaključana PUK-om."</string>
@@ -704,14 +699,10 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Otključaj"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Zvuk je uključen"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Zvuk isključen"</string>
- <!-- no translation found for lockscreen_access_pattern_start (3941045502933142847) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cleared (5583479721001639579) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cell_added (6756031208359292487) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_detected (4988730895554057058) -->
- <skip />
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Uzorak se pokrenuo"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Uzorak je obrisan"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Dodan je mobitel"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Uzorak je dovršen"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 1f74260..5819e4e4 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -665,16 +665,11 @@
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Masukkan kartu SIM"</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="7138450788301444298">"Kartu SIM tidak ada atau tidak dapat dibaca. Masukkan kartu SIM."</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"Kartu SIM Anda dinonaktifkan secara permanen."\n" Hubungi penyedia layanan nirkabel Anda untuk mendapatkan kartu SIM lainnya."</string>
- <!-- no translation found for lockscreen_transport_prev_description (201594905152746886) -->
- <skip />
- <!-- no translation found for lockscreen_transport_next_description (6089297650481292363) -->
- <skip />
- <!-- no translation found for lockscreen_transport_pause_description (7659088786780128001) -->
- <skip />
- <!-- no translation found for lockscreen_transport_play_description (5888422938351019426) -->
- <skip />
- <!-- no translation found for lockscreen_transport_stop_description (4562318378766987601) -->
- <skip />
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Tombol trek sebelumnya"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Tombol trek berikutnya"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Tombol jeda"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Tombol putar"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Tombol hentikan"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Panggilan darurat saja"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Jaringan terkunci"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Kartu SIM terkunci PUK."</string>
@@ -704,14 +699,10 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Buka kunci"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Suara hidup"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Suara mati"</string>
- <!-- no translation found for lockscreen_access_pattern_start (3941045502933142847) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cleared (5583479721001639579) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cell_added (6756031208359292487) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_detected (4988730895554057058) -->
- <skip />
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Pola dimulai"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Pola dihapus"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Sel ditambahkan"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Pola selesai"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 9646d6a..fdb1e5a 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -695,7 +695,7 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Accedi"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Password o nome utente non valido."</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="8253152905532900548">"Hai dimenticato il nome utente o la password?"\n"Visita "<b>"google.com/accounts/recovery"</b></string>
- <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Controllo in corso..."</string>
+ <string name="lockscreen_glogin_checking_password" msgid="6758890536332363322">"Controllo..."</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Sblocca"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Audio attivato"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Audio disattivato"</string>
@@ -885,7 +885,7 @@
<string name="yes" msgid="5362982303337969312">"OK"</string>
<string name="no" msgid="5141531044935541497">"Annulla"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Attenzione"</string>
- <string name="loading" msgid="1760724998928255250">"Caricamento in corso..."</string>
+ <string name="loading" msgid="1760724998928255250">"Caricamento..."</string>
<string name="capital_on" msgid="1544682755514494298">"ON"</string>
<string name="capital_off" msgid="6815870386972805832">"OFF"</string>
<string name="whichApplication" msgid="4533185947064773386">"Completa l\'azione con"</string>
@@ -990,7 +990,7 @@
<string name="usb_storage_error_message" product="nosdcard" msgid="3276413764430468454">"Problema di utilizzo dell\'archivio USB come archivio di massa USB."</string>
<string name="usb_storage_error_message" product="default" msgid="120810397713773275">"Problema di utilizzo della scheda SD come archivio di massa USB."</string>
<string name="usb_storage_notification_title" msgid="8175892554757216525">"USB collegata"</string>
- <string name="usb_storage_notification_message" msgid="7380082404288219341">"Seleziona per copiare file sul/dal tuo computer."</string>
+ <string name="usb_storage_notification_message" msgid="7380082404288219341">"Seleziona per copiare file sul/dal computer."</string>
<string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Disattiva archivio USB"</string>
<string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Seleziona per disattivare l\'archivio USB."</string>
<string name="usb_storage_stop_title" msgid="660129851708775853">"Archivio USB in uso"</string>
@@ -1096,15 +1096,15 @@
<item quantity="other" msgid="4641872797067609177">"<xliff:g id="INDEX">%d</xliff:g> di <xliff:g id="TOTAL">%d</xliff:g>"</item>
</plurals>
<string name="action_mode_done" msgid="7217581640461922289">"Fine"</string>
- <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Smontaggio dell\'archivio USB in corso..."</string>
- <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Smontaggio scheda SD in corso..."</string>
- <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Cancellazione dell\'archivio USB in corso..."</string>
- <string name="progress_erasing" product="default" msgid="2115214724367534095">"Cancellazione scheda SD in corso..."</string>
+ <string name="progress_unmounting" product="nosdcard" msgid="535863554318797377">"Smontaggio dell\'archivio USB..."</string>
+ <string name="progress_unmounting" product="default" msgid="5556813978958789471">"Smontaggio scheda SD..."</string>
+ <string name="progress_erasing" product="nosdcard" msgid="4183664626203056915">"Cancellazione dell\'archivio USB..."</string>
+ <string name="progress_erasing" product="default" msgid="2115214724367534095">"Cancellazione scheda SD..."</string>
<string name="format_error" product="nosdcard" msgid="6299769563624776948">"Cancellazione archivio USB non riuscita."</string>
<string name="format_error" product="default" msgid="7315248696644510935">"Cancellazione scheda SD non riuscita."</string>
<string name="media_bad_removal" msgid="7960864061016603281">"La scheda SD è stata rimossa prima che fosse smontata."</string>
- <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Controllo dell\'archivio USB in corso."</string>
- <string name="media_checking" product="default" msgid="7334762503904827481">"Controllo della scheda SD in corso."</string>
+ <string name="media_checking" product="nosdcard" msgid="418188720009569693">"Controllo dell\'archivio USB..."</string>
+ <string name="media_checking" product="default" msgid="7334762503904827481">"Controllo della scheda SD..."</string>
<string name="media_removed" msgid="7001526905057952097">"La scheda SD è stata rimossa."</string>
<string name="media_shared" product="nosdcard" msgid="5830814349250834225">"L\'archivio USB è attualmente utilizzato da un computer."</string>
<string name="media_shared" product="default" msgid="5706130568133540435">"La scheda SD è attualmente utilizzata da un computer."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 232232c..869f971 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -28,7 +28,7 @@
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="7670819340156489359">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="6071602020171759109">"<ללא כותרת>"</string>
- <string name="ellipsis" msgid="7899829516048813237">"???"</string>
+ <string name="ellipsis" msgid="7899829516048813237">"..."</string>
<string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(אין מספר טלפון)"</string>
<string name="unknownName" msgid="2277556546742746522">"(לא ידוע)"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 9e6e8b8..025be8c 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -665,16 +665,11 @@
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"SIMカードを挿入してください。"</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="7138450788301444298">"SIMカードが見つからないか読み取れません。SIMカードを挿入してください。"</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"お使いのSIMカードは永久に無効となっています。"\n"ワイヤレスサービスプロバイダに問い合わせて新しいSIMカードを入手してください。"</string>
- <!-- no translation found for lockscreen_transport_prev_description (201594905152746886) -->
- <skip />
- <!-- no translation found for lockscreen_transport_next_description (6089297650481292363) -->
- <skip />
- <!-- no translation found for lockscreen_transport_pause_description (7659088786780128001) -->
- <skip />
- <!-- no translation found for lockscreen_transport_play_description (5888422938351019426) -->
- <skip />
- <!-- no translation found for lockscreen_transport_stop_description (4562318378766987601) -->
- <skip />
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"前のトラックボタン"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"次のトラックボタン"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"一時停止ボタン"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"再生ボタン"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"停止ボタン"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"緊急通報のみ"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"ネットワークがロックされました"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIMカードはPUKでロックされています。"</string>
@@ -704,14 +699,10 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"ロック解除"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"サウンドON"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"サウンドOFF"</string>
- <!-- no translation found for lockscreen_access_pattern_start (3941045502933142847) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cleared (5583479721001639579) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cell_added (6756031208359292487) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_detected (4988730895554057058) -->
- <skip />
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"パターンの描画を開始しました"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"パターンを消去しました"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"セルを追加しました"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"パターンの描画が完了しました"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -904,8 +895,8 @@
<string name="chooseUsbActivity" msgid="7892597146032121735">"USBデバイス用アプリケーションを選択"</string>
<string name="noApplications" msgid="1691104391758345586">"この操作を実行できるアプリケーションはありません。"</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
- <string name="aerr_application" msgid="932628488013092776">"申し訳ありませんが、<xliff:g id="APPLICATION">%1$s</xliff:g>は停止しました。"</string>
- <string name="aerr_process" msgid="4507058997035697579">"申し訳ありませんが、プロセス「<xliff:g id="PROCESS">%1$s</xliff:g>」が停止しました。"</string>
+ <string name="aerr_application" msgid="932628488013092776">"問題が発生したため、<xliff:g id="APPLICATION">%1$s</xliff:g>を終了します。"</string>
+ <string name="aerr_process" msgid="4507058997035697579">"問題が発生したため、プロセス「<xliff:g id="PROCESS">%1$s</xliff:g>」を終了します。"</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="8339738283149696827">"<xliff:g id="APPLICATION">%2$s</xliff:g>は応答していません。"\n\n"このアプリケーションを終了しますか?"</string>
<string name="anr_activity_process" msgid="7018289416670457797">"操作「<xliff:g id="ACTIVITY">%1$s</xliff:g>」は応答していません。"\n\n"この操作を終了しますか?"</string>
@@ -950,7 +941,7 @@
<string name="volume_icon_description_media" msgid="4217311719665194215">"メディアの音量"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"通知音量"</string>
<string name="ringtone_default" msgid="3789758980357696936">"プリセット着信音"</string>
- <string name="ringtone_default_with_actual" msgid="8129563480895990372">"端末の基本着信音(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_default_with_actual" msgid="8129563480895990372">"端末の基本着信音(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="4440324407807468713">"サイレント"</string>
<string name="ringtone_picker_title" msgid="3515143939175119094">"着信音"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"不明な着信音"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 95fbeeb..ea4c6cc 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -462,12 +462,12 @@
<string name="permdesc_changeWifiState" msgid="2950383153656873267">"애플리케이션이 Wi-Fi 액세스포인트에 연결하거나 연결을 끊고, 구성된 Wi-Fi 네트워크를 변경할 수 있도록 합니다."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi 멀티캐스트 수신 허용"</string>
<string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"애플리케이션이 휴대기기로 직접 주소가 지정되지 않은 패킷을 받을 수 있도록 합니다. 이 기능은 가까운 곳에서 제공되는 서비스를 검색할 때 유용하며 비멀티캐스트 모드보다 전원을 더 많이 소비합니다."</string>
- <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"Bluetooth 관리"</string>
+ <string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"블루투스 관리"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"애플리케이션이 로컬 블루투스 태블릿을 구성한 다음 원격 기기를 검색하여 페어링할 수 있도록 합니다."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"애플리케이션이 로컬 Bluetooth 휴대전화를 구성한 다음 원격 장치를 검색하여 페어링할 수 있도록 합니다."</string>
- <string name="permlab_bluetooth" msgid="8361038707857018732">"Bluetooth 연결 만들기"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"애플리케이션이 로컬 블루투스 휴대전화를 구성한 다음 원격 장치를 검색하여 페어링할 수 있도록 합니다."</string>
+ <string name="permlab_bluetooth" msgid="8361038707857018732">"블루투스 연결 만들기"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"애플리케이션이 로컬 블루투스 태블릿의 구성을 보고 페어링된 장치에 연결하며 연결을 수락할 수 있도록 합니다."</string>
- <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"애플리케이션이 로컬 Bluetooth 전화의 구성을 보고 페어링된 장치에 연결하며 연결을 수락할 수 있도록 합니다."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"애플리케이션이 로컬 블루투스 전화의 구성을 보고 페어링된 장치에 연결하며 연결을 수락할 수 있도록 합니다."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"NFC(Near Field Communication) 제어"</string>
<string name="permdesc_nfc" msgid="9171401851954407226">"애플리케이션에서 NFC(Near Field Communication) 태그, 카드 및 리더와 통신할 수 있습니다."</string>
<string name="permlab_disableKeyguard" msgid="4977406164311535092">"키 잠금 사용 중지"</string>
@@ -699,10 +699,10 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"잠금해제"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"사운드 켜기"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"사운드 끄기"</string>
- <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"패턴 시작됨"</string>
- <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"패턴 삭제됨"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"패턴 시작"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"패턴 삭제"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"셀 추가됨"</string>
- <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"패턴 완료됨"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"패턴 완료"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -886,8 +886,8 @@
<string name="no" msgid="5141531044935541497">"취소"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"주의"</string>
<string name="loading" msgid="1760724998928255250">"로드 중..."</string>
- <string name="capital_on" msgid="1544682755514494298">"사용"</string>
- <string name="capital_off" msgid="6815870386972805832">"사용 안함"</string>
+ <string name="capital_on" msgid="1544682755514494298">"ON"</string>
+ <string name="capital_off" msgid="6815870386972805832">"OFF"</string>
<string name="whichApplication" msgid="4533185947064773386">"작업을 수행할 때 사용하는 애플리케이션"</string>
<string name="alwaysUse" msgid="4583018368000610438">"이 작업에 대해 기본값으로 사용"</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"홈 설정 > 애플리케이션 > 애플리케이션 관리에서 기본값을 지웁니다."</string>
@@ -928,10 +928,10 @@
<string name="sendText" msgid="5132506121645618310">"텍스트에 대한 작업 선택"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"벨소리 볼륨"</string>
<string name="volume_music" msgid="5421651157138628171">"미디어 볼륨"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth를 통해 재생"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"블루투스를 통해 재생"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="6158339745293431194">"고주파 벨소리 선택"</string>
<string name="volume_call" msgid="3941680041282788711">"통화 볼륨"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth 통화 볼륨"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"블루투스 통화 볼륨"</string>
<string name="volume_alarm" msgid="1985191616042689100">"알람 볼륨"</string>
<string name="volume_notification" msgid="2422265656744276715">"알림 볼륨"</string>
<string name="volume_unknown" msgid="1400219669770445902">"볼륨"</string>
diff --git a/core/res/res/values-mcc208-mnc10/config.xml b/core/res/res/values-mcc208-mnc10/config.xml
new file mode 100755
index 0000000..99cc599
--- /dev/null
+++ b/core/res/res/values-mcc208-mnc10/config.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2009, 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 my 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.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Array of ConnectivityManager.TYPE_xxxx values allowable for tethering -->
+ <!-- Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or
+ <!== [0,1,5,7] for TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI and TYPE_BLUETOOTH -->
+ <integer-array translatable="false" name="config_tether_upstream_types">
+ <item>1</item>
+ <item>4</item>
+ </integer-array>
+
+ <!-- String containing the apn value for tethering. May be overriden by secure settings
+ TETHER_DUN_APN. Value is a comma separated series of strings:
+ "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type"
+ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" -->
+ <string translatable="false" name="config_tether_apndata">SFR Option Modem,websfr,,,,,,,,,208,10,,DUN"</string>
+
+</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 8ab8262..bc53220 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -183,7 +183,7 @@
<string name="permlab_statusBar" msgid="7417192629601890791">"deaktivere eller endre statusfeltet"</string>
<string name="permdesc_statusBar" msgid="1365473595331989732">"Lar applikasjonen deaktivere statusfeltet, samt legge til og fjerne systemikoner."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"statusrad"</string>
- <string name="permdesc_statusBarService" msgid="4097605867643520920">"Tillater programmet å vises i statusfeltet."</string>
+ <string name="permdesc_statusBarService" msgid="4097605867643520920">"Tillater appen å vises i statusfeltet."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"utvide/slå sammen statusfeltet"</string>
<string name="permdesc_expandStatusBar" msgid="7088604400110768665">"Lar applikasjonen utvide eller slå sammen statusfeltet."</string>
<string name="permlab_processOutgoingCalls" msgid="1136262550878335980">"avskjære utgående anrop"</string>
@@ -199,17 +199,17 @@
<string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"send tekstmeldinger uten godkjenning"</string>
<string name="permdesc_sendSmsNoConfirmation" msgid="4477752891276276168">"Gir applikasjonen tillatelse til å sende tekstmeldinger. Skadelige applikasjoner kan sende meldinger uten din godkjennelse, som du må betale for."</string>
<string name="permlab_readSms" msgid="4085333708122372256">"lese SMS- og MMS-meldinger"</string>
- <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Lar programmet lese tekstmeldinger lagret på nettbrettet eller SIM-kortet. Skadelige programmer kan få tilgang til å lese dine private meldinger."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="5836710350295631545">"Lar appen lese tekstmeldinger lagret på nettbrettet eller SIM-kortet. Skadelige apper kan få tilgang til å lese dine private meldinger."</string>
<string name="permdesc_readSms" product="default" msgid="3002170087197294591">"Lar applikasjonen lese SMS-meldinger lagret i telefonen eller på SIM-kortet. Ondsinnede applikasjoner kan lese private meldinger."</string>
<string name="permlab_writeSms" msgid="6881122575154940744">"redigere SMS- og MMS-meldinger"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Lar programmet skrive tekstmeldinger lagret på nettbrettet eller SIM-kortet. Skadelige programmer kan komme til å slette meldingene dine."</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5332124772918835437">"Lar appen skrive tekstmeldinger lagret på nettbrettet eller SIM-kortet. Skadelige apper kan komme til å slette meldingene dine."</string>
<string name="permdesc_writeSms" product="default" msgid="6299398896177548095">"Lar applikasjonen skrive til SMS-meldinger lagret i telefonen eller på SIM-kortet. Ondsinnede applikasjoner kan slette meldinger."</string>
<string name="permlab_receiveWapPush" msgid="8258226427716551388">"motta WAP"</string>
<string name="permdesc_receiveWapPush" msgid="5979623826128082171">"Lar applikasjonen motta og behandle WAP-meldinger. Ondsinnede applikasjoner kan overvåke meldinger eller slette dem uten at de vises."</string>
<string name="permlab_getTasks" msgid="5005277531132573353">"se kjørende applikasjoner"</string>
- <string name="permdesc_getTasks" msgid="7048711358713443341">"Tillater applikasjonen å hente informasjon om aktive og nylig kjørte programmer. Kan tillate ondsinnede applikasjoner å oppdage privat informasjon om andre applikasjoner."</string>
+ <string name="permdesc_getTasks" msgid="7048711358713443341">"Tillater applikasjonen å hente informasjon om aktive og nylig kjørte apper. Kan tillate ondsinnede applikasjoner å oppdage privat informasjon om andre applikasjoner."</string>
<string name="permlab_reorderTasks" msgid="5669588525059921549">"omordne kjørende applikasjoner"</string>
- <string name="permdesc_reorderTasks" msgid="126252774270522835">"Tillater applikasjonen å flytte programmer til forgrunnen eller bakgrunnen. Ondsinnede applikasjoner kan tvinge seg selv til fronten."</string>
+ <string name="permdesc_reorderTasks" msgid="126252774270522835">"Tillater applikasjonen å flytte apper til forgrunnen eller bakgrunnen. Ondsinnede applikasjoner kan tvinge seg selv til fronten."</string>
<string name="permlab_removeTasks" msgid="4802740047161700683">"stopp kjøring av applikasjoner"</string>
<string name="permdesc_removeTasks" msgid="2000332928514575461">"Gjør applikasjoner i stand til å fjerne og ødelegge for oppgaver. Skadelige applikasjoner kan forstyrre oppførselen til andre applikasjoner."</string>
<string name="permlab_setDebugApp" msgid="4339730312925176742">"aktiver applikasjonsdebugging"</string>
@@ -220,7 +220,7 @@
<string name="permdesc_enableCarMode" msgid="5673461159384850628">"Tillater applikasjoner å aktivere bilmodus."</string>
<string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"avslutt bakgrunnsprosesser"</string>
<string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Tillater applikasjoner å avslutte bakgrunnsprosesser for andre applikasjoner, selv om det er nok minne."</string>
- <string name="permlab_forceStopPackages" msgid="1447830113260156236">"fremtving stopp av andre programmer"</string>
+ <string name="permlab_forceStopPackages" msgid="1447830113260156236">"fremtving stopp av andre apper"</string>
<string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Tillater applikasjoner å tvinge andre applikasjoner til å stoppe."</string>
<string name="permlab_forceBack" msgid="1804196839880393631">"tvinge applikasjoner til å lukkes"</string>
<string name="permdesc_forceBack" msgid="6534109744159919013">"Lar applikasjonen tvinge enhver aktivitet som er i forgrunnen til å lukkes og gå tilbake. Vanlige applikasjoner bør aldri trenge dette."</string>
@@ -233,7 +233,7 @@
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"forhindre applikasjonsbytte"</string>
<string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Lar applikasjonen forhindre brukeren fra å bytte til en annen applikasjon."</string>
<string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"overvåke og kontrollere all applikasjonsoppstart"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Lar programmet overvåke og kontrollere hvordan systemet starter opp aktiviteter. Skadelig programvare kan gjøre hele systemet usikkert. Denne tillatelsen er kun nødvendig for utviklere, aldri for vanlig bruk."</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="2149363027173451218">"Lar appen overvåke og kontrollere hvordan systemet starter opp aktiviteter. Skadelig programvare kan gjøre hele systemet usikkert. Denne tillatelsen er kun nødvendig for utviklere, aldri for vanlig bruk."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"kringkaste melding om fjernet pakke"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Lar applikasjonen kringkaste en melding om at en applikasjonspakke er blitt fjernet. Ondsinnede applikasjoner kan bruke dette til å drepe vilkårlige andre kjørende applikasjoner."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"kringkaste melding om mottatt SMS"</string>
@@ -246,20 +246,20 @@
<string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"Lar applikasjonen kontrollere om aktiviteter alltid avsluttes når de sendes til bakgrunnen. Behøves aldri for vanlige applikasjoner."</string>
<string name="permlab_batteryStats" msgid="7863923071360031652">"endre batteristatistikk"</string>
<string name="permdesc_batteryStats" msgid="5847319823772230560">"Lar applikasjonen endre på innsamlet batteristatistikk. Ikke ment for vanlige applikasjoner."</string>
- <string name="permlab_backup" msgid="470013022865453920">"kontrollere backup og gjenoppretting"</string>
- <string name="permdesc_backup" msgid="4837493065154256525">"Lar applikasjonen kontrollere systemets backup- og gjenopprettingsmekanisme. Ikke ment for vanlige applikasjoner."</string>
- <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"bekreft en fullstendig sikkerhetskopi, eller gjenopprett driften"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"kontrollere sikkerhetskopiering og gjenoppretting"</string>
+ <string name="permdesc_backup" msgid="4837493065154256525">"Lar appen kontrollere systemets sikkerhetskopierings- og gjenopprettingsmekanisme. Ikke ment for vanlige apper."</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"bekrefte en fullstendig sikkerhetskopi, eller gjenopprette driften"</string>
<string name="permdesc_confirm_full_backup" msgid="9005017754175897954">"Lar appen starte det fullst. grensesnittet for bekreftelse av sikkerh.kopi. Må ikke brukes av noen apper."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"vis uautoriserte vinduer"</string>
<string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillater at det opprettes vinduer ment for bruk av systemets interne brukergrensesnitt. Ikke ment for vanlige applikasjoner."</string>
<string name="permlab_systemAlertWindow" msgid="3372321942941168324">"vise advarsler på systemnivå"</string>
- <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Lar programmet vise systemvarslingsvinduer. Skadelige programmer kan ta over hele skjermen."</string>
+ <string name="permdesc_systemAlertWindow" msgid="2884149573672821318">"Lar appen vise systemvarslingsvinduer. Skadelige apper kan ta over hele skjermen."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"endre global animasjonshastighet"</string>
<string name="permdesc_setAnimationScale" msgid="7181522138912391988">"Lar applikasjonen endre den globale animasjonshastigheten (raskere eller tregere animasjoner) når som helst."</string>
<string name="permlab_manageAppTokens" msgid="17124341698093865">"styre applikasjonssymboler"</string>
<string name="permdesc_manageAppTokens" msgid="977127907524195988">"Lar applikasjoner lage og vedlikeholde sine egne symboler, noe som lar dem overstyre den vanlige Z-ordningen. Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"trykke taster og kontrolknapper"</string>
- <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Lar programmet levere sine egne inndatahendelser (tastetrykk osv.) til andre programmer. Skadelige programmer kan bruke dette til å ta over nettbrettet."</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="7200014808195664505">"Lar appen levere sine egne inndatahendelser (tastetrykk osv.) til andre apper. Skadelige apper kan bruke dette til å ta over nettbrettet."</string>
<string name="permdesc_injectEvents" product="default" msgid="3946098050410874715">"Lar applikasjonen levere sine egne inndatahendelser (tastetrykk osv.) til andre applikasjoner. Ondsinnede applikasjoner kan bruke dette til å ta over telefonen."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"ta opp hva som skrives og gjøres"</string>
<string name="permdesc_readInputState" msgid="5132879321450325445">"Lar applikasjoner overvåke tastetrykk selv når interaksjonen er med andre applikasjoner (som å skrive inn et passord). Vanlige applikasjoner bør aldri trenge dette."</string>
@@ -270,11 +270,11 @@
<string name="permlab_bindVpnService" msgid="4708596021161473255">"binde deg til en VPN-tjeneste"</string>
<string name="permdesc_bindVpnService" msgid="6011554199384584151">"Lar innehaveren binde seg til det øverste nivået av grensesnittet for en VPN-tjeneste. Skal aldri være nødvendig for normale apper."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"bind til bakgrunnsbilde"</string>
- <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Lar innehaveren binde det øverste nivået av grensesnittet til en bakgrunnsbilder. Skal ikke være nødvendig for vanlige programmer."</string>
+ <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Lar innehaveren binde det øverste nivået av grensesnittet til en bakgrunnsbilder. Skal ikke være nødvendig for vanlige apper."</string>
<string name="permlab_bindRemoteViews" msgid="5697987759897367099">"bind til modultjenste"</string>
- <string name="permdesc_bindRemoteViews" msgid="2930855984822926963">"Lar innehaveren binde til det øverste nivået av grensesnittet for en modultjeneste. Skal aldri være nødvendig for normale programmer."</string>
+ <string name="permdesc_bindRemoteViews" msgid="2930855984822926963">"Lar innehaveren binde til det øverste nivået av grensesnittet for en modultjeneste. Skal aldri være nødvendig for normale apper."</string>
<string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommuniser med enhetsadministrator"</string>
- <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillater innehaveren å sende hensikter til enhetsadministrator. Bør aldri være nødvendig for normale programmer."</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillater innehaveren å sende hensikter til enhetsadministrator. Bør aldri være nødvendig for normale apper."</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"snu skjermen"</string>
<string name="permdesc_setOrientation" msgid="6335814461615851863">"Lar applikasjonen rotere skjermen når som helst. Vanlige applikasjoner bør aldri trenge dette."</string>
<string name="permlab_setPointerSpeed" msgid="9175371613322562934">"endre pekerhastighet"</string>
@@ -294,13 +294,13 @@
<string name="permlab_installPackages" msgid="335800214119051089">"installere applikasjoner direkte"</string>
<string name="permdesc_installPackages" msgid="526669220850066132">"Lar applikasjonen installere nye eller oppdaterte Android-pakker. Ondsinnede applikasjoner kan bruke dette til å legge til nye applikasjoner med vilkårlig kraftige rettigheter."</string>
<string name="permlab_clearAppCache" msgid="4747698311163766540">"slette hurtigbufferdata for alle applikasjoner"</string>
- <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Lar programmet frigjøre lagringsplass på nettbrettet ved å slette filer fra programmets buffermappe. Tilgangen er svært begrenset, vanligvis til systemprosessen."</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="3097119797652477973">"Lar appen frigjøre lagringsplass på nettbrettet ved å slette filer fra appens buffermappe. Tilgangen er svært begrenset, vanligvis til systemprosessen."</string>
<string name="permdesc_clearAppCache" product="default" msgid="7740465694193671402">"Lar applikasjonen frigjøre lagringsplass ved å slette filer i applikasjoners hurtigbufferkatalog. Tilgangen er vanligvis sterkt begrenset, til systemprosesser."</string>
<string name="permlab_movePackage" msgid="728454979946503926">"Flytter programressurser"</string>
<string name="permdesc_movePackage" msgid="6323049291923925277">"Gir applikasjoner tillatelse til å flytte applikasjonsressurser fra interne til eksterne medier og omvendt."</string>
- <string name="permlab_readLogs" msgid="6615778543198967614">"les sensitive loggdata"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Lar programmet lese fra diverse loggfiler på systemet. Disse inneholder generell informasjon om hva som gjøres med nettbrettet, og kan inneholde personlig eller privat informasjon."</string>
- <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Lar programmet lese fra diverse loggfiler på systemet. Disse inneholder generell informasjon om hva som gjøres med telefonen, og kan inneholde personlig eller privat informasjon."</string>
+ <string name="permlab_readLogs" msgid="6615778543198967614">"lese sensitive loggdata"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="4077356893924755294">"Lar appen lese fra diverse loggfiler på systemet. Disse inneholder generell informasjon om hva som gjøres med nettbrettet, og kan inneholde personlig eller privat informasjon."</string>
+ <string name="permdesc_readLogs" product="default" msgid="8896449437464867766">"Lar appen lese fra diverse loggfiler på systemet. Disse inneholder generell informasjon om hva som gjøres med telefonen, og kan inneholde personlig eller privat informasjon."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"lese/skrive ressurser eid av diag"</string>
<string name="permdesc_diagnostic" msgid="3121238373951637049">"Lar applikasjonen lese og skrive enhver ressurs eid av gruppen diag; for eksempel, filer i /dev. Dette kan potensielt påvirke systemets sikkerhet og stabilitet. Dette bør KUN brukes for maskinvarespesifikke diagnoseverktøy laget av operatøren eller produsenten."</string>
<string name="permlab_changeComponentState" msgid="79425198834329406">"aktivere eller deaktigere applikasjonskomponenter"</string>
@@ -311,20 +311,20 @@
<string name="permlab_writeSettings" msgid="1365523497395143704">"endre globale systeminnstillinger"</string>
<string name="permdesc_writeSettings" msgid="838789419871034696">"Lar applikasjonen endre systemets innstillingsdata. Ondsinnede applikasjoner kan skade systemets innstillinger."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"endre sikre systeminnstillinger"</string>
- <string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"Gir programmet tillatelse til å endre systemets data for sikkerhetsinnstilling. Ikke ment for vanlige programmer."</string>
+ <string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"Gir appen tillatelse til å endre systemets data for sikkerhetsinnstilling. Ikke ment for vanlige apper."</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"redigere Google-tjenestekartet"</string>
<string name="permdesc_writeGservices" msgid="6602362746516676175">"Lar applikasjonen redigere Google-tjenestekartet. Ikke ment for bruk av vanlige applikasjoner."</string>
<string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"starte automatisk sammen med systemet"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Lar programmet starte seg selv så snart systemet er ferdig med oppstarten. Dette kan føre til lenger oppstartstid for nettbrettet, i tillegg til at enheten kan bli tregere generelt av at programmet alltid kjører."</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7530977064379338199">"Lar appen starte seg selv så snart systemet er ferdig med oppstarten. Dette kan føre til lenger oppstartstid for nettbrettet, i tillegg til at enheten kan bli tregere generelt av at appen alltid kjører."</string>
<string name="permdesc_receiveBootCompleted" product="default" msgid="698336728415008796">"Lar applikasjonen sette opp at den selv skal starte så fort systemet er ferdig med å slå seg på. Dette kan gjøre at det tar lengre tid å starte telefonen, og at den kan bli tregere fordi applikasjonen alltid kjører."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"sende varige kringkastinger"</string>
- <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Lar programmet sende hengende kringkastinger (sticky broadcasts) som blir værende etter at kringkastingen er over. Skadelige programmer kan gjøre nettbrettet tregt eller ustabilt ved å bruke for mye minne."</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="6322249605930062595">"Lar appen sende hengende kringkastinger (sticky broadcasts) som blir værende etter at kringkastingen er over. Skadelige apper kan gjøre nettbrettet tregt eller ustabilt ved å bruke for mye minne."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="1920045289234052219">"Lar applikasjonen sende varige kringkastinger, som forblir på systemet etter at kringkastingen er avsluttet. Ondsinnede applikasjoner kan gjøre telefonen treg eller ustabil ved å få den til å bruke for mye minne."</string>
<string name="permlab_readContacts" msgid="6219652189510218240">"lese kontaktinformasjon"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Lar programmet lese all kontaktinformasjon (adresser) lagret på telefonen. Skadelige programmet kan bruke dette til å sende personlige data til andre."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="7596158687301157686">"Lar appen lese all kontaktinformasjon (adresser) lagret på telefonen. Skadelige appen kan bruke dette til å sende personlige data til andre."</string>
<string name="permdesc_readContacts" product="default" msgid="3371591512896545975">"Lar applikasjonen lese all kontakt- og adresseinformasjon lagret på telefonen. Ondsinnede applikasjoner kan bruke dette til å sende personlige data til andre."</string>
<string name="permlab_writeContacts" msgid="644616215860933284">"skrive kontaktinformasjon"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Lar programmet endre kontaktinformasjon (adresser) lagret på nettbrettet. Skadelige programmet kan bruke dette til å slette eller endre kontaktinformasjonen."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="7782689510038568495">"Lar appen endre kontaktinformasjon (adresser) lagret på nettbrettet. Skadelige appen kan bruke dette til å slette eller endre kontaktinformasjonen."</string>
<string name="permdesc_writeContacts" product="default" msgid="3924383579108183601">"Lar applikasjonen endre kontakt- og adresseinformasjon lagret på telefonen. Ondsinnede applikasjoner kan bruke dette til å redigere eller endre kontaktinformasjonen."</string>
<string name="permlab_readProfile" msgid="6824681438529842282">"lese profildataene dine"</string>
<string name="permdesc_readProfile" product="default" msgid="6335739730324727203">"Gir applikasjonen tillatelse til å lese personlig profilinformasjon lagret på enheten, for eksempel navn og kontaktinformasjon. Dette betyr at applikasjonen kan identifisere deg og sende din profilinformasjon til andre."</string>
@@ -346,49 +346,49 @@
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"installere posisjonskilder"</string>
<string name="permdesc_installLocationProvider" msgid="5449175116732002106">"Lar applikasjonen lage manuelle plasseringskilder for testing. Ondsinnede applikasjoner kan bruke dette til å overstyre plasseringen og/eller statusen rapportert av ekte plasseringskilder slik som GPS eller nettverksoperatører, eller overvåke og rapportere plasseringen din til en tredjepart."</string>
<string name="permlab_accessFineLocation" msgid="8116127007541369477">"nøyaktig (GPS-) posisjon"</string>
- <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Få tilgang til nøyaktige posisjonskilder, som for eksempel Global Positioning System (GPS) på nettbrettet der dette er tilgjengelig. Skadelige programmer kan bruke dette til å finne ut hvor du er, og kan også bruke mer batteri."</string>
+ <string name="permdesc_accessFineLocation" product="tablet" msgid="243973693233359681">"Få tilgang til nøyaktige posisjonskilder, som for eksempel Global Positioning System (GPS) på nettbrettet der dette er tilgjengelig. Skadelige apper kan bruke dette til å finne ut hvor du er, og kan også bruke mer batteri."</string>
<string name="permdesc_accessFineLocation" product="default" msgid="7411213317434337331">"Få tilgang til nøyaktige posisjonskilder som Global Positioning System (GPS) på telefonen, når det er tilgjengelig. Ondsinnede applikasjoner kan bruke dette til å finne ut hvor du er, og kan bruke mer batteri."</string>
<string name="permlab_accessCoarseLocation" msgid="4642255009181975828">"grov (nettverksbasert) posisjon"</string>
- <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Få tilgang til grovinnstilte posisjonskilder, som for eksempel databasen over basestasjoner, for å finne nettbrettets omtrentlige posisjon der dette er tilgjengelig. Skadelige programmer kan bruke dette til å finne ut omtrent hvor du er."</string>
+ <string name="permdesc_accessCoarseLocation" product="tablet" msgid="3704633168985466045">"Få tilgang til grovinnstilte posisjonskilder, som for eksempel databasen over basestasjoner, for å finne nettbrettets omtrentlige posisjon der dette er tilgjengelig. Skadelige apper kan bruke dette til å finne ut omtrent hvor du er."</string>
<string name="permdesc_accessCoarseLocation" product="default" msgid="8235655958070862293">"Få tilgang til grove posisjonskilder som databasen over basestasjoner til å finne ut omtrent hvor telefonen er, når det er tilgjengelig. Ondsinnede applikasjoner kan bruke dette til å finne ut omtrent hvor du er."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"få tilgang til SurfaceFlinger"</string>
<string name="permdesc_accessSurfaceFlinger" msgid="6805241830020733025">"Lar applikasjonen bruke lavnivåfunksjonalitet i SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"lese skjermbufferet"</string>
- <string name="permdesc_readFrameBuffer" msgid="7530020370469942528">"Tillater at programmet leser innholdet av rammebufferen."</string>
+ <string name="permdesc_readFrameBuffer" msgid="7530020370469942528">"Tillater at appen leser innholdet av rammebufferen."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"endre lydinnstillinger"</string>
<string name="permdesc_modifyAudioSettings" msgid="5793461287365991922">"Lar applikasjonen endre globale lydinnstillinger som volum og ruting."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ta opp lyd"</string>
<string name="permdesc_recordAudio" msgid="6493228261176552356">"Gir applikasjonen tilgang til opptaksstien for lyd."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ta bilder og videoer"</string>
- <string name="permdesc_camera" msgid="6004878235852154239">"Tillat programmet å ta bilder og videoer med kameraet. Programmet kan dermed til enhver tid samle inn bilder som kameraet fanger inn."</string>
+ <string name="permdesc_camera" msgid="6004878235852154239">"Tillat programmet å ta bilder og videoer med kameraet. Appen kan dermed til enhver tid samle inn bilder som kameraet fanger inn."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"deaktiver nettbrett permanent"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"deaktivere telefonen permanent"</string>
- <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Lar programmet deaktivere hele nettbrettet permanent. Dette er veldig farlig."</string>
+ <string name="permdesc_brick" product="tablet" msgid="7379164636920817963">"Lar appen deaktivere hele nettbrettet permanent. Dette er veldig farlig."</string>
<string name="permdesc_brick" product="default" msgid="5569526552607599221">"Lar applikasjonen deaktivere hele telefonen permanent. Dette er svært farlig."</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"tvungen omstart av nettbrettet"</string>
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"tvinge omstart av telefon"</string>
- <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Lar programmet tvinge omstart av nettbrettet."</string>
+ <string name="permdesc_reboot" product="tablet" msgid="4555793623560701557">"Lar appen tvinge omstart av nettbrettet."</string>
<string name="permdesc_reboot" product="default" msgid="7914933292815491782">"Lar applikasjonen tvinge telefonen til å starte på nytt."</string>
<string name="permlab_mount_unmount_filesystems" msgid="1761023272170956541">"montere og avmontere filsystemer"</string>
<string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Lar applikasjonen montere og avmontere filsystemer for uttagbar lagring."</string>
<string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatere ekstern lagringsplass"</string>
<string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Lar applikasjonen formatere ekstern lagringsplass."</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"få informasjon om intern lagring"</string>
- <string name="permdesc_asec_access" msgid="8820326551687285439">"Tillater programmet å innhente informasjon om intern lagring."</string>
+ <string name="permdesc_asec_access" msgid="8820326551687285439">"Tillater appen å innhente informasjon om intern lagring."</string>
<string name="permlab_asec_create" msgid="6414757234789336327">"opprett intern lagring"</string>
- <string name="permdesc_asec_create" msgid="2621346764995731250">"Tillater programmet å opprette intern lagring."</string>
+ <string name="permdesc_asec_create" msgid="2621346764995731250">"Tillater appen å opprette intern lagring."</string>
<string name="permlab_asec_destroy" msgid="526928328301618022">"slett intern lagring"</string>
- <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Tillater programmet å stenge intern lagring."</string>
+ <string name="permdesc_asec_destroy" msgid="2746706889208066256">"Tillater appen å stenge intern lagring."</string>
<string name="permlab_asec_mount_unmount" msgid="2456287623689029744">"koble til eller fra intern lagring"</string>
- <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Tillater programmet å koble intern lagring til eller fra."</string>
+ <string name="permdesc_asec_mount_unmount" msgid="5934375590189368200">"Tillater appen å koble intern lagring til eller fra."</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"gi nytt navn til intern lagring"</string>
- <string name="permdesc_asec_rename" msgid="2152829985238876790">"Tillater programmet å gi nytt navn til intern lagring."</string>
+ <string name="permdesc_asec_rename" msgid="2152829985238876790">"Tillater appen å gi nytt navn til intern lagring."</string>
<string name="permlab_vibrate" msgid="7768356019980849603">"kontrollere vibratoren"</string>
<string name="permdesc_vibrate" msgid="2886677177257789187">"Lar applikasjonen kontrollere vibratoren."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"kontrollere lommelykten"</string>
<string name="permdesc_flashlight" msgid="6433045942283802309">"Lar applikasjonen kontrollere lommelykten."</string>
<string name="permlab_manageUsb" msgid="1113453430645402723">"administrere innstillinger og tillatelser for USB-enheter"</string>
- <string name="permdesc_manageUsb" msgid="6148489202092166164">"Tillater at programmet administrerer innstillinger og tillatelser for USB-enheter."</string>
+ <string name="permdesc_manageUsb" msgid="6148489202092166164">"Tillater at appen administrerer innstillinger og tillatelser for USB-enheter."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"implementer MTP-protokoll"</string>
<string name="permdesc_accessMtp" msgid="6532961200486791570">"Tillater tilgang til kjerne-MTP-driver for implementering av MTP USB-protokollen."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"teste maskinvare"</string>
@@ -412,11 +412,11 @@
<string name="permdesc_readPhoneState" msgid="188877305147626781">"Gir applikasjonen tilgang til telefonfunksjonaliteten i enheten. En applikasjon med denne rettigheten kan finne telefonens telefonnummer og seriellnummer, om en samtale er aktiv, nummeret det ringes til og lignende."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"hindre nettbrettet fra å gå over til sovemodus"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"forhindre telefonen fra å sove"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Lar programmet hindre nettbrettet fra å gå over til sovemodus."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="4032181488045338551">"Lar appen hindre nettbrettet fra å gå over til sovemodus."</string>
<string name="permdesc_wakeLock" product="default" msgid="7584036471227467099">"Lar applikasjonen forhindre telefonen fra å gå i hvilemodus."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"slå på eller av nettbrettet"</string>
<string name="permlab_devicePower" product="default" msgid="4928622470980943206">"slå telefonen av eller på"</string>
- <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Lar programmet slå på eller av nettbrettet."</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="3853773100100451905">"Lar appen slå på eller av nettbrettet."</string>
<string name="permdesc_devicePower" product="default" msgid="4577331933252444818">"Lar applikasjonen skru telefonen av eller på."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"kjøre i fabrikktestmodus"</string>
<string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Kjør en produsenttest på lavt nivå, noe som gir fullstendig tilgang til nettbrettets maskinvare. Kun tilgjengelig når nettbrettet kjøres i produsenttestmodus."</string>
@@ -428,15 +428,15 @@
<string name="permlab_masterClear" msgid="2315750423139697397">"tilbakestille systemet til fabrikkinnstillinger"</string>
<string name="permdesc_masterClear" msgid="5033465107545174514">"Lar applikasjonen tilbakestille systemet til fabrikkinnstillinger, noe som vil fjerne alle data, alt oppsett, og alle installerte applikasjoner."</string>
<string name="permlab_setTime" msgid="2021614829591775646">"stille klokken"</string>
- <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Lar programmet stille klokken på nettbrettet."</string>
+ <string name="permdesc_setTime" product="tablet" msgid="209693136361006073">"Lar appen stille klokken på nettbrettet."</string>
<string name="permdesc_setTime" product="default" msgid="667294309287080045">"Tillater applikasjoner å stille klokken på telefonen."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"endre tidssone"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Lar programmet endre nettbrettets tidssone."</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="2522877107613885139">"Lar appen endre nettbrettets tidssone."</string>
<string name="permdesc_setTimeZone" product="default" msgid="1902540227418179364">"Lar applikasjonen endre telefonens tidssone."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"fungere som kontoadministrasjonstjenesten"</string>
<string name="permdesc_accountManagerService" msgid="6056903274106394752">"Lar applikasjoner foreta anrop til kontogodkjennere"</string>
<string name="permlab_getAccounts" msgid="4549918644233460103">"oppdage kjente kontoer"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Lar programmet få tilgang til listen over kontoer nettbrettet kjenner til."</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="857622793935544694">"Lar appen få tilgang til listen over kontoer nettbrettet kjenner til."</string>
<string name="permdesc_getAccounts" product="default" msgid="6839262446413155394">"Lar applikasjonen hente listen over kontoer telefonen kjenner til."</string>
<string name="permlab_authenticateAccounts" msgid="3940505577982882450">"fungere som en kontogodkjenner"</string>
<string name="permdesc_authenticateAccounts" msgid="4006839406474208874">"Lar applikasjoner bruke kontoadministratorens rettigheter til kontoautentisering, herunder opprette kontoer og få og angi passord."</string>
@@ -463,13 +463,13 @@
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"tillat multicast for trådløse nettverk"</string>
<string name="permdesc_changeWifiMulticastState" msgid="8199464507656067553">"Lar applikasjonen motta pakker som ikke er adressert til enheten selv. Dette kan være nyttig ved leting etter nærliggende tjenester, men bruker mer strøm enn ikke-multicast-modus."</string>
<string name="permlab_bluetoothAdmin" msgid="1092209628459341292">"Bluetooth-administrasjon"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Lar programmet konfigurere det lokale Bluetooth-nettbrettet, samt oppdage og koble sammen med eksterne enheter."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="3511795757324345837">"Lar appen konfigurere det lokale Bluetooth-nettbrettet, samt oppdage og koble sammen med eksterne enheter."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="7256289774667054555">"Lar applikasjonen konfigurere den lokale Bluetooth-telefonen, og å oppdage og pare med andre enheter."</string>
<string name="permlab_bluetooth" msgid="8361038707857018732">"opprette Bluetooth-tilkoblinger"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Lar programmet vise konfigurasjonen av det lokale Bluetooth-nettbrettet, samt opprette og akseptere tilkoblinger med sammenkoblede enheter."</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="4191941825910543803">"Lar appen vise konfigurasjonen av det lokale Bluetooth-nettbrettet, samt opprette og akseptere tilkoblinger med sammenkoblede enheter."</string>
<string name="permdesc_bluetooth" product="default" msgid="762515380679392945">"Lar applikasjonen se konfigurasjonen til den lokale Bluetooth-telefonen, og å opprette og godta tilkoblinger med parede enheter."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"kontroller overføring av data med NFC-teknologi"</string>
- <string name="permdesc_nfc" msgid="9171401851954407226">"Tillater programmet å kommunisere data via koder, kort og lesere for NFC-teknologi."</string>
+ <string name="permdesc_nfc" msgid="9171401851954407226">"Tillater appen å kommunisere data via koder, kort og lesere for NFC-teknologi."</string>
<string name="permlab_disableKeyguard" msgid="4977406164311535092">"slå av tastaturlås"</string>
<string name="permdesc_disableKeyguard" msgid="3189763479326302017">"Lar applikasjonen slå av tastaturlåsen og enhver tilknyttet passordsikkerhet. Et legitimt eksempel på dette er at telefonen slår av tastaturlåsen når den mottar et innkommende anrop, og så slår den på igjen når samtalen er over."</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"lese synkroniseringsinnstillinger"</string>
@@ -665,10 +665,10 @@
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Sett inn et SIM-kort."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="7138450788301444298">"SIM-kort mangler eller er uleselig. Sett inn et SIM-kort."</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"SIM-kortet er permanent deaktivert."\n" Ta kontakt med mobiltjenesteleverandøren din for å få et annet SIM-kort."</string>
- <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Forrige sang-knappen"</string>
- <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Neste sang-knappen"</string>
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Knapp for forrige sang"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Knapp for neste sang"</string>
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Pause-knappen"</string>
- <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Avspilling-knappen"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Avspillingsknappen"</string>
<string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Stopp-knappen"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Kun nødanrop"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Nettverk ikke tillatt"</string>
@@ -738,14 +738,14 @@
<string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"lese nettleserens logg og bokmerker"</string>
<string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Lar applikasjonen lese alle adresser nettleseren har besøkt, og alle nettleserens bokmerker."</string>
<string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skrive til nettleserens logg og bokmerker"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Lar programmet endre nettleserens logg eller bokmerker som er lagret på nettbrettet. Skadelige programmer kan bruke dette til å fjerne eller redigere nettleserens data."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="7193514090469945307">"Lar appen endre nettleserens logg eller bokmerker som er lagret på nettbrettet. Skadelige apper kan bruke dette til å fjerne eller redigere nettleserens data."</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="945571990357114950">"Lar applikasjonen endre nettleserens logg og bokmerker lagret på telefonen. Ondsinnede applikasjoner kan bruke dette til å fjerne eller redigere nettleserens data."</string>
<string name="permlab_setAlarm" msgid="5924401328803615165">"angi alarm i alarmklokke"</string>
- <string name="permdesc_setAlarm" msgid="5966966598149875082">"Lar programmet angi en alarm i et installert alarmklokkeprogram. Det kan hende at enkelte alarmklokkeprogrammer ikke implementerer denne funksjonen."</string>
+ <string name="permdesc_setAlarm" msgid="5966966598149875082">"Lar appen angi en alarm i et installert alarmklokkeprogram. Det kan hende at enkelte alarmklokkeprogrammer ikke implementerer denne funksjonen."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"legg til talepost"</string>
<string name="permdesc_addVoicemail" msgid="4828507394878206682">"Lar applikasjonen legge til meldinger i talepostinnboksen din."</string>
<string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Endre nettleserens tillatelser for geografisk posisjonering"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Tillater programmet å endre nettleserens tillatelser for geografisk posisjonering. Skadelige programmer kan bruke denne funksjonen til å sende posisjonsopplysninger til vilkårlige nettsteder."</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Tillater appen å endre nettleserens tillatelser for geografisk posisjonering. Skadelige apper kan bruke denne funksjonen til å sende posisjonsopplysninger til vilkårlige nettsteder."</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"bekreft pakker"</string>
<string name="permdesc_packageVerificationAgent" msgid="6033195477325381106">"Lar appen bekrefte om en pakke kan installeres."</string>
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"bind til en pakkeverifikator"</string>
@@ -905,21 +905,21 @@
<string name="force_close" msgid="8346072094521265605">"OK"</string>
<string name="report" msgid="4060218260984795706">"Rapportér"</string>
<string name="wait" msgid="7147118217226317732">"Vent"</string>
- <string name="launch_warning_title" msgid="8323761616052121936">"Programmet er omdirigert"</string>
+ <string name="launch_warning_title" msgid="8323761616052121936">"Appen er omdirigert"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> kjører nå."</string>
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> ble opprinnelig startet."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"Skala"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"Vis alltid"</string>
<string name="screen_compat_mode_hint" msgid="2953716574198046484">"Aktiver denne på nytt med Innstillinger > Applikasjoner > Administrer applikasjoner."</string>
- <string name="smv_application" msgid="295583804361236288">"Programmet <xliff:g id="APPLICATION">%1$s</xliff:g> (prosessen <xliff:g id="PROCESS">%2$s</xliff:g>) har brutt de selvpålagte StrictMode-retningslinjene."</string>
+ <string name="smv_application" msgid="295583804361236288">"Appen <xliff:g id="APPLICATION">%1$s</xliff:g> (prosessen <xliff:g id="PROCESS">%2$s</xliff:g>) har brutt de selvpålagte StrictMode-retningslinjene."</string>
<string name="smv_process" msgid="5120397012047462446">"Prosessen<xliff:g id="PROCESS">%1$s</xliff:g> har brutt de selvpålagte StrictMode-retningslinjene."</string>
<string name="android_upgrading_title" msgid="378740715658358071">"Android oppgraderes …"</string>
<string name="android_upgrading_apk" msgid="274409861603566003">"Optimaliserer applikasjon <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
<string name="android_upgrading_starting_apps" msgid="7959542881906488763">"Starter applikasjoner."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Ferdigstiller oppstart."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string>
- <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Velg for å bytte til programmet"</string>
- <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Bytt programmer?"</string>
+ <string name="heavy_weight_notification_detail" msgid="2423977499339403402">"Velg for å bytte til appen"</string>
+ <string name="heavy_weight_switcher_title" msgid="1135403633766694316">"Bytt apper?"</string>
<string name="heavy_weight_switcher_text" msgid="4592075610079319667">"En annen applikasjon kjører og må stoppes før du kan starte en ny applikasjon."</string>
<string name="old_app_action" msgid="493129172238566282">"Gå tilbake til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
<string name="old_app_description" msgid="942967900237208466">"Ikke start det nye programmet."</string>
@@ -999,7 +999,7 @@
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Slå av USB-lagring"</string>
<string name="usb_storage_stop_error_message" msgid="143881914840412108">"Det oppstod et problem ved deaktivering av USB-lagring. Kontroller at du har demontert USB-verten, og prøv på nytt."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Slå på USB-lagring"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Hvis du aktiverer USB-lagring, virker ikke lenger enkelte av programmene du bruker, og de kan være utilgjengelige inntil du deaktiverer USB-lagringen."</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="3202838234780505886">"Hvis du aktiverer USB-lagring, virker ikke lenger enkelte av appene du bruker, og de kan være utilgjengelige inntil du deaktiverer USB-lagringen."</string>
<string name="dlg_error_title" msgid="7323658469626514207">"USB-handling mislyktes"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"Tilkoblet som medieenhet"</string>
@@ -1045,8 +1045,8 @@
<string name="activity_list_empty" msgid="4168820609403385789">"Fant ingen tilsvarende aktiviteter"</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"oppdater statistikk over komponentbruk"</string>
<string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Tillater endring av innsamlet data om bruk av komponenter. Ikke ment for vanlige applikasjoner."</string>
- <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Tillater bruk av standard meldingsbeholdertjeneste for kopiering av innhold. Brukes ikke for normale programmer."</string>
- <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Tillater bruk av standard meldingsbeholdertjeneste for kopiering av innhold. Brukes ikke for normale programmer."</string>
+ <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Tillater bruk av standard meldingsbeholdertjeneste for kopiering av innhold. Brukes ikke for normale apper."</string>
+ <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Tillater bruk av standard meldingsbeholdertjeneste for kopiering av innhold. Brukes ikke for normale apper."</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Trykk to ganger for zoomkontroll"</string>
<string name="gadget_host_error_inflating" msgid="2613287218853846830">"Feil under oppakking av gadget"</string>
<string name="ime_action_go" msgid="8320845651737369027">"Gå"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index cf5485d..73c6c8be 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -242,7 +242,7 @@
<string name="permdesc_broadcastWapPush" msgid="3955303669461378091">"Hiermee kan een app een melding verzenden dat een WAP PUSH-bericht is ontvangen. Schadelijke apps kunnen hiervan gebruik maken om een valse MMS-ontvangst te melden of de inhoud van willekeurige webpagina\'s door schadelijke varianten te vervangen."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"aantal actieve processen beperken"</string>
<string name="permdesc_setProcessLimit" msgid="7824786028557379539">"Hiermee kan een app het maximum aantal processen bepalen dat wordt uitgevoerd. Nooit vereist voor normale apps."</string>
- <string name="permlab_setAlwaysFinish" msgid="5342837862439543783">"alle achtergrondtoepassingen sluiten"</string>
+ <string name="permlab_setAlwaysFinish" msgid="5342837862439543783">"alle achtergrondapplicaties sluiten"</string>
<string name="permdesc_setAlwaysFinish" msgid="8773936403987091620">"Hiermee kan een app bepalen of activiteiten altijd worden afgesloten zodra deze naar de achtergrond gaan. Nooit nodig voor normale apps."</string>
<string name="permlab_batteryStats" msgid="7863923071360031652">"accustatistieken aanpassen"</string>
<string name="permdesc_batteryStats" msgid="5847319823772230560">"Hiermee kunnen verzamelde accustatistieken worden gewijzigd. Niet voor gebruik door normale apps."</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 5fd6336..e317426 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -886,8 +886,8 @@
<string name="no" msgid="5141531044935541497">"Anuluj"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"Uwaga"</string>
<string name="loading" msgid="1760724998928255250">"Wczytywanie..."</string>
- <string name="capital_on" msgid="1544682755514494298">"Włącz"</string>
- <string name="capital_off" msgid="6815870386972805832">"Wyłącz"</string>
+ <string name="capital_on" msgid="1544682755514494298">"Wł."</string>
+ <string name="capital_off" msgid="6815870386972805832">"Wył."</string>
<string name="whichApplication" msgid="4533185947064773386">"Zakończ czynność korzystając z"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Używaj domyślnie dla tej czynności."</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Wyczyść domyślne w: Ustawienia strony głównej > Aplikacje > Zarządzaj aplikacjami."</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 0fcbd3f..23f7cb5 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -665,16 +665,11 @@
<string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Introduceţi un card SIM."</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="7138450788301444298">"Cartela SIM lipseşte sau nu poate fi citită. Introduceţi o cartelă SIM."</string>
<string name="lockscreen_permanent_disabled_sim_instructions" msgid="1631853574702335453">"Cartela dvs. SIM este dezactivată definitiv."\n" Contactaţi furnizorul de servicii wireless pentru a obţine o altă cartelă SIM."</string>
- <!-- no translation found for lockscreen_transport_prev_description (201594905152746886) -->
- <skip />
- <!-- no translation found for lockscreen_transport_next_description (6089297650481292363) -->
- <skip />
- <!-- no translation found for lockscreen_transport_pause_description (7659088786780128001) -->
- <skip />
- <!-- no translation found for lockscreen_transport_play_description (5888422938351019426) -->
- <skip />
- <!-- no translation found for lockscreen_transport_stop_description (4562318378766987601) -->
- <skip />
+ <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Butonul Melodia anterioară"</string>
+ <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Butonul Melodia următoare"</string>
+ <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Butonul Întrerupeţi"</string>
+ <string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Butonul Redaţi"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Butonul Opriţi"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Numai apeluri de urgenţă"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Reţea blocată"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Cardul SIM este blocat cu codul PUK."</string>
@@ -704,14 +699,10 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Deblocaţi"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sunet activat"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Sunet dezactivat"</string>
- <!-- no translation found for lockscreen_access_pattern_start (3941045502933142847) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cleared (5583479721001639579) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_cell_added (6756031208359292487) -->
- <skip />
- <!-- no translation found for lockscreen_access_pattern_detected (4988730895554057058) -->
- <skip />
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Desenarea modelului a început"</string>
+ <string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Modelul a fost şters"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Celulă adăugată"</string>
+ <string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Modelul a fost desenat"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
<string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
@@ -1178,7 +1169,7 @@
<string name="description_target_camera" msgid="969071997552486814">"Cameră foto"</string>
<string name="description_target_silent" msgid="893551287746522182">"Silenţios"</string>
<string name="description_target_soundon" msgid="30052466675500172">"Sunet activat"</string>
- <string name="keyboard_headset_required_to_hear_password" msgid="5913502399391940888">"Conectaţi un set de căşti pentru a auzi tastele apăsate la introducerea parolei rostite cu voce tare."</string>
+ <string name="keyboard_headset_required_to_hear_password" msgid="5913502399391940888">"Conectaţi un set căşti-microfon pentru a auzi tastele apăsate când introduceţi parola."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Punct."</string>
<string name="action_bar_home_description" msgid="5293600496601490216">"Navigaţi la ecranul de pornire"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Navigaţi în sus"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 0541edf..7e38edf 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -486,7 +486,7 @@
<string name="permdesc_readDictionary" msgid="1082972603576360690">"Позволяет приложению считывать любые слова, имена и фразы личного пользования, которые могут храниться в пользовательском словаре."</string>
<string name="permlab_writeDictionary" msgid="6703109511836343341">"записывать в словарь пользователя"</string>
<string name="permdesc_writeDictionary" msgid="2241256206524082880">"Позволяет приложению записывать новые слова в словарь пользователя."</string>
- <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"изм./удал. содерж. накопителя"</string>
+ <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"доступ к USB-накопителю"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"изменять/удалять содержимое SD-карты"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6594393334785738252">"Разрешает приложению запись на USB-накопитель."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="6643963204976471878">"Разрешает приложению запись на SD-карту"</string>
@@ -669,12 +669,12 @@
<string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Кнопка перехода к следующему треку"</string>
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Кнопка паузы"</string>
<string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Кнопка воспроизведения"</string>
- <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Кнопка остановки"</string>
+ <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Кнопка выключения"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"Только экстренные вызовы"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Сеть заблокирована"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-карта заблокирована с помощью кода PUK."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"См. руководство пользователя или свяжитесь со службой поддержки."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM-карта заблокирована."</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM-карта заблокирована"</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Разблокировка SIM-карты…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="3514742106066877476">"Количество неудачных попыток ввода графического ключа разблокировки: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="4906034376425175381">"Количество неудачных попыток ввода пароля: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string>
@@ -699,7 +699,7 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Разблокировать"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Вкл. звук"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Откл. звук"</string>
- <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Ввод графического ключа начался"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"Ввод графического ключа"</string>
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"Графический ключ сброшен"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Ячейка добавлена"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Графический ключ введен"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 12fac56a9..7a3ae0b 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -887,7 +887,7 @@
<string name="dialog_alert_title" msgid="2049658708609043103">"Pozor"</string>
<string name="loading" msgid="1760724998928255250">"Nalaganje ..."</string>
<string name="capital_on" msgid="1544682755514494298">"VKLOPLJENO"</string>
- <string name="capital_off" msgid="6815870386972805832">"IZKLOPLJEN"</string>
+ <string name="capital_off" msgid="6815870386972805832">"IZKLOPLJENO"</string>
<string name="whichApplication" msgid="4533185947064773386">"Dokončanje dejanja z"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Privzeta uporaba za to dejanje."</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Počistite privzete nastavitve v razdelku Osnovne nastavitve > Programi > Upravljanje programov."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index fd4955d..4446db3 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -753,7 +753,7 @@
<string name="save_password_message" msgid="767344687139195790">"คุณต้องการให้เบราว์เซอร์จำรหัสผ่านนี้หรือไม่"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"ยังไม่ใช้งานขณะนี้"</string>
<string name="save_password_remember" msgid="6491879678996749466">"จำไว้"</string>
- <string name="save_password_never" msgid="8274330296785855105">"ไม่เคย"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"ไม่ต้องเลย"</string>
<string name="open_permission_deny" msgid="5661861460947222274">"คุณไม่ได้รับอนุญาตให้เปิดหน้านี้"</string>
<string name="text_copied" msgid="4985729524670131385">"คัดลอกข้อความไปยังคลิปบอร์ด"</string>
<string name="more_item_label" msgid="4650918923083320495">"เพิ่มเติม"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index d559569..6dbdb35 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -140,7 +140,7 @@
<string name="shutdown_progress" msgid="2281079257329981203">"正在关机..."</string>
<string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板电脑会关闭。"</string>
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"您的手机会关机。"</string>
- <string name="shutdown_confirm_question" msgid="6656441286856415014">"要关闭手机吗?"</string>
+ <string name="shutdown_confirm_question" msgid="6656441286856415014">"您要关机吗?"</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"近期任务"</string>
<string name="no_recent_tasks" msgid="279702952298056674">"没有最近的应用程序。"</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"平板电脑选项"</string>
@@ -341,8 +341,8 @@
<string name="permdesc_writeCalendar" msgid="5368129321997977226">"允许应用程序以日历所有者的名义发送活动邀请,同时允许其添加、删除和更改您能够在设备上修改的活动(包括朋友或同事的活动)。拥有此权限的恶意应用程序可以假借日历所有者的名义发送垃圾邮件,还可以在所有者不知情的情况下修改活动或添加虚假活动。"</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"使用模拟地点来源进行测试"</string>
<string name="permdesc_accessMockLocation" msgid="7648286063459727252">"创建模拟地点来源进行测试。恶意应用程序可能利用此选项覆盖由真实地点来源(如 GPS 或网络提供商)传回的地点和/或状态。"</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"访问额外的位置信息提供程序命令"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"访问额外的位置信息提供程序命令。恶意应用程序可借此干扰 GPS 或其他位置源的正常工作。"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"获取额外的位置信息提供程序命令"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="1948144701382451721">"获取额外的位置信息提供程序命令。恶意应用程序可借此干扰 GPS 或其他位置源的正常工作。"</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"允许安装位置信息提供程序"</string>
<string name="permdesc_installLocationProvider" msgid="5449175116732002106">"创建模拟地点来源进行测试。恶意应用程序可能利用此选项覆盖由真实地点来源(如 GPS 或网络提供商)所传回的地点和/或状态,或者监视您的位置并将其提供给外部来源。"</string>
<string name="permlab_accessFineLocation" msgid="8116127007541369477">"精准的(GPS)位置"</string>
@@ -452,8 +452,8 @@
<string name="permdesc_writeApnSettings" msgid="2369786339323021771">"允许应用程序更改网络设置、拦截和检查所有网络流量,例如,更改任何 APN 的代理和端口。恶意应用程序可以监视、重定向,或在您不知情的情况下修改网络数据包。"</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"更改网络连接性"</string>
<string name="permdesc_changeNetworkState" msgid="4199958910396387075">"允许应用程序更改网络连接的状态。"</string>
- <string name="permlab_changeTetherState" msgid="2702121155761140799">"更改绑定的连接"</string>
- <string name="permdesc_changeTetherState" msgid="8905815579146349568">"允许应用程序更改绑定网络连接的状态。"</string>
+ <string name="permlab_changeTetherState" msgid="2702121155761140799">"更改网络共享连接"</string>
+ <string name="permdesc_changeTetherState" msgid="8905815579146349568">"允许应用程序更改共享网络时所用连接的状态。"</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"更改后台数据使用设置"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"允许应用程序更改后台数据使用设置。"</string>
<string name="permlab_accessWifiState" msgid="8100926650211034400">"查看 Wi-Fi 状态"</string>
@@ -701,7 +701,7 @@
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"关闭声音"</string>
<string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"开始绘制图案"</string>
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"图案已清除"</string>
- <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"单元格已添加"</string>
+ <string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已添加单元格"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"图案绘制完成"</string>
<string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
<string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
@@ -888,8 +888,8 @@
<string name="loading" msgid="1760724998928255250">"正在载入..."</string>
<string name="capital_on" msgid="1544682755514494298">"打开"</string>
<string name="capital_off" msgid="6815870386972805832">"关闭"</string>
- <string name="whichApplication" msgid="4533185947064773386">"使用以下方式发送"</string>
- <string name="alwaysUse" msgid="4583018368000610438">"默认使用此方式发送。"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"选择要使用的应用程序:"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"设为默认选项。"</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"通过主屏幕上的“设置”>“应用程序”>“管理应用程序”清除默认设置。"</string>
<string name="chooseActivity" msgid="1009246475582238425">"选择一项操作"</string>
<string name="chooseUsbActivity" msgid="7892597146032121735">"选择适用于 USB 设备的应用程序"</string>
@@ -1080,7 +1080,7 @@
<string name="submit" msgid="1602335572089911941">"提交"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"已启用车载模式"</string>
<string name="car_mode_disable_notification_message" msgid="668663626721675614">"选择退出车载模式"</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"USB 绑定或热点已启用"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"网络共享或热点已启用"</string>
<string name="tethered_notification_message" msgid="3067108323903048927">"触摸可进行配置"</string>
<string name="back_button_label" msgid="2300470004503343439">"上一步"</string>
<string name="next_button_label" msgid="1080555104677992408">"下一步"</string>
@@ -1178,7 +1178,7 @@
<string name="storage_sd_card" msgid="8921771478629812343">"SD 卡"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB 存储器"</string>
<string name="extract_edit_menu_button" msgid="302060189057163906">"编辑..."</string>
- <string name="data_usage_warning_title" msgid="1955638862122232342">"数据使用情况警告"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"流量使用警告"</string>
<string name="data_usage_warning_body" msgid="7217480745540055170">"触摸可查看使用情况和设置"</string>
<string name="data_usage_3g_limit_title" msgid="7093334419518706686">"2G-3G 数据已停用"</string>
<string name="data_usage_4g_limit_title" msgid="7636489436819470761">"4G 数据已停用"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 4b791f1..36da9e4 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -699,7 +699,7 @@
<string name="lockscreen_unlock_label" msgid="737440483220667054">"解除封鎖"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"開啟音效"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"關閉音效"</string>
- <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"已開始繪畫解鎖圖形"</string>
+ <string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"已開始繪製解鎖圖形"</string>
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"已清除解鎖圖形"</string>
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"已加入 1 格"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"已畫出解鎖圖形"</string>
@@ -875,7 +875,7 @@
<string name="textSelectionCABTitle" msgid="5236850394370820357">"選取文字"</string>
<string name="addToDictionary" msgid="9090375111134433012">"新增至字典"</string>
<string name="deleteText" msgid="7070985395199629156">"刪除"</string>
- <string name="inputMethod" msgid="1653630062304567879">"輸入方式"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"輸入法"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"文字動作"</string>
<string name="low_internal_storage_view_title" msgid="1399732408701697546">"儲存空間即將不足"</string>
<string name="low_internal_storage_view_text" product="tablet" msgid="4231085657068852042">"平板電腦的儲存空間即將不足。"</string>
@@ -888,9 +888,9 @@
<string name="loading" msgid="1760724998928255250">"載入中..."</string>
<string name="capital_on" msgid="1544682755514494298">"開啟"</string>
<string name="capital_off" msgid="6815870386972805832">"關閉"</string>
- <string name="whichApplication" msgid="4533185947064773386">"完成操作需使用"</string>
- <string name="alwaysUse" msgid="4583018368000610438">"以此為本操作預設值。"</string>
- <string name="clearDefaultHintMsg" msgid="4815455344600932173">"清除首頁設定 (應用程式) 管理應用程式的預設值。"</string>
+ <string name="whichApplication" msgid="4533185947064773386">"選擇要使用的應用程式"</string>
+ <string name="alwaysUse" msgid="4583018368000610438">"設為預設應用程式。"</string>
+ <string name="clearDefaultHintMsg" msgid="4815455344600932173">"清除主螢幕設定 > 應用程式 > 管理應用程式中的預設選項。"</string>
<string name="chooseActivity" msgid="1009246475582238425">"選取一項操作"</string>
<string name="chooseUsbActivity" msgid="7892597146032121735">"選取要以 USB 裝置存取的應用程式"</string>
<string name="noApplications" msgid="1691104391758345586">"沒有應用程式可執行此項操作。"</string>
@@ -1014,8 +1014,8 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"格式化"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB 偵錯模式已啟用"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"選取以停用 USB 偵錯。"</string>
- <string name="select_input_method" msgid="6865512749462072765">"選取輸入方式"</string>
- <string name="configure_input_methods" msgid="6324843080254191535">"設定輸入方式"</string>
+ <string name="select_input_method" msgid="6865512749462072765">"選擇輸入法"</string>
+ <string name="configure_input_methods" msgid="6324843080254191535">"設定輸入法"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"待選項目"</u></string>
@@ -1065,7 +1065,7 @@
<string name="deny" msgid="2081879885755434506">"拒絕"</string>
<string name="permission_request_notification_title" msgid="5390555465778213840">"已要求權限"</string>
<string name="permission_request_notification_with_subtitle" msgid="4325409589686688000">"帳戶 <xliff:g id="ACCOUNT">%s</xliff:g> 的"\n"權限要求"</string>
- <string name="input_method_binding_label" msgid="1283557179944992649">"輸入方式"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"輸入法"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"同步處理"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"協助工具"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"桌布"</string>
diff --git a/data/fonts/Roboto-Bold.ttf b/data/fonts/Roboto-Bold.ttf
index e5d828d..6d32fba 100644
--- a/data/fonts/Roboto-Bold.ttf
+++ b/data/fonts/Roboto-Bold.ttf
Binary files differ
diff --git a/data/fonts/Roboto-BoldItalic.ttf b/data/fonts/Roboto-BoldItalic.ttf
index d8fa3ae..fc2da4c 100644
--- a/data/fonts/Roboto-BoldItalic.ttf
+++ b/data/fonts/Roboto-BoldItalic.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Italic.ttf b/data/fonts/Roboto-Italic.ttf
index 6682d17..ce2e072 100644
--- a/data/fonts/Roboto-Italic.ttf
+++ b/data/fonts/Roboto-Italic.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Regular.ttf b/data/fonts/Roboto-Regular.ttf
index 153c608..465dfc1 100644
--- a/data/fonts/Roboto-Regular.ttf
+++ b/data/fonts/Roboto-Regular.ttf
Binary files differ
diff --git a/data/fonts/fallback_fonts.xml b/data/fonts/fallback_fonts.xml
index 881233a..e23004b 100644
--- a/data/fonts/fallback_fonts.xml
+++ b/data/fonts/fallback_fonts.xml
@@ -61,6 +61,16 @@
</family>
<family>
<fileset>
+ <file>Lohit-Bengali.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>Lohit-Tamil.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
<file>DroidSansFallback.ttf</file>
</fileset>
</family>
diff --git a/data/sounds/AudioPackage7.mk b/data/sounds/AudioPackage7.mk
index 8d92b05..93e0fa0 100755
--- a/data/sounds/AudioPackage7.mk
+++ b/data/sounds/AudioPackage7.mk
@@ -15,10 +15,10 @@
$(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \
$(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \
$(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressStandard_49.ogg:system/media/audio/ui/KeypressStandard.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_49.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressDelete_49.ogg:system/media/audio/ui/KeypressDelete.ogg \
- $(LOCAL_PATH)/effects/ogg/KeypressReturn_49.ogg:system/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
$(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
diff --git a/data/sounds/AudioPackage7alt.mk b/data/sounds/AudioPackage7alt.mk
new file mode 100755
index 0000000..11409f2
--- /dev/null
+++ b/data/sounds/AudioPackage7alt.mk
@@ -0,0 +1,67 @@
+#
+# Audio Package 7 - Tuna - Alternate names
+#
+# Include this file in a product makefile to include these audio files
+#
+#
+
+LOCAL_PATH:= frameworks/base/data/sounds
+
+PRODUCT_COPY_FILES += \
+ $(LOCAL_PATH)/alarms/ogg-jp/Argon.ogg:system/media/audio/alarms/Argon.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Helium.ogg:system/media/audio/alarms/Helium.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Neon.ogg:system/media/audio/alarms/Neon.ogg \
+ $(LOCAL_PATH)/alarms/ogg-jp/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \
+ $(LOCAL_PATH)/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \
+ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \
+ $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
+ $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
+ $(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg \
+ $(LOCAL_PATH)/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Arcturus.ogg:system/media/audio/notifications/Arcturus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Bellatrix.ogg:system/media/audio/notifications/Bellatrix.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg \
+ $(LOCAL_PATH)/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Hojus.ogg:system/media/audio/notifications/Hojus.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Lalande.ogg:system/media/audio/notifications/Lalande.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Mira.ogg:system/media/audio/notifications/Mira.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Proxima.ogg:system/media/audio/notifications/Proxima.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Shaula.ogg:system/media/audio/notifications/Shaula.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Spica.ogg:system/media/audio/notifications/Spica.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Tejat.ogg:system/media/audio/notifications/Tejat.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Upsilon.ogg:system/media/audio/notifications/Upsilon.ogg \
+ $(LOCAL_PATH)/notifications/ogg/Vega.ogg:system/media/audio/notifications/Vega.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Andromeda.ogg:system/media/audio/ringtones/Andromeda.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/CanisMajor.ogg:system/media/audio/ringtones/CanisMajor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Carina.ogg:system/media/audio/ringtones/Carina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Draco.ogg:system/media/audio/ringtones/Draco.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Girtab.ogg:system/media/audio/ringtones/Girtab.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Hydra.ogg:system/media/audio/ringtones/Hydra.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Perseus.ogg:system/media/audio/ringtones/Perseus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones/UrsaMinor.ogg \
+ $(LOCAL_PATH)/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta.ogg
diff --git a/data/sounds/alarms/ogg-jp/Argon.ogg b/data/sounds/alarms/ogg-jp/Argon.ogg
new file mode 100755
index 0000000..2ff6600
--- /dev/null
+++ b/data/sounds/alarms/ogg-jp/Argon.ogg
Binary files differ
diff --git a/data/sounds/alarms/ogg-jp/Carbon.ogg b/data/sounds/alarms/ogg-jp/Carbon.ogg
new file mode 100755
index 0000000..c994f28
--- /dev/null
+++ b/data/sounds/alarms/ogg-jp/Carbon.ogg
Binary files differ
diff --git a/data/sounds/alarms/ogg-jp/Helium.ogg b/data/sounds/alarms/ogg-jp/Helium.ogg
new file mode 100755
index 0000000..94f13ce
--- /dev/null
+++ b/data/sounds/alarms/ogg-jp/Helium.ogg
Binary files differ
diff --git a/data/sounds/alarms/ogg-jp/Krypton.ogg b/data/sounds/alarms/ogg-jp/Krypton.ogg
new file mode 100755
index 0000000..48f956b
--- /dev/null
+++ b/data/sounds/alarms/ogg-jp/Krypton.ogg
Binary files differ
diff --git a/data/sounds/alarms/ogg-jp/Neon.ogg b/data/sounds/alarms/ogg-jp/Neon.ogg
new file mode 100755
index 0000000..3089a27
--- /dev/null
+++ b/data/sounds/alarms/ogg-jp/Neon.ogg
Binary files differ
diff --git a/data/sounds/alarms/ogg-jp/Oxygen.ogg b/data/sounds/alarms/ogg-jp/Oxygen.ogg
new file mode 100755
index 0000000..4dc8ade
--- /dev/null
+++ b/data/sounds/alarms/ogg-jp/Oxygen.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressDelete_120.ogg b/data/sounds/effects/ogg/KeypressDelete_120.ogg
new file mode 100644
index 0000000..f2851f7
--- /dev/null
+++ b/data/sounds/effects/ogg/KeypressDelete_120.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressReturn_120.ogg b/data/sounds/effects/ogg/KeypressReturn_120.ogg
new file mode 100644
index 0000000..48a26b4
--- /dev/null
+++ b/data/sounds/effects/ogg/KeypressReturn_120.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressSpacebar_120.ogg b/data/sounds/effects/ogg/KeypressSpacebar_120.ogg
new file mode 100644
index 0000000..9620927
--- /dev/null
+++ b/data/sounds/effects/ogg/KeypressSpacebar_120.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressStandard_120.ogg b/data/sounds/effects/ogg/KeypressStandard_120.ogg
new file mode 100644
index 0000000..e4d916a
--- /dev/null
+++ b/data/sounds/effects/ogg/KeypressStandard_120.ogg
Binary files differ
diff --git a/data/sounds/notifications/ogg/Hojus.ogg b/data/sounds/notifications/ogg/Hojus.ogg
index 5bc1265..96a3ed9 100644
--- a/data/sounds/notifications/ogg/Hojus.ogg
+++ b/data/sounds/notifications/ogg/Hojus.ogg
Binary files differ
diff --git a/data/sounds/notifications/wav/Hojus.wav b/data/sounds/notifications/wav/Hojus.wav
index 076a0c7..a16f943 100644
--- a/data/sounds/notifications/wav/Hojus.wav
+++ b/data/sounds/notifications/wav/Hojus.wav
Binary files differ
diff --git a/docs/html/guide/appendix/api-levels.jd b/docs/html/guide/appendix/api-levels.jd
index 7a0e17f..95542bc 100644
--- a/docs/html/guide/appendix/api-levels.jd
+++ b/docs/html/guide/appendix/api-levels.jd
@@ -84,6 +84,12 @@
<table>
<tr><th>Platform Version</th><th>API Level</th><th>VERSION_CODE</th><th>Notes</th></tr>
+ <tr><td><a href="{@docRoot}sdk/android-4.0.html">Android 4.0</a></td>
+ <td><a href="{@docRoot}sdk/api_diff/14/changes.html" title="Diff Report">14</a></td>
+ <td>{@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}</td>
+ <td><a href="{@docRoot}sdk/android-4.0-highlights.html">Platform
+Highlights</a></td></tr>
+
<tr><td><a href="{@docRoot}sdk/android-3.2.html">Android 3.2</a></td>
<td><a href="{@docRoot}sdk/api_diff/13/changes.html" title="Diff Report">13</a></td>
<td>{@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2}</td>
diff --git a/docs/html/guide/developing/device.jd b/docs/html/guide/developing/device.jd
index e08119f..9ce3649 100644
--- a/docs/html/guide/developing/device.jd
+++ b/docs/html/guide/developing/device.jd
@@ -30,14 +30,9 @@
you don't yet have a device, check with the service providers in your area to determine which
Android-powered devices are available.</p>
-<p>If you want a SIM-unlocked phone, then you might consider either an Android Dev Phone or the
-Google Nexus S. These are SIM-unlocked so that you can use them on any GSM network using a SIM
-card. The Android Dev Phones also feature an unlocked bootloader so you can install custom system
-images (great for developing and installing custom versions of the Android platform). To find a
-a place you can purchase the Nexus S, visit <a
-href="http://www.google.com/phone/detail/nexus-s">google.com/phone</a>. To purchase an Android
-Dev Phone, see the <a href="http://market.android.com/publish">Android Market</a> site
-(requires a developer account).</p>
+<p>If you want a SIM-unlocked phone, then you might consider the Google Nexus S. To find a place
+to purchase the Nexus S and other Android-powered devices, visit <a
+href="http://www.google.com/phone/detail/nexus-s">google.com/phone</a>.</p>
<p class="note"><strong>Note:</strong> When developing on a device, keep in mind that you should
still use the <a
diff --git a/docs/html/guide/developing/index.jd b/docs/html/guide/developing/index.jd
index 722c75a..3af4a8c 100644
--- a/docs/html/guide/developing/index.jd
+++ b/docs/html/guide/developing/index.jd
@@ -11,58 +11,55 @@
will sometimes have to call command line tools manually, but you will have access to the same
number of features that you would have in Eclipse.</p>
- <p class="note"><strong>Note:</strong> Before you begin developing Android applications, make
- sure you have gone through all of the steps outlined in <a
-href="{@docRoot}sdk/installing.html">Installing the SDK</a>.</p>
+<div class="figure" style="width:461px">
+ <img src="{@docRoot}images/developing/developing_overview.png"
+ alt="Development process for Android applications"
+ height="738" />
+ <p class="img-caption">
+ <strong>Figure 1.</strong> The development process for Android applications.
+ </p>
+</div>
- <p>The basic steps for developing applications with or without Eclipse are the same:</p>
+<p>The basic steps for developing applications (with or without Eclipse) are shown in figure 1. The
+development steps encompass four development phases, which include:</p>
- <ol>
-
- <li>Set up Android Virtual Devices or hardware devices.
-
- <p>You need to create Android Virtual Devices (AVD) or connect hardware devices on which
- you will install your applications.</p>
-
- <p>See <a href="{@docRoot}guide/developing/devices/index.html">Managing Virtual Devices</a>
+<ul>
+ <li><strong>Setup</strong>
+ <p>During this phase you install and set up your development environment. You also create
+ Android Virtual Devices (AVDs) and connect hardware devices on which you can install your
+ applications.</p>
+ <p>See <a href="{@docRoot}guide/developing/devices/index.html">Managing Virtual Devices</a>
and <a href="{@docRoot}guide/developing/device.html">Using Hardware Devices</a> for more
-information.
- </li>
+ information.
+ </li>
+ <li><strong>Development</strong>
+ <p>During this phase you set up and develop your Android project, which contains all of the
+ source code and resource files for your application. For more informations, see
+ <a href="{@docRoot}guide/developing/projects/index.html">Create an Android project</a>.</p>
+ </li>
+ <li><strong>Debugging and Testing</strong>
+ <p>During this phase you build your project into a debuggable <code>.apk</code> package that you
+ can install and run on the emulator or an Android-powered device. If you are using Eclipse,
+ builds are generated each time you project is saved. If you're using another IDE,
+ you can build your project using Ant and install it on a device using
+ <a href="{@docRoot}guide/developing/tools/adb.html">adb</a>. For more information, see
+ <a href="{@docRoot}guide/developing/building/index.html">Build and run your application</a>.</p>
+ <p>Next, you debug your application using a JDWP-compliant debugger along with the debugging
+ and logging tools that are provided with the Android SDK. Eclipse already comes packaged with
+ a compatible debugger. For more information see,
+ <a href="{@docRoot}guide/developing/debugging/index.html">Debug your application with the
+ SDK debugging and logging tools</a>.</p>
+ <p>Last, you test your application using various Android SDK testing tools. For more
+ information, see <a href="{@docRoot}guide/developing/testing/index.html">Test your application
+ with the Testing and Instrumentation framework</a>.</p>
+ </li>
+ <li><strong>Publishing</strong>
+ <p>During this phase you configure and build your application for release and distribute your
+ application to users. For more information, see
+ <a href="{@docRoot}guide/publishing/publishing_overview.html">Publishing Overview</a>.</p>
+ </li>
+</ul>
- <li>
- <a href="{@docRoot}guide/developing/projects/index.html">Create an Android project</a>.
-
- <p>An Android project contains all source code and resource files for your application. It is
- built into an <code>.apk</code> package that you can install on Android devices.</p>
- </li>
-
- <li>
- <a href="{@docRoot}guide/developing/building/index.html">Build and run your
- application</a>.
-
- <p>If you are using Eclipse, builds are generated each time you save changes and you can install
- your application on a device by clicking <strong>Run</strong>. If you're using another IDE, you can build your
- project using Ant and install it on a device using <code>adb</code>.</p>
- </li>
-
- <li>
- <a href="{@docRoot}guide/developing/debugging/index.html">Debug your application with the
- SDK debugging and logging tools</a>.
-
- <p>Debugging your application involves using a JDWP-compliant debugger along with the
- debugging and logging tools that are provided with the Android SDK. Eclipse already
- comes packaged with a compatible debugger.</p>
- </li>
-
- <li>
- <a href="{@docRoot}guide/developing/testing/index.html">Test your application with the
- Testing and Instrumentation framework</a>.
-
- <p>The Android SDK provides a testing and instrumnetation framework to help you set up and
- run tests within an emulator or device.</p>
- </li>
- </ol>
-
<h2 id="EssentialTools">Essential command line tools</h2>
<p>When developing in IDEs or editors other than Eclipse, be familiar with
@@ -101,7 +98,7 @@
<dd>To sign your .apk file with a private key generated by Keytool. Jarsigner is part of the
JDK.</dd>
</dl>
-
+
<p>If you are using Eclipse and ADT, tools such as <code>adb</code> and <code>android</code>
are automatically called by Eclipse and ADT so you don't have to manually invoke these tools.
You need to be familiar with <code>adb</code>, however, because certain functions are not
@@ -109,19 +106,20 @@
Eclipse, such as the <code>adb</code> shell commands. You might also need to call Keytool and
Jarsigner to
sign your applications, but you can set up Eclipse to do this automatically as well.</p>
-
+
<p>For more information on the tools provided with the Android SDK, see the
<a href="{@docRoot}guide/developing/tools/index.html">Tools</a> section of the documentation.</p>
-
+
<h2 id="ThirdParty">Other Third-Party Development Tools</h2>
<p>
The tools described in this section are not developed by the Android SDK team. The Android Dev Guide
does not provide documentation for these tools. Please refer to the linked documents in each
section for documentation.
-</p>
+</p>
<h3 id="IntelliJ">Developing in IntelliJ IDEA</h3>
<div style="float: right">
-<img alt="The IntelliJ graphical user interface" height="500px" src="{@docRoot}images/developing/intellijidea_android_ide.png"/>
+<img alt="The IntelliJ graphical user interface" height="500px"
+src="{@docRoot}images/developing/intellijidea_android_ide.png"/>
</div>
<p>
IntelliJ IDEA is a powerful Java IDE from JetBrains that provides
@@ -148,5 +146,5 @@
<li>
<a href="http://wiki.jetbrains.net/intellij/Android">IntelliJ IDEA Android Tutorials</a>
</li>
-</ul>
+</ul>
diff --git a/docs/html/guide/developing/projects/projects-cmdline.jd b/docs/html/guide/developing/projects/projects-cmdline.jd
index 08e0d9a..81c2c58 100644
--- a/docs/html/guide/developing/projects/projects-cmdline.jd
+++ b/docs/html/guide/developing/projects/projects-cmdline.jd
@@ -114,7 +114,7 @@
<p class="caution"><strong>Caution:</strong> You should refrain from moving the location of the
SDK directory, because this will break the SDK location property located in <code>local.properties</code>.
If you need to update the SDK location, use the <code>android update project</code> command.
- See <a href="UpdatingAProject">Updating a Project</a> for more information.</p>
+ See <a href="#UpdatingAProject">Updating a Project</a> for more information.</p>
<h2 id="UpdatingAProject">Updating a Project</h2>
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index b7710c3..a3bb6d4 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -406,6 +406,9 @@
<span class="en">Android Market Topics</span>
</h2>
<ul>
+ <li><a href="<?cs var:toroot ?>guide/publishing/publishing.html">
+ <span class="en">Publishing on Android Market</span>
+ </a></li>
<li><a href="<?cs var:toroot ?>guide/publishing/licensing.html">
<span class="en">Application Licensing</span></a>
</li>
@@ -649,28 +652,11 @@
<span class="zh-TW" style="display:none">發佈</span>
</h2>
<ul>
- <li><a href="<?cs var:toroot ?>guide/publishing/app-signing.html">
- <span class="en">Signing Your Applications</span>
- <span class="de" style="display:none">Signieren Ihrer Anwendungen</span>
- <span class="es" style="display:none">Firma de aplicaciones</span>
- <span class="fr" style="display:none">Attribution de votre signature <br />à vos applications</span>
- <span class="it" style="display:none">Firma delle applicazioni</span>
- <span class="ja" style="display:none">アプリケーションへの署名</span>
- <span class="zh-CN" style="display:none">应用程序签名</span>
- <span class="zh-TW" style="display:none">簽署應用程式</span>
- </a></li>
- <li><a href="<?cs var:toroot ?>guide/publishing/versioning.html">
- <span class="en">Versioning Your Applications</span>
- <span class="de" style="display:none">Versionsverwaltung für Ihre <br />Anwendungen</span>
- <span class="es" style="display:none">Versiones de las aplicaciones</span>
- <span class="fr" style="display:none">Attribution d'une version à vos applications</span>
- <span class="it" style="display:none">Controllo versioni delle applicazioni</span>
- <span class="ja" style="display:none">アプリケーションのバージョニング</span>
- <span class="zh-CN" style="display:none">应用程序版本控制</span>
- <span class="zh-TW" style="display:none">應用程式版本設定</span>
- </a></li>
+ <li><a href="<?cs var:toroot ?>guide/publishing/publishing_overview.html">
+ <span class="en">Publishing Overview</span>
+ </a><span class="new">new!</span></li>
<li><a href="<?cs var:toroot ?>guide/publishing/preparing.html">
- <span class="en">Preparing to Publish</span>
+ <span class="en">Preparing for Release</span>
<span class="de" style="display:none">Vorbereitung auf die Veröffentlichung</span>
<span class="es" style="display:none">Publicación de aplicaciones</span>
<span class="fr" style="display:none">Préparation à la publication</span>
@@ -678,9 +664,29 @@
<span class="ja" style="display:none">公開の準備</span>
<span class="zh-CN" style="display:none">准备发布</span>
<span class="zh-TW" style="display:none">準備發佈</span>
+ </a><span class="new">updated</span></li>
+ <li><a href="<?cs var:toroot ?>guide/publishing/app-signing.html">
+ <span class="en">Signing Your Applications</span>
+ <span class="de" style="display:none">Signieren Ihrer Anwendungen</span>
+ <span class="es" style="display:none">Firma de aplicaciones</span>
+ <span class="fr" style="display:none">Attribution de votre signature <br />à vos
+applications</span>
+ <span class="it" style="display:none">Firma delle applicazioni</span>
+ <span class="ja" style="display:none">アプリケーションへの署名</span>
+ <span class="zh-CN" style="display:none">应用程序签名</span>
+ <span class="zh-TW" style="display:none">簽署應用程式</span>
</a></li>
- <li><a href="<?cs var:toroot ?>guide/publishing/publishing.html">
- <span class="en">Publishing on Android Market</span>
+ <li><a href="<?cs var:toroot ?>guide/publishing/versioning.html">
+ <span class="en">Versioning Your Applications</span>
+ <span class="de" style="display:none">Versionsverwaltung für Ihre <br
+/>Anwendungen</span>
+ <span class="es" style="display:none">Versiones de las aplicaciones</span>
+ <span class="fr" style="display:none">Attribution d'une version à vos
+applications</span>
+ <span class="it" style="display:none">Controllo versioni delle applicazioni</span>
+ <span class="ja" style="display:none">アプリケーションのバージョニング</span>
+ <span class="zh-CN" style="display:none">应用程序版本控制</span>
+ <span class="zh-TW" style="display:none">應用程式版本設定</span>
</a></li>
</ul>
</li>
@@ -715,9 +721,9 @@
</a></li>
</ul>
</li>
- <li><a href="<?cs var:toroot ?>guide/practices/optimizing-for-3.0.html">
- <span class="en">Optimizing Apps for Android 3.0</span>
- </a></li>
+ <li><a href="<?cs var:toroot ?>guide/practices/tablets-and-handsets.html">
+ <span class="en">Supporting Tablets and Handsets</span>
+ </a> <span class="new">new!</span></li>
<li class="toggle-list">
<div><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/index.html">
<span class="en">UI Guidelines</span>
diff --git a/docs/html/guide/practices/optimizing-for-3.0.jd b/docs/html/guide/practices/optimizing-for-3.0.jd
index e968372..39662f1 100644
--- a/docs/html/guide/practices/optimizing-for-3.0.jd
+++ b/docs/html/guide/practices/optimizing-for-3.0.jd
@@ -1,6 +1,31 @@
page.title=Optimizing Apps for Android 3.0
@jd:body
+
+<div id="deprecatedSticker">
+ <a href="#"
+ onclick="$('#naMessage').show();$('#deprecatedSticker').hide();return false">
+ <strong>This doc is deprecated</strong></a>
+</div>
+
+
+<div id="naMessage" style="display:block">
+<div><p><strong>This document has been deprecated.</strong></p>
+ <p>To learn about how you can optimize your app for both tablets and handsets, please
+read the guide to <a href="tablets-and-handsets.html">Supporting Tablets and
+Handsets</a>.</p>
+
+ <input style="margin-top:1em;padding:5px" type="button"
+ value="That's nice, but I still want to read this document"
+onclick="$('#naMessage').hide();$('#deprecatedSticker').show()" />
+</div>
+</div>
+
+
+
+
+
+
<div id="qv-wrapper">
<div id="qv">
<h2>In this document</h2>
@@ -25,6 +50,8 @@
<h2>See also</h2>
<ol>
+ <li><a href="tablets-and-handsets.html">Supporting Tablets
+and Handsets</a></li>
<li><a
href="{@docRoot}sdk/compatibility-library.html">Compatibility Library</a></li>
<li><a href="http://code.google.com/p/iosched/">Google I/O App source code</a></li>
@@ -411,8 +438,8 @@
>Action Bar</a>: Samples that demonstrate various Action Bar features, such as tabs, logos, and
action items.</li>
<li><a
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/content/ClipboardSample.
-html">Clipboard</a>: An example of how to use the clipboard for copy and paste operations.</li>
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/content/ClipboardSample.html"
+>Clipboard</a>: An example of how to use the clipboard for copy and paste operations.</li>
<li><a
href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.html">
Drag and Drop</a>: An example of how to perform drag and drop with new View events.</li>
@@ -427,11 +454,11 @@
Property Animation</a>: Several samples using the new animation APIs to animate object
properties.</li>
<li><a
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/SearchViewActionBar.
-html">Search View Widget</a>: Example using the new search widget in the Action Bar (as an
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/SearchViewActionBar.html">
+Search View Widget</a>: Example using the new search widget in the Action Bar (as an
"action view").</li>
<li><a
-href="{@docRoot}resources/samples/Renderscript/index.html">Renderscript</a>: Contains several
+href="{@docRoot}resources/samples/RenderScript/index.html">Renderscript</a>: Contains several
different applications that demonstrate using renderscript APIs for computations and 3D
graphics.</li>
</ul>
diff --git a/docs/html/guide/practices/screen-compat-mode.jd b/docs/html/guide/practices/screen-compat-mode.jd
index 6a77d60..7f10914 100644
--- a/docs/html/guide/practices/screen-compat-mode.jd
+++ b/docs/html/guide/practices/screen-compat-mode.jd
@@ -71,7 +71,7 @@
android:minSdkVersion}</a> or <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
android:targetSdkVersion}</a> to {@code "4"} or higher, or set <a
-href="guide/topics/manifest/supports-screens-element.html#resizeable">{@code
+href="{@docRoot}guide/topics/manifest/supports-screens-element.html#resizeable">{@code
android:resizeable}</a> to {@code "true"}.</p>
</dd>
diff --git a/docs/html/guide/practices/screens-distribution.jd b/docs/html/guide/practices/screens-distribution.jd
index 951e364cc..60c9c95 100644
--- a/docs/html/guide/practices/screens-distribution.jd
+++ b/docs/html/guide/practices/screens-distribution.jd
@@ -15,8 +15,8 @@
<h2>In this document</h2>
<ol>
- <li><a href="#FilteringHansetApps">Filtering a Handset Application from Tablets</a></li>
- <li><a href="#FilteringTabletApps">Filtering a Tablet Application from Handsets</a></li>
+ <li><a href="#FilteringHansetApps">Declaring an App is Only for Handsets</a></li>
+ <li><a href="#FilteringTabletApps">Declaring an App is Only for Tablets</a></li>
<li><a href="#MultiApks">Publishing Multiple APKs for Different Screens</a></li>
</ol>
@@ -48,7 +48,7 @@
-<h2 id="FilteringHandsetApps">Filtering a Handset Application from Tablets</h2>
+<h2 id="FilteringHandsetApps">Declaring an App is Only for Handsets</h2>
<p>Because the system generally scales applications to fit larger screens well, you shouldn't
need to filter your application from larger screens. As long as you follow the <a
@@ -79,7 +79,6 @@
<pre>
<manifest ... >
- ...
<compatible-screens>
<!-- all small size screens -->
<screen android:screenSize="small" android:screenDensity="ldpi" />
@@ -92,6 +91,7 @@
<screen android:screenSize="normal" android:screenDensity="hdpi" />
<screen android:screenSize="normal" android:screenDensity="xhdpi" />
</compatible-screens>
+ ...
<application ... >
...
<application>
@@ -108,36 +108,66 @@
-<h2 id="FilteringTabletApps">Filtering a Tablet Application from Handsets</h2>
-<p>If your application's UI is adversely affected when the system scales your application down to
-smaller screens, you should add <a
-href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">alternative
-layouts</a> for smaller screens to adjust the layout for those screens. However, sometimes your
-layout still might not fit a smaller screen or you've explicitly designed your application only for
-tablets and other large devices. In this case, you can manage the availability of your application
-to smaller screens by using the <a
+<h2 id="FilteringTabletApps">Declaring an App is Only for Tablets</h2>
+
+<p>If you don't want your app to be used on handsets (perhaps your app truly makes sense only on a
+large screen) or you need time to optimize it for smaller screens, you can prevent small-screen
+devices from downloading your app by using the <a
href="{@docRoot}guide/topics/manifest/supports-screens-element.html">{@code
<supports-screens>}</a> manifest element.</p>
-<p>For example, if you want your application to be available only to large and extra large
-screens, you can declare the element in your manifest like this:</p>
+<p>For example, if you want your application to be available only to tablet devices, you can declare
+the element in your manifest like this:</p>
<pre>
<manifest ... >
- ...
<supports-screens android:smallScreens="false"
android:normalScreens="false"
android:largeScreens="true"
- android:xlargeScreens="true" />
+ android:xlargeScreens="true"
+ android:requiresSmallestWidthDp="600" />
+ ...
<application ... >
...
- <application>
+ </application>
</manifest>
</pre>
-<p>External services such as Android Market read this manifest element and use it to ensure that
-your application is available only to devices with either a large or an extra large screen.</p>
+<p>This describes your app's screen-size support in two different ways:</p>
+
+<ul>
+ <li>It declares that the app does <em>not</em> support the screen sizes "small" and
+"normal", which are traditionally not tablets.</li>
+ <li>It declares that the app requires a screen size with a minimum usable area that is at least
+600dp wide.</li>
+</ul>
+
+<p>The first technique is for devices that are running Android 3.1 or older, because those devices
+declare their size based on generalized screen sizes. The <a
+href="{@docRoot}guide/topics/manifest/supports-screens-element.html#requiresSmallest">{@code
+requiresSmallestWidthDp}</a> attribute is for devices running Android 3.2 and newer, which includes
+the capability for apps to specify size requirements based on a minimum number of
+density-independent pixels available. In this example, the app declares a minimum width requirement
+of 600dp, which generally implies a 7"-or-greater screen. </p>
+
+<p>Your size choice might be different, of course, based on how well your design works on different
+screen sizes; for example, if your design works well only on screens that are 9" or larger, you
+might require a minimum width of 720dp.</p>
+
+<p>The catch is that you must compile your application against Android 3.2 or higher in order to use
+the <code>requiresSmallestWidthDp</code> attribute. Older versions don't understand this attribute
+and will raise a compile-time error. The safest thing to do is develop your app against the platform
+that matches the API level you've set for <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">minSdkVersion</a
+>. When you're making final preparations to build your release candidate, change the build target to
+Android 3.2 and add the <code>requiresSmallestWidthDp</code> attribute. Android versions older than
+3.2 simply ignore that XML attribute, so there's no risk of a runtime failure.</p>
+
+<p>For more information about why the "smallest width" screen size is
+important for supporting different screen sizes, read <a
+href="http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html">New
+Tools for Managing Screen Sizes</a>.</p>
<p class="caution"><strong>Caution:</strong> If you use the <a
href="{@docRoot}guide/topics/manifest/supports-screens-element.html">{@code
@@ -151,7 +181,7 @@
to prevent your application from being downloaded on larger screens, use <a
href="{@docRoot}guide/topics/manifest/compatible-screens-element.html">{@code
<compatible-screens>}</a>, as discussed in the previous section about <a
-href="#FilteringHandsetApps">Filtering a Handset Application from Tablets</a>.</p>
+href="#FilteringHandsetApps">Declaring an App is Only for Handsets</a>.</p>
<p>Remember, you should strive to make your application available to as many devices as possible by
applying all necessary techniques for <a
diff --git a/docs/html/guide/practices/screens_support.jd b/docs/html/guide/practices/screens_support.jd
index 6dec4b3..fb121bd 100644
--- a/docs/html/guide/practices/screens_support.jd
+++ b/docs/html/guide/practices/screens_support.jd
@@ -50,6 +50,9 @@
<h2>See also</h2>
<ol>
<li><a
+href="http://android-developers.blogspot.com/2011/09/thinking-like-web-designer.html">Thinking
+Like a Web Designer</a></li>
+ <li><a
href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">
Providing Alternative Resources</a></li>
<li><a href="{@docRoot}guide/practices/ui_guidelines/icon_design.html">Icon Design
@@ -1111,7 +1114,7 @@
<img src="{@docRoot}images/screens_support/scale-test.png" alt="" />
<p class="img-caption"><strong>Figure 5.</strong> Comparison of pre-scaled and auto-scaled
bitmaps, from <a
-href="resources/samples/ApiDemos/src/com/example/android/apis/graphics/DensityActivity.html">
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/DensityActivity.html">
ApiDemos</a>.
</p>
</div>
@@ -1150,7 +1153,7 @@
scaled bitmaps have slightly different appearances depending on whether they are pre-scaled or
auto-scaled at draw time. You can find the source code for this sample application, which
demonstrates using pre-scaled and auto-scaled bitmaps, in <a
-href="resources/samples/ApiDemos/src/com/example/android/apis/graphics/DensityActivity.html">
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/DensityActivity.html">
ApiDemos</a>.</p>
<p class="note"><strong>Note:</strong> In Android 3.0 and above, there should be no perceivable
diff --git a/docs/html/guide/practices/tablets-and-handsets.jd b/docs/html/guide/practices/tablets-and-handsets.jd
new file mode 100644
index 0000000..7bc1ad7
--- /dev/null
+++ b/docs/html/guide/practices/tablets-and-handsets.jd
@@ -0,0 +1,491 @@
+page.title=Supporting Tablets and Handsets
+
+@jd:body
+
+<div id="qv-wrapper">
+<ol id="qv">
+
+<h2>In this document</h2>
+<ol>
+ <li><a href="#Guidelines">Basic Guidelines</a></li>
+ <li><a href="#Fragments">Creating Single-pane and Multi-pane Layouts</a></li>
+ <li><a href="#ActionBar">Using the Action Bar</a>
+ <ol>
+ <li><a href="#SplitActionBar">Using split action bar</a></li>
+ <li><a href="#NavigatingUp">Using "up" navigation</a></li>
+ </ol>
+ </li>
+ <li><a href="#Tips">Other Design Tips</a></li>
+</ol>
+
+<h2>Related samples</h2>
+<ol>
+ <li><a href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb
+Gallery</a></li>
+</ol>
+
+<h2>See also</h2>
+<ol>
+ <li><a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a></li>
+ <li><a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a></li>
+ <li><a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a></li>
+</ol>
+
+
+
+</div>
+</div>
+
+
+
+<p>The Android platform runs on a variety of screen sizes and the system gracefully resizes your
+application's UI to fit each one. Typically, all you need to do is design your UI to be flexible and
+optimize some elements for different sizes by providing <a
+href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">alternative
+resources</a> (such as alternative layouts that reposition some views or alternative
+dimension values for views). However, sometimes you might want to go a step further to
+optimize the overall user experience for different screen sizes. For example, tablets offer
+more space in which your application can present multiple sets of information at once, while a
+handset device usually requires that you split those sets apart and display them separately. So
+even though a UI designed for handsets will properly resize to fit a tablet, it does not fully
+leverage the potential of the tablet's screen to enhance the user experience.</p>
+
+<p>With Android 3.0 (API level 11), Android introduced a new set of framework APIs that allow you
+ to more effectively design activities that take advantage of large screens: the {@link
+android.app.Fragment} APIs. Fragments allow you to separate distinct behavioral components of your
+UI into separate parts, which you can then combine to create multi-pane layouts when running on a
+tablet or place in separate activities when running on a handset. Android 3.0 also introduced
+{@link android.app.ActionBar}, which provides a dedicated UI at the top of the screen to identify
+the app and provide user actions and navigation.</p>
+
+<p>This document provides guidance that can help you create an application that offers a unique and
+optimized user experience on both handsets and tablets, using fragments and the action bar.</p>
+
+<p>Before you continue with this guide, it's important that you first read the
+guide to <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple
+Screens</a>. That document describes the fundamental design principles for developing a UI that
+supports different screen sizes and densities with flexible layouts and alternative bitmaps,
+respectively.</p>
+
+
+
+
+<h2 id="Guidelines">Basic Guidelines</h2>
+
+<p>Here are a few guidelines that will help you create an app that provides an optimized user
+experience on both tablets and handsets:</p>
+
+<ul>
+ <li><strong>Build your activity designs based on fragments</strong> that you can reuse in
+different combinations—in multi-pane layouts on tablets and single-pane layouts on handsets.
+
+<p>A {@link android.app.Fragment} represents a behavior or a portion of user interface in an
+activity. You can think of a fragment as a modular section of an activity (a "fragment" of an
+activity), which has its own lifecycle and which you can add or remove while the activity is
+running.</p>
+
+<p>If you haven't used fragments yet, start by reading the <a
+href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</p>
+</li>
+
+
+ <li><strong>Use the action bar</strong>, but follow best practices and ensure your design
+is flexible enough for the system to adjust the action bar layout based on the screen size.
+
+<p>The {@link android.app.ActionBar} is a UI component for activities that replaces the traditional
+title bar at the top of the screen. By default, the action bar includes the application logo on the
+left side, followed by the activity title, and access to items from the options menu on the right
+side.</p>
+
+<p>You can enable items from the options menu to appear directly in the action bar as "action
+items". You can also add navigation features to the action bar, such as tabs or a drop-down list,
+and use the application icon to supplement the system's BACK behavior with the option to navigate to
+your application's "home" activity or "up" the application's structural hierarchy.</p>
+
+<p>This guide provides some tips for using the action bar in ways that support both tablets and
+handsets. For a detailed discussion of the action bar APIs, read the <a
+href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</p>
+</li>
+
+
+ <li><strong>Implement flexible layouts</strong>, as discussed in the
+<a href="{@docRoot}guide/practices/screens_support.html#screen-independence">Best Practices</a> for
+supporting multiple screens and the blog post, <a
+href="http://android-developers.blogspot.com/2011/09/thinking-like-web-designer.html">Thinking
+Like a Web Designer</a>.
+ <p>A flexible layout design allows your application to adapt to variations in screen
+sizes. Not all tablets are the same size, nor are all handsets the same size. While you might
+provide different fragment combinations for "tablets" and "handsets", it's still necessary that
+each design be flexible to resize to variations in size and aspect ratio.</p>
+</li>
+</ul>
+
+<p>The following sections discuss the first two recommendations in more detail. For more
+information about creating flexible layouts, refer to the links provided above.</p>
+
+
+<p class="note"><strong>Note:</strong> Aside from one feature in the action bar, all the
+APIs needed to accomplish the recommendations in this document are available in Android
+3.0. Additionally, you can even implement the fragment design patterns and remain
+backward-compatible with Android 1.6, by using the support library—discussed in the side
+bar below.</p>
+
+
+
+<h2 id="Fragments">Creating Single-pane and Multi-pane Layouts</h2>
+
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+ <h3>Remaining backward-compatible</h3>
+<p>If you want to use fragments in your application <em>and</em> remain compatible with
+versions of Android older than 3.0, you can do so by using the Android <a
+href="{@docRoot}sdk/compatibility-library.html">Support Library</a> (downloadable from the
+SDK Manager).</p>
+<p>The support library includes APIs for <a
+href="{@docRoot}guide/topics/fundamentals/fragments.html">fragments</a>, <a
+href="{@docRoot}guide/topics/fundamentals/loaders.html">loaders</a>, and other APIs added in newer
+versions of Android. By simply adding this library to your Android project, you can use
+backward-compatible versions of these APIs in your application and remain compatible with Android
+1.6 (your <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
+android:minSdkVersion}</a> value can be as low as {@code "4"}). For information about how to get the
+library and start using it, see the <a href="{@docRoot}sdk/compatibility-library.html">Support
+Library</a> document.</p>
+
+<p>The support library <em>does not</em> provide APIs for the action bar, but you can use
+code from the sample app, <a
+href="{@docRoot}resources/samples/ActionBarCompat/index.html">Action Bar Compatibility</a>, to
+create an action bar that supports all devices.</p>
+</div>
+</div>
+
+
+
+
+<p>The most effective way to create a distinct user experience for tablets and handsets is to create
+layouts with different combinations of fragments, such that you can design "multi-pane" layouts for
+tablets and "single-pane" layouts for handsets. For example, a news application on a tablet might
+show a list of articles on the left side and a full article on the right side—selecting an
+article on the left updates the article view on the right. On a handset, however, these two
+components should appear on separate screens—selecting an article from a list changes the
+entire screen to show that article. There are two techniques to accomplish this design with
+fragments:</p>
+
+
+<ul>
+ <li><em>Multiple fragments, one activity</em>: Use one activity regardless of the device size,
+but decide at runtime whether to combine fragments in the layout (to create a multiple-pane design)
+or swap fragments (to create a single-pane design). Or...</li>
+
+ <li><em>Multiple fragments, multiple activities</em>: On a tablet, place multiple fragments in
+one activity; on a handset, use separate activities to host each fragment. For example,
+when the tablet design uses two fragments in an activity, use the same activity for handsets, but
+supply an alternative layout that includes just the first fragment. When running on a handset and
+you need to switch fragments (such as when the user selects an item), start another activity that
+hosts the second fragment.</li>
+</ul>
+
+<p>The approach you choose depends on your design and personal preferences. The first option
+(one activity; swapping fragments) requires that you determine the screen size at runtime
+and dynamically add each fragment as appropriate—rather than declare the fragments
+in your activity's XML layout—because you <em>cannot</em> remove a fragment from an activity
+if it's been declared in the XML layout. When using the first technique, you might also need to
+update the action bar each time the fragments change, depending on what actions or navigation modes
+are available for each fragment. In some cases, these factors might not affect your design, so
+using one activity and swapping fragments might work well (especially if your tablet design requires
+that you add fragments dynamically anyway). Other times, however, dynamically swapping
+fragments for your handset design can make your code more complicated, because you must manage all
+the fragment combinations in the activity's code (rather than use alternative layout resources to
+define fragment combinations) and manage the back stack of fragments yourself (rather than
+allow the normal activity stack to handle back-navigation).</p>
+
+<p>This guide focuses on the second option, in which you display each fragment in a separate
+activity when on a smaller screen. Using this technique means that you can use alternative layout
+files that define different fragment combinations for different screen sizes, keep fragment code
+modular, simplify action bar management, and let the system handle all the back stack work on
+handsets.</p>
+
+<p>Figure 1 illustrates how an application with two fragments might be arranged for
+both handsets and tablets when using separate activities for the handset design:</p>
+
+<img src="{@docRoot}images/fundamentals/fragments.png" alt="" />
+<p class="img-caption"><strong>Figure 1.</strong> Different design patterns for tablets and
+handsets when selecting an item to view its details.</p>
+
+<p>In the application shown in figure 1, Activity A is the "main activity" and uses different
+layouts to display either one or two fragments at a time, depending on the size of the screen:</p>
+<ul>
+ <li>On a tablet-sized screen, the Activity A layout contains both Fragment A and Fragment B.</li>
+ <li>On a handset-sized screen, the Activity A layout contains only Fragment A (the list
+view). In order to show the details in Fragment B, Activity B must open.</li>
+</ul>
+
+<p class="note"><strong>Note:</strong> Activity B is never used on a tablet. It is simply a
+container to present Fragment B, so is only used on handset devices when the two fragments must
+be displayed separately.</p>
+
+<p>Depending on the screen size, the system applies a different {@code main.xml} layout file:</p>
+
+<p><code>res/layout/main.xml</code> for handsets:</p>
+
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <!-- "Fragment A" -->
+ <fragment class="<b>com.example.android.TitlesFragment</b>"
+ android:id="@+id/list_frag"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+</FrameLayout>
+</pre>
+
+<p><code>res/layout-large/main.xml</code> for tablets:</p>
+
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/frags">
+ <!-- "Fragment A" -->
+ <fragment class="<b>com.example.android.TitlesFragment</b>"
+ android:id="@+id/list_frag"
+ android:layout_width="@dimen/titles_size"
+ android:layout_height="match_parent"/>
+ <!-- "Fragment B" -->
+ <fragment class="<b>com.example.android.DetailsFragment</b>"
+ android:id="@+id/details_frag"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+</LinearLayout>
+</pre>
+
+
+<div class="sidebox-wrapper">
+<div class="sidebox">
+ <h3>Supporting sizes based on screen width</h3>
+ <p>Android 3.2 (API level 13) adds new APIs that provide more fine-grain control over what screen
+sizes your app supports and what resources it uses, by declaring screen sizes based on the minimum
+width your layouts require. For example, both a 5" and 7" device qualify as a "large" screen, so
+your "large" layout resources are used on both devices. With API level 13, you can distinguish
+between these two sizes based on the screen width, as measured in density-independent pixels.</p>
+ <p>For details, read the blog post about <a
+href="http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html">
+New Tools for Managing Screen Sizes</a>.</p>
+</div>
+</div>
+
+<p class="note"><strong>Note:</strong> Although the above sample layout for tablets is based on
+the "large" screen configuration qualifier, you should also use the new "minimum width" size
+qualifiers in order to more precisely control the screen size at which the system applies your
+handset or tablet layout. See the sidebar for more information.</p>
+
+<p>How the application responds when a user selects an item from the list depends on whether
+Fragment B is available in the layout:</p>
+<ul>
+ <li>If Fragment B is in the layout, Activity A notifies Fragment B to update itself.</li>
+ <li>If Fragment B is <em>not</em> in the layout, Activity A starts Activity B (which hosts
+Fragment B).</li>
+</ul>
+
+
+<p>To implement this pattern for your application, it's important
+that you develop your fragments to be highly compartmentalized. Specifically, you should follow two
+guidelines:</p>
+
+<ul>
+ <li>Do not manipulate one fragment directly from another.</li>
+ <li>Keep all code that concerns content in a fragment inside that fragment, rather than putting it
+in the host activity's code.</li>
+</ul>
+
+<p>To avoid directly calling one fragment from another, <strong>define a callback interface in each
+fragment</strong> class that it can use to deliver events to
+its host activity, which implements the callback
+interface. When the activity receives a callback due to an event (such as the user selecting a list
+item), the activity responds appropriately based on the current fragment configuration.</p>
+
+<p>For example, Activity A from above can handle item selections depending on whether it's using
+the tablet or handset layout like this:</p>
+
+<pre>
+public class MainActivity extends Activity implements TitlesFragment.OnItemSelectedListener {
+ ...
+
+ /** This is a callback that the list fragment (Fragment A)
+ calls when a list item is selected */
+ public void onItemSelected(int position) {
+ DisplayFragment displayFrag = (DisplayFragment) getFragmentManager()
+ .findFragmentById(R.id.display_frag);
+ if (displayFrag == null) {
+ // DisplayFragment (Fragment B) is not in the layout (handset layout),
+ // so start DisplayActivity (Activity B)
+ // and pass it the info about the selected item
+ Intent intent = new Intent(this, DisplayActivity.class);
+ intent.putExtra("position", position);
+ startActivity(intent);
+ } else {
+ // DisplayFragment (Fragment B) is in the layout (tablet layout),
+ // so tell the fragment to update
+ displayFrag.updateContent(position);
+ }
+ }
+}
+</pre>
+
+<p>When <code>DisplayActivity</code> (Activity B) starts, it reads the data delivered by the
+{@link android.content.Intent} and passes it to the <code>DisplayFragment</code> (Fragment B).</p>
+
+<p>If Fragment B needs to deliver a result back to Fragment A (because Activity B was started with
+{@link android.app.Activity#startActivityForResult startActivityForResult()}), then the process
+works similarly with a callback interface between Fragment B and Activity B. That is, Activity B
+implements a different callback interface defined by Fragment B. When Activity B receives the
+callback with a result from the fragment, it sets the result for the activity (with {@link
+android.app.Activity#setResult setResult()}) and finishes itself. Activity A then receives the
+result and delivers it to Fragment A.</p>
+
+<p>For a demonstration of this technique for creating different fragment combinations for
+tablets and handsets, see the updated version of the <a
+href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb Gallery</a>
+sample.</p>
+
+
+
+
+
+
+<h2 id="ActionBar">Using the Action Bar</h2>
+
+<p>The <a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> is an important UI
+component for Android apps on both tablets and handsets. To ensure that the action bar
+behaves appropriately on all screen sizes, it's important that you use the {@link
+android.app.ActionBar} APIs without adding complex customizations. By using the standard {@link
+android.app.ActionBar} APIs to design your action bar, the Android system does all
+the work to gracefully adapt the action bar for different screen sizes. Here are some important
+tips to follow when creating your action bar:</p>
+
+<ul>
+ <li>When setting a menu item to be an action item, <strong>avoid using the {@code "always"}
+value</strong>. In your <a
+href="{@docRoot}guide/topics/resources/menu-resource.html">menu resource</a>, use {@code "ifRoom"}
+for the {@code android:showAsAction} attribute if you'd like the menu item to appear in the action
+bar. However, you might need {@code "always"} when an action view does not provide an alternative
+action for the overflow menu (that is, it must appear as an action view) or when a menu item added
+by a fragment is low in the menu order and it must jump into the action bar at all times. However,
+you should not use {@code "always"} more than once or twice. In almost all other cases, use {@code
+"ifRoom"} as the value for {@code "android:showAsAction"} when you want the item to appear as an
+action item. Forcing too many action items into the action bar can create a cluttered UI and
+action items may overlap with other action bar elements such as the title or navigation items.</li>
+
+ <li>When adding action items to the action bar with a text title, also <strong>provide an
+icon</strong>, when appropriate, and declare <code>showAsAction="ifRoom|withText"</code>.
+This way, if there's not enough room for the title, but there is enough room for the icon, then only
+the icon may be used.</li>
+
+
+ <li>Always <strong>provide a title</strong> for your action items, even if you don't enable {@code
+"withText"}, because users can view the title as a "tool-tip" by performing a
+"long click" on the item—the title text appears momentarily in a toast message. Providing
+a title is also critical for accessibility, because screen readers read aloud the item title
+even when not visible.</li>
+
+
+ <li><strong>Avoid using custom navigation modes when possible</strong>. Use the built-in tab
+and drop-down navigation modes when possible—they're designed so the system can adapt their
+presentation to different screen sizes. For example, when the width is too narrow for both tabs and
+other action items (such as a handset in portrait orientation), the tabs appear below the action bar
+(this is known as the "stacked action bar"). If you must build a custom navigation mode or other
+custom views in the action bar, thoroughly test them on smaller screens and make any
+necessary adjustments to support a narrow action bar.</li>
+</ul>
+
+<p>For example, the mock-ups below demonstrate how the system may adapt an action bar based
+on the available screen space. On the handset, only two action items fit, so the remaining menu
+items appear in the overflow menu (because {@code android:showAsAction} was set to {@code "ifRoom"})
+and the tabs appear in a separate row (the stacked action bar). On the tablet, more action items can
+fit in the action bar and so do the tabs.</p>
+
+<img src="{@docRoot}images/practices/actionbar-phone-tablet.png" alt=""/>
+<p class="img-caption"><strong>Figure 2.</strong> Mock-up showing how the system re-configures
+action bar components based on the available screen space.</p>
+
+
+<h3 id="SplitActionBar">Using split action bar</h3>
+
+<p>When your application is running on Android 4.0 (API level 14) and
+higher, there's an extra mode available for the action bar called "split action bar." When
+you enable split action bar, a separate bar appears at the bottom of the screen to
+display all action items when the activity is running on a narrow screen (such as a portrait
+handset). Splitting the action bar ensures that a reasonable amount of space is available to
+display action items on a narrow screen and also leave room for navigation and title elements
+at the top.</p>
+
+<p>To enable split action bar, simply add {@code uiOptions="splitActionBarWhenNarrow"} to your
+<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a> or
+<a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a>
+manifest element.</p>
+
+
+<img src="{@docRoot}images/practices/actionbar-phone-splitaction.png" alt=""/>
+<p class="img-caption"><strong>Figure 3.</strong> Split action bar with navigation tabs on the left;
+with the app icon and title disabled on the right.</p>
+
+
+<p>If you'd like to hide the main action bar at the top, because you're using the built-in
+navigation tabs along with the split action bar, call {@link
+android.app.ActionBar#setDisplayShowHomeEnabled setDisplayShowHomeEnabled(false)} to disable the
+application icon in the action bar. In this case, there's now nothing left in the main action bar,
+so it disappears and all that’s left are the navigation tabs at the top and the action items at the
+bottom, as shown by the second device in figure 3.</p>
+
+<p class="note"><strong>Note:</strong> Although the {@code uiOptions} attribute was added in Android
+4.0 (API level 14), you can safely include it in your application even if your <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> is set to
+a value lower than {@code "14"} to remain compatible with older versions of Android. When running on
+older versions, the system simply ignores the attribute because it doesn't understand it. The only
+condition to adding it to your manifest is that you must compile your application against a platform
+version that supports API level 14 or higher. Just be sure that you don't openly use other APIs in
+your application code that aren't supported by the version declared by your <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a>
+attribute.</p>
+
+
+<h3 id="NavigatingUp">Using "up" navigation</h3>
+
+<p>As discussed in the <a href="{@docRoot}guide/topics/ui/actionbar.html#Home">Action Bar</a>
+developer guide, you can use the application icon in the action bar to facilitate user navigation
+when appropriate—either as a method to get back to the "home" activity (similar to clicking
+the logo on a web site) or as a way to navigate up the application's structural hierarchy. Although
+it might seem similar to the standard BACK navigation in some cases, the up navigation option
+provides a more predictable navigation method for situations in which the user may have entered
+from an external location, such as a notification, app widget, or a different application.</p>
+
+<p>When using fragments in different combinations for different devices, it's important to give
+extra consideration to how your up navigation behaves in each configuration. For example, when on a
+handset and your application shows just one fragment at a time, it might be appropriate to enable up
+navigation to go up to the parent screen, whereas it's not necessary when showing the same
+fragment in a multi-pane configuration.</p>
+
+<p>For more information about enabling up navigation, see the <a
+href="{@docRoot}guide/topics/ui/actionbar.html#Home">Action Bar</a> developer guide.</p>
+
+
+
+
+<h2 id="Tips">Other Design Tips</h2>
+
+<ul>
+ <li>When working with a {@link android.widget.ListView}, consider how you might provide more or less
+information in each list item based on the available space. That is, you can create alternative
+layouts to be used by the items in your list adapter such that a large screen might display more
+detail for each item.</li>
+ <li>Create <a href="{@docRoot}guide/topics/resources/more-resources.html ">alternative resource
+files</a> for values such as integers, dimensions, and even booleans. Using size qualifiers for
+these resources, you can easily apply different layout sizes, font sizes, or enable/disable features
+based on the current screen size.</li>
+</ul>
+
+
diff --git a/docs/html/guide/publishing/app-signing.jd b/docs/html/guide/publishing/app-signing.jd
index 193c0fd..9abcdf7 100644
--- a/docs/html/guide/publishing/app-signing.jd
+++ b/docs/html/guide/publishing/app-signing.jd
@@ -7,7 +7,7 @@
<h2>Quickview</h2>
<ul>
-<li>All Android apps <em>must</em> be signed</a></li>
+<li>All Android apps <em>must</em> be signed</li>
<li>You can sign with a self-signed key</li>
<li>How you sign your apps is critical — read this document carefully</li>
<li>Determine your signing strategy early in the development process</li>
@@ -16,11 +16,11 @@
<h2>In this document</h2>
<ol>
-<li><a href="#overview">Overview</a></li>
+<li><a href="#signing">Signing Process</a></li>
<li><a href="#strategies">Signing Strategies</a></li>
<li><a href="#setup">Basic Setup for Signing</a></li>
<li><a href="#debugmode">Signing in Debug Mode</a></li>
-<li><a href="#releasemode">Signing for Public Release</a>
+<li><a href="#releasemode">Signing Release Mode</a>
<ol>
<li><a href="#cert">Obtain a suitable private key</a></li>
<li><a href="#releasecompile">Compile the application in release mode</a></li>
@@ -43,74 +43,67 @@
</div>
</div>
-<p>This document provides information about signing your Android applications prior to publishing them for mobile device users.</p>
-
-<h2 id="overview">Overview</h2>
-
-<p>The Android system requires that all installed applications be digitally
-signed with a certificate whose private key is held by the application's
-developer. The Android system uses the certificate as a means of identifying the author of
-an application and establishing trust relationships between applications. The certificate is not
-used to control which applications the user can install. The certificate
-does not need to be signed by a certificate authority: it is perfectly
-allowable, and typical, for Android applications to use self-signed
-certificates.</p>
+<p>The Android system requires that all installed applications be digitally signed with a
+certificate whose private key is held by the application's developer. The Android system uses the
+certificate as a means of identifying the author of an application and establishing trust
+relationships between applications. The certificate is not used to control which applications the
+user can install. The certificate does not need to be signed by a certificate authority: it is
+perfectly allowable, and typical, for Android applications to use self-signed certificates.</p>
<p>The important points to understand about signing Android applications are:</p>
<ul>
- <li>All applications <em>must</em> be signed. The system will not install an application
-that is not signed.</li>
- <li>You can use self-signed certificates to sign your applications. No certificate authority
-is needed.</li>
- <li>When you are ready to release your application for end-users, you must sign it with a suitable private
-key. You can not publish an application that is signed with the debug key generated
-by the SDK tools.
- </li>
- <li>The system tests a signer certificate's expiration date only at install time. If an
-application's signer certificate expires after the application is installed, the application
+ <li>All applications <em>must</em> be signed. The system will not install an application
+on an emulator or a device if it is not signed.</li>
+ <li>To test and debug your application, the build tools sign your application with a special debug
+ key that is created by the Android SDK build tools.</li>
+ <li>When you are ready to release your application for end-users, you must sign it with a suitable
+ private key. You cannot publish an application that is signed with the debug key generated
+ by the SDK tools.</li>
+ <li>You can use self-signed certificates to sign your applications. No certificate authority is
+ needed.</li>
+ <li>The system tests a signer certificate's expiration date only at install time. If an
+application's signer certificate expires after the application is installed, the application
will continue to function normally.</li>
- <li>You can use standard tools — Keytool and Jarsigner — to generate keys and
+ <li>You can use standard tools — Keytool and Jarsigner — to generate keys and
sign your application .apk files.</li>
- <li>Once you have signed the application, use the <code>zipalign</code> tool to optimize the final APK package.</li>
+ <li>After you sign your application for release, we recommend that you use the
+ <code>zipalign</code> tool to optimize the final APK package.</li>
</ul>
-<p>The Android system will not install or run an application that is not signed appropriately. This
-applies wherever the Android system is run, whether on an actual device or on the emulator.
-For this reason, you must set up signing for your application before you will be able to
-run or debug it on an emulator or device.</p>
+<p>The Android system will not install or run an application that is not signed appropriately. This
+applies wherever the Android system is run, whether on an actual device or on the emulator.
+For this reason, you must <a href="#setup">set up signing</a> for your application before you can
+run it or debug it on an emulator or device.</p>
-<p>The Android SDK tools assist you in signing your applications when debugging. Both the ADT Plugin
-for Eclipse and the Ant build tool offer two signing modes — <em>debug mode</em>
-and <em>release mode</em>.
+<h2 id="signing">Signing Process</h3>
-<ul>
-<li>While developing and testing, you can compile in debug mode.
-In debug mode, the build tools use the Keytool utility, included in the JDK, to create
-a keystore and key with a known alias and password. At each compilation, the tools then use
-the debug key to sign the application .apk file. Because the password is known, the tools
-don't need to prompt you for the keystore/key password each time you compile.</li>
+<p>The Android build process signs your application differently depending on which build mode you
+use to build your application. There are two build modes: <em>debug mode</em> and <em>release
+mode</em>. You use debug mode when you are developing and testing your application. You use
+release mode when you want to build a release version of your application that you can
+distribute directly to users or publish on an application marketplace such as Android Market.</p>
-<li>When your application is ready for release, you must compile in release mode
-and then sign the .apk <span style="color:red">with your private key</span>.
-There are two ways to do this:
- <ul>
- <li>Using Keytool and Jarsigner in the command-line. In this approach,
- you first compile your application to an <em>unsigned</em> .apk. You must then sign
- the .apk manually with your private key
- using Jarsigner (or similar tool). If you do not have a suitable private key already,
- you can run Keytool manually to generate your own keystore/key and then sign your
- application with Jarsigner.</li>
- <li>Using the ADT Export Wizard. If you are developing in Eclipse with the ADT plugin,
- you can use the Export Wizard to compile the application, generate a private key
- (if necessary), and sign the .apk, all in a single process using the Export Wizard.
- </li>
- </ul>
-</li>
-</ul>
+<p>When you build in <em>debug mode</em> the Android SDK build tools use the Keytool utility
+(included in the JDK) to create a debug key. Because the SDK build tools created the debug key,
+they know the debug key's alias and password. Each time you compile your application in debug mode,
+the build tools use the debug key along with the Jarsigner utility (also included in the JDK) to
+sign your application's <code>.apk</code> file. Because the alias and password are known to the SDK
+build tools, the tools don't need to prompt you for the debug key's alias and password each time
+you compile.</p>
-<p>Once your application is signed, don't forget to run {@code zipalign} on the APK
-for additional optimization.</p>
+<p>When you build in <em>release mode</em> you use your own private key to sign your application. If
+you don't have a private key, you can use the Keytool utility to create one for you. When you
+compile your application in release mode, the build tools use your private key along with the
+Jarsigner utility to sign your application's <code>.apk</code> file. Because the certificate and
+private key you use are your own, you will have to provide the password for the keystore and key
+alias.</p>
+
+<p>The debug signing process happens automatically when you run or debug your application using
+Eclipse with the ADT plugin. Debug signing also happens automatically when you use the Ant build
+script with the <code>debug</code> option. You can automate the release signing process by using the
+Eclipse Export Wizard or by modifying the Ant build script and building with the
+<code>release</code> option.</p>
<h2 id="strategies">Signing Strategies</h2>
@@ -149,24 +142,24 @@
</ul>
-<p>Another important consideration in determining your signing strategy is
-how to set the validity period of the key that you will use to sign your
+<p>Another important consideration in determining your signing strategy is
+how to set the validity period of the key that you will use to sign your
applications.</p>
<ul>
-<li>If you plan to support upgrades for a single application, you should ensure
+<li>If you plan to support upgrades for a single application, you should ensure
that your key has a validity period that exceeds the expected lifespan of
-that application. A validity period of 25 years or more is recommended.
+that application. A validity period of 25 years or more is recommended.
When your key's validity period expires, users will no longer be
able to seamlessly upgrade to new versions of your application.</li>
-<li>If you will sign multiple distinct applications with the same key,
-you should ensure that your key's validity period exceeds the expected
-lifespan of <em>all versions of all of the applications</em>, including
+<li>If you will sign multiple distinct applications with the same key,
+you should ensure that your key's validity period exceeds the expected
+lifespan of <em>all versions of all of the applications</em>, including
dependent applications that may be added to the suite in the future. </li>
<li>If you plan to publish your application(s) on Android Market, the
-key you use to sign the application(s) must have a validity period
+key you use to sign the application(s) must have a validity period
ending after 22 October 2033. The Market server enforces this requirement
to ensure that users can seamlessly upgrade Market applications when
new versions are available. </li>
@@ -177,25 +170,21 @@
<h2 id="setup">Basic Setup for Signing</h2>
-<p>Before you begin, you should make sure that
-Keytool is available to the SDK build
-tools. In most cases, you can tell the SDK build tools how to find Keytool by setting
-your <code>JAVA_HOME</code> environment variable to references a suitable JDK.
-Alternatively, you can add the JDK version of Keytool to your <code>PATH</code> variable.</p>
+<p>Before you begin, make sure that the Keytool utility and Jarsigner utility are available to
+the SDK build tools. Both of these tools are available in the JDK. In most cases, you can tell
+the SDK build tools how to find these utilities by setting your <code>JAVA_HOME</code> environment
+variable so it references a suitable JDK. Alternatively, you can add the JDK version of Keytool and
+Jarsigner to your <code>PATH</code> variable.</p>
-<p>If you are developing on a version of Linux that originally came with GNU Compiler for
-Java, make sure that the system is using the JDK version of Keytool, rather than the gcj
-version. If Keytool is already in your <code>PATH</code>, it might be pointing to a symlink at
-<code>/usr/bin/keytool</code>. In this case, check the symlink target to be sure it points
+<p>If you are developing on a version of Linux that originally came with GNU Compiler for
+Java, make sure that the system is using the JDK version of Keytool, rather than the gcj
+version. If Keytool is already in your <code>PATH</code>, it might be pointing to a symlink at
+<code>/usr/bin/keytool</code>. In this case, check the symlink target to be sure it points
to the Keytool in the JDK.</p>
-<p>If you will release your application to the public, you will also need to have
-the Jarsigner tool available on your machine. Both Jarsigner and Keytool are included
-in the JDK. </p>
-
<h2 id="debugmode">Signing in Debug Mode</h2>
-<p>The Android build tools provide a debug signing mode that makes it easier for you
+<p>The Android build tools provide a debug signing mode that makes it easier for you
to develop and debug your application, while still meeting the Android system
requirement for signing your .apk.
When using debug mode to build your app, the SDK tools invoke Keytool to automatically create
@@ -209,7 +198,7 @@
<li>Key alias: "androiddebugkey"</li>
<li>Key password: "android"</li>
<li>CN: "CN=Android Debug,O=Android,C=US"</li>
-</ul></p>
+</ul>
<p>If necessary, you can change the location/name of the debug keystore/key or
supply a custom debug keystore/key to use. However, any custom debug
@@ -218,38 +207,38 @@
<strong>Windows</strong> > <strong>Preferences</strong> >
<strong>Android</strong> > <strong>Build</strong>.) </p>
-<p class="caution"><strong>Caution:</strong> You <em>cannot</em> release your application
+<p class="caution"><strong>Caution:</strong> You <em>cannot</em> release your application
to the public when signed with the debug certificate.</p>
<h3>Eclipse Users</h3>
-<p>If you are developing in Eclipse/ADT (and have set up Keytool as described above in
+<p>If you are developing in Eclipse/ADT (and have set up Keytool and Jarsigner as described above in
<a href="#setup">Basic Setup for Signing</a>),
signing in debug mode is enabled by default. When you run or debug your
-application, ADT signs the .apk with the debug certificate, runs {@code zipalign} on the
-package, then installs it on
-the selected emulator or connected device. No specific action on your part is needed,
+application, ADT signs the .apk with the debug certificate, runs {@code zipalign} on the
+package, then installs it on
+the selected emulator or connected device. No specific action on your part is needed,
provided ADT has access to Keytool.</p>
<h3>Ant Users</h3>
-<p>If you are using Ant to build your .apk files, debug signing mode
+<p>If you are using Ant to build your .apk files, debug signing mode
is enabled by using the <code>debug</code> option with the <code>ant</code> command
(assuming that you are using a <code>build.xml</code> file generated by the
-<code>android</code> tool). When you run <code>ant debug</code> to
-compile your app, the build script generates a keystore/key and signs the .apk for you.
+<code>android</code> tool). When you run <code>ant debug</code> to
+compile your app, the build script generates a keystore/key and signs the .apk for you.
The script then also aligns the .apk with the <code>zipalign</code> tool.
-No other action on your part is needed. Read
+No other action on your part is needed. Read
<a href="{@docRoot}guide/developing/building/building-cmdline.html#DebugMode">Building and Running Apps
on the Command Line</a> for more information.</p>
<h3 id="debugexpiry">Expiry of the Debug Certificate</h3>
-<p>The self-signed certificate used to sign your application in debug mode (the default on
+<p>The self-signed certificate used to sign your application in debug mode (the default on
Eclipse/ADT and Ant builds) will have an expiration date of 365 days from its creation date.</p>
-<p>When the certificate expires, you will get a build error. On Ant builds, the error
+<p>When the certificate expires, you will get a build error. On Ant builds, the error
looks like this:</p>
<pre>debug:
@@ -258,59 +247,59 @@
<p>In Eclipse/ADT, you will see a similar error in the Android console.</p>
-<p>To fix this problem, simply delete the <code>debug.keystore</code> file.
-The default storage location for AVDs is in <code>~/.android/</code> on OS X and Linux,
+<p>To fix this problem, simply delete the <code>debug.keystore</code> file.
+The default storage location for AVDs is in <code>~/.android/</code> on OS X and Linux,
in <code>C:\Documents and Settings\<user>\.android\</code> on Windows XP, and in
<code>C:\Users\<user>\.android\</code> on Windows Vista and Windows 7.</p>
<p>The next time you build, the build tools will regenerate a new keystore and debug key.</p>
-<p>Note that, if your development machine is using a non-Gregorian locale, the build
-tools may erroneously generate an already-expired debug certificate, so that you get an
-error when trying to compile your application. For workaround information, see the
+<p>Note that, if your development machine is using a non-Gregorian locale, the build
+tools may erroneously generate an already-expired debug certificate, so that you get an
+error when trying to compile your application. For workaround information, see the
troubleshooting topic <a href="{@docRoot}resources/faq/troubleshooting.html#signingcalendar">
-I can't compile my app because the build tools generated an expired debug
+I can't compile my app because the build tools generated an expired debug
certificate</a>. </p>
-<h2 id="releasemode">Signing for Public Release</h2>
+<h2 id="releasemode">Signing in Release Mode</h2>
<p>When your application is ready for release to other users, you must:</p>
<ol>
<li><a href="#cert">Obtain a suitable private key</a></li>
- <li><a href="#releasecompile">Compile the application in release mode</li>
+ <li><a href="#releasecompile">Compile the application in release mode</a></li>
<li><a href="#signapp">Sign your application with your private key</a></li>
<li><a href="#align">Align the final APK package</a></li>
</ol>
<p>If you are developing in Eclipse with the ADT plugin, you can use the Export Wizard
-to perform the compile, sign, and align procedures. The Export Wizard even allows you to
-generate a new keystore and private key in the process. So if you use Eclipse, you can
+to perform the compile, sign, and align procedures. The Export Wizard even allows you to
+generate a new keystore and private key in the process. So if you use Eclipse, you can
skip to <a href="#ExportWizard">Compile and sign with Eclipse ADT</a>.</p>
<h3 id="cert">1. Obtain a suitable private key</h3>
-<p>In preparation for signing your application, you must first ensure that
-you have a suitable private key with which to sign. A suitable private
+<p>In preparation for signing your application, you must first ensure that
+you have a suitable private key with which to sign. A suitable private
key is one that:</p>
<ul>
<li>Is in your possession</li>
-<li>Represents the personal, corporate, or organizational entity to be identified
+<li>Represents the personal, corporate, or organizational entity to be identified
with the application</li>
<li>Has a validity period that exceeds the expected lifespan of the application
-or application suite. A validity period of more than 25 years is recommended.
-<p>If you plan to publish your application(s) on Android Market, note that a
+or application suite. A validity period of more than 25 years is recommended.
+<p>If you plan to publish your application(s) on Android Market, note that a
validity period ending after 22 October 2033 is a requirement. You can not upload an
-application if it is signed with a key whose validity expires before that date.
+application if it is signed with a key whose validity expires before that date.
</p></li>
<li>Is not the debug key generated by the Android SDK tools. </li>
</ul>
-<p>The key may be self-signed. If you do not have a suitable key, you must
+<p>The key may be self-signed. If you do not have a suitable key, you must
generate one using Keytool. Make sure that you have Keytool available, as described
in <a href="#setup">Basic Setup</a>.</p>
@@ -318,8 +307,8 @@
command and pass any of the options listed below (and any others, as
needed). </p>
-<p class="warning"><strong>Warning:</strong> Keep your private key secure.
-Before you run Keytool, make sure to read
+<p class="warning"><strong>Warning:</strong> Keep your private key secure.
+Before you run Keytool, make sure to read
<a href="#secure-key">Securing Your Private Key</a> for a discussion of how to keep
your key secure and why doing so is critically important to you and to users. In
particular, when you are generating your key, you should select strong passwords
@@ -342,7 +331,7 @@
the first 8 characters of the alias are used.</td>
</tr>
<tr>
-<td><code>-keyalg <alg></code></td><td>The encryption algorithm to use
+<td><code>-keyalg <alg></code></td><td>The encryption algorithm to use
when generating the key. Both DSA and RSA are supported.</td>
</tr>
<tr>
@@ -354,7 +343,7 @@
<td><code>-dname <name></code></td><td><p>A Distinguished Name that describes
who created the key. The value is used as the issuer and subject fields in the
self-signed certificate. </p><p>Note that you do not need to specify this option
-in the command line. If not supplied, Jarsigner prompts you to enter each
+in the command line. If not supplied, Jarsigner prompts you to enter each
of the Distinguished Name fields (CN, OU, and so on).</p></td>
</tr>
<tr>
@@ -381,14 +370,14 @@
<p>Here's an example of a Keytool command that generates a private key:</p>
-<pre>$ keytool -genkey -v -keystore my-release-key.keystore
+<pre>$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000</pre>
<p>Running the example command above, Keytool prompts you to provide
passwords for the keystore and key, and to provide the Distinguished
Name fields for your key. It then generates the keystore as a file called
-<code>my-release-key.keystore</code>. The keystore and key are
-protected by the passwords you entered. The keystore contains
+<code>my-release-key.keystore</code>. The keystore and key are
+protected by the passwords you entered. The keystore contains
a single key, valid for 10000 days. The alias is a name that you —
will use later, to refer to this keystore when signing your application. </p>
@@ -401,7 +390,7 @@
<h3 id="releasecompile">2. Compile the application in release mode</h3>
-<p>In order to release your application to users, you must compile it in release mode.
+<p>In order to release your application to users, you must compile it in release mode.
In release mode, the compiled application is not signed by default and you will need
to sign it with your private key.</p>
@@ -410,19 +399,19 @@
<h4>With Eclipse</h4>
-<p>To export an <em>unsigned</em> .apk from Eclipse, right-click the project in the Package
-Explorer and select <strong>Android Tools</strong> > <strong>Export Unsigned Application
+<p>To export an <em>unsigned</em> .apk from Eclipse, right-click the project in the Package
+Explorer and select <strong>Android Tools</strong> > <strong>Export Unsigned Application
Package</strong>. Then specify the file location for the unsigned .apk.
-(Alternatively, open your <code>AndroidManifest.xml</code> file in Eclipse, open
+(Alternatively, open your <code>AndroidManifest.xml</code> file in Eclipse, open
the <em>Overview</em> tab, and click <strong>Export an unsigned .apk</strong>.)</p>
-<p>Note that you can combine the compiling and signing steps with the Export Wizard. See
+<p>Note that you can combine the compiling and signing steps with the Export Wizard. See
<a href="#ExportWizard">Compiling and signing with Eclipse ADT</a>.</p>
<h4>With Ant</h4>
<p>If you are using Ant, you can enable release mode by using the <code>release</code> option
-with the <code>ant</code> command. For example, if you are running Ant from the
+with the <code>ant</code> command. For example, if you are running Ant from the
directory containing your {@code build.xml} file, the command would look like this:</p>
<pre>ant release</pre>
@@ -437,7 +426,7 @@
your key alias in the project's {@code ant.properties} file. With this information provided,
the build script will prompt you for your keystore and alias password when you perform
<code>ant release</code>, it will sign the package and then align it. The final output
-file in {@code bin/} will instead be
+file in {@code bin/} will instead be
<code><em><your_project_name></em>-release.apk</code>. With these steps
automated for you, you're able to skip the manual procedures below (steps 3 and 4).
To learn how to specify your keystore and alias in the {@code ant.properties} file,
@@ -455,7 +444,7 @@
<p>To sign your application, you run Jarsigner, referencing both the
application's .apk and the keystore containing the private key with which to
-sign the .apk. The table below shows the options you could use. <p>
+sign the .apk. The table below shows the options you could use. </p>
<table>
<tr>
@@ -471,37 +460,37 @@
</tr>
<tr>
<td><code>-storepass <password></code></td><td><p>The password for the
-keystore. </p><p>As a security precaution, do not include this option
+keystore. </p><p>As a security precaution, do not include this option
in your command line unless you are working at a secure computer.
-If not supplied, Jarsigner prompts you to enter the password. In this
+If not supplied, Jarsigner prompts you to enter the password. In this
way, your password is not stored in your shell history.</p></td>
</tr>
<tr>
<td><code>-keypass <password></code></td><td><p>The password for the private
-key. </p><p>As a security precaution, do not include this option
+key. </p><p>As a security precaution, do not include this option
in your command line unless you are working at a secure computer.
-If not supplied, Jarsigner prompts you to enter the password. In this
+If not supplied, Jarsigner prompts you to enter the password. In this
way, your password is not stored in your shell history.</p></td>
</tr>
</table>
<p>Here's how you would use Jarsigner to sign an application package called
-<code>my_application.apk</code>, using the example keystore created above.
+<code>my_application.apk</code>, using the example keystore created above.
</p>
-<pre>$ jarsigner -verbose -keystore my-release-key.keystore
+<pre>$ jarsigner -verbose -keystore my-release-key.keystore
my_application.apk alias_name</pre>
<p>Running the example command above, Jarsigner prompts you to provide
-passwords for the keystore and key. It then modifies the .apk
-in-place, meaning the .apk is now signed. Note that you can sign an
+passwords for the keystore and key. It then modifies the .apk
+in-place, meaning the .apk is now signed. Note that you can sign an
.apk multiple times with different keys.</p>
<p>To verify that your .apk is signed, you can use a command like this:</p>
<pre>$ jarsigner -verify my_signed.apk</pre>
-<p>If the .apk is signed properly, Jarsigner prints "jar verified".
+<p>If the .apk is signed properly, Jarsigner prints "jar verified".
If you want more details, you can try one of these commands:</p>
<pre>$ jarsigner -verify -verbose my_application.apk</pre>
@@ -510,7 +499,7 @@
<pre>$ jarsigner -verify -verbose -certs my_application.apk</pre>
-<p>The command above, with the <code>-certs</code> option added, will show you the
+<p>The command above, with the <code>-certs</code> option added, will show you the
"CN=" line that describes who created the key.</p>
<p class="note"><strong>Note:</strong> If you see "CN=Android Debug", this means the .apk was
@@ -534,21 +523,21 @@
of the data from the package. The benefit is a reduction in the amount of
RAM consumed by the running application.</p>
-<p>The <code>zipalign</code> tool is provided with the Android SDK, inside the
+<p>The <code>zipalign</code> tool is provided with the Android SDK, inside the
<code>tools/</code> directory. To align your signed .apk, execute:</p>
<pre>zipalign -v 4 <em>your_project_name</em>-unaligned.apk <em>your_project_name</em>.apk</pre>
<p>The {@code -v} flag turns on verbose output (optional). {@code 4} is the
byte-alignment (don't use anything other than 4). The first file argument is
-your signed .apk (the input) and the second file is the destination .apk file (the output).
+your signed .apk (the input) and the second file is the destination .apk file (the output).
If you're overriding an existing .apk, add the {@code -f} flag.</p>
<p class="caution"><strong>Caution:</strong> Your input .apk must be signed with your
private key <strong>before</strong> you optimize the package with {@code zipalign}.
If you sign it after using {@code zipalign}, it will undo the alignment.</p>
-<p>For more information, read about the
+<p>For more information, read about the
<a href="{@docRoot}guide/developing/tools/zipalign.html">zipalign</a> tool.
@@ -568,15 +557,15 @@
<p>To create a signed and aligned .apk in Eclipse:</p>
<ol>
- <li>Select the project in the Package
+ <li>Select the project in the Package
Explorer and select <strong>File > Export</strong>.</li>
- <li>Open the Android folder, select Export Android Application,
+ <li>Open the Android folder, select Export Android Application,
and click <strong>Next</strong>.
- <p>The Export Android Application wizard now starts, which will
+ <p>The Export Android Application wizard now starts, which will
guide you through the process of signing your application,
including steps for selecting the private key with which to sign the .apk
(or creating a new keystore and private key).</p>
- <li>Complete the Export Wizard and your application will be compiled,
+ <li>Complete the Export Wizard and your application will be compiled,
signed, aligned, and ready for distribution.</li>
</ol>
@@ -590,10 +579,10 @@
could find and use them, your authoring identity and the trust of the user
are compromised. </p>
-<p>If a third party should manage to take your key without your knowledge or
+<p>If a third party should manage to take your key without your knowledge or
permission, that person could sign and distribute applications that maliciously
replace your authentic applications or corrupt them. Such a person could also
-sign and distribute applications under your identity that attack other
+sign and distribute applications under your identity that attack other
applications or the system itself, or corrupt or steal user data. </p>
<p>Your reputation as a developer entity depends on your securing your private
@@ -602,12 +591,12 @@
<ul>
<li>Select strong passwords for the keystore and key.</li>
-<li>When you generate your key with Keytool, <em>do not</em> supply the
-<code>-storepass</code> and <code>-keypass</code> options at the command line.
-If you do so, your passwords will be available in your shell history,
+<li>When you generate your key with Keytool, <em>do not</em> supply the
+<code>-storepass</code> and <code>-keypass</code> options at the command line.
+If you do so, your passwords will be available in your shell history,
which any user on your computer could access.</li>
-<li>Similarly, when signing your applications with Jarsigner,
-<em>do not</em> supply the <code>-storepass</code> and <code>-keypass</code>
+<li>Similarly, when signing your applications with Jarsigner,
+<em>do not</em> supply the <code>-storepass</code> and <code>-keypass</code>
options at the command line. </li>
<li>Do not give or lend anyone your private key, and do not let unauthorized
persons know your keystore and key passwords.</li>
diff --git a/docs/html/guide/publishing/preparing.jd b/docs/html/guide/publishing/preparing.jd
index 69aecd4..5ed55fe 100644
--- a/docs/html/guide/publishing/preparing.jd
+++ b/docs/html/guide/publishing/preparing.jd
@@ -1,253 +1,355 @@
-page.title=Preparing to Publish: A Checklist
+page.title=Preparing for Release
@jd:body
-<p>Publishing an application means testing it, packaging it appropriately, and
-making it available to users of Android-powered mobile devices.</p>
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Quickview</h2>
+ <ul>
+ <li>Learn which resources you'll need to release your app.</li>
+ <li>Find out how to configure and build your app for release.</li>
+ <li>Learn best practices for releasing your app.</li>
+ </ul>
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#publishing-intro">Introduction</a></li>
+ <li><a href="#publishing-gather">Gathering Materials and Resources</a></li>
+ <li><a href="#publishing-configure">Configuring Your Application</a></li>
+ <li><a href="#publishing-build">Building Your Application</a></li>
+ <li><a href="#publishing-resources">Preparing External Servers and Resources</a></li>
+ <li><a href="#publishing-test">Testing Your Application for Release</a></li>
+ </ol>
+ <h2>See also</h2>
+ <ol>
+ <li><a href="{@docRoot}guide/publishing/publishing_overview.html">Publishing Overview</a></li>
+ <li><a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a></li>
+ <li><a href="{@docRoot}guide/publishing/publishing.html">Publishing on Android Market</a></li>
+ </ol>
+ </div>
+</div>
-<p>If you plan to publish your application for installation on
-Android-powered devices, there are several things you need to do, to get
-your application ready. This document highlights the significant
-checkpoints for preparing your application for a successful release.
+<p>Before you distribute your Android application to users you need to prepare it for release. The
+preparation process is a required <a href="{@docRoot}guide/developing/index.html">development
+task</a> for all Android applications and is the first step in the publishing process (see figure
+1).</p>
+
+<p>When you prepare your application for release, you configure, build, and test a release
+version of your application. The configuration tasks are straightforward, involving basic code
+cleanup and code modification tasks that help optimize your application. The build process is
+similar to the debug build process and can be done using JDK and Android SDK tools. The testing
+tasks serve as a final check, ensuring that your application performs as expected under real-world
+conditions. When you are finished preparing your application for release you have a signed
+<code>.apk</code> file, which you can distribute directly to users or distribute through an
+application marketplace such as Android Market.</p>
+
+<p>This document summarizes the main tasks you need to perform to prepare your application for
+release. The tasks that are described in this document apply to all Android applications regardless
+how they are released or distributed to users. If you are releasing your application through Android
+Market, you should also read <a href="{@docRoot}guide/publishing/publishing.html">Publishing on
+Android Market</a> to be sure your release-ready application satisfies all Android Market
+requirements.</p>
+
+<p class="note"><strong>Note:</strong> As a best practice, your application should meet all of your
+release criteria for functionality, performance, and stability before you perform the tasks outlined
+in this document.</p>
+
+<img src="{@docRoot}images/publishing/publishing_overview_prep.png"
+ alt="Shows how the preparation process fits into the development process"
+ height="190"
+ id="figure1" />
+<p class="img-caption">
+ <strong>Figure 1.</strong> Preparing for release is a required <a
+href="{@docRoot}guide/developing/index.html">development
+task</a> and is the first step in the publishing process.
</p>
-<p>If you will publish your application on Android Market, please also see <a
-href="{@docRoot}guide/publishing/publishing.html#market">Publishing on Android Market</a>
-for specific preparation requirements for your application. </p>
+<h2 id="publishing-intro">Introduction</h2>
-<p>For general information about the ways that you can publish an applications,
-see the <a href="{@docRoot}guide/publishing/publishing.html">Publishing Your
-Applications</a> document. </p>
+<p>To release your application to users you need to create a release-ready package that users can
+install and run on their Android-powered devices. The release-ready package contains the same
+components as the debug <code>.apk</code> file — compiled source code, resources, manifest
+file, and so on — and it is built using the same build tools. However, unlike the debug
+<code>.apk</code> file, the release-ready <code>.apk</code> file is signed with your own certificate
+and it is optimized with the zipalign tool.</p>
-<div class="special">
-
-<p><a href="#releaseready">Before you consider your application ready for release</a>:</p>
-
-<ol>
-<li>Test your application extensively on an actual device </li>
-<li>Consider adding an End User License Agreement in your application</li>
-<li>Consider adding licensing support</li>
-<li>Specify an icon and label in the application's manifest</li>
-<li>Turn off logging and debugging and clean up data/files</li>
-</ol>
-
-<p><a href="#finalcompile">Before you do the final compile of your application</a>:</p>
-
-<ol start="6">
-<li>Version your application</li>
-<li>Obtain a suitable cryptographic key</li>
-<li>Register for a Maps API Key, if your application is using MapView elements</li>
-</ol>
-
-<p><a href="#compile">Compile your application</a></p>
-
-<p><a href="#post-compile">After you compile your application</a>:</p>
-<ol start="9">
-<li>Sign your application</li>
-<li>Test your compiled application</li>
-</ol>
+<div class="figure" style="width:331px">
+ <img src="{@docRoot}images/publishing/publishing_preparing.png"
+ alt="Shows the five tasks you perform to prepare your app for release"
+ height="450" />
+ <p class="img-caption">
+ <strong>Figure 2.</strong> You perform five main tasks to prepare your application for
+ release.
+ </p>
</div>
-<h2 id="releaseready">Before you consider your application ready for release</h2>
+<p>The signing and optimization tasks are usually seamless if you are building your application with
+Eclipse and the ADT plugin or with the Ant build script (included with the Android SDK). For
+example, you can use the Eclipse Export Wizard to compile, sign, and optimize your application all
+at once. You can also configure the Ant build script to do the same when you build from the command
+line.</p>
-<h3 id="test">1. Test your application extensively on an actual device</h3>
+<p>To prepare your application for release you typically perform five main tasks (see figure 2).
+Each main task may include one or more smaller tasks depending on how you are releasing your
+application. For example, if you are releasing your application through Android Market you may want
+to add special filtering rules to your manifest while you are configuring your application for
+release. Similarly, to meet Android Market publishing guidelines you may have to prepare screenshots
+and create promotional text while you are gathering materials for release.</p>
-<p>It's important to test your application as extensively as possible, in as
-many areas as possible. To help you do that, Android provides a variety of
-testing classes and tools. You can use
-{@link android.app.Instrumentation Instrumentation} to run JUnit and other
-test cases, and you can use testing
-tools such as the <a href="{@docRoot}guide/developing/tools/monkey.html">UI/Application
-Exerciser Monkey</a>. </p>
+<p>You usually perform the tasks listed in figure 2 after you have throroughly debugged and tested
+your application. The Android SDK contains several tools to help you test and debug your Android
+applications. For more information, see the <a
+href="{@docRoot}guide/developing/debugging/index.html">Debugging</a> and <a
+href="{@docRoot}guide/developing/testing/index.html">Testing</a> sections in the Dev Guide.</p>
+
+<h2 id="publishing-gather">Gathering Materials and Resources</h2>
+
+<p>To begin preparing your application for release you need to gather several supporting items. At a
+minimum this includes cryptographic keys for signing your application and an application icon. You
+might also want to include an end-user license agreement.</p>
+
+<h4 id="publishing-keys">Cryptographic keys</h4>
+
+<p>The Android system requires that each installed application be digitally signed with a
+certificate that is owned by the application's developer (that is, a certificate for which the
+developer holds the private key). The Android system uses the certificate as a means of identifying
+the author of an application and establishing trust relationships between applications. The
+certificate that you use for signing does not need to be signed by a certificate authority; the
+Android system allows you to sign your applications with a self-signed certificate. To learn about
+certificate requirements, see <a href="{@docRoot}guide/publishing/app-signing.html#cert">Obtain a
+suitable private key</a>.</p>
+
+<p>You may also have to obtain other release keys if your application accesses a service or uses a
+third-party library that requires you to use a key that is based on your private key. For example,
+if your application uses the <a
+href="http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/ MapView.
+html">MapView</a> class, which is part of the <a
+href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps external
+library</a>, you will need to register your application with the Google Maps service and obtain
+a Maps API key. For information about getting a Maps API key, see <a
+href="http://code.google.com/android/add-ons/google-apis/mapkey.html"> Obtaining a Maps API
+key</a>.</p>
+
+<h4>Application Icon</h4>
+
+<p>Be sure you have an application icon and that it meets the recommended <a
+href="{@docRoot}guide/practices/ui_guidelines/icon_design_launcher.html">icon guidelines</a>. Your
+application's icon helps users identify your application on a device's Home
+screen and in the Launcher window. It also appears in Manage Applications, My Downloads, and
+elsewhere. In addition, publishing services such as Android Market display your icon to users.</p>
+
+<p class="note"><strong>Note:</strong> If you are releasing your application on Android Market, you
+need to create a high resolution
+ version of your icon. See <a
+href="https://www.google.com/support/androidmarket/developer/bin/answer.py?answer=1078870">Graphic
+Assets for your Application</a> for more information.</p>
+
+<h4>End-user License Agreement</h4>
+
+<p>Consider preparing an End User License Agreement (EULA) for your application. A EULA can help
+protect your person, organization, and intellectual property, and we recommend that you provide one
+with your application.</p>
+
+<h4>Miscellaneous Materials</h4>
+
+<p>You might also have to prepare promotional and marketing materials to publicize your application.
+For example, if you are releasing your application on Android Market you will need to prepare some
+promotional text and you will need to create screenshots of your application. For more
+information, see
+<a href="https://www.google.com/support/androidmarket/developer/bin/answer.py?answer=1078870">
+Graphic Assets for your Application</a></p>
+
+<h2 id="publishing-configure">Configuring Your Application for Release</h2>
+
+<p>After you gather all of your supporting materials you can start configuring your application
+for release. This section provides a summary of the configuration changes we recommend that you make
+to your source code, resource files, and application manifest prior to releasing your application.
+Although most of the configuration changes listed in this section are optional, they are
+considered good coding practices and we encourage you to implement them. In some cases,
+you may have already made these configuration changes as part of your development process.</p>
+
+<h4>Choose a good package name</h4>
+
+<p>Make sure you choose a package name that is suitable over the life of your application. You
+cannot change the package name after you distribute your application to users. You can set the
+package name in application's manifest file. For more information, see the <a
+href="{@docRoot}guide/topics/manifest/manifest-element.html#package">package</a> attribute
+documentation.</p>
+
+<h4>Turn off logging and debugging</h4>
+
+<p>Make sure you deactivate logging and disable the debugging option before you build your
+application for release. You can deactivate logging by removing calls to
+{@link android.util.Log} methods in your source files. You can disable debugging by removing the
+<code>android:debuggable</code> attribute from the <code><application></code> tag in your
+manifest file, or by setting the <code>android:debuggable</code> attribute to
+<code>false</code> in your manifest file. Also, remove any log files or static test files that
+were created in your project.</p>
+
+<p>Also, you should remove all {@link android.os.Debug} tracing calls that you
+added to your code, such as {@link android.os.Debug#startMethodTracing()} and
+{@link android.os.Debug#stopMethodTracing()} method calls.</p>
+
+<h4>Clean up your project directories</h4>
+
+<p>Clean up your project and make sure it conforms to the directory structure described in <a
+href="{@docRoot}guide/developing/projects/index.html#ApplicationProjects">Android Projects</a>.
+Leaving stray or orphaned files in your project can prevent your application from compiling and
+cause your application to behave unpredictably. At a minimum you should do the following cleanup
+tasks:</p>
<ul>
-<li>To ensure that your application will run properly for users, you should make
-every effort to obtain one or more physical mobile device(s) of the type on
-which you expect the application to run. You should then test your application
-on the actual device, under realistic network conditions. Testing your
-application on a physical device is very important, because it enables you to
-verify that your user interface elements are sized correctly (especially for
-touch-screen UI) and that your application's performance and battery efficiency
-are acceptable.</li>
-
-<li>If you can not obtain a mobile device of the type you are targeting for your
-application, you can use emulator options such as <code>-dpi</code>,
-<code>-device</code>, <code>-scale</code>, <code>-netspeed</code>,
-<code>-netdelay</code>, <code>-cpu-delay</code> and others to model the
-emulator's screen, network performance, and other attributes to match the target
-device to the greatest extent possible. You can then test your application's UI
-and performance. However, we strongly recommend that you test your application
-on an actual target device before publishing it. </li>
-
+ <li>Review the contents of your <code>jni/</code>, <code>lib/</code>, and <code>src/</code>
+ directories. The <code>jni/</code> directory should contain only source files associated with the
+ <a href="{@docRoot}sdk/ndk/index.html">Android NDK</a>, such as
+ <code>.c</code>, <code>.cpp</code>, <code>.h</code>, and <code>.mk</code> files. The
+ <code>lib/</code> directory should contain only third-party library files or private library
+ files, including prebuilt shared and static libraries (for example, <code>.so</code> files). The
+ <code>src/</code> directory should contain only the source files for your application
+ (<code>.java</code> and <code>.aidl</code> files). The <code>src/</code> directory should not
+ contain any <code>.jar</code> files.</li>
+ <li>Check your project for private or proprietary data files that your application does not use
+ and remove them. For example, look in your project's <code>res/</code> directory for old
+ drawable files, layout files, and values files that you are no longer using and delete them.</li>
+ <li>Check your <code>lib/</code> directory for test libraries and remove them if they are no
+ longer being used by your application.</li>
+ <li>Review the contents of your <code>assets/</code> directory and your <code>res/raw/</code>
+ directory for raw asset files and static files that you need to update or remove prior to
+ release.</li>
</ul>
-<h3 id="eula">2. Consider adding an End User License Agreement in your
-application</h3>
+<h4>Review and update your manifest settings</h4>
-<p>To protect your person, organization, and intellectual property, you may want
-to provide an End User License Agreement (EULA) with your application.
-
-<h3>3. Consider adding support for Android Market Licensing</h3>
-
-<p>If you are publishing a paid application through Android Market, consider
-adding support for Android Market Licensing. Licensing lets you control access
-to your application based on whether the current user has purchased it.
-Using Android Market Licensing is optional.
-
-<p>For complete information about Android Market Licensing Service and how to
-use it in your application, see <a
-href="{@docRoot}guide/publishing/licensing.html">Licensing Your
-Applications</a>.</p>
-
-<h3 id="iconlabel">4. Specify an icon and label in the application's manifest</h3>
-
-<p>The icon and label that you specify in an application's manifest are
-important because they are displayed to users as your application's icon and
-name. They are displayed on the device's Home screen, as well as in Manage
-Applications, My Downloads, and elsewhere. Additionally, publishing services may
-display the icon and label to users. </p>
-
-<p>To specify an icon and label, you define the attributes
-<code>android:icon</code> and <code>android:label</code> in the
-<code><application></code> element of the manifest. </p>
-
-<p>As regards the design of your icon, you should try to make it match as much
-as possible the style used by the built-in Android applications.</p>
-
-<h3 id="logging">5. Turn off logging and debugging and clean up data/files</h3>
-
-<p>For release, you should make sure that debug facilities are turned off and
-that debug and other unnecessary data/files are removed from your application
-project.</p>
-<ul>
-<li>Remove the <code>android:debuggable="true"</code> attribute from the
-<code><application></code> element of the manifest.</li>
-<li>Remove log files, backup files, and other unnecessary files from the
-application project.</li>
-<li>Check for private or proprietary data and remove it as necessary.</li>
-<li>Deactivate any calls to {@link android.util.Log} methods in the source
-code.</li>
-</ul>
-
-<h2 id="finalcompile">Before you do the final compile of your application</h2>
-
-<h3 id="versionapp">6. Version your application</h3>
-
-<p>Before you compile your application, you must make sure that you have defined
-a version number for your application, specifying an appropriate value for both
-the <code>android:versionCode</code> and <code>android:versionName</code>
-attributes of the <code><manifest></code> element in the application's
-manifest file. Carefully consider your version numbering plans in the context of
-your overall application upgrade strategy. </p>
-
-<p>If you have previously released a version of your application, you must make
-sure to increment the version number of the current application. You must
-increment both the <code>android:versionCode</code> and
-<code>android:versionName</code> attributes of the <code><manifest></code>
-element in the application's manifest file, using appropriate values. </p>
-
-<p>For detailed information about how to define version information for your
-application, see <a href="{@docRoot}guide/publishing/versioning.html">Versioning
-Your Applications</a>.</p>
-
-<h3 id="cryptokey">7. Obtain a suitable cryptographic key</h3>
-
-<p>If you have read and followed all of the preparation steps up to this point,
-your application is compiled and ready for signing. Inside the .apk, the
-application is properly versioned, and you've cleaned out extra files and
-private data, as described above. </p>
-
-<p>Before you sign your application, you need to make sure that you have a
-suitable private key. For complete information about how to obtain (or generate)
-a private key, see <a href="{@docRoot}guide/publishing/app-signing.html#cert">
-Obtaining a Suitable Private Key</a>.</p>
-
-<p>Once you have obtained (or generated) a suitable private key, you will use it
-to:</p>
+<p>Verify that the following manifest items are set correctly:</p>
<ul>
-<li>Register for a Maps API Key (see below), if your application uses MapView
-elements.</li>
-<li>Sign your application for release, later in the preparation process</li>
+ <li><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">
+ <uses-permission></a> element
+ <p>You should specify only those permissions that are relevant and required for your application.</p>
+ </li>
+ <li><code>android:icon</code> and <code>android:label</code> attributes
+ <p>You must specify values for these attributes, which are located in the
+ <a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a>
+ element.</p>
+ </li>
+ <li><code>android:versionCode</code> and <code>android:versionName</code> attributes.
+ <p>We recommend that you specify values for these attributes, which are located in the
+ <a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a>
+ element. For more information see
+ <a href="{@docRoot}guide/publishing/versioning.html">Versioning your Application</a>.</p>
+ </li>
</ul>
-<h3 id="mapsApiKey">8. Register for a Maps API Key, if your application is using
-MapView elements</h3>
+<p>There are several additional manifest elements that you can set if you are releasing your
+application on Android Market. For example, the <code>android:minSdkVersion</code> and
+<code>android:targetSdkVersion</code> attributes, which are located in the <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"> <uses-sdk></a> element. For more
+information about these and other Android Market settings, see <a
+href="{@docRoot}/guide//appendix/market-filters.html">Market Filters</a>.</p>
-<div class="sidebox-wrapper">
-<div class="sidebox"><p>
-For complete information about getting a Maps API Key, see <a
-href="http://code.google.com/android/add-ons/google-apis/mapkey.html">
-Obtaining a Maps API Key</a>.</p>
-</div>
-</div>
+<h4>Address compatibility issues</h4>
-<p>If your application uses one or more Mapview elements, you will need to
-register your application with the Google
-Maps service and obtain a Maps API Key, before your MapView(s) will be able to
-retrieve data from Google Maps. To do so, you supply an MD5 fingerprint of your
-signer certificate to the Maps service. </p>
+<p>Android provides several tools and techniques to make your application compatible with a wide
+range of devices. To make your application available to the largest number of users, consider
+doing the following:</p>
-<p>During development, you can get a temporary Maps API Key by registering the
-debug key generated by the SDK tools. However, before publishing your
-application, you must register for a new Maps API Key that is based on your
-private key. </p>
+<ul>
+ <li><strong>Add support for multiple screen configurations</strong>
+ <p>Make sure you meet the
+ <a href="{@docRoot}guide/practices/screens_support.html#screen-independence">
+ best practices for supporting multiple screens</a>. By supporting multiple screen configurations
+ you can create an application that functions properly and looks good on any of the screen sizes
+ supported by Android.</p>
+ </li>
+ <li><strong>Optimize your application for Android 3.0 devices.</strong>
+ <p>If your application is designed for devices older than Android 3.0, make it compatible
+ with Android 3.0 devices by following the guidelines and best practices described in
+ <a href="{@docRoot}guide/practices/optimizing-for-3.0.html">Optimizing Apps for Android 3.0
+ </a>.</p>
+ </li>
+ <li><strong>Consider using the Support Library</strong>
+ <p>If your application is designed for devices running Android 3.x, make your application
+ compatible with older versions of Android by adding the
+ <a href="{@docRoot}sdk/compatibility-library.html">Support Library</a> to your
+ application project. The Support Library provides static support libraries that you can add to
+ your Android application, which enables you to use APIs that are either not available on
+ older platform versions or use utility APIs that are not part of the framework APIs.</p>
+ </li>
+</ul>
-<p>If your application uses MapView elements, the important points to understand
-are:</p>
+<h4>Update URLs for servers and services</h4>
-<ol>
-<li>You <em>must</em> obtain the Maps API Key before you compile your
-application for release, because you must add the Key to a special attribute in
-each MapView element — <code>android:apiKey</code> — in your
-application's layout files. If you are instantiating MapView objects directly
-from code, you must pass the Maps API Key as a parameter in the constructor.
-</li>
-<li>The Maps API Key referenced by your application's MapView elements must be
-registered (in Google Maps) to the certificate used to sign the application.
-This is particularly important when publishing your application — your
-MapView elements must reference a Key that is registered to the release
-certificate that you will use to sign your application. </li>
-<li>If you previously got a temporary Maps API Key by registering the debug
-certificate generated by the SDK tools, you <em>must</em> remember to obtain a
-new Maps API Key by registering your release certificate. You must then remember
-to change the MapView elements to reference the new Key, rather than the Key
-associated with the debug certificate. If you do not do so, your MapView
-elements will not have permission to download Maps data. </li>
-<li>If you change the private key that you will use to sign your application,
-you <em>must</em> remember to obtain a new Maps API Key from the Google Maps
-service. If you do not get a new Maps API Key and apply it to all MapView
-elements, any MapView elements referencing the old Key will not have permission
-to download Maps data. </li>
-</ol>
+<p>If your application accesses remote servers or services, make sure you are using the production
+URL or path for the server or service and not a test URL or path.</p>
-<h2 id="compile">Compile your application</h2>
+<h4>Implement Licensing (if you are releasing on Android Market)</h4>
-<p>When you've prepared your application as described in the previous sections,
-you can compile your application for release.</p>
+<p>If you are releasing a paid application through Android Market, consider adding support for
+Android Market Licensing. Licensing lets you control access to your application based on whether the
+current user has purchased it. Using Android Market Licensing is optional even if you are
+releasing your app through Android Market.</p>
+<p>For more information about Android Market Licensing Service and how to use it in your
+application, see <a href="{@docRoot}guide/publishing/licensing.html">Application Licensing</a>.</p>
-<h2 id="post-compile">After you compile your application</h2>
+<h2 id="publishing-build">Building Your Application for Release</h2>
-<h3 id="signapp">9. Sign your application</h3>
+<p>After you finish configuring your application you can build it into a release-ready
+<code>.apk</code> fle that is signed and optimized. The JDK includes the tools for signing the
+<code>.apk</code> file (Keytool and Jarsigner); the Android SDK includes the tools for compiling and
+optimizing the <code>.apk</code> file. If you are using Eclipse with the ADT plugin or you are using
+the Ant build script from the command line, you can automate the entire build process.</p>
-<p>Sign your application using your private key and then
-align it with the {@code zipalign} tool. Signing your application
-correctly is critically important. Please see
-<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your
-Applications</a> for complete information. </p>
+<h3>Building with Eclipse</h3>
-<h3 id="testapp">10. Test your compiled and signed application</h3>
+<p>You can use the Eclipse Export Wizard to build a release-ready <code>.apk</code> file that is
+signed with your private key and optimized. To learn how to run the Export Wizard, see
+<a href="{@docRoot}guide/publishing/app-signing.html#ExportWizard">Compile and sign with Eclipse
+ADT</a>. The Export Wizard compiles your application for release, signs your application with your
+private key, and optimizes your application with the zipalign tool. The Export Wizard should run
+successfully if you have run or debugged your application from Eclipse and you have no errors in
+your application (see <a href="{@docRoot}guide/developing/building/building-eclipse.html">Building
+and Running from Eclipse with ADT</a> for more information.</p>
-<p>Before you release your compiled application, you should thoroughly test it
-on the target mobile device (and target network, if possible). In particular,
-you should make sure that any MapView elements in your UI are receiving maps
-data properly. If they are not, go back to <a href="#mapsApiKey">Register for a
-Maps API Key</a> and correct the problem. You should also ensure that the
-application works correctly with any server-side services and data that you are
-providing or are relying on and that the application handles any authentication
-requirements correctly. </p>
+<p>The Export Wizard assumes that you have a <a href="#billing-keys">certificate and private key</a>
+suitable for signing your application. If you do not have a suitable certificate and private key,
+the Export Wizard will help you generate one (see
+<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a> for more
+information about the signing process and signing guidelines.</p>
-<p>After testing, you are now ready to publish your application to mobile device
-users.</p>
+<h3>Building with Ant</h3>
+
+<p>You can use the Ant build script (included in the Android SDK) to build a release-ready
+<code>.apk</code> file that is signed with your private key and optimized. To learn how to do this,
+see <a href="{@docRoot}guide/developing/building/building-cmdline.html#ReleaseMode">Building in
+Release Mode</a>. This build method assumes you have a <a href="#billing-keys">certificate and
+private key</a> suitable for signing your application. If you do not have a suitable certificate and
+private key, the Export Wizard will help you generate one (see
+<a href="{@docRoot}guide/publishing/app-signing.html">Signing Your Applications</a> for more
+information about the signing process and signing guidelines.</p>
+
+<h2 id="publishing-resources">Preparing External Servers and Resources</h2>
+
+<p>If your application relies on a remote server, make sure the server is secure and that it is
+configured for production use. This is particularly important if you are implementing <a
+href="{@docRoot}guide/market/billing/index.html">in-app billing</a> in your application and you are
+performing the signature verification step on a remote server.</p>
+
+<p>Also, if your application fetches content from a remote server or a real-time service (such as a
+content feed), be sure the content you are providing is up to date and production-ready.</p>
+
+<h2 id="publishing-test">Testing Your Application for Release</h2>
+
+<p>Testing the release version of your application helps ensure that your application runs properly
+under realistic device and network conditions. Ideally, you should test your application on at least
+one handset-sized device and one tablet-sized device to verify that your user interface elements are
+sized correctly and that your application's performance and battery efficiency are acceptable.</p>
+
+<p>As a starting point for testing, see
+<a href="{@docRoot}guide/topics/testing/what_to_test.html">What to Test</a>. This article provides
+a summary of common Android situations that you should consider when you are testing. When you are
+done testing and you are satisfied that the release version of your application
+behaves correctly, you can release your application to users. For more information, see
+<a href="{@docRoot}guide/publishing/publishing_overview.html#publishing-release">Releasing Your
+Application to Users</a>. If you are publishing your application on Android Market, see
+<a href="{@docRoot}guide/publishing/publishing.html">Publishing on Android Market</a>.</p>
diff --git a/docs/html/guide/publishing/publishing_overview.jd b/docs/html/guide/publishing/publishing_overview.jd
new file mode 100755
index 0000000..a0f6ae3
--- /dev/null
+++ b/docs/html/guide/publishing/publishing_overview.jd
@@ -0,0 +1,236 @@
+page.title=Publishing Overview
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+ <h2>Quickview</h2>
+ <ul>
+ <li>Learn how to publish Android apps.</li>
+ <li>Find out how to prepare apps for release.</li>
+ <li>Learn how to release apps to users.</li>
+ </ul>
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#publishing-prepare">Preparing Your Application for Release</a></li>
+ <li><a href="#publishing-release">Releasing Your Application to Users</a>
+ <ol>
+ <li><a href="#publishing-market">Releasing on Android Market</a></li>
+ <li><a href="#publishing-website">Releasing on your own website</a></li>
+ <li><a href="#publishing-email">Releasing through email</a></li>
+ </ol>
+ </ol>
+ <h2>See also</h2>
+ <ol>
+ <li><a href="{@docRoot}guide/publishing/publishing_preparing.html">Preparing for
+ Release</a></li>
+ <li><a href="{@docRoot}guide/publishing/publishing.html">Publishing on Android Market</a></li>
+ </ol>
+</div>
+</div>
+
+<p>Publishing is the process that makes your Android applications available to users. When you
+publish an Android application you perform two main tasks:</p>
+
+<ul>
+ <li>You prepare the application for release.
+ <p>During the preparation step you build a release version of your application, which users can
+ download and install on their Android-powered devices.</p>
+ </li>
+ <li>You release the application to users.
+ <p>During the release step you publicize, sell, and distribute the release version of your
+ application to users.</p>
+ </li>
+</ul>
+
+<p>Usually, you release your application through an application marketplace, such as Android Market.
+However, you can also release applications by sending them directly to users or by letting users
+download them from your own website.</p>
+
+<p>Figure 1 shows how the publishing process fits into the overall Android <a
+href="{@docRoot}guide/developing/index.html">application development process</a>.
+The publishing process is typically performed after you finish testing your application in a debug
+environment. Also, as a best practice, your application should meet all of your release criteria for
+functionality, performance, and stability before you begin the publishing process.</p>
+
+<img src="{@docRoot}images/publishing/publishing_overview.png" alt="Shows where the publishing
+ process fits into the overall development process" height="86" id="figure1" />
+<p class="img-caption">
+ <strong>Figure 1.</strong> Publishing is the last phase of the Android <a
+href="{@docRoot}guide/developing/index.html">application development process</a>.
+</p>
+
+<h2 id="publishing-prepare">Preparing Your Application for Release</h2>
+
+<p>Preparing your application for release is a multi-step process that involves the following
+tasks:</p>
+
+<ul>
+
+ <li>Configuring your application for release.
+ <p>At a minimum you need to remove {@link android.util.Log} calls and remove the
+ <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
+ attribute from your manifest file. You should also provide values for the
+ <code>android:versionCode</code> and <code>android:versionName</code> attributes, which are
+ located in the
+ <a href="{@docRoot}guide/topics/manifest/manifest-element.html"><manifest></a>
+ element. You may also have to configure several other settings to meet Android Market
+ requirements or accomodate whatever method you're using to release your application.</p>
+ </li>
+ <li>Building and signing a release version of your application.
+ <p>The Android Development Tools (ADT) plugin and the Ant build script that are provided
+ with the Android SDK tools provide everything you need to build and sign a release version of
+ your application.</p>
+ </li>
+ <li>Testing the release version of your application.
+ <p>Before you distribute your application, you should thoroughly test the release version on at
+ least one target handset device and one target tablet device.</p>
+ </li>
+ <li>Updating application resources for release.
+ <p>You need to be sure that all application resources such as multimedia files and graphics
+ are updated and included with your application or staged on the proper production servers.</p>
+ </li>
+ <li>Preparing remote servers and services that your application depends on.
+ <p>If your application depends on external servers or services, you need to be sure they
+ are secure and production ready.</p>
+ </li>
+</ul>
+
+<p>You may have to perform several other tasks as part of the preparation process. For example, you
+will need to get a private key for signing your application, and you may need to get a Maps API
+release key if you are using the <a
+href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps external
+library</a>. You will also need to create an icon for your application, and you may want to prepare
+an End User License Agreement (EULA) to protect your person, organization, and intellectual
+property.</p>
+
+<p>When you are finished preparing your application for release you will have a signed
+<code>.apk</code> file that you can distribute to users.</p>
+
+<p>To learn how to prepare your application for release, see <a
+href="{@docRoot}guide/publishing/preparing.html">Preparing for Release</a> in the Dev Guide. This
+topic provides step-by-step instructions for configuring and building a release version of your
+application.</p>
+
+<h2 id="publishing-release">Releasing Your Application to Users</h2>
+
+<p>You can release your Android applications several ways. Usually, you release applications
+through an application marketplace, such as Android Market, but you can also release applications
+on your own website or by sending an application directly to a user. Android Market is the
+recommended marketplace for Android applications and is particularly useful if you want to
+distribute your applications to a large global audience. The other two release methods—server
+distribution and email distribution—are useful if you are releasing an application to a small
+group of users (for example, a work group in an enterprise environment), or if you do not want to
+make your application available to the general public.</p>
+
+<h3 id="publishing-market">Releasing Your Applications on Android Market</h3>
+
+<p>Android Market is a robust publishing platform that helps you publicize, sell, and distribute
+your Android applications to users around the world. When you release your applications through
+Android Market you have access to a suite of developer tools that let you analyze your sales,
+identify market trends, and control who your applications are being distributed to. You also have
+access to several revenue-enhancing features that are not available anywhere else, such as <a
+href="{@docRoot}guide/market/billing/index.html">in-app billing</a> and <a
+href="{@docRoot}guide/publishing/licensing.html">application licensing</a>. This rich array of tools
+and features, coupled with numerous end-user community features, makes Android Market the premier
+marketplace for selling and buying Android applications.</p>
+
+<p>Releasing your application on Android Market is a simple process that involves four basic
+ steps:</p>
+
+<div class="figure" style="width:275px">
+ <img src="{@docRoot}images/publishing/publishing_unknown_sources.png"
+ alt="Screenshot showing the graphical user interface element that allows unknown sources
+ to be installed" />
+ <p class="img-caption">
+ <strong>Figure 2.</strong> The <strong>Unknown sources</strong> setting lets you install
+ applications that are not published on Android Market .
+ </p>
+</div>
+
+<ul>
+ <li>Preparing promotional materials.
+ <p>To fully leverage the marketing and publicity capabilities of Android Market, you need to
+ create promotional materials for your application, such as screenshots, videos, graphics, and
+ promotional text.</p>
+ </li>
+ <li>Planning publishing options.
+ <p>Android Market lets you target your application to a worldwide pool of users and devices.
+ Using various Android Market tools, you can choose the countries you want to reach, the
+ price you want to charge in each country, and the devices you want to target. You can also
+ use Android Market's filtering settings to target specific device features and capabilities.</p>
+ </li>
+ <li>Configuring publishing options and uploading assets.
+ <p>After you create your promotional materials and determine which publishing options are
+ suitable for your application, you can use the Android Market developer console to configure
+ those options and upload the promotional materials. You can also use the developer console to
+ upload your application as a draft (unpublished) application, which lets you do final
+ testing before you publish it for final release.</p>
+ </li>
+ <li>Publishing the release version of your application.
+ <p>When you are satisfied that your publishing settings are correctly configured and your
+ uploaded application is ready to be released to the public, you can simply click
+ <strong>Publish</strong > in the developer console and within minutes your application will be
+ live and available for download around the world.</p>
+ </li>
+</ul>
+
+<p>For information about Android Market, see <a
+href="{@docRoot}guide/publishing/publishing.html#market">Publishing on Android Market</a>. This
+topic provides an introduction to Android Market features and provides a step-by-step guide for
+distributing your applications on Android Market.</p>
+
+<h3 id="publishing-website">Releasing your application on your own website</h3>
+
+<p>If you do not want to release your application on an application marketplace like Android Market,
+you can release your application by making it available for download on your own website or server.
+To do this, you must first prepare your application for release (that is, you must build it for
+release and sign it). Then all you need to do is host the release-ready application on your website
+and provide a download link for the application. When users browse to your website with their
+Android-powered devices and download your application, the Android system will automatically start
+installing the application on the device. However, the installation process will start automatically
+only if the user has configured their device to allow the installation of non-Android Market
+applications.</p>
+
+<div class="figure" style="width:275px">
+ <img src="{@docRoot}images/publishing/publishing_via_email.png"
+ alt="Screenshot showing the graphical user interface users see when you send them an app"
+ height="453" />
+ <p class="img-caption">
+ <strong>Figure 3.</strong> Users can simply click <strong>Install</strong> when you send them
+ an application via email.
+ </p>
+</div>
+
+<p>By default, Android-powered devices allow users to install applications only if the applications
+have been downloaded from Android Market. To allow the installation of applications from other
+sources, users need to enable the <strong>Unknown sources</strong> setting on their devices, and
+they need to make this configuration change before they download your application to their
+device (see figure 2).</p>
+
+<p class="note"><strong>Note:</strong> Some network providers do not allow users to install
+applications from unknown sources.</p>
+
+<p>Although it is relatively easy to release your application on your own website, it can be
+inefficient and cumbersome. For example, if you want to monetize your application you will
+have to process and track all financial transactions yourself and you will not be able to use
+Android Market's in-app billing feature to sell in-app products. In addition, you will not be
+able to use the licensing feature to help prevent unauthorized installation and use of your
+application.</p>
+
+<h3 id="publishing-email">Releasing your application through email</h3>
+
+<p>The easiest and quickest way to release your application is to send it to a user through
+email. To do this, you prepare your application for release and then attach it to an email
+and send it to a user. When the user opens your email message on their Android-powered device
+the Android system will recognize the <code>.apk</code> and display an <strong>Install Now</strong>
+button in the email message (see figure 3). Users can install your application by touching the
+button.</p>
+
+<p class="note"><strong>Note:</strong> The <strong>Install Now</strong> button appears only if a
+user has configured their device to allow the installation of non-Android Market applications and
+they open your email with the native Gmail application.</p>
+
+<p>Releasing applications through email is convenient if you are sending your application to
+only a few trusted users, but it provides few protections from piracy and unauthorized
+distribution; that is, anyone you send your application to can simply forward it to someone else.
+else.
\ No newline at end of file
diff --git a/docs/html/guide/publishing/versioning.jd b/docs/html/guide/publishing/versioning.jd
index 01bfba8..79ebf96 100644
--- a/docs/html/guide/publishing/versioning.jd
+++ b/docs/html/guide/publishing/versioning.jd
@@ -32,8 +32,8 @@
</div>
</div>
-<p>Versioning is a critical component of your application upgrade/maintenance
-strategy. </p>
+<p>Versioning is a critical component of your application upgrade and maintenance
+strategy. Versioning is important because:</p>
<ul>
<li>Users need to have specific information about the application version that
@@ -48,15 +48,14 @@
determine compatibility and establish upgrade/downgrade relationships.</li>
</ul>
-<p>The Android system itself <em>does not ever</em> check the application version
-information for an application, such as to enforce restrictions on upgrades,
-compatibility, and so on. Instead, only users or applications themselves are
-responsible for enforcing any version restrictions for applications themselves. </p>
-
-<p>The Android system <em>does</em> check any system version compatibility expressed
-by an application in its manifest, in the <code>minSdkVersion</code> attribute. This
-allows an application to specify the minimum system API with which is compatible.
-For more information see <a href="#minsdkversion">Specifying Minimum System API Version</a>.
+<p>The Android system does not use app version information to enforce
+restrictions on upgrades, downgrades, or compatibility of third-party apps. Instead, you (the
+developer) are responsible for enforcing version restrictions within your application or by
+informing users of the version restrictions and limitations. The Android system does, however,
+enforce system version compatibility as expressed by the <code>minSdkVersion</code> attribute in the
+manifest. This attribute allows an application to specify the minimum system API with which it is
+compatible. For more information see <a href="#minsdkversion">Specifying Minimum System API
+Version</a>.</p>
<h2 id="appversioning">Setting Application Version</h2>
<p>To define the version information for your application, you set attributes in
@@ -65,7 +64,7 @@
<ul>
<li><code>android:versionCode</code> — An integer value that represents
-the version of the application code, relative to other versions.
+the version of the application code, relative to other versions.
<p>The value is an integer so that other applications can programmatically
evaluate it, for example to check an upgrade or downgrade relationship. You can
@@ -83,7 +82,7 @@
services should not display this version value to users.</p>
</li>
<li><code>android:versionName</code> — A string value that represents the
-release version of the application code, as it should be shown to users.
+release version of the application code, as it should be shown to users.
<p>The value is a string so that you can describe the application version as a
<major>.<minor>.<point> string, or as any other type of
absolute or relative version identifier. </p>
@@ -121,20 +120,20 @@
<p>The Android framework provides an API to let applications query the system
for version information about your application. To obtain version information,
-applications use the
-{@link android.content.pm.PackageManager#getPackageInfo(java.lang.String, int)}
+applications use the
+{@link android.content.pm.PackageManager#getPackageInfo(java.lang.String, int)}
method of {@link android.content.pm.PackageManager PackageManager}. </p>
<h2 id="minsdkversion">Specifying Your Application's System API Requirements</h2>
<p>If your application requires a specific minimum version of the Android
platform, or is designed only to support a certain range of Android platform
-versions, you can specify those version requirements as API Level identifiers
-in the application's manifest file. Doing so ensures that your
+versions, you can specify those version requirements as API Level identifiers
+in the application's manifest file. Doing so ensures that your
application can only be installed on devices that
are running a compatible version of the Android system. </p>
-<p>To specify API Level requirements, add a <code><uses-sdk></code>
+<p>To specify API Level requirements, add a <code><uses-sdk></code>
element in the application's manifest, with one or more of these attributes: </p>
<ul>
@@ -144,10 +143,10 @@
<li><code>android:targetSdkVersion</code> — Specifies the API Level
on which the application is designed to run. In some cases, this allows the
application to use manifest elements or behaviors defined in the target
-API Level, rather than being restricted to using only those defined
+API Level, rather than being restricted to using only those defined
for the minimum API Level.</li>
<li><code>android:maxSdkVersion</code> — The maximum version
-of the Android platform on which the application is designed to run,
+of the Android platform on which the application is designed to run,
specified by the platform's API Level identifier. <strong>Important:</strong> Please read the <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code><uses-sdk></code></a>
documentation before using this attribute. </li>
diff --git a/docs/html/guide/topics/admin/device-admin.jd b/docs/html/guide/topics/admin/device-admin.jd
index 7dddd9a..7bbf5e6 100644
--- a/docs/html/guide/topics/admin/device-admin.jd
+++ b/docs/html/guide/topics/admin/device-admin.jd
@@ -619,8 +619,8 @@
mDPM.setPasswordExpirationTimeout(mDeviceAdminSample, pwExpiration);
</pre>
-<p>From the <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/
-DeviceAdminSample.html"> Device Administration API sample</a>, here is the code
+<p>From the <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/DeviceAdminSample.html"
+>Device Administration API sample</a>, here is the code
that updates the password expiration status:</p>
<pre>
diff --git a/docs/html/guide/topics/fundamentals/fragments.jd b/docs/html/guide/topics/fundamentals/fragments.jd
index 8f61945..d6ba646 100644
--- a/docs/html/guide/topics/fundamentals/fragments.jd
+++ b/docs/html/guide/topics/fundamentals/fragments.jd
@@ -11,7 +11,7 @@
<li>Fragments decompose application functionality and UI into reusable modules</li>
<li>Add multiple fragments to a screen to avoid switching activities</li>
<li>Fragments have their own lifecycle, state, and back stack</li>
- <li>Fragments require API Level "Honeycomb" or greater</li>
+ <li>Fragments require API Level 11 or greater</li>
</ul>
<h2>In this document</h2>
@@ -49,8 +49,16 @@
<h2>Related samples</h2>
<ol>
<li><a
+href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb Gallery</a></li>
+ <li><a
href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment">ApiDemos</a></li>
</ol>
+
+ <h2>See also</h2>
+ <ol>
+ <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">Supporting Tablets
+and Handsets</a></li>
+ </ol>
</div>
</div>
@@ -58,7 +66,8 @@
{@link android.app.Activity}. You can combine multiple fragments in a single activity to build a
multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a
modular section of an activity, which has its own lifecycle, receives its own input events, and
-which you can add or remove while the activity is running.</p>
+which you can add or remove while the activity is running (sort of like a "sub activity" that
+you can reuse in different activities).</p>
<p>A fragment must always be embedded in an activity and the fragment's lifecycle is directly
affected by the host activity's lifecycle. For example, when the activity is paused, so are all
@@ -69,14 +78,16 @@
fragment transaction, you can also add it to a back stack that's managed by the
activity—each back stack entry in the activity is a record of the fragment transaction that
occurred. The back stack allows the user to reverse a fragment transaction (navigate backwards),
-by pressing the BACK key.</p>
+by pressing the BACK button.</p>
<p>When you add a fragment as a part of your activity layout, it lives in a {@link
-android.view.ViewGroup} inside the activity's view hierarchy and defines its own layout of views.
+android.view.ViewGroup} inside the activity's view hierarchy and the fragment defines its own view
+layout.
You can insert a fragment into your activity layout by declaring the fragment in the activity's
layout file, as a {@code <fragment>} element, or from your application code by adding it to an
existing {@link android.view.ViewGroup}. However, a fragment is not required to be a part of the
-activity layout; you may also use a fragment as an invisible worker for the activity.</p>
+activity layout; you may also use a fragment without its own UI as an invisible worker for the
+activity.</p>
<p>This document describes how to build your application to use fragments, including
how fragments can maintain their state when added to the activity's back stack, share
@@ -86,9 +97,9 @@
<h2 id="Design">Design Philosophy</h2>
-<p>Android introduced fragments in Android 3.0 (API Level "Honeycomb"), primarily to support more
+<p>Android introduced fragments in Android 3.0 (API level 11), primarily to support more
dynamic and flexible UI designs on large screens, such as tablets. Because a
-tablet's screen is much larger than that of a mobile phone, there's more room to combine and
+tablet's screen is much larger than that of a handset, there's more room to combine and
interchange UI components. Fragments allow such designs without the need for you to manage complex
changes to the view hierarchy. By dividing the layout of an activity into fragments, you become able
to modify the activity's appearance at runtime and preserve those changes in a back stack
@@ -99,28 +110,34 @@
activity, side by side, and each fragment has its own set of lifecycle callback methods and handle
their own user input events. Thus, instead of using one activity to select an article and another
activity to read the article, the user can select an article and read it all within the same
-activity, as illustrated in figure 1.</p>
+activity, as illustrated in the tablet layout in figure 1.</p>
+
+<p>You should design each fragment as a modular and reusable activity component. That is, because
+each fragment defines its own layout and its own behavior with its own lifecycle callbacks, you can
+include one fragment in multiple activities, so you should design for reuse and avoid directly
+manipulating one fragment from another fragment. This is especially important because a modular
+fragment allows you to change your fragment combinations for different screen sizes. When designing
+your application to support both tablets and handsets, you can reuse your fragments in different
+layout configurations to optimize the user experience based on the available screen space. For
+example, on a handset, it might be necessary to separate fragments to provide a single-pane UI when
+more than one cannot fit within the same activity.</p>
<img src="{@docRoot}images/fundamentals/fragments.png" alt="" />
-<p class="img-caption"><strong>Figure 1.</strong> An example of how two UI modules that are
-typically separated into two activities can be combined into one activity, using fragments.</p>
-
-
-<p>A fragment should be a modular and reusable component in your application. That is, because the
-fragment defines its own layout and its own behavior using its own lifecycle callbacks, you
-can include one fragment in multiple activities. This is especially important because it allows you
-to adapt your user experience to different screen sizes. For instance, you might include multiple
-fragments in an activity only when the screen size is sufficiently large, and, when it is not,
-launch separate activities that use different fragments.</p>
+<p class="img-caption"><strong>Figure 1.</strong> An example of how two UI modules defined by
+fragments can be combined into one activity for a tablet design, but separated for a
+handset design.</p>
<p>For example—to continue with the news application example—the application can embed
-two
-fragments in <em>Activity A</em>, when running on an extra large screen (a tablet, for example).
-However, on a normal-sized screen (a phone, for example),
-there's not be enough room for both fragments, so <em>Activity A</em> includes only the fragment for
-the list of articles, and when the user selects an article, it starts <em>Activity B</em>, which
-includes the fragment to read the article. Thus, the application supports both design patterns
-suggested in figure 1.</p>
+two fragments in <em>Activity A</em>, when running on a tablet-sized device. However, on a
+handset-sized screen, there's not be enough room for both fragments, so <em>Activity A</em> includes
+only the fragment for the list of articles, and when the user selects an article, it starts
+<em>Activity B</em>, which includes the second fragment to read the article. Thus, the application
+supports both tablets and handsets by reusing fragments in different combinations, as illustrated in
+figure 1.</p>
+
+<p>For more information about designing your application with different fragment combinations for
+different screen configurations, see the guide to <a
+href="{@docRoot}guide/practices/tablets-and-handsets.html">Supporting Tablets and Handsets</a>.</p>
diff --git a/docs/html/guide/topics/fundamentals/loaders.jd b/docs/html/guide/topics/fundamentals/loaders.jd
index d31f090..3aad204 100644
--- a/docs/html/guide/topics/fundamentals/loaders.jd
+++ b/docs/html/guide/topics/fundamentals/loaders.jd
@@ -32,7 +32,8 @@
<h2>Related samples</h2>
<ol>
<li> <a
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentListCursorLoader.html">FragmentListCursorLoader</a></li>
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html">
+LoaderCursor</a></li>
<li> <a
href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html">
LoaderThrottle</a></li>
@@ -485,7 +486,9 @@
<p>There are a few different samples in <strong>ApiDemos</strong> that
illustrate how to use loaders:</p>
<ul>
- <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentListCursorLoader.html">FragmentListCursorLoader</a> — A complete version of the
+ <li><a
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html">
+LoaderCursor</a> — A complete version of the
snippet shown above.</li>
<li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a> — An example of how to use throttling to
reduce the number of queries a content provider does then its data changes.</li>
diff --git a/docs/html/guide/topics/graphics/2d-graphics.jd b/docs/html/guide/topics/graphics/2d-graphics.jd
index ac2b47c..5abffb3 100644
--- a/docs/html/guide/topics/graphics/2d-graphics.jd
+++ b/docs/html/guide/topics/graphics/2d-graphics.jd
@@ -188,7 +188,7 @@
<p>This document discusses the basics of using Drawable objects to draw graphics and how to use a
couple subclasses of the Drawable class. For information on using Drawables to do frame-by-frame
-animation, see <a href="{@docRoot}guide/topics/animation/frame-animation.html">Frame-by-Frame
+animation, see <a href="{@docRoot}guide/topics/animation/drawable-animation.html">Drawable
Animation</a>.</p>
<p>A {@link android.graphics.drawable.Drawable} is a general abstraction for "something that can be
diff --git a/docs/html/guide/topics/graphics/animation.jd b/docs/html/guide/topics/graphics/animation.jd
index e8996f6..561369d 100644
--- a/docs/html/guide/topics/graphics/animation.jd
+++ b/docs/html/guide/topics/graphics/animation.jd
@@ -6,7 +6,8 @@
<h2>See also</h2>
<ol>
- <li><a href="{@docRoot}guide/topics/graphics/property-animation.html">Property Animation</a></li>
+ <li><a href="{@docRoot}guide/topics/graphics/prop-animation.html">Property
+Animation</a></li>
<li><a href="{@docRoot}guide/topics/graphics/view-animation.html">View Animation</a></li>
<li><a href="{@docRoot}guide/topics/graphics/drawable-animation.html">Drawable Animation</a></li>
<ol>
diff --git a/docs/html/guide/topics/graphics/index.jd b/docs/html/guide/topics/graphics/index.jd
index ffa9a39..ab623c2 100644
--- a/docs/html/guide/topics/graphics/index.jd
+++ b/docs/html/guide/topics/graphics/index.jd
@@ -5,7 +5,7 @@
<div id="qv">
<h2>Topics</h2>
<ol>
- <li><a href="{@docRoot}guide/topics/graphics/canvas.html">Canvas and Drawables</a></li>
+ <li><a href="{@docRoot}guide/topics/graphics/2d-graphics.html">Canvas and Drawables</a></li>
<li><a href="{@docRoot}guide/topics/graphics/hardware-accel.html">Hardware Acceleration</a></li>
<li><a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL</a></li>
</ol>
diff --git a/docs/html/guide/topics/graphics/opengl.jd b/docs/html/guide/topics/graphics/opengl.jd
index 231f4ef..6a2a20f 100644
--- a/docs/html/guide/topics/graphics/opengl.jd
+++ b/docs/html/guide/topics/graphics/opengl.jd
@@ -40,14 +40,11 @@
</ol>
<h2>Related samples</h2>
<ol>
- <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/
-GLSurfaceViewActivity.html">GLSurfaceViewActivity</a></li>
- <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/
-GLES20Activity.html">GLES20Activity</a></li>
- <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/
-TouchRotateActivity.html">TouchRotateActivity</a></li>
- <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/
-CompressedTextureActivity.html">Compressed Textures</a></li>
+ <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/GLSurfaceViewActivity.html">GLSurfaceViewActivity</a></li>
+ <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/GLES20Activity.html">GLES20Activity</a></li>
+ <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html">TouchRotateActivity</a></li>
+ <li><a
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/CompressedTextureActivity.html">Compressed Textures</a></li>
</ol>
<h2>See also</h2>
<ol>
@@ -94,8 +91,8 @@
implement the touch listeners, as shown in OpenGL Tutorials for
<a href="{@docRoot}resources/tutorials/opengl/opengl-es10.html#touch">ES 1.0</a>,
<a href="{@docRoot}resources/tutorials/opengl/opengl-es20.html#touch">ES 2.0</a> and the <a
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity
-.html">TouchRotateActivity</a> sample.</dd>
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html"
+>TouchRotateActivity</a> sample.</dd>
<dt><strong>{@link android.opengl.GLSurfaceView.Renderer}</strong></dt>
<dd>This interface defines the methods required for drawing graphics in an OpenGL {@link
@@ -410,9 +407,8 @@
android.opengl.ETC1Util} utility class and the {@code etc1tool} compression tool (located in the
Android SDK at {@code <sdk>/tools/}). For an example of an Android application that uses
texture compression, see the <a
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/
-CompressedTextureActivity.html">CompressedTextureActivity</a> code sample.
-</p>
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/CompressedTextureActivity.html"
+>CompressedTextureActivity</a> code sample.</p>
<p>To check if the ETC1 format is supported on a device, call the {@link
android.opengl.ETC1Util#isETC1Supported() ETC1Util.isETC1Supported()} method.</p>
diff --git a/docs/html/guide/topics/manifest/activity-element.jd b/docs/html/guide/topics/manifest/activity-element.jd
index 02a8a8e..e23fb0ec 100644
--- a/docs/html/guide/topics/manifest/activity-element.jd
+++ b/docs/html/guide/topics/manifest/activity-element.jd
@@ -34,6 +34,7 @@
android:<a href="#state">stateNotNeeded</a>=["true" | "false"]
android:<a href="#aff">taskAffinity</a>="<i>string</i>"
android:<a href="#theme">theme</a>="<i>resource or theme</i>"
+ android:<a href="#uioptions">uiOptions</a>=["none" | "splitActionBarWhenNarrow"]
android:<a href="#wsoft">windowSoftInputMode</a>=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
@@ -749,14 +750,39 @@
<p>
If this attribute is not set, the activity inherits the theme set for the
-application as a whole — see the
+application as a whole — from the
<code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>
element's
<code><a href="{@docRoot}guide/topics/manifest/application-element.html#theme">theme</a></code>
-attribute. If that attribute is also not set, the default system theme is used.
+attribute. If that attribute is also not set, the default system theme is used. For more
+information, see the <a
+href="{@docRoot}guide/topics/ui/themes.html">Styles and Themes</a> developer guide.
</p>
<dd>
+<!-- ##api level 14## -->
+<dt><a name="uioptions"></a>{@code android:uiOptions}</dt>
+<dd>Extra options for an activity's UI.
+ <p>Must be one of the following values.</p>
+
+ <table>
+ <tr><th>Value</th><th>Description</th></tr>
+ <tr><td>{@code "none"}</td><td>No extra UI options. This is the default.</td></tr>
+ <tr><td>{@code "splitActionBarWhenNarrow"}</td><td>Add a bar at
+the bottom of the screen to display action items in the {@link android.app.ActionBar}, when
+constrained for horizontal space (such as when in portrait mode on a handset). Instead of a small
+number of action items appearing in the action bar at the top of the screen, the action bar is
+split into the top navigation section and the bottom bar for action items. This ensures a reasonable
+amount of space is made available not only for the action items, but also for navigation and title
+elements at the top. Menu items are not split across the two bars; they always appear
+together.</td></tr>
+ </table>
+ <p>For more information about the action bar, see the <a
+href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</p>
+ <p>This attribute was added in API level 14.</p>
+</dd>
+
+
<!-- ##api level 3## -->
<dt><a name="wsoft"></a>{@code android:windowSoftInputMode}</dt>
<dd>How the main window of the activity interacts with the window containing
diff --git a/docs/html/guide/topics/manifest/application-element.jd b/docs/html/guide/topics/manifest/application-element.jd
index 41313ed..4f1964c 100644
--- a/docs/html/guide/topics/manifest/application-element.jd
+++ b/docs/html/guide/topics/manifest/application-element.jd
@@ -23,7 +23,8 @@
android:<a href="#proc">process</a>="<i>string</i>"
android:<a href="#restoreany">restoreAnyVersion</a>=["true" | "false"]
android:<a href="#aff">taskAffinity</a>="<i>string</i>"
- android:<a href="#theme">theme</a>="<i>resource or theme</i>" >
+ android:<a href="#theme">theme</a>="<i>resource or theme</i>"
+ android:<a href="#uioptions">uiOptions</a>=["none" | "splitActionBarWhenNarrow"] >
. . .
</application></pre></dd>
@@ -276,7 +277,31 @@
<dd>A reference to a style resource defining a default theme for all
activities in the application. Individual activities can override
the default by setting their own <code><a href="{@docRoot}guide/topics/manifest/activity-element.html#theme">theme</a></code>
-attributes; see that attribute for more information.</dd>
+attributes. For more information, see the <a
+href="{@docRoot}guide/topics/ui/themes.html">Styles and Themes</a> developer guide.
+</dd>
+
+<!-- ##api level 14## -->
+<dt><a name="uioptions"></a>{@code android:uiOptions}</dt>
+<dd>Extra options for an activity's UI.
+ <p>Must be one of the following values.</p>
+
+ <table>
+ <tr><th>Value</th><th>Description</th></tr>
+ <tr><td>{@code "none"}</td><td>No extra UI options. This is the default.</td></tr>
+ <tr><td>{@code "splitActionBarWhenNarrow"}</td><td>Add a bar at
+the bottom of the screen to display action items in the {@link android.app.ActionBar}, when
+constrained for horizontal space (such as when in portrait mode on a handset). Instead of a small
+number of action items appearing in the action bar at the top of the screen, the action bar is
+split into the top navigation section and the bottom bar for action items. This ensures a reasonable
+amount of space is made available not only for the action items, but also for navigation and title
+elements at the top. Menu items are not split across the two bars; they always appear
+together.</td></tr>
+ </table>
+ <p>For more information about the action bar, see the <a
+href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</p>
+ <p>This attribute was added in API level 14.</p>
+</dd>
</dl></dd>
diff --git a/docs/html/guide/topics/renderscript/compute.jd b/docs/html/guide/topics/renderscript/compute.jd
index e4c2283..8f08f59 100644
--- a/docs/html/guide/topics/renderscript/compute.jd
+++ b/docs/html/guide/topics/renderscript/compute.jd
@@ -1,6 +1,6 @@
page.title=Compute
parent.title=RenderScript
-parent.link=index.html
+parent.link=index.html
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/guide/topics/renderscript/graphics.jd b/docs/html/guide/topics/renderscript/graphics.jd
index d8be85f..2fefecc 100644
--- a/docs/html/guide/topics/renderscript/graphics.jd
+++ b/docs/html/guide/topics/renderscript/graphics.jd
@@ -9,10 +9,26 @@
<ol>
<li>
- <a href="#developing">Developing a RenderScript application</a>
-
+ <a href="#creating-graphics-rs">Creating a Graphics Renderscript</a>
<ol>
- <li><a href="#hello-graphics">The Hello Graphics application</a></li>
+ <li><a href="#creating-native">Creating the native Renderscript file</a></li>
+ <li><a href="#creating-entry">Creating the Renderscript entry point class</a></li>
+ <li><a href="#creating-view">Creating the surface view</a></li>
+ <li><a href="#creating-activity">Creating the activity</a></li>
+ </ol>
+ </li>
+ <li>
+ <a href="#drawing">Drawing</a>
+ <ol>
+ <li><a href="#drawing-rsg">Drawing using the rsgDraw functions</a></li>
+ <li><a href="#drawing-mesh">Drawing with a mesh</a></li>
+ </ol>
+ </li>
+ <li>
+ <a href="#shaders">Shaders</a>
+ <ol>
+ <li><a href="#shader-bindings">Shader bindings</a></li>
+ <li><a href="#shader-sampler">Defining a sampler</a></li>
</ol>
</li>
</ol>
@@ -22,13 +38,13 @@
<ol>
<li><a href="{@docRoot}resources/samples/RenderScript/Balls/index.html">Balls</a></li>
- <li><a href=
- "{@docRoot}resources/samples/Renderscript/Fountain/index.html">Fountain</a></li>
+ <li><a href="{@docRoot}resources/samples/RenderScript/Fountain/index.html">Fountain</a></li>
<li><a href="{@docRoot}resources/samples/RenderScript/HelloWorld/index.html">Hello
World</a></li>
- <li><a href="{@docRoot}resources/samples/RenderScript/Samples/index.html">Samples</a></li>
+ <li><a
+href="{@docRoot}resources/samples/RenderScript/MiscSamples/index.html">Misc Samples</a></li>
</ol>
</div>
</div>
@@ -40,7 +56,7 @@
will need to be familiar with APIs to appropriately render 3D graphics on an Android-powered
device.</p>
- <h2>Creating a Graphics RenderScript</h2>
+ <h2 id="creating-graphics-rs">Creating a Graphics RenderScript</h2>
<p>Because of the various layers of code when writing a RenderScript application, it is useful to
create the following files for a scene that you want to render:</p>
@@ -73,7 +89,7 @@
RenderScript sample that is provided in the SDK as a guide (some code has been modified from its
original form for simplicity).</p>
- <h3>Creating the native RenderScript file</h3>
+ <h3 id="creating-native">Creating the native RenderScript file</h3>
<p>Your native RenderScript code resides in a <code>.rs</code> file in the
<code><project_root>/src/</code> directory. You can also define <code>.rsh</code> header
@@ -102,8 +118,8 @@
enough or more resources to do so, and renders as fast as it can if it does not.</p>
<p>For more
- information on using the RenderScript graphics functions, see <a href=
- "using-graphics-api">Using the Graphics APIs</a>.</p>
+ information on using the RenderScript graphics functions, see the <a href=
+ "#drawing">Drawing</a> section.</p>
</li>
<li>An <code>init()</code> function. This allows you to do any initialization of your
@@ -153,7 +169,7 @@
}
</pre>
- <h3>Creating the RenderScript entry point class</h3>
+ <h3 id="creating-entry">Creating the RenderScript entry point class</h3>
<p>When you create a RenderScript (<code>.rs</code>) file, it is helpful to create a
corresponding Android framework class that is an entry point into the <code>.rs</code> file. In
@@ -218,7 +234,7 @@
</pre>
- <h3>Creating the surface view</h3>
+ <h3 id="creating-view">Creating the surface view</h3>
<p>To create a surface view to render graphics on, create a class that extends {@link
android.renderscript.RSSurfaceView}. This class also creates a RenderScript context object
@@ -293,7 +309,7 @@
</pre>
- <h3>Creating the Activity</h3>
+ <h3 id="creating-activity">Creating the Activity</h3>
<p>Applications that use RenderScript still adhere to activity lifecyle, and are part of the same
view hierarchy as traditional Android applications, which is handled by the Android VM. This
@@ -329,9 +345,9 @@
}
</pre>
- <h2>Drawing</h2>
-
- <h3>Drawing using the rsgDraw functions</h3>
+ <h2 id="drawing">Drawing</h2>
+ <p>The following sections describe how to use the graphics functions to draw with Renderscript.</p>
+ <h3 id="drawing-rsg">Drawing using the rsgDraw functions</h3>
<p>The native RenderScript APIs provide a few convenient functions to easily draw a polygon to
the screen. You call these in your <code>root()</code> function to have them render to the
@@ -348,7 +364,7 @@
the screen.</li>
</ul>
- <h3>Drawing with a mesh</h3>
+ <h3 id="drawing-mesh">Drawing with a mesh</h3>
<p>When you want to draw complex shapes and textures to the screen, instantiate a {@link
android.renderscript.Mesh} and draw it to the screen with <code>rsgDrawMesh()</code>. A {@link
@@ -559,7 +575,7 @@
"{@docRoot}resources/samples/RenderScript/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStatesRS.html">
RsRenderStatesRS</a> sample has many examples on how to create a shader without writing GLSL.</p>
- <h3>Shader bindings</h3>
+ <h3 id="shader-bindings">Shader bindings</h3>
<p>You can also set four pragmas that control the shaders' default bindings to the {@link
android.renderscript.RenderScriptGL} context when the script is executing:</p>
@@ -599,7 +615,7 @@
#pragma stateStore(parent)
</pre>
- <h3>Defining a sampler</h3>
+ <h3 id="shader-sampler">Defining a sampler</h3>
<p>A {@link android.renderscript.Sampler} object defines how data is extracted from textures.
Samplers are bound to Program objects (currently only a Fragment Program) alongside the texture
diff --git a/docs/html/guide/topics/resources/animation-resource.jd b/docs/html/guide/topics/resources/animation-resource.jd
index 480ca78..eaa698f 100644
--- a/docs/html/guide/topics/resources/animation-resource.jd
+++ b/docs/html/guide/topics/resources/animation-resource.jd
@@ -10,8 +10,8 @@
<li><a href="#Property">Property Animation</a></li>
<li><a href="#View">View Animation</a>
<ol>
- <li><a href="Tween">Tween animation</a></li>
- <li><a href="Frame">Frame animation</a></li>
+ <li><a href="#Tween">Tween animation</a></li>
+ <li><a href="#Frame">Frame animation</a></li>
</ol>
</li>
</ol>
diff --git a/docs/html/guide/topics/search/search-dialog.jd b/docs/html/guide/topics/search/search-dialog.jd
index 27409d5..e06563d 100644
--- a/docs/html/guide/topics/search/search-dialog.jd
+++ b/docs/html/guide/topics/search/search-dialog.jd
@@ -807,8 +807,8 @@
Bar</a> developer guide.</p>
<p>Also see the <a
-href="{@docRoot}resources/samples/SearchableDictionary/src/com/example/android/searchabledict/
-SearchableDictionary.html">Searchable Dictionary</a> for an example implementation using
+href="{@docRoot}resources/samples/SearchableDictionary/src/com/example/android/searchabledict/SearchableDictionary.html"
+>Searchable Dictionary</a> for an example implementation using
both the dialog and the widget.</p>
diff --git a/docs/html/guide/topics/usb/adk.jd b/docs/html/guide/topics/usb/adk.jd
index 120576b..6c7ab0d 100644
--- a/docs/html/guide/topics/usb/adk.jd
+++ b/docs/html/guide/topics/usb/adk.jd
@@ -396,7 +396,7 @@
<li>Connect the ADK board (USB-A) to your Android-powered device (micro-USB). Ensure that the
power cable to the accessory is plugged in or that the micro-USB port on the accesory is
- connected to your computer for power (this also allows you to <a href="monitoring">monitor the
+ connected to your computer for power (this also allows you to <a href="#monitoring">monitor the
ADK board</a>). When connected, accept the prompt that asks for whether or not to open the
DemoKit application to connect to the accessory. If the prompt does not show up, connect and
reconnect the accessory.</li>
@@ -625,8 +625,8 @@
<code>AndroidAccessory::isAccessoryDevice()</code>. This method checks the vendor and product ID
of the device descriptor. A device in accessory mode has a vendor ID of 0x18D1 and a product ID
of 0x2D00 or 0x2D01. If the device is in accessory mode, then the ADK board can <a href=
- "#establish-a">establish communication with the device</a>. If not, the board <a href=
- "start-a">attempts to start the device in accessory mode</a>.</p>
+ "#establish">establish communication with the device</a>. If not, the board <a href=
+ "#start">attempts to start the device in accessory mode</a>.</p>
<pre>
bool AndroidAccessory::isConnected(void)
{
@@ -699,7 +699,7 @@
</pre>If this method returns false, the board waits until a new device is connected. If it is
successful, the device displays itself on the USB bus as being in accessory mode when the ADK board
re-enumerates the bus. When the device is in accessory mode, the accessory then <a href=
-"establish-a">establishes communication with the device</a>.
+"establish-adk">establishes communication with the device</a>.
<h3 id="establish-adk">Establish communication with the device</h3>
diff --git a/docs/html/guide/topics/usb/index.jd b/docs/html/guide/topics/usb/index.jd
index 6dc8ec5..ef53bdf 100644
--- a/docs/html/guide/topics/usb/index.jd
+++ b/docs/html/guide/topics/usb/index.jd
@@ -42,8 +42,8 @@
dependant on the device's hardware, regardless of platform level. You can filter for devices that
support USB host and accessory through a <a href=
"{@docRoot}guide/topics/manifest/uses-feature-element.html"><uses-feature></a> element. See
- the USB <a href="{@docRoot}guide/topics/USB/accessory.html">accessory</a> and <a href=
- "{@docRoot}guide/topics/USB/host.html">host</a> documentation for more details.</p>
+ the USB <a href="{@docRoot}guide/topics/usb/accessory.html">accessory</a> and <a href=
+ "{@docRoot}guide/topics/usb/host.html">host</a> documentation for more details.</p>
<h2>Debugging considerations</h2>
diff --git a/docs/html/images/developing/developing_overview.png b/docs/html/images/developing/developing_overview.png
new file mode 100755
index 0000000..ab09407
--- /dev/null
+++ b/docs/html/images/developing/developing_overview.png
Binary files differ
diff --git a/docs/html/images/fundamentals/fragments.graffle b/docs/html/images/fundamentals/fragments.graffle
new file mode 100755
index 0000000..c14282b
--- /dev/null
+++ b/docs/html/images/fundamentals/fragments.graffle
@@ -0,0 +1,2549 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGrafflePro</string>
+ <string>138.9.0.117994</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {576, 733}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2011-01-11 11:58:30 -0800</string>
+ <key>Creator</key>
+ <string>Scott Main</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>FileType</key>
+ <string>flat</string>
+ <key>GraphDocumentVersion</key>
+ <integer>6</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{381.839, 143.614}, {103, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>199</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>Position</key>
+ <real>0.49348831176757812</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKyNTZWxlY3RpbmcgYW4gaXRlbQpzdGFydHMg
+ QWN0aXZpdHkgQoaEAmlJASOShISEDE5TRGljdGlvbmFy
+ eQCUhAFpA5KElpYQTlNQYXJhZ3JhcGhTdHlsZYaShISE
+ EE5TUGFyYWdyYXBoU3R5bGUAlIQEQ0NAUwIAhISEB05T
+ QXJyYXkAlJkMkoSEhAlOU1RleHRUYWIAlIQCQ2YAHIaS
+ hJ+eADiGkoSfngBUhpKEn54AcIaShJ+eAIGMAIaShJ+e
+ AIGoAIaShJ+eAIHEAIaShJ+eAIHgAIaShJ+eAIH8AIaS
+ hJ+eAIEYAYaShJ+eAIE0AYaShJ+eAIFQAYaGAIaShJaW
+ B05TQ29sb3KGkoSEhAdOU0NvbG9yAJSEAWMDhAJmZgCD
+ ZmYmP4aShJaWBk5TRm9udIaShISEBk5TRm9udB6UmRyE
+ BVsyOGNdBgAAABQAAAD//kgAZQBsAHYAZQB0AGkAYwBh
+ AIQBZgygAKABoACgAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Selecting an item\
+starts Activity B}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ <key>ID</key>
+ <integer>198</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{369.178, 215.343}</string>
+ <string>{423.11, 162.614}</string>
+ <string>{500.499, 215.4}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>213</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{82.9116, 142.624}, {119, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>207</integer>
+ <key>Line</key>
+ <dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>Position</key>
+ <real>0.4970354437828064</real>
+ <key>RotationType</key>
+ <integer>0</integer>
+ </dict>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKyVTZWxlY3RpbmcgYW4gaXRlbSAKdXBkYXRl
+ cyBGcmFnbWVudCBChoQCaUkBJZKEhIQMTlNEaWN0aW9u
+ YXJ5AJSEAWkDkoSWlhBOU1BhcmFncmFwaFN0eWxlhpKE
+ hIQQTlNQYXJhZ3JhcGhTdHlsZQCUhARDQ0BTAgCEhIQH
+ TlNBcnJheQCUmQyShISECU5TVGV4dFRhYgCUhAJDZgAc
+ hpKEn54AOIaShJ+eAFSGkoSfngBwhpKEn54AgYwAhpKE
+ n54AgagAhpKEn54AgcQAhpKEn54AgeAAhpKEn54AgfwA
+ hpKEn54AgRgBhpKEn54AgTQBhpKEn54AgVABhoYAhpKE
+ lpYHTlNDb2xvcoaShISEB05TQ29sb3IAlIQBYwOEAmZm
+ AINmZiY/hpKElpYGTlNGb250hpKEhIQGTlNGb250HpSZ
+ HIQFWzI4Y10GAAAAFAAAAP/+SABlAGwAdgBlAHQAaQBj
+ AGEAhAFmDKAAoAGgAKAAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Selecting an item \
+updates Fragment B}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>11</real>
+ </dict>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Info</key>
+ <integer>4</integer>
+ </dict>
+ <key>ID</key>
+ <integer>206</integer>
+ <key>OrthogonalBarAutomatic</key>
+ <false/>
+ <key>OrthogonalBarPosition</key>
+ <real>4.1290435791015625</real>
+ <key>Points</key>
+ <array>
+ <string>{71.6501, 212.785}</string>
+ <string>{160.191, 161.624}</string>
+ <string>{214.615, 212.785}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.7</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>2</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>Info</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{48.4197, 241.159}, {69.6911, 14.0908}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>239</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{131.767, 253.185}, {122.888, 80.6596}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>238</integer>
+ <key>Rotation</key>
+ <real>359.89700317382812</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{131.723, 217.483}, {122.898, 31.7043}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>237</integer>
+ <key>Rotation</key>
+ <real>359.89700317382812</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>4</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>236</integer>
+ <key>Points</key>
+ <array>
+ <string>{118.111, 325.705}</string>
+ <string>{48.4197, 325.705}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>235</integer>
+ <key>Points</key>
+ <array>
+ <string>{118.111, 311.614}</string>
+ <string>{48.4197, 311.614}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>234</integer>
+ <key>Points</key>
+ <array>
+ <string>{118.111, 297.523}</string>
+ <string>{48.4197, 297.523}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>233</integer>
+ <key>Points</key>
+ <array>
+ <string>{118.111, 283.432}</string>
+ <string>{48.4197, 283.432}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>232</integer>
+ <key>Points</key>
+ <array>
+ <string>{118.111, 269.341}</string>
+ <string>{48.4197, 269.341}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>231</integer>
+ <key>Points</key>
+ <array>
+ <string>{118.111, 227.364}</string>
+ <string>{48.4197, 227.364}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{127.406, 212.785}, {130.814, 125.056}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>230</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.7396, -1.1094}</string>
+ <string>{-0.421637, -1.26491}</string>
+ <string>{0, -1.33333}</string>
+ <string>{0.421637, -1.26491}</string>
+ <string>{0.7396, -1.1094}</string>
+ <string>{1.1094, -0.7396}</string>
+ <string>{1.26491, -0.421637}</string>
+ <string>{1.33333, 0}</string>
+ <string>{1.26491, 0.421637}</string>
+ <string>{1.1094, 0.7396}</string>
+ <string>{0.7396, 1.1094}</string>
+ <string>{0.421637, 1.26491}</string>
+ <string>{0, 1.33333}</string>
+ <string>{-0.421637, 1.26491}</string>
+ <string>{-0.7396, 1.1094}</string>
+ <string>{-1.1094, 0.7396}</string>
+ <string>{-1.26491, 0.421636}</string>
+ <string>{-1.33333, -6.35783e-07}</string>
+ <string>{-1.26491, -0.421638}</string>
+ <string>{-1.1094, -0.7396}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{48.4197, 212.785}, {69.6911, 125.056}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>229</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.7396, -1.1094}</string>
+ <string>{-0.421636, -1.26491}</string>
+ <string>{1.27157e-06, -1.33333}</string>
+ <string>{0.421638, -1.26491}</string>
+ <string>{0.739601, -1.1094}</string>
+ <string>{1.1094, -0.7396}</string>
+ <string>{1.26491, -0.421636}</string>
+ <string>{1.33333, 0}</string>
+ <string>{1.26491, 0.421637}</string>
+ <string>{1.1094, 0.7396}</string>
+ <string>{0.7396, 1.1094}</string>
+ <string>{0.421638, 1.26491}</string>
+ <string>{1.27157e-06, 1.33333}</string>
+ <string>{-0.421636, 1.26491}</string>
+ <string>{-0.739599, 1.1094}</string>
+ <string>{-1.1094, 0.739601}</string>
+ <string>{-1.26491, 0.421638}</string>
+ <string>{-1.33333, -6.35783e-07}</string>
+ <string>{-1.26491, -0.421638}</string>
+ <string>{-1.1094, -0.7396}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.921919</string>
+ <key>g</key>
+ <string>1</string>
+ <key>r</key>
+ <string>0.936969</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{40.3187, 205.072}, {226.178, 141.361}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Copperplate-Bold</string>
+ <key>Size</key>
+ <real>33</real>
+ </dict>
+ <key>ID</key>
+ <integer>228</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.938075</string>
+ <key>g</key>
+ <string>0.938269</string>
+ <key>r</key>
+ <string>0.938154</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.712329</string>
+ <key>g</key>
+ <string>0.70317</string>
+ <key>r</key>
+ <string>0.691643</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>1</real>
+ <key>Width</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{24.8797, 189.905}, {258.196, 172.701}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>227</integer>
+ <key>ImageID</key>
+ <integer>4</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{-0.7396, -1.1094}</string>
+ <string>{-0.421637, -1.26491}</string>
+ <string>{-3.17891e-07, -1.33333}</string>
+ <string>{0.421637, -1.26491}</string>
+ <string>{0.7396, -1.1094}</string>
+ <string>{1.1094, -0.7396}</string>
+ <string>{1.26491, -0.421637}</string>
+ <string>{1.33333, 0}</string>
+ <string>{1.26491, 0.421637}</string>
+ <string>{1.1094, 0.7396}</string>
+ <string>{0.7396, 1.1094}</string>
+ <string>{0.421637, 1.26491}</string>
+ <string>{-3.17892e-07, 1.33333}</string>
+ <string>{-0.421638, 1.26491}</string>
+ <string>{-0.7396, 1.1094}</string>
+ <string>{-1.1094, 0.7396}</string>
+ <string>{-1.26491, 0.421637}</string>
+ <string>{-1.33333, -6.35783e-07}</string>
+ <string>{-1.26491, -0.421637}</string>
+ <string>{-1.1094, -0.7396}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{473.523, 244.187}, {54.0405, 64.7821}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>226</integer>
+ <key>Rotation</key>
+ <real>359.85791015625</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>Bounds</key>
+ <string>{{473.435, 219.657}, {54.2123, 20.3811}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>225</integer>
+ <key>Rotation</key>
+ <real>359.82769775390625</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>3</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{470.354, 215.4}, {60.48, 97.92}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>224</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Rotation</key>
+ <real>359.88986206054688</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{460.845, 198.425}, {79.9634, 145.72}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>222</integer>
+ <key>ImageID</key>
+ <integer>3</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{339.608, 238.883}, {59.4713, 10.3718}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>220</integer>
+ <key>Rotation</key>
+ <real>359.91473388671875</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.874135</string>
+ <key>r</key>
+ <string>0.71718</string>
+ </dict>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>1</string>
+ <key>g</key>
+ <string>0.662438</string>
+ <key>r</key>
+ <string>0.464468</string>
+ </dict>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>219</integer>
+ <key>Points</key>
+ <array>
+ <string>{399.607, 301.157}</string>
+ <string>{340.135, 301.157}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>218</integer>
+ <key>Points</key>
+ <array>
+ <string>{399.607, 290.785}</string>
+ <string>{340.115, 290.785}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>217</integer>
+ <key>Points</key>
+ <array>
+ <string>{399.707, 280.413}</string>
+ <string>{340.095, 280.413}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>216</integer>
+ <key>Points</key>
+ <array>
+ <string>{399.607, 270.041}</string>
+ <string>{340.075, 270.041}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>215</integer>
+ <key>Points</key>
+ <array>
+ <string>{399.607, 259.669}</string>
+ <string>{340.055, 259.669}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>AllowConnections</key>
+ <string>NO</string>
+ <key>AllowLabelDrop</key>
+ <false/>
+ <key>AllowToConnect</key>
+ <false/>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>214</integer>
+ <key>Points</key>
+ <array>
+ <string>{399.607, 228.411}</string>
+ <string>{339.995, 228.411}</string>
+ </array>
+ <key>Rotation</key>
+ <real>358.4884033203125</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.223529</string>
+ <key>g</key>
+ <string>0.776471</string>
+ <key>r</key>
+ <string>0.643137</string>
+ </dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{339.032, 215.343}, {60.48, 97.92}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>213</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Rotation</key>
+ <real>359.8895263671875</real>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.921919</string>
+ <key>g</key>
+ <string>1</string>
+ <key>r</key>
+ <string>0.936969</string>
+ </dict>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.727869</string>
+ <key>g</key>
+ <string>0.728019</string>
+ <key>r</key>
+ <string>0.72793</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>2</real>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{72.7507, 362.169}, {161, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>210</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKy1BY3Rpdml0eSBBIGNvbnRhaW5zCkZyYWdt
+ ZW50IEEgYW5kIEZyYWdtZW50IEKGhAJpSQEtkoSEhAxO
+ U0RpY3Rpb25hcnkAlIQBaQOShJaWEE5TUGFyYWdyYXBo
+ U3R5bGWGkoSEhBBOU1BhcmFncmFwaFN0eWxlAJSEBEND
+ QFMCAISEhAdOU0FycmF5AJSZDJKEhIQJTlNUZXh0VGFi
+ AJSEAkNmAByGkoSfngA4hpKEn54AVIaShJ+eAHCGkoSf
+ ngCBjACGkoSfngCBqACGkoSfngCBxACGkoSfngCB4ACG
+ koSfngCB/ACGkoSfngCBGAGGkoSfngCBNAGGkoSfngCB
+ UAGGhgCGkoSWlgdOU0NvbG9yhpKEhIQHTlNDb2xvcgCU
+ hAFjA4QCZmYAg2ZmJj+GkoSWlgZOU0ZvbnSGkoSEhAZO
+ U0ZvbnQelJkchAVbMjhjXQYAAAAUAAAA//5IAGUAbAB2
+ AGUAdABpAGMAYQCEAWYMoACgAaAAoACGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Activity A contains\
+Fragment A and Fragment B}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{446.159, 362.169}, {108, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>209</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKx5BY3Rpdml0eSBCIGNvbnRhaW5zCkZyYWdt
+ ZW50IEKGhAJpSQEekoSEhAxOU0RpY3Rpb25hcnkAlIQB
+ aQOShJaWEE5TUGFyYWdyYXBoU3R5bGWGkoSEhBBOU1Bh
+ cmFncmFwaFN0eWxlAJSEBENDQFMCAISEhAdOU0FycmF5
+ AJSZDJKEhIQJTlNUZXh0VGFiAJSEAkNmAByGkoSfngA4
+ hpKEn54AVIaShJ+eAHCGkoSfngCBjACGkoSfngCBqACG
+ koSfngCBxACGkoSfngCB4ACGkoSfngCB/ACGkoSfngCB
+ GAGGkoSfngCBNAGGkoSfngCBUAGGhgCGkoSWlgdOU0Nv
+ bG9yhpKEhIQHTlNDb2xvcgCUhAFjA4QCZmYAg2ZmJj+G
+ koSWlgZOU0ZvbnSGkoSEhAZOU0ZvbnQelJkchAVbMjhj
+ XQYAAAAUAAAA//5IAGUAbAB2AGUAdABpAGMAYQCEAWYM
+ oACgAaAAoACGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Activity B contains\
+Fragment B}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{316.401, 362.169}, {107, 38}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>208</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKx5BY3Rpdml0eSBBIGNvbnRhaW5zCkZyYWdt
+ ZW50IEGGhAJpSQEekoSEhAxOU0RpY3Rpb25hcnkAlIQB
+ aQOShJaWEE5TUGFyYWdyYXBoU3R5bGWGkoSEhBBOU1Bh
+ cmFncmFwaFN0eWxlAJSEBENDQFMCAISEhAdOU0FycmF5
+ AJSZDJKEhIQJTlNUZXh0VGFiAJSEAkNmAByGkoSfngA4
+ hpKEn54AVIaShJ+eAHCGkoSfngCBjACGkoSfngCBqACG
+ koSfngCBxACGkoSfngCB4ACGkoSfngCB/ACGkoSfngCB
+ GAGGkoSfngCBNAGGkoSfngCBUAGGhgCGkoSWlgdOU0Nv
+ bG9yhpKEhIQHTlNDb2xvcgCUhAFjA4QCZmYAg2ZmJj+G
+ koSWlgZOU0ZvbnSGkoSEhAZOU0ZvbnQelJkchAVbMjhj
+ XQYAAAAUAAAA//5IAGUAbAB2AGUAdABpAGMAYQCEAWYM
+ oACgAaAAoACGhoY=
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Activity A contains\
+Fragment A}</string>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{394.67, 99.0729}, {80.1852, 42.5806}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.5</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>100</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKwdIYW5kc2V0hoQCaUkBB5KEhIQMTlNEaWN0
+ aW9uYXJ5AJSEAWkDkoSWlgdOU0NvbG9yhpKEhIQHTlND
+ b2xvcgCUhAFjAYQEZmZmZgAAAIMAAAA/hpKElpYGTlNG
+ b250hpKEhIQGTlNGb250HpSZHIQFWzI4Y10GAAAAFAAA
+ AP/+SABlAGwAdgBlAHQAaQBjAGEAhAFmDJsAmwGbAJsA
+ hpKElpYQTlNQYXJhZ3JhcGhTdHlsZYaShISEEE5TUGFy
+ YWdyYXBoU3R5bGUAlIQEQ0NAUwIAhISEB05TQXJyYXkA
+ lJkMkoSEhAlOU1RleHRUYWIAlIQCQ2YAHIaShKWkADiG
+ koSlpABUhpKEpaQAcIaShKWkAIGMAIaShKWkAIGoAIaS
+ hKWkAIHEAIaShKWkAIHgAIaShKWkAIH8AIaShKWkAIEY
+ AYaShKWkAIE0AYaShKWkAIFQAYaGAIaGhg==
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Handset}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{110.788, 99.0729}, {80.1852, 42.5806}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.5</string>
+ <key>b</key>
+ <string>0</string>
+ <key>g</key>
+ <string>0</string>
+ <key>r</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>Helvetica</string>
+ <key>Size</key>
+ <real>12</real>
+ </dict>
+ <key>ID</key>
+ <integer>205</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>RTFD</key>
+ <data>
+ BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
+ ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
+ bmcBlIQBKwZUYWJsZXSGhAJpSQEGkoSEhAxOU0RpY3Rp
+ b25hcnkAlIQBaQOShJaWB05TQ29sb3KGkoSEhAdOU0Nv
+ bG9yAJSEAWMBhARmZmZmAAAAgwAAAD+GkoSWlgZOU0Zv
+ bnSGkoSEhAZOU0ZvbnQelJkchAVbMjhjXQYAAAAUAAAA
+ //5IAGUAbAB2AGUAdABpAGMAYQCEAWYMmwCbAZsAmwCG
+ koSWlhBOU1BhcmFncmFwaFN0eWxlhpKEhIQQTlNQYXJh
+ Z3JhcGhTdHlsZQCUhARDQ0BTAgCEhIQHTlNBcnJheQCU
+ mQyShISECU5TVGV4dFRhYgCUhAJDZgAchpKEpaQAOIaS
+ hKWkAFSGkoSlpABwhpKEpaQAgYwAhpKEpaQAgagAhpKE
+ paQAgcQAhpKEpaQAgeAAhpKEpaQAgfwAhpKEpaQAgRgB
+ hpKEpaQAgTQBhpKEpaQAgVABhoYAhoaG
+ </data>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf540
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
+
+\f0\fs24 \cf2 Tablet}</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{14.3137, 109.726}, {279.329, 302.075}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>204</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.578326</string>
+ <key>g</key>
+ <string>0.578615</string>
+ <key>r</key>
+ <string>0.578453</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>15</real>
+ <key>Pattern</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>10</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{329.628, 198.425}, {79.9634, 145.72}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>221</integer>
+ <key>ImageID</key>
+ <integer>3</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{311.222, 109.726}, {250, 302.074}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>a</key>
+ <string>0.65</string>
+ <key>w</key>
+ <string>0</string>
+ </dict>
+ <key>Font</key>
+ <string>DroidSans</string>
+ <key>Size</key>
+ <real>10</real>
+ </dict>
+ <key>ID</key>
+ <integer>203</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.578326</string>
+ <key>g</key>
+ <string>0.578615</string>
+ <key>r</key>
+ <string>0.578453</string>
+ </dict>
+ <key>CornerRadius</key>
+ <real>15</real>
+ <key>Pattern</key>
+ <integer>1</integer>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>VerticalPad</key>
+ <integer>10</integer>
+ </dict>
+ <key>TextPlacement</key>
+ <integer>0</integer>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>HorizontalGuides</key>
+ <array>
+ <real>109.44444274902344</real>
+ </array>
+ <key>ImageCounter</key>
+ <integer>5</integer>
+ <key>Images</key>
+ <array>
+ <dict>
+ <key>Extension</key>
+ <string>png</string>
+ <key>ID</key>
+ <integer>4</integer>
+ <key>RawData</key>
+ <data>
+ iVBORw0KGgoAAAANSUhEUgAAAvMAAAH5CAMAAAA7qEEeAAAAGXRF
+ WHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRF
+ OTk5dnZ3wMLDU1JS3+DhVFRUn6Gk5eXmXl5eDg4O6erquLm74eLi
+ xMXH09TVent72NnaODg4YWFhg4SFxMbHZmZmqKmrd3h50NHSaWlp
+ 3d3e1dbW9vb2bW1uzM3OIiIimJqc9PT0hIWG8PDx/v7+uLq7l5mb
+ yMnKqqyuYmJitri5tLa4xcbHvr/BTExMxsjJzs/Qu72+w8TFuru9
+ ycrLtLW3vb6/z9DRwcLDd3d45OTl19jZ5ubnsLGzeXp6m52gMzMz
+ 2tvcRERF5ebmeHl6wMHC3t/g5ufoU1NT2trb4+Tk4uPj1tfX5+jo
+ 0dLTy8zNoaOlmZyePT09pKWnsrS1oKKkn6GjfH19nqCiVFRT+vr6
+ o6Wn+fn5QUJCpqiqnZ+hm52f8/Pz+/v7sbO0oKKlr7Gz8vLzqKqs
+ V1dXRUZG/Pz8oqSmra+xp6mr7+/vsLK07Ozs7e3ts7W3pKaohYaH
+ eXl5RUVGnJ6gXV1dVlZWpqireHl5V1ZWeHh5/f39p6iqVVVVqKqt
+ Ozs7nJ6hWVhYnJ+hpaepnZ+ip6irp6mqWFdXmpyerK6w7O3trK6x
+ 7+/w+Pj4nqGjqautsbO18vLys7S2s7W26+zs7e7u7/Dw+Pn5q62v
+ 7OztnaCi7u7vsrO18fHxsrS2r7Cy/P39sbK0+Pj59fX1+vv7rrCx
+ ra6wpaeopKaprrCyoKOl6uvr9/f3+fr6+/v88/P08/T0nJ+gqaus
+ 7u/v8vPzrq+xoqOmmp2f7e3uoaOmVlVW+vr7qqutnp+i9/j4oKOk
+ /Pz9+fj5oaKl+/r7rK2wra6xpKWompyf7u7u/v79paaooaSloqSl
+ kJGTo6anoqWno6Smo6Wm9/j3Pz8/gYKDoaOkn6Kk/v39oKKj/v3+
+ r7Gy+fn6ra+wnJ2g8/TznqChnqCj/fz8/fz9n6Ci+/r6+/z7V1ZX
+ +/z8mZudVFNUqKmsV1dWrbCxqKusqaqsrK+w3uDfpqeppqeqXl1d
+ 8/Lzp6qsWlpaW1tbWVlZWFhYAAAA////XFxciKC+sAAAICNJREFU
+ eNrsnXlcFGeaxzFBUVTWSYYoh4gjIoLYoERNnIxhFW2NR2UzVdML
+ DNVqGDugcTesqfRkwN5BMIk6xjuJOcxlbp0zc2buGefYY/aa3ex9
+ z+4ye18D3VM9bzXiAd1No10Pz/v27/cHFtgPH32fX1d/q35V9WTZ
+ EJRZysISQPA8BMHzEJSpnt/WDEH8tM0Nz3/1y4Wz3ltdW7Udgvip
+ qrbaM2vtD9vS5vmucxsbKpommX6rxwdBHNXT7Tf19oMrVr6dBs+X
+ HZ518h7LNHRdgyDO0nXDsv6nKm/r9Xm+bENDk2XG7P6Wz7T8FvYo
+ EEMJZ4rdsmNT4xmrZcW66/D8+5calh77RabZ/ub8FZ6SPAhip6It
+ nhumHvyiZZqTnP29pVXnXqPn5zXopvMrfP7Xq+qmzftGGU5yQWz1
+ p8Vnsj3HmvzO7l7v1hbNvQbPfyrvdWcfr/foVUVPYEkhGdR1bvMH
+ Y2gyyf+5lWVj9fy8paYR+5i4YR3275BEtr9rmeEcgRpmQ/HYPD/t
+ Py2BNfvvveHU0E/OPzGtqGZRwwoI4qYGz/KNdz35+NCJl9xawyfc
+ ax1cNxbP5+miSDefe//F3/J2Xu3RH/h9ensTBPGT8OqBv66oLpp3
+ 0a/ZrQ7gmH9Yn7Lny+qeeVdUtNe8Evu2eOMJ34GmSs/6nENntzVC
+ EDf9ZO6h21d6KrU+o7L+2zHPNnucXb1hzErR82ULusWbpPtgTuy7
+ T2/ZVb6rYdrZLqAixJvktxZWd5R/bfkgxmfv2C9Q5es1KXm+zON8
+ LlhLYyd7Gjd3lP77yvNY0DSr8ens/85+og0LkWbNzTtdesvG2Lp+
+ /kSPcxKmJhXPb17lWH5J7FK13GPlf7V+G5YyzXqypEK3rM/+2ReW
+ fwSLkWY1F+0orXw2dtal1hKmP7JydM8XGpO0t6zpDsp0zfK9W9OM
+ ZUz3Z/Dm10vNiqqqE0dXle5aifVIt87XmV/c6Jxg/8tlpmD69pzR
+ PJ/7uiFYfpFT8lRD+R25WMJ065MNfmtqtgOdcwur/JYHB0ppV87R
+ 0ve+6BDksm5N8/3sTHLPN24Xbw1/rdOH4ufLVwDk068lfXrRUMxX
+ VvNM3xYsSfqxfmn5Uud0fXNVj3No2pXU8wsEAvnuiO2Ejh2oQQKb
+ fs1YpV951jjP3D8Ni5J2bfOUTnWofF6FT9N6Nifz/CZN14yOc85e
+ fndfHpYu/So+2Hf1mYRFfc/h9I0LqiuPmT6nXTi691Riz3dVmpq+
+ 3zmsaqstn4V1c0H1B3ZefVZg7i0mdvRuaEH5dOePGkEu3csSe36l
+ gHmr1iGautJFWDU31FA6/ITx9PIFWBYX9PfV5Q7TNFYJU/umJfL8
+ +YM+QTbPiq21Byo/hVVzQ/816fZhP5lWOr8L6+KCHn/VXC3+WCd4
+ 3TzRlsDzReJjwHJOIxR/7vvPYs3c0NmW3uFnznKNnU9hYdzQJuOl
+ RueDtFvTfWvje/5bx8RuvsI5Z+MpRVTijj7T0vKZYT96WrvwOBbG
+ FdXEDkrvbzE0c35ZXM9n/52uWQ4C5foq8Wnrjroq2ofHfKv7KnHi
+ xh01tjY96ezCLYE36+J6vqFHM3YdFxu13euwXi6p8u6iYT8pKV+C
+ ZXFJa2OnYk79jtiZe+J5fmuLYH1n+XPNWqyWW8orHbZXf6XVvx7L
+ 4pLaTn7TOXyqtTTjdHEcz690LrJ3dvCeL2E375rm9VqFV/2gyDqN
+ KzxcU+HdzqnhekPTzA1xPN9gab47xNHU3N4HwJfuaUHp6eNXfJv7
+ 23dvxqK4R/QVn/gX2z5/i0AYz0jPFx80BqGnvq8Ia+WeHn+u7y+e
+ vvTdutOl87GHcVE1B+4SX28wtWeO/fkIz5/zabqeLTaq9eNYKjfp
+ 5oXS3uWDOPPpLU2lVXOxJC5qk1knvq4XQL/38AjPr+/R9A6x/k9V
+ PNCFpXJTx6f2HdjVMKt+1rKOPn/1WSyIm+o6+OqLgiB/T9evuP5g
+ yPMeUzvyvPiY3fTZEqyUu3plxnaj3JH2QCEu13ZZDfoZ225+zaf5
+ N4/w/FRTM50L0db34TI/1/WtTUULVtRtzAXKu6713dlXuPsqz3e1
+ XnwnLNCexUJByujcgeWDFOO7fPnBRc+fPS0879zAU/u5b2ChIHWO
+ nnRn/77Z1Iw324Z5/u1dhq7fJfb3L7Um+w3FhQuWTIcgPlpSc1ey
+ a/TOVywVXwtNTW9pHOb5J4XntRzb/ocXdif5Be//gs/yQxAnme9e
+ uD2xZZtfm5/I8+va9Xc7cm27saM6cf3W/7DuxdwiiJvM3h8m9GxZ
+ 5QvC6znC8x2Hh3k+5zu6sUv8sLF9RWLP16zStI4WCOKkDk07kOT8
+ +vzXmm3714Tnmw4N97wmPH//KJ5fampNP/rj34jpfTfffPPlrfcN
+ bsbbuvqFmVNyc5pKsLTJS973o3bNNzVxzjF/55Dnf/1aPP+8qbVM
+ uDHg6GM/9d4Yim0FJnpvnPixYVvveL3eYGwr+FOv952kJT9NU0ko
+ cUkofsnFF/5zvJJ34pRc8bsTlHjTXjJxjCW/mqAkeKnkHddLgt4E
+ DUxSMmrPE5VM7HxDM1rb3PL8A8LztwWjQgPhSKQ/GpPYCg9u9Yut
+ gaGtyODWQGTohSxKBhKUhOOURBKXROUvkbSBI0vCv9ShGbtd9fye
+ wMV/zuV/WP/lf1h06J8zwmPkJf3XVBKOUzL0QrYlYTdKxr2BKZZQ
+ eT7RezEaZwcU7/+S/pJ+BiWRNJREI0l7fo0lA+kuCY9PSTyb7HuY
+ wvMAGxXBJiwj2Iit0EwKzwNslGchWcBGvJDE8wAbgA0XsBEvDLnO
+ Nns7J6pywA+wkR9sxAsDrh/DPjLBC7AB2DDqufvnbT46wQuwAdhw
+ ARtRQuH5EMAGYMOo5wTn5zsDABuADSMWosxhATaZBzb93MCGNocF
+ 2KhTIi/YODnsGhLPZw7YDABsWIONUJAqhwXYAGw4gA1hDguwAdhw
+ KQkRXGMWAtgAbBilVzQ5LMAmjWAzALAZq02uLiHJYQE2ABtGJYQ5
+ LMAGYMPishyC8/O3BQA2zMEmmjlgQ5nDKgY2YYCNnGBD6HlmYBMG
+ 2GQo2Dgbe0g8P75gMwCwAdhcLgmQ5LAAG4ANnxKKHPYxgA3AhlHP
+ Q50kOSzABmDDA2xESfADrt8DfpsXYKMk2Mj6TL8IYQ4LsAHYcOg5
+ RQ47MbPBJgywYQQ2YZocNqjKAT/ARomHFRN4/uGAgmATBtjICTa0
+ OawMO7z+xCX96S5J9OkbGfeSRMQ1kO6S8el5+ANUOSzABmDDo4Qm
+ hwXYAGz49JwqhwXYAGy49JzC80GADcZLMSoJuc7zj870AmyUBBtZ
+ H1ZMksMCbAA2jHpOcg84wAZgw6iELoeVDmwwN1NFsCHOYQE2ABsO
+ PafKYQE2ABsuJUQ5LMAGYMOm5xGqHBZgA7Bh0nOS5xIDbAA2jEpI
+ PA+wkRVsosqBzQBVDguwAdjw6TlNDqse2GBuprxjNAhzWIANwIZF
+ zwnOz08IAmwANow+schmIgNsADZMSihnIgNsADYcek7keYANwIbN
+ JxZRDguwURBsZH1YcYhqJjLAJvMuy2Hac6ocFmADsOHyIef+TOS9
+ nRNVOeAH2CgxhYFmJjLABmDDp+ckOSzABmDD6EOOcCYywAZgw6KE
+ LIcF2ABsmLAQZQ4LsMk8sOln+CFH5XmADeZmcinZt4bE85kDNrhD
+ nP3DioNUOSzAhg3YRDIZbKhyWIANwIZRifs5bGwmMsAGYMMmvaLJ
+ YQE2ABs+n1hhwpnIABuADYcSwhwWYAOwYXFZDsWzuAMAG+Zgk1mX
+ 5ZDlsIqBDeZmSgo2UdKZyJzAJgywyVCwcTb2UOWwPPde/VQsBLBh
+ c70xTQ4LsAHY8CmhmokMsAHYcOl5qJMkhwXYAGzY3EgVdP1Z3Htv
+ 8wJslAQbWZ/pFyHMYQE2ABsOPafIYSdmNtjgRipOYBOOEs5EVuCA
+ H2CjxMOKKWciqwQ2mJspKdjQ5rAy7PAANqqDTZRsJjLABmDDpiRA
+ NRMZYAOwYdJzqhwWYAOw4dJzCs8H42FBovfiQGKS4FAypv3K9ZRE
+ kpekTFyulYx9Lz/OJZd6HiSZiQywURFsZH1YMc1MZIANwIZPz0ly
+ WIBNeksANtfVc7ocVjqwwdxMFcGGOIcF2ABsOPScKocF2ABsWIAN
+ XQ4LsAHYsOl5hCqHBdgAbJj0nOS5xAAbgA0XsBElVDORATZSgk1U
+ ObBxZiKT5LAAG4ANn56T5rAKgc0AwEZOsCHKYb0AG4ANo54TnJ+f
+ EATYAGwY3SFDNhMZYAOw4QA2UdqZyAAbgA2HnhN5HmADsOEBNnQ5
+ LMBGQbAJywg2VDkswAZ3iDPqOVUOC7AB2HB5pon7M5H3dk6UE2z6
+ ATYKgg3ZTGSADcCGT89JcliADcCG0cPaKHLYEMAGYMMFbPoJc1iA
+ DcCGCQtR5rAAm8wDm35uYEPoeYCNlGATUQ5shPatoZqJnCFggzvE
+ 2T+sOEiVwwJs2IBNJJPBhiqHBdgAbLiAjShxP4eNzUQG2ABs2KRX
+ NDkswAZgw2duEGUOC7AB2Iw72JDksB8dymEBNgAbFpflUDyLOwCw
+ YQ42mXVZDlkOC7AB2HAAmyjpTGROYBMG2GQo2Dgbe6hyWJ5Tf/up
+ WAhgw+Z6Y5ocFmADsGECNuKFVDORATYAGy49D3WS5LAAG4ANmxup
+ 3J+JvPc2L8AGYMMFbMQL91HksAAbgA2jnpPMRM5ssMGNVJzAJkyT
+ w/4bwOZaSwA2LrAQ5UxklcAGczMlBRvaHJYT2OCynAx+9A3RTGSA
+ DcCGzUmeANVMZIANwIZJz6lyWIANwIZLzyk8HwTYXBfYYLxUetOr
+ IMlMZICNimAj68OKSWciA2wANgx6TpLDAmyimJvJ57Icihw2KCfY
+ YG6mimBDnMMCbAA2HHpOlcNe/fEz1ksXyUpG2UlEx75fGXtJhG1J
+ 8qXt59DAVEqIcliADcCGTc8jVDkswAZgw6TnJM8lBtgAbBj1nGom
+ MsBGSrCJKgc2zkxkkhwWYAOw4dNz0hxWIbAZANjICTZEOawXYAOw
+ YdRzipnIQYANwIbRQHC6HBZgA7Dh0XPKmcgAG4ANh54TeR5gA7Dh
+ ATZ0OSzARkGwCcsINlQ5LMAGd4gz6jlVDguwAdhwmbzh/kzkvZ0T
+ 5QSbfoCNgmATpshhnZnIABuADZ+eU85EBtgAbMYdbEhmIg/lsAAb
+ gA2PEgLPdwYANgAbRixEmcMCbDIPbPq5gQ2h5wE2UoJNRDmwEdq3
+ hmomcoaADe4QZ/+w4iBVDguwYQM2kUwGG6ocFmADsGFU4n4OG5uJ
+ DLAB2LBJrwIkOSzABmDDZ6QYZQ4LsAHYcCih8HwIYAOwYXRZDsWz
+ uAMAG+Zgk1mX5ZDlsACbjAQbjixEOBOZE9iEATYZCjbOxh6qHJbb
+ 0btLYDMAsOF+vTFNDguwAdjwOclDNRMZYAOw4dLzUCdJDguwAdiw
+ uZHK/ZnIe2/zAmwANozSK5IcFmADsGHUc5KZyJkNNriRihPYhClz
+ WIBNREEWkvFhxZQzkVUCG8zNlBRsaHNYTmCDy3Iy+NE3RDORpbv2
+ FGCjKNgIBahmIgNsADZMek6VwwJsADZcek7h+SDABmDDqOdEOSzA
+ RkGwkfVhxaQzkQE2ABsGPSfMYTMVbDA3k1nPKXLYoJxgg7mZKoLN
+ AG0OC7AB2HDoOVUOC7AB2HDpOVEOC7AB2LDpeYQqhwXYAGyY9Jzk
+ ucQAG4ANo55TzUQG2EgJNlHlwMaZiew6zz860wuwAdgw6jlpDqsQ
+ 2GBupqRgQ5TDekfsIxPsJMKJdxIsSgZkmfrreomkDRwsoZuJDLAB
+ 2PB409LlsAAbgA2PnlPmsAAbgA2HEsIcFmADsGHxpiXKYQE2CoKN
+ rOOlyHJYgA3AhkkJVQ4LsAHYcHmfuz8TeW/nRDnBBneIqwg2Yaoc
+ Vj2wGQDYyAk24oWUM5EBNgAbDu9zuhwWYAOw4VFC4PnOAMAGYMOo
+ hGwmMsAmI8Gmn+H7nMrzAJsMHy8V5lOybw1VDguwUQ1swjKCDVUO
+ C7CRYm5mRoCNeCGJ5wE2ABtGJUQ5rBoH/AAb+cFGvDDg+jHsIxO8
+ ABuADaP3OWUOC7AB2HAoofB8CGADsGHUc7qZyACbiIwlCl6WQ5bD
+ AmwyEmw4shBhDguwUadEXrAhy2H5NrCfioUANmyuNw6S5LAAG4AN
+ n5M8VDkswAZgw6Uk1Om+50MAG4BNlM+NVEQzkQE2ABs26RVJDguw
+ AdgwKiGciZypYIMbqTiBTZgyhwXYRBRkIRkfVkyawyoENmGATVTW
+ p01TeV6SngNsVAebKNmzuKW79hRgoyjYCAXIcliADcCGRwlFDvsY
+ wAZgw6jnFJ4PAmwANox6TpTDAmwUBBtZn+lHOhMZYAOwYdBzwhw2
+ U8EGczOZ9Zwihw2qcsAPsFHiYcV0M5EBNgAbHj2nnIkMsAHYcOg5
+ XQ4LsAHY8CihyWEBNgAbPj0nm4kMsAHYMOk5UQ4LsFGuRN7xUiHX
+ ef7RmV6ADcCGUc9Jc1iFwAZzMyUFG6Ic1guwAdgwKqGbiQywAdjw
+ eNPS5bAAG4ANj55T5rAAG4ANhxKiHHb0z8VRnEVa0p/ukuj1loSv
+ q2QgTklK60RTMkBcEplJNRMZYKMa2Mg6XooshwXYAGyYlJB4HmAz
+ jiwEsBle4n4OG5uJLCPY4A5xFcEmTJXDqgc2mJsp7xgNypnIABuA
+ zbiDDclM5KEcFmADsOFRQuD5zgDABmDDqITsWdwAG4ANB7CJks5E
+ BtjIBzYR5cBGaN/DVDkswEY1sJH1YcUkmRTAhhXYRDIZbMQLqWYi
+ A2wANlxKQg+T5LBqHPADbJSYwhBw/Rj2kUs5LMAGYDPuYEOcwwJs
+ ADYcSig8HwLYAGwY9ZxuJjLAZhxvpGIENuPPQqQzkQE2GQc2HFmI
+ MIcF2KhTIvXczH1rSDyfOWAzALDhfpInSDYTGWADsOFxkocqhwXY
+ AGy4lIQIrjELAWwANozSK6KZyAAbgA2b9IokhwXYAGwYlRDORAbY
+ 4Jl+LC7LocthATYRBVlIxocVk+awCoEN5mZKCjaEnr/eTyxclgOw
+ SVdJeA/VTGS5rj0F2CgKNlGqmcgAG4ANnxKKHPYxgA3AhgvYiJJQ
+ J8lMZIANwIZNz4lyWICNgmAj6zP9SJ7FDbAB2DC6Q5wwh81UsMHc
+ TGY9p8hhg6oc8ANslHhYMd1MZIANwIYB2ERpZyIDbAA2HHpONBMZ
+ YAOwYVNCk8MCbAA2TMCGciYywAZgw6TnFJ4PAmwwXopRifszkR+d
+ 6QXYAGyifB5WTDMTWT2wwdxMScFGvJDkHnCADcCGUQldDguwAdgw
+ ABvSHBZgA7Dh0XPKHBZgA7DhUEKUwwJsADY8wMZZpplUM5EBNqqB
+ jazjpchyWIANwIZJCYnnATY852aGM3Nupvs5bGwmsoxggzvEVQQb
+ 8UKaHFY9sMHcTHnHaFDORAbYAGzGHWxIZiK3TAgCbAA2jAaCE3i+
+ MwCwAdgwKiF7FjfABmDDAWyipDORATbygU1EObAR2vcwVQ4LsFEN
+ bGR9WDFJJgWwYQU2kUwGG/FCqpnIABuADZcS92cix3JYNQ74ATZK
+ TGEIuH4M+8ilHBZgA7AZd7AhzmEBNgAbDiUUng8BbAA2jHpONxMZ
+ YDOON1IxApvxZyHSmcgAm4wDG44sRJjDAmzUKZF6bua+NSSezxyw
+ GQDYcD/JEySbiQywAdjwOMlDlcMCbAA2XEpCBNeYhQA2ABtG6RXR
+ TGSADcCGTXpFksMCbAA2jEoIZyIDbPBMPxaX5dDlsACbiIIsJOPD
+ iklzWIXABnMzJQUbQs9fvY8c+wHT+JeMsl8Ze0mUbcnou9UxLm0/
+ q56H91DNRJbr2lOAjaJgE6WaiQywAdjwKaHIYR8D2ABsGPU81Eky
+ ExlgA7Bh03OiHBZgoyDYyPpMvwhhDguwAdhw6DlhDpupYIO5mcx6
+ TjcTWYEDfoCNEg8rppuJrBbYhAE2coJNlHYmMsAGYMOh50QzkQE2
+ ABs2JTQ5LMAGYMOn52QzkQE2ABsmPafwfBBgg/FSjErcn4n86Ewv
+ wEZJsBmQEWyoclgFwQZzMyUFG/FCknvAATYAG0YldDmsdGDTD7BR
+ EGxIc1iADcCGR88pc1iADcCGQwlRDguwAdiw6XlkJtVMZICNamAj
+ 63gpshwWYAOwYVJC4nmAjaxgE1UObAYoctjYTGQZwQZ3iKsINuKF
+ NDmsemCDuZnyjtEgzGEBNgAbFj0nOD8/IQiwAdgwGghO4PnOAMAG
+ YMOohOxZ3AAbgA2TnhPORAbYyAc2EeXARmjfw1Q5LMBGNbCR9WHF
+ JJkUwAZ3iDPqOdVMZIANwIZLifszkWM5rBoH/AAbJaYwBFw/hn3k
+ Ug4LsAHYcOg5SQ4LsAHYMCqh8HwIYAOwYdRzshwWYAOwYcJCpDOR
+ ATYZBzYcWYgwhwXYqFMi9dzMfWtIPJ85YIM7xNk/rDhINhMZYAOw
+ 4XGShyCH/dD/TX5o8uSFMd0ktm66uPXQ0NbkkVsLXSxZeG0lk1Fy
+ ceum8SlJm00GPuS254/m3/merKyPD+ryVlbW0GbWe5JtoeRaSrJS
+ KYn/u9UvuTO/xWXP7/zwzyGIk7J+02XPf+KXscgQK30cnofgeXge
+ guevi+cfxCJD8DwEwfMQpLLn58yZkuI/bkrKr3ReOwfdhFh6fk44
+ P3/ynSm5eHHB7Pz7UnT9eybn54fheoih5+cUFOTnF8xOwfRT+mc7
+ r1yc0n8ja7b4tbPzYXqIgee/d/W5yhuFkYWVF46++74z9sr82an4
+ eEp+Qey1i9FQaPw9f/X5+SkLY+bMLxjdyYsHXzn7xyn8L+YMvj8K
+ Jk9BRyFunr9pzJ7/lVQ8X1AAz0M8Pf/zxYNs81Ca2WbwrTT7PjQU
+ Yuf5KQWzCwpmp2TkG8UrC1K08Z2x1y7Ebh7id97m51MWL1wYSen8
+ ypQfT85/KCvF/8ecUP7CxbA8xNHzwstTUs6kpozBxVPgeIir5yEI
+ nocgeB6C4HkIksXzuE8KguchSGHPP49nfUDs5Dzro9U1z1eZ2s9m
+ //g+Rw8++OB99yXcGuWvUXJ5C+t0nSUfLujVfPPLrtXzh0fxvMfS
+ tN4dEMRJvZrmL7GvxfPf0Y2WL4/i+Rzd0CCImwzf6iSef014Ptfx
+ /KFhns9t0nVNVLZVVCUutzfq/iMGBHGSz79/eWLLNrZWddl2tvB8
+ y/lhnj+8y9C1HNvuumN3Es/bqz0n32yFID56s7IuJ4ljnzq4VHwt
+ dDzfOMzzx48aWs9a2y6rvLAtmenttm0QxEldSf06t6NBfC0yNaNi
+ 2zDPN77q0760UWws6T1uQ5AqetZfJ75uMTVfVdcwz9snTc1y/jbP
+ WoeFgpTRNP968XWZqZnV9nDPN4h3wtIy8ZrSIiwUpIy2+HLF1+37
+ NatkhOc3C8rfISj/eEc1FgpSRiedQ9cnbzG0VfUjPL9aeL59kxO2
+ /m8zVgpSRPOanF14tk/XO3JHeP7MG7pmzhIbJf5pWCpIEdWXr3Q8
+ bWm+C+dHeL5sqql1O5ctPG2twFJBaqhs6j3Hbbttt3HlIewlz9s1
+ Tjw7T2xMbf88FgtSQud8ztn5XE3XrBlxPO/8RbcDN/V3l2CxICW0
+ 6G4no/VYmv77Z+J4vuuET/O91Gbbr1zY+zdYLUgB3W/cKgxdfNrQ
+ upfacTxv54l3gy9bbMworcNyQQpoxQ8cP2+0NM23Pq7nP3KLoe2f
+ Ko5i204YuVgvSHrlrKoVX7+73acZF5rjet5eZGlvGWud1362sg0r
+ Bkmu5js05zaRlaamWbPs+J4/1K5rZusnxVZdOQ5jIdk1vXyz+Hq2
+ wtCMHccTeN5eIsDHcl738vZuBFOQ3JpROtWhlTpzxL2DV3r+zKPi
+ LdHxtNh6tqUJSA/JrA3GaSdnuv0t/aoMdrjn7bweTeuucq6tn2bu
+ eALrBkmrdU3tzl67+IX9muartxN7vu2BbkE3C5zNQvPo01g5SFKt
+ brp3g/PnDQ6u19pJPG/nNhmavj92BX3h1zvA9JCcKjS0250/a8Q+
+ 3LfjTFLP23mmrhlazOzTmqyaF7F8kHT6rqfvaOxwdIaha7pZaCf3
+ fOzcjdEUM/2p1tL592MFIcl07mR5VWzXvv5PDG3wjtfknv925SpN
+ O9IeM/0nPZa2vBiLCEmkz9QZvprYYz1mCGLRzGVdo3renruzR+zp
+ vzh46WVOa/kuuB6SRltL7im9dfA0+6x3nb38rX9kj+55+/BOU5j+
+ SF3s8oNtRRWlTQtytmE1IfZ6+a4lXyl9dX1sx35+uk8Xlt8+107F
+ 8/a8Lwim1/2VgyfoX57xQevA96bXHyqG8SGu2nb2VP2Kr939t1WF
+ T8W+z90uEF3s5bfaqXne/v9KYXqtu2Pzp2Lf/tamkjsM/4Fdx+bf
+ 4FkEQezUMHX3G33+bz63/NTgM7lfLvld07F87eN2qp63n1rRI1jI
+ sG7dcPEHXcfr62qfu/CGjofgQvzUe/D5ZVsKt158CH3X2lZTGNVn
+ ehJcHRzX83ZZ3h84bxRz0vwNl0/RtzXP/QgE8dPZ5svu/kl21T/6
+ nJ18S30iEMpK8PPcByzxXtEtX1XeVuAiJInO5L1kmvdq2hGzMvH1
+ Yok8b391Vofjes18prd6xjkcv0Lc1Zy7cWmHuV9zTsD868Z/ssfu
+ eduet6TdmuT8BtP6/gu1JfXrDh3eCkH8dP+h1evrane2+336vQ6c
+ dHg+nezNkZXsL0+t6LUcNtIm7TeFrPZbIIifNMedpi92hmW/2eIZ
+ 5YqZrOR/fbxk9xHTNzRGSn8XgvhpyJ6G2WOcGP34M2u0FzRuqjvR
+ YvnFuwiC+MpnrjL3nqzJbRwd/LNSODjoeruwZNnu3o6mr9wLQfyk
+ NTXtOlZdkz2vLKWD3awUD4rL2hqfPLRhbTYEcdPanEPzGrtSP8GT
+ hXNcUIYJnofgeQiC5yEInocgeB6C4HkIguchiIN+IcAALvHBXni8
+ uwwAAAAASUVORK5CYII=
+ </data>
+ </dict>
+ <dict>
+ <key>Extension</key>
+ <string>png</string>
+ <key>ID</key>
+ <integer>3</integer>
+ <key>RawData</key>
+ <data>
+ iVBORw0KGgoAAAANSUhEUgAAAMUAAAFnCAMAAAAhRX2TAAAAGXRF
+ WHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRF
+ rrCxu72+1NXWoKKk7OzswMHCVlZW7u7ugYGCxMXHqaqsvsDB0NHS
+ t7i6hYaGlpib8vLz9vb23t/gqqyudXV2sLK0xcbIwsPE/v7+yMnK
+ 29zcw8TGVFRUxsjJzs/Q8PDxubq8wcLErK2vu7y+zc7P0tPUeXp6
+ t7m6zM3O3N3eycrLeHh4UlFR4uLj6OjptLW3ysvNfn5/5OTlvb6/
+ 3+DgzM7PmZye2Nna5ubnury91dbX2trcsrO1wsTF0NDS19jZ5ebm
+ 4eLil5mb3t7fn6Gk3d7em52g4ODh2trb4+Tkr7Gz5+jo2Nja5OXm
+ 6Onq7ezu4OHi5ufo2NjZ09TVdnd47u/v29zd4uPjqKms7O7ukZKT
+ 6+zssrS1pKWn0dLTz9DRoKGjnZ+hnqCinJ6g+fn5pKaotre5pqiq
+ /Pz8paeptba4n6Gj9fX1+vr6mJqcm52f6+vrsrS2mZudmpyepaeo
+ mpyf/f39o6Wnpaaop6mrs7W3oqSmpqirs7S2ra+xnJ+hra+wnqCj
+ +Pj4+Pn4g4OE+/v7V1dX8fHys7W27/Dw+fr56urrtbe4mp2fU1NT
+ mJqd8/PzmJud9PT1nJ6hmZue9PT0rK6veHl6tri5ra6w9fb2d3h5
+ VlZV6uvr9/j46+vsnqGj+Pn58/T0f3+AtLa36erq+Pj5nZ+i9/f3
+ 8fLy+vv7+fr6p6iqWFhX+/z8/f7+9PX1rq+x9fX2f4CAo6SmnaCi
+ +fn6/P39pqeqp6mqpqepn6CinaChpqmq+vr7pKWo+/v8oqWntbe5
+ /Pz9oKGko6Wo/v799fb18vHypqipnJ2gpqmr+vv6o6anoqOlhISF
+ q62voqWm7e3u7u7tpKappKeo+/z76enpoqOmVVVVnJ+gnZ6g/P38
+ nZ+g/fz8/fz98vHxsLG0paiq/Pv8/Pv7p6irjo+Qm52emJmcs7a3
+ srW2mpues7S3/v3+9/j3lZeYnJ6fiYqLzMzNoaSloaSmoqSl+Pf3
+ u76+oaOmoaOlWlpaW1tbWVlZWFhYXFxc////DxLvHgAAIHNJREFU
+ eNrsnXtcGuma58HSMIBOFAYEDYqtLNGziXbwxEjoYyStbXTNatto
+ zySLW1UQIKWQQAuhGTXJtDGZGDWdxLWzJ9cxiUn39O2c7jN9+txn
+ Zuc+7bKXbPbee529zq67s7uVW+1b4AWKAqoQzev5nCd/5KV46/Kt
+ 9/e+z1tVPykB9fMQgl9Q/NxTjNkSwg8phdNmuzI9Hg4flMnqX+/P
+ z8/XlJaK8+boaBckhAksni0uLa2z5jfUyw6GRdO3T2cJjS+FyjlW
+ JNrX1aCr0+QJCxQmSdCOsgWWGMwqhEPytUkrrND0G2UHcq+M+VXr
+ T6HK3VGiqyluVARdAZIkMNyDj4JjRRCEzDQQBKCN4h4UQ0KBtySm
+ ytLtRlm35bRq3SjC2j8jhjw4OMlIJFaPZCmIldON0+EZSohWenm0
+ mQiEZStgbXwIDwVPmgw1xgPnivxZpVB93NlTKsFjTzo4Zvok4nRb
+ kIFAwOFwyWuHh4eFFXl5eXXfBJFT0saIEuv2b5apwfdHh4flDkcg
+ EKLbwuMZHcVuxmyb3jR9KsiT+mJd87Q/GxTOQ73qWnsI84DdICvK
+ JoJy04RQqqzR6apf23EoHLYNDo75QXDSAqj3o8G7IlH3a9U6q1ps
+ aDwsCIbwpe60CkSgHhT5fUFxT+fAmigG6sUKO45j0Q0T9hHFsFTT
+ 3yC7Fi581+bM2jCpss0XWo41N/RrKk0jEjs2hKPL3Q0IFfUg8oKq
+ jluZUdyqzpOg6D1i6by0okjTg++td/ZS2QrvdDVtrzgaDJBYKxrd
+ eUQDnyj3qXhTjG+Xn8KjTQC2gUkKxNYuf9rkYbt/7ty5nftAtPQm
+ RCe9fF/njXPnptNmQL9N1GUV62eQyHBCHwaGk2/3fsiLorDmg1aC
+ 7gkEjrsUFQ3nbydrBWeH0VpWWloxMTenGBkZedPhcCCnTp3C3OaE
+ wLFTdIQcDsnIyOG5guLSOp21umWfqPzdJOr0XxW11B2Rk557SKRJ
+ 7pl6nZwpVMYPcLotCRyRi6tFqTrAAyluNrt9Pg8YQ+nR0w5CYTKZ
+ JvJYQk9/Mzxjt4PBCcU9Pp/XbL540etFJHNlY8n3cXVfj9ARFQaK
+ F9zhSPFpHq1HIEa5uHkwjY57LrsqlDU5uqbmvj7R/fFpv/+jj9Jp
+ /6OPBsfvdxzoMhrLlBph5RGF/FWvLz/1OgNthhORM4uG8v1cKHIF
+ OKh9jxhumE/fG7Xepd2rBuffLRf1dVVbdTqrUiwWS2uPMqJWCxaX
+ 1vXodC3NfZbxgbtLjay6VaTzTnyYblflZQuXXgVnFzdcT0+RKwEQ
+ yKiphVO6EV9UqNXF/9dw9uyMIwAk4tt9cbfPQ6fn6PASWonoQIGh
+ uM93ka7oIx0njwqL1VZj7649xZe1HDLNfNmJUbAV3FSejiK8gIHx
+ AFkc5DYyjgtGPR7QKTDULpmZKDBMaPMa57TFxZX6PI1SqZQKl8MA
+ PimF+spS6dysVD8n1E8IJEDmHg+d5zAPIeO0O5GW7h644A9TU9xV
+ oADih33cGPw2240qg/aI4biw0lRgek9wfKR9QnHyvZcWXPbAd7/7
+ 3T8fvbAc+J+DzwG7a2HmpODt9pHjX39ScHS28fgRhUlgelOu7+SY
+ T363DAGNjLdfSUlR7CHJz+QPUyamf/VgHGQmXU2pQXv4pMSB3kNR
+ 0BxYZC4OxBgCEySHiQ6FNmaAqowucoFJFxLVFr0arT3JQq0+r7hG
+ 17YrfNWZVsctIRqj0ZmCohdkGMKe5MQ4p+/saKgq1QpcIQT17AYj
+ rPfyTZdEUdvY+AqYUVmbZLK+3NzcjwdttkFnJFRx1yWRAF/aRLm5
+ nftlOboqpbhRa1IE7fjuKbN5twcjAwtHKuqM+/dYUgwsMhJgoIvJ
+ Ka6CToH8XknCioOF3U1qfbsk5DGbt/r+tkv+yeHK0ipd9YEblsIr
+ d3+0pinH53fBxWJHi7GqVK94Kfi/8a3g7BCOBZOwpqmzfP4jVgwE
+ /OtMSlEHhidcwxgYOvOlx0Ne90VwquRHKsBlzB5R0T9ep0nU+M6u
+ tn5xY7sdQS+43V5iRqvM6ZxnDl85QLhorT8JReEXBIm9F9OY/tyc
+ xu9jXrfP8Z+li217psfW8fo/Tnw2yw5jXV6tHHW7fV+6Zhf74ntz
+ Hhhw0bYkFFbQFET1ysf7urmQ2x0QSHM6pgepFxBjA+H6KuHJwGUz
+ LhGWfLr6xbkfgtPd7mSlcJowEltpqGvit9y+HwuN15zUi43BG73K
+ dsI9JdGsDp2LOJioylgpukGfwY1LvUFNutGJnNuQ3DTz39luwt2E
+ sGPp8/QHBIkbWCmsrSTxJ+cixc5PvKeEe5wURPGgLy9gfrV4OvpJ
+ Axrjx+MsFKoCjES1kWID4m3fAd9tzHApYpZEj2tnjG7iKE47EBKN
+ zFBLXvXlnYbydmy3yYtExqafKAgSrWSh2BkCFN2g0PH3PUo/BWfY
+ KjynIqNomYfE5AOJFE0EiTjugzFh2F0BKwTQvdL3j0Tg/+ZXwZXl
+ gUQKDaD7Tw8oqm1IPkDBG4PaqUaQzK/Ib5IeYyKFASfxPAB79HI+
+ 1I8qRC60F/w3h5JocQLFj2oxEq8DvQKxT8P9xKXOTI+kGpQ8ddjP
+ pLi6ALI6aKIycwXcENS5AAJ6hhEF3fg6k6Lw+6C71FN+k6cFcgpK
+ 6O4Hgy7Ie4FcJkUYsIXuUOXkB+OwU+T49BRlCSEI2cyk6AAU9nKq
+ F6+FHYIKI/Ii6l05QRJNTAoZoHDZqBp33eoczAlVrFwsDcqRbpDW
+ wISpn0nRBCgkY0Bzvcsj2mLjrB6imDVs717KfEJzNaXSoqRHw6Sw
+ oiRhUg2afNein3f8jgdHoQrcE8qJHluNGTSCFOS3YiZFHUpiE9TH
+ /z4Q7dwDL6EkdEEs3TMwblVSlNhDjgqZFMUgF+ZRFvRkUXQcaCXJ
+ gAuqCJCkpyZycPt9WhV9iYE2qhgUYkAhpQ75jkcvsaUoGfi1r756
+ 552vfjkSq6VffueddxJKbBW/4lGRw7a/+su/IlF9JFsfoC+sreD6
+ +vj7DIpGQCGmmr1Lt32PouSvv/HXJye3nYnElsnJyS3R0rbJyUfR
+ haulR3EVmaucSb/K6ra3JKs4+bKdxBSRx3uHAmAc0gGKwzYGBZhd
+ 4VVUvbcx+vEISjr+7uSzp0+e0/H42bNn0dITUHocLT1dLj0HpafP
+ WSoyV4mpmGyV5Nt+9h1AYbJFJ4SuMfa2ACcf3051XRSuUPz6G5NL
+ OwKbf8o8tuerO3oce0SrqyxXTL9Kim2vlr798grF/aD9OmXElpsm
+ gSLHXBpDsY15RE/YNh936IkQaVeJ2XYq2m2rFLYZUkTJEISQXImn
+ cCow0qOjrGZxjKK2QCMnUHHbb61QnF6IUiDB6XgKmwAjh9riKf7a
+ mY2QE9fGe/RLiRRvcqXg3OTrKidQ+u1Viut8KSCRE5DDs1WKwRnS
+ wocCFjmBijEUlAm5lpTC18Ck2CA5caKNo0CbWSnGJQSC1VM6tzqG
+ YsuGyelJGjlxpLAECfopU5XPukrxjcl0cnq8UXKKz91JKc69CSh2
+ UaW7rbG5e13l9Jxff9vycqYU0MgpPnfzoVjO3TDICVRkowhyoFjK
+ 3S9ATmyrbGP0izshhCREHCngkBOoeIYxRoUDCImG4ynKJewUkMgp
+ PndHKHJZKDppW25fAgWH+c2GyAlU5EJh9ZBE0MKk4DK/yYKcnqWV
+ 05PnnCiqcBJ9m2JSbJic0gwfbLmbjaKMheLvbINGTplT0LkbFjmx
+ 5G7uFDwnp+snJ1CKzXrHeSjqjW9DIycgh1gKKZ9+cQYaOTFydwXa
+ xZkiOgPJ7rVOhnJi5O68ISM/io2RE4d7C7FjVIUvhw8Fh/nNhsgJ
+ VFwDBYf5zYbIiZG7+VFAI6fnmVPQuRsSOXGk6AcUw8ly94bLiW0g
+ P/Nb6SnUgEKfQMHpiJ5sgJxAPHo5nuIQC0VF1OIST/EIGjkxcjdN
+ YaEpHqalWMrd6yCnjJ7LbGMo6pYLUMjSU0RzNxRyAqUtjN5t40Ox
+ MXJ6+iztI8RnPCguMyggkRNL7k5F4euJo4BFTo+f86LA6xm5Gw45
+ PedJIYuheMTjeoKbNtIOsU+TbjtTCvqpPSRyoiliRto87hSrT+0f
+ p23y9ZYTI3e/kpqiOI5iGzRyAqXJGIoynzEVRUGsopZyNwxyin9q
+ Dyh6UlHMxfXuMxshJ65PjWOe2lP95ppUFEcTKOCQU/xTe0Ch4UUB
+ iZxAxWeZU8AiJ8ZTe34U0Mjp+RootkAjpzVQQOu440NB525Y5BTv
+ uONHAavjLkIx1k6QaA8HRcHquItQOM9iS3+ZxyHrwSEn2nHH6BfO
+ 4VMkauVIAaPjjjcFlI47vhSwyOnpk+eZU8DquONFAa3jjg/FNyah
+ kRNL7uZIAbHjrooXBayOOyMPRcU47l60nBiOuxa+WQ9Kx121u4Ly
+ 883d0Dnuqt0GXhRrltPjrMiJkbt5UkDquONHAavjjh9FFuX0fE1y
+ ep45BbyOOx4UEDvu+FFwbfJ1lxPDccdHUfA67nj1C2gdd3yzHnc5
+ PVlPOT2Lf2rPmwJKx10GuRtCxx1PCljk9JglX5hurv4IRUoKWB13
+ NAUlvEf/XT2n3A2n4y5CkRfzq0Vccnc25fSEi5zYFBjruFuhKOWR
+ u6Fz3PGigNZxx4MixnEHg6dlW2aKgthxx5sCSscdX4qn0Fik1kAB
+ qeOOHwWsjjteFNA67vhQQOa4+06muRtWxx0vCmgddxnkbggdd2ko
+ pJvDcZeGopTNccd9Npf8iJLJ6Rnn4fu310ABp+MuLUX9ZnDcpaWo
+ Zjju4JATv6wX/5cL0Dru0lHE/hUJvI67dBTsv5OzLnJ6zm9y+e2X
+ M6SA1nHHgwJixx0fitSOu/WUE9sq276zBgooHXcrFGJuFHA67lYo
+ KjhRwCInlqf2VA1OorNcKGB13EUo6B/FOcqBAlrHXYRiOzeKZI67
+ FyAnttzNjQJixx0/Clgdd3wUtfTUHgY5MRx3fChgdtzxpIDWcceH
+ AhI5sTy150EBseOOOwXMjjvuFNDIaQ25G17HXS+/3A2p4+4ALwqe
+ FwfrJyeG4+4Y/9wNoeOODwW8jrtjvGcgnK8111NODMcdbwooHXfH
+ +OduCB13PClgkRPjqT0/Clgdd8d45m44HXfH+OXuFyQntlViHXfH
+ Msnd0DnueFFA67hLRqG5RKLCpL9xl2U5ZfSYbxsHRbH89iPEjrtk
+ FEl/n/ZF/yjcSunZGiggkRPjqT1PCkgdd/wooJHT8zVQPIJGTmug
+ gNdxd8wt5EoB75vpqGO7jw9yptjGX07r52mZzIwCYscdHwpo30zH
+ nwJKxx1fCjgddzwpIH0zHT8KWB13vCigddzxoYD3zXS8sh60jrtM
+ cjd8jjs+ioL3zXQZ5W7oHHdpKIo3h+MuDUWdb1O8mS4Nhc63KRx3
+ aSisvk3huONHAeub6dJS6DaD4y4dhbdsMzju0lHEvG0Z4jfT8aCA
+ 2HHHhwJexx1/ChjfTMeXAk7HHU8KSB13PCkgfTMdPwpYHXd8KOB1
+ 3PHLerC+mY4fBbSOOz65+xHb2XrC77FDlv5Qn/HUnk+/gPbNdBnl
+ bvgcd3wpNkZOaXyVCU/tU1AcZ6GA8810ySjaLpDYiI0td0PpuEtC
+ 0TtEYidPMymgkdNzHhS/waB4BI2cMqeA2XHHi4KTnJ5sgJyYjjs+
+ FI+gkRPHp/Zs/QJix11qivzE3A2FnEDp29x7d0MCBZyOu9QUXSy5
+ G0bHXWqKegYFLHJ6zCtf1E8ZNoXjLg2FV7spHHfpKBqT/E5OBnJ6
+ mj05cbzzz0KxCR13rBSbznHHpqhvbIFGThwdd2wUm89xl5RiUznu
+ klGsWU5PsiInnrmbQbHJHHfsFJvNccdKsQUaOa2BYvM57thz92Zz
+ 3LHnbmjkxNFxxzob3HSOu5S5e9M47pJSwCEnUDqzhty9uRx3yXP3
+ ZnLcsVNskJw4PebLnGKzOe6S5G6YHHe/tNbc/cLlxNFxx06x2Rx3
+ bIrafI67JQpZLAXb7+S8IDk94ZW7OxJnIJvJcbfXF6EIs+XuzeO4
+ 20EghGQcUFSm+J2cDJ4aZ+9dJlwo9pAI8YGICvuOODex424foAgC
+ igvtpzex426ZYkhxOsnv5LxQOWVOsQkdd+wUm81xx0oB7+/k8OkX
+ m85xx0ax+Rx3SSmgfDMdXwqIHXf0r7LPcaKA2XGnBhT61BQTkZF2
+ 2+Tko2eReARKZyKlLZOT26KlM6C0JVoCFbesVlwpbUu+yjMe246U
+ Enq3NPGdCyszkK+jFJUoaf+fvwLiG5F4I670RrTIVnqDxyr8tv0r
+ /yFAohM/WaVgef/FMoVviTYfJ8nAiRMnXG9FIknpBFtpTRVTrBIg
+ yVYNxYnCq1VFPp/7PkFCFwgh40bhOzoWXdB0CsfgChQfXWoKqvsi
+ ONkpKJb7BUU1VwpmoIp2YYNq6diSvReGOUbRYbsysE5RVJSuhs02
+ cHowrtaVwZUDS0cham1fpVi/sI2lq3Gtv3Sxy5ns297UFIX/MDid
+ 6aFZ2kpWou1hqprzBtN0UbclRY0yxOuduqRPdiz5Zg0rRWeU4uoC
+ IUq264cHD6lSHVuP27MSW4tTVLz6tgcfnv3Lo8lr6PB/8V5pLXZZ
+ /z327xfNNaxvIb/xFoF8t5sa+5m3k33FwrMo0payLdocEvnIUkiq
+ ktf7dKL1VQRFMG3SGh9LPFog7H5s+W1/zJD6eiiVECNRZTxFuYRA
+ kAMA0KxjXU80g4f2plbU2EDRtXxrNMoOJD/ECRztl/0VgTUmrdLZ
+ St4A//3k7csa9grDaD3lHD5FovnxFOfeJBByF1Dc8g2p+NgjRxGl
+ 5Vr4/dQgnSgRDZ8yWZWitz0oaCgZiUmS9p02n2QA/KeSel9hP6Wu
+ 0HiUwhpPYQkCCiCmG4jkNsuu5fSEBGRPec1ASorlhI8no7g60Yr1
+ 04Uue6vkYJJKD1GsC/w3IPf1J+mBehUrxbT8JomC/O4f9rKs+adH
+ h0jSHkJ8uGehOwXFwZH2aCyUsVcoF+CIJtLzWmocnn/TkUSbh32S
+ +iJR5aV/spN1nJ7xNVCU8yyWoKj3BRjpo3tviccRZhGzHsUqzx9s
+ m8XwwL7kFAeWZy1eMXuF+2dxw3CkW78i0YR+uCfJdvp+6rkp+X/3
+ EFLMlljKfCNgyjomIEg0J57CBiiGaArnEbeWJduc/q8XENDvVT0h
+ X7A8KcX5owXRGNYlqTEtW9wa6Xlqs7AvnHRDu0w/aPXUCjCcpXs/
+ tPua6CN2IRH1xFJQJpTEI1rKPeHbzrLdK8OYHbQj9foHP61JuvMO
+ +XvRSDHSLnoLisb/9XTFbm2qHjbYUX/g9LdwBE2Q5h+0T1X6k1HM
+ AYrortswtIdtcNlpiTRCYfl40uTX502f9RbR0O+ACHymTTsbUFV4
+ MEdh/LLbx70nIymdlUIPKJaab9GH9asymoSEDdJoCJuS1qnzfTYK
+ AvUUpN/eoGFqZj5+fiWYkkeFWG4HFN0MimKQz6XR4u+qcY/20HrN
+ BItElkiIuEzYHpTEJRWbzj71Um60fCgAKMIMCjFK3jMstYCqyeUO
+ Kc9RkIWtwXT5gnAZPhdQ4EyKMpTEzjpXpTHqDig7nfAgjO1SL1zw
+ yl/3r/RBEkFC5xgUVpQkFDFHfUBLmAmB5sC0HwKCcVnFDGHGP7HG
+ dBIZghAr84xlihKURBy2mFX93UoJ6vZ+oVdXT7+4NlGdPm8sHQ5M
+ uT+TKLviLuCq2ShkgMJ+hZHqWpRnkYtunBRUWKsffrzBAP7yfU01
+ WgfmM18OzNb13WJ8/S3QBRR3GRQ7AQWZOLn403O9yrffvLTV7AtJ
+ FNKq3oPjRX9v3XvxbVFnk0Y78gXi3noxNKNf7Jr+MLGW2LNyq3CV
+ IoyS5Ckje6uOdxo1s2+S4Ky4ffaRWalat7cv97btw+9l8dC/96Ft
+ +nzf3m+p87Qmyakpt9tDBBYMVS13ktwH8IMEh2r9DIrxE2DgUqfq
+ YqLmHI3B9H3c65667MMJ0i6YM4jrdE2yvvPhgesZDQK265bcXc1t
+ OduV0qPtdpLAhy7/hdl74X+9NFuxvW3fu6m2WfQeQV4yUAyK6SBC
+ Xko7KVDZpi19TYvF+mGB3IGgZhBbPfdCdslCu0mfV1pWZmwpqT8f
+ CdE4I8pvRJbvrK5uaSorU+YJTYqXFlyBU5fMW8FmPIhLIjiuLd1u
+ 3JF7vyj9cJILLmXwUibFvOAmScjf5dz1Bq9Ydu6SNeWrX9HOyV2B
+ EIHhPi84Grfb7aXD/aX9RHyEfJEvLoIabrP5os+DYWTIFTTNVmj6
+ jS19Oy23xz7i3ozV4LrNo2ZSvH8cI0nsfCaDoco5Vmjp3lFt1KnV
+ YoPBMHGWjsPyPwnGhSKy+Kwe1HilRp1vbNjRF7bYnP7Mpmwa0I9X
+ LvVWKFSNYPElY1aS1GAkit6NxKdXr346QBds0cVZyj2mz0iSaGBS
+ UBWgiejXkWQ/canWYaMiBwEyQ18ChdoDFCW/mt2dObvq9F9/PVHT
+ dSvLFG3/lCSRQDiBQgf6BfmZLKv7qj+Omr0EcXkrLtib1fmYSgj0
+ j5woSqBoQRCSHJVmcVf/VoN6JUpZd4esTn75fxRn8zb2+FvgYAmB
+ M4FiZwh8gdjD2dtVsfdLzdLZul6GTDWOZW/T/aApSGy1F69QzIPr
+ 2BS3w/iHDkdirlv3hzx1Wdv0gJyWP76YSOEUgGzYTgaOZWlPh36K
+ x43bvQTRmS2KuiGXnST/uDeRgn5+jDXmuRuzNDCKmVsqNRuydYIC
+ IWkIQQIHWSj6wVRXsc/+xzlZ2dP8At4Vv+QaGZjOyqbHjkxVlOEk
+ NvI+C0XXDxDCFTbiq7lkLdGBLjAGJf+c77WsXD294n1TRD+8iEnR
+ grh0iJdQFW5XNvRbbTYwpVlxMT8bEMrdSPMDB0KiOjYK1WGUHqIG
+ hd5A29p31mPWJN7bVGfhQrDUg/ZQMjASYQ/ZKCglShIjY5TN4MXq
+ 1jy2l5jzEvo720MFvncfa70kOMdinCRmilgpZDiYYHWDMVf9z3wT
+ N9a4u06faZCxqOBy71onHq87pj7ooi/0MBKPfc4UQ1FIiy1yQ7zk
+ C3fgW4Nr2uG05EvGxYrFhVjWBmER4kN6ehtdIHUTbewUlIEeviI3
+ rsobPV5T85oyh9TMmJPVubVrmhHOV9ndof7I3RAwFyTk80koGkBe
+ X7qZ7m+Qu3+g7fp3me90D0Y0x34+GBjdvwaG29YZb+vSPfBDdoIx
+ VYqlOC0nSOzIUgtc1QTMqKLf8i8zTt7e2KeoovfcmafuwV3FQe9/
+ bO9dakvQtxGkOxkFbYtEsJXUZFmUXPgLZLb/UGZCuK696PgbS/cD
+ VPslU4pPM0M4vUOpaHVjc3uXO+oN+p6/nkpKEQZNhc2tXhlfb6gM
+ uL2vtqtfK8wEQ3/R87OS3PnTomot6j2cySYGrzVJg6h794ymc/VU
+ Gi6R5A+6klNQSnDxjVtjM+W4USu5YL4UrFXLLDa+GarsA/d/+bH8
+ JZfPbK/5P3xz9MD5hryTIbf79z5R7ojtyW1079U7U1CMBwmS+DPG
+ 0/Tp19QKEjdPIQpplcwyyEdff5h/xEWS9toyPmOsyjl/8HWNfgF3
+ X8QclbqO34wfboMYiYQYD8IFjEubUQB6eD7hxJTv1cz+kc/txpEv
+ avNqdG3Ne0T3f4PLTRnV55ZfvcVpyB777+XXOqubyjTCdjvhcXvR
+ EUPZroTL3KIJkCsSbsUyKJwFQHRoI9vxOa90G4tr5QGcvq2JE67g
+ S+2HDcWL/Q0tHTdEhVfufs43vTjvzhcW/s0bzS05/ZqKAtMnckcA
+ 8241m92EQ1CwWB2eZ9OZlL7hpLiemoKyOIDscHFS2fzBjb6SfHXF
+ zxSuAEmgHp/b7HZ7dxMuicKkbTQoxTU6nW7vazJZ17VcltixXyZr
+ surylUqxsPGI4muXC9990e02e32XUCRklxyvLF7s2b/H8mEycPqu
+ GWG/Q6WhoKoJ+j5uRZqe7Pc/uCLq7mrqqdNIDROHZxwBn8/rnQIn
+ 0ufzeXAQBMIS9BceUAM0p9fr9XkcjvbDWkOpJj+nesedc7c+THO7
+ s1CP037UEiotBWXFENBotTz645htfno8nLtDttdq7S8tFQvPzs3N
+ KUYSQwCWz0nFxRqrNWd/yz6RaHr6uo27ELtngNwRtqcsiRRLGC7j
+ 2i7A//lvJsaa5vvzdQg9CcTY7iWzUFD5KBAVgeo71+MOa6aTkNdH
+ cHByMZL1hriA9S7o79N3re4hWtlpOBjG89vpM0u2ytlvCrBSUA+H
+ aXAExWfUB144yHSb4QRO30bDvhSOUzwoqMHtfwun4TEckUiNu8Zf
+ 1LP7q7vyta6b9CklMc9IdTKJC5JeWCntEQ7yVdSDSBQVuj2F72/k
+ 8d8q7GgS18oRDz3WgKk2PpIzn7SyIPl2RHVyIgqCECiIPzJJaxo6
+ yz93rmen/29jn4/va8sXNyoc9D4jCEARodqGVBlMkHJqXyKV4yhK
+ RK2Z4HwAqEDQZBB/M6f3QLfIcv1Wdp5vvX933NLR2dLQX5enFbjs
+ ITApGI0eP9gp2L+i7k7qMydIJ8zOqiPyUCuOIUhks+A/sF3c40FC
+ juDMiKL2aF6xJr/f2FK9MxweL5w+bbOl6kMqm80GZk+F/yA3vKNa
+ lpPfLy4WDp8VjEiCAfLSUCt9ypZ2FN3TECkvyD+f9kaGgMOpGji4
+ V60PkgSOY6t/IYMgBIFhaGxgjiCYTim0BmFjhUbJDLEQhNZkOixw
+ BINE/IrYTWLp2Jf+6AVtxYmAa7g0Z08Rl8YUcGx0lW1nidrwtoRY
+ 3i8Rt19y5fQBstHRUdyTGLTRbhR8fxNJXBMcOHFq+aQQQYG2YnvJ
+ znnOlhMBLwE/uC3qfL1M3DjcPhN0kcTQEJjd0UjYytyP098XLUe0
+ MXF8aAgj7cEFgWk2T21tOyCanuc5gAgy64+DRZbczr6SNmtZXUWx
+ sPao3OUIBEJ0Z8RQ+rxfGk2MSIPQnmGAGgoE3nK4vq49Kq3Q9Jc1
+ lHR1XrO8+37GWUmQhSFG5fePDd4VhR/WN1frenRqjUYjFSaGGCzX
+ WHt6cmRd9Q9FuVfGBp3+LGVTAfXzEL+g+AXFLygS4/8LMADwNQPr
+ st+xzQAAAABJRU5ErkJggg==
+ </data>
+ </dict>
+ </array>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2011-10-26 13:03:17 -0700</string>
+ <key>Modifier</key>
+ <string>Scott Main</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>size</string>
+ <string>{612, 792}</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{-108, 0}, {792.222, 718.889}}</string>
+ <key>Zoom</key>
+ <real>0.89999997615814209</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>0.89999997615814209</real>
+ <real>1.7200000286102295</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>NO</string>
+</dict>
+</plist>
diff --git a/docs/html/images/fundamentals/fragments.png b/docs/html/images/fundamentals/fragments.png
index b3b7b23..bf986b1 100644
--- a/docs/html/images/fundamentals/fragments.png
+++ b/docs/html/images/fundamentals/fragments.png
Binary files differ
diff --git a/docs/html/images/practices/actionbar-phone-splitaction.png b/docs/html/images/practices/actionbar-phone-splitaction.png
new file mode 100644
index 0000000..a0081e7
--- /dev/null
+++ b/docs/html/images/practices/actionbar-phone-splitaction.png
Binary files differ
diff --git a/docs/html/images/practices/actionbar-phone-tablet.png b/docs/html/images/practices/actionbar-phone-tablet.png
new file mode 100644
index 0000000..430ea85
--- /dev/null
+++ b/docs/html/images/practices/actionbar-phone-tablet.png
Binary files differ
diff --git a/docs/html/images/publishing/publishing_overview.png b/docs/html/images/publishing/publishing_overview.png
new file mode 100755
index 0000000..0d88b4f
--- /dev/null
+++ b/docs/html/images/publishing/publishing_overview.png
Binary files differ
diff --git a/docs/html/images/publishing/publishing_overview_prep.png b/docs/html/images/publishing/publishing_overview_prep.png
new file mode 100755
index 0000000..7a300f4
--- /dev/null
+++ b/docs/html/images/publishing/publishing_overview_prep.png
Binary files differ
diff --git a/docs/html/images/publishing/publishing_preparing.png b/docs/html/images/publishing/publishing_preparing.png
new file mode 100755
index 0000000..40c0ac6
--- /dev/null
+++ b/docs/html/images/publishing/publishing_preparing.png
Binary files differ
diff --git a/docs/html/images/publishing/publishing_unknown_sources.png b/docs/html/images/publishing/publishing_unknown_sources.png
new file mode 100755
index 0000000..ad310a1
--- /dev/null
+++ b/docs/html/images/publishing/publishing_unknown_sources.png
Binary files differ
diff --git a/docs/html/images/publishing/publishing_via_email.png b/docs/html/images/publishing/publishing_via_email.png
new file mode 100755
index 0000000..54c64bd
--- /dev/null
+++ b/docs/html/images/publishing/publishing_via_email.png
Binary files differ
diff --git a/docs/html/index.jd b/docs/html/index.jd
index d412993..bb7721d 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -132,16 +132,14 @@
'name':"Android 4.0",
'img':"ics-android.png",
'title':"Ice Cream Sandwich!",
- 'desc': "<br/><br/><br/><p>Oh my goodness, that looks tasty!</p>"
-/*
-+ "<p>For more information about all the changes in Android 3.2, read the "
-+ "<a href='{@docRoot}sdk/android-3.2.html'>version notes</a> and <a "
-+ "href='{@docRoot}sdk/api_diff/13/changes.html'>diff report</a>.</p>"
-+ "<p>If you have an existing SDK, add Android 3.0 as an "
-+ "<a href='{@docRoot}sdk/adding-components.html'>SDK "
-+ "component</a>. If you're new to Android, install the "
-+ "<a href='{@docRoot}sdk/index.html'>SDK starter package</a>."
-*/
+ 'desc': "<p>Android 4.0 is here, delivering a unified UI for phones and tablets and "
++ "innovative features for users and developers. Check out the <a "
++ "href='http://developer.android.com/sdk/android-4.0-highlights.html'>Platform Highlights</a> "
++ "for an overview of the new features in Android 4.0.</p>"
++ "<p>For more information about API changes, read the "
++ "<a href='{@docRoot}sdk/android-4.0.html'>platform notes</a> and <a "
++ "href='{@docRoot}sdk/api_diff/14/changes.html'>diff report</a>. If you're new to Android, "
++ "get started with the <a href='/sdk/index.html'>SDK starter package</a>.</p>"
},
'tv': {
@@ -158,7 +156,7 @@
+ "<p><a href='http://code.google.com/tv'>Develop for Google TV »</a></p>"
},
-
+/*
'devphone': {
'layout':"imgLeft",
'icon':"devphone-small.png",
@@ -172,6 +170,7 @@
+ "<a href='http://market.android.com/publish'>Visit Android Market "
+ "to learn more »</a></p>"
},
+ */
'mapskey': {
'layout':"imgLeft",
diff --git a/docs/html/resources/dashboard/opengl.jd b/docs/html/resources/dashboard/opengl.jd
index 2b94b28..9089937 100644
--- a/docs/html/resources/dashboard/opengl.jd
+++ b/docs/html/resources/dashboard/opengl.jd
@@ -57,7 +57,7 @@
<div class="dashboard-panel">
<img alt="" width="400" height="250"
-src="http://chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b,6fad0c&chl=GL%201.1|GL%202.0%20%26%201.1&chd=t%3A9.4,90.6" />
+src="http://chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b,6fad0c&chl=GL%201.1|GL%202.0%20%26%201.1&chd=t%3A9.2,90.8" />
<table>
<tr>
@@ -66,14 +66,14 @@
</tr>
<tr>
<td>1.1</th>
-<td>9.4%</td>
+<td>9.2%</td>
</tr>
<tr>
<td>2.0</th>
-<td>90.6%</td>
+<td>90.8%</td>
</tr>
</table>
-<p><em>Data collected during a 7-day period ending on September 2, 2011</em></p>
+<p><em>Data collected during a 7-day period ending on October 3, 2011</em></p>
</div>
diff --git a/docs/html/resources/dashboard/platform-versions.jd b/docs/html/resources/dashboard/platform-versions.jd
index 51cbae3..135c6f2 100644
--- a/docs/html/resources/dashboard/platform-versions.jd
+++ b/docs/html/resources/dashboard/platform-versions.jd
@@ -52,7 +52,7 @@
<div class="dashboard-panel">
<img alt="" height="250" width="470"
-src="http://chart.apis.google.com/chart?&cht=p&chs=460x250&chd=t:1.0,1.8,13.3,51.2,0.6,30.7,0.2,0.7,0.5&chl=Android%201.5|Android%201.6|Android%202.1|Android%202.2|Android%202.3|Android%202.3.3|Android%203.0|Android%203.1|Android%203.2&chco=c4df9b,6fad0c" />
+src="http://chart.apis.google.com/chart?&cht=p&chs=460x250&chd=t:1.1,1.4,11.7,45.3,0.5,38.2,0.2,0.9,0.7&chl=Android%201.5|Android%201.6|Android%202.1|Android%202.2|Android%202.3|Android%202.3.3|Android%203.0|Android%203.1|Android%203.2&chco=c4df9b,6fad0c" />
<table>
<tr>
@@ -61,21 +61,21 @@
<th>API Level</th>
<th>Distribution</th>
</tr>
-<tr><td><a href="{@docRoot}sdk/android-1.5.html">Android 1.5</a></td><td>Cupcake</td> <td>3</td><td>1.0%</td></tr>
-<tr><td><a href="{@docRoot}sdk/android-1.6.html">Android 1.6</a></td><td>Donut</td> <td>4</td><td>1.8%</td></tr>
-<tr><td><a href="{@docRoot}sdk/android-2.1.html">Android 2.1</a></td><td>Eclair</td> <td>7</td><td>13.3%</td></tr>
-<tr><td><a href="{@docRoot}sdk/android-2.2.html">Android 2.2</a></td><td>Froyo</td> <td>8</td><td>51.2%</td></tr>
+<tr><td><a href="{@docRoot}sdk/android-1.5.html">Android 1.5</a></td><td>Cupcake</td> <td>3</td><td>1.1%</td></tr>
+<tr><td><a href="{@docRoot}sdk/android-1.6.html">Android 1.6</a></td><td>Donut</td> <td>4</td><td>1.4%</td></tr>
+<tr><td><a href="{@docRoot}sdk/android-2.1.html">Android 2.1</a></td><td>Eclair</td> <td>7</td><td>11.7%</td></tr>
+<tr><td><a href="{@docRoot}sdk/android-2.2.html">Android 2.2</a></td><td>Froyo</td> <td>8</td><td>45.3%</td></tr>
<tr><td><a href="{@docRoot}sdk/android-2.3.html">Android 2.3 -<br/>
- Android 2.3.2</a></td><td rowspan="2">Gingerbread</td> <td>9</td><td>0.6%</td></tr>
+ Android 2.3.2</a></td><td rowspan="2">Gingerbread</td> <td>9</td><td>0.5%</td></tr>
<tr><td><a href="{@docRoot}sdk/android-2.3.3.html">Android 2.3.3 -<br/>
- Android 2.3.4</a></td><!-- Gingerbread --> <td>10</td><td>30.7%</td></tr>
+ Android 2.3.7</a></td><!-- Gingerbread --> <td>10</td><td>38.2%</td></tr>
<tr><td><a href="{@docRoot}sdk/android-3.0.html">Android 3.0</a></td>
<td rowspan="3">Honeycomb</td> <td>11</td><td>0.2%</td></tr>
-<tr><td><a href="{@docRoot}sdk/android-3.1.html">Android 3.1</a></td><!-- Honeycomb --><td>12</td><td>0.7%</td></tr>
-<tr><td><a href="{@docRoot}sdk/android-3.2.html">Android 3.2</a></td><!-- Honeycomb --><td>13</td><td>0.5%</td></tr>
+<tr><td><a href="{@docRoot}sdk/android-3.1.html">Android 3.1</a></td><!-- Honeycomb --><td>12</td><td>0.9%</td></tr>
+<tr><td><a href="{@docRoot}sdk/android-3.2.html">Android 3.2</a></td><!-- Honeycomb --><td>13</td><td>0.7%</td></tr>
</table>
-<p><em>Data collected during a 14-day period ending on September 2, 2011</em></p>
+<p><em>Data collected during a 14-day period ending on October 3, 2011</em></p>
<!--
<p style="font-size:.9em">* <em>Other: 0.1% of devices running obsolete versions</em></p>
-->
@@ -104,9 +104,9 @@
<div class="dashboard-panel">
<img alt="" height="250" width="660" style="padding:5px;background:#fff"
-src="http://chart.apis.google.com/chart?&cht=lc&chs=660x250&chxt=x,x,y,r&chxr=0,0,12|1,0,12|2,0,100|3,0,100&chxl=0%3A%7C03/01%7C03/15%7C04/01%7C04/15%7C05/01%7C05/15%7C06/01%7C06/15%7C07/01%7C07/15%7C08/01%7C08/15%7C09/01%7C1%3A%7C2011%7C%7C%7C%7C%7C%7C%7C%7C%7C%7C%7C%7C2011%7C2%3A%7C0%25%7C25%25%7C50%25%7C75%25%7C100%25%7C3%3A%7C0%25%7C25%25%7C50%25%7C75%25%7C100%25&chxp=0,0,1,2,3,4,5,6,7,8,9,10,11,12&chxtc=0,5&chd=t:100.0,99.8,99.7,99.6,99.6,99.5,99.4,99.3,99.2,99.0,98.8,98.7,98.6|96.7,96.8,97.0,97.1,97.3,97.5,97.5,97.5,97.7,97.6,97.5,97.5,97.5|91.5,92.0,93.5,93.9,94.3,94.8,95.0,95.2,95.5,95.5,95.5,95.6,95.8|61.5,63.0,66.4,68.0,69.8,71.5,73.9,75.4,77.6,79.0,80.2,81.1,82.4|1.1,1.7,2.5,3.1,4.0,6.1,9.5,13.6,17.8,20.6,24.3,27.5,31.1|0.0,1.0,1.7,2.2,3.0,5.1,8.4,12.6,16.8,20.0,23.7,26.9,30.5&chm=b,c3df9b,0,1,0|b,b4db77,1,2,0|tAndroid 2.1,547a19,2,0,15,,t::-5|b,a5db51,2,3,0|tAndroid 2.2,3f5e0e,3,0,15,,t::-5|b,96dd28,3,4,0|b,83c916,4,5,0|tAndroid 2.3.3,131d02,5,7,15,,t::-5|B,6fad0c,5,6,0&chg=7,25&chdl=Android 1.5|Android 1.6|Android 2.1|Android 2.2|Android 2.3|Android 2.3.3&chco=add274,9dd14f,8ece2a,7ab61c,659b11,507d08" />
+src="http://chart.apis.google.com/chart?&cht=lc&chs=660x250&chxt=x,x,y,r&chxr=0,0,12|1,0,12|2,0,100|3,0,100&chxl=0%3A%7C04/01%7C04/15%7C05/01%7C05/15%7C06/01%7C06/15%7C07/01%7C07/15%7C08/01%7C08/15%7C09/01%7C09/15%7C10/01%7C1%3A%7C2011%7C%7C%7C%7C%7C%7C%7C%7C%7C%7C%7C%7C2011%7C2%3A%7C0%25%7C25%25%7C50%25%7C75%25%7C100%25%7C3%3A%7C0%25%7C25%25%7C50%25%7C75%25%7C100%25&chxp=0,0,1,2,3,4,5,6,7,8,9,10,11,12&chxtc=0,5&chd=t:99.7,99.6,99.6,99.5,99.4,99.3,99.2,99.0,98.8,98.7,98.5,98.5,98.2|97.0,97.1,97.3,97.5,97.5,97.5,97.7,97.6,97.5,97.5,97.5,97.5,97.1|93.5,93.9,94.3,94.8,95.0,95.2,95.5,95.5,95.5,95.6,95.7,95.8,95.6|66.4,68.0,69.8,71.5,73.9,75.4,77.6,79.0,80.2,81.1,82.4,83.3,83.8|2.5,3.1,4.0,6.1,9.5,13.6,17.8,20.6,24.3,27.5,31.2,34.7,38.3|1.7,2.2,3.0,5.1,8.4,12.6,16.8,20.0,23.7,26.9,30.6,34.1,37.8&chm=b,c3df9b,0,1,0|b,b4db77,1,2,0|tAndroid 2.1,547a19,2,0,15,,t::-5|b,a5db51,2,3,0|tAndroid 2.2,3f5e0e,3,0,15,,t::-5|b,96dd28,3,4,0|b,83c916,4,5,0|tAndroid 2.3.3,131d02,5,5,15,,t::-5|B,6fad0c,5,6,0&chg=7,25&chdl=Android 1.5|Android 1.6|Android 2.1|Android 2.2|Android 2.3|Android 2.3.3&chco=add274,9dd14f,8ece2a,7ab61c,659b11,507d08" />
-<p><em>Last historical dataset collected during a 14-day period ending on September 2, 2011</em></p>
+<p><em>Last historical dataset collected during a 14-day period ending on October 3, 2011</em></p>
</div><!-- end dashboard-panel -->
diff --git a/docs/html/resources/dashboard/screens.jd b/docs/html/resources/dashboard/screens.jd
index 77fd2d2..67b47d0 100644
--- a/docs/html/resources/dashboard/screens.jd
+++ b/docs/html/resources/dashboard/screens.jd
@@ -59,7 +59,8 @@
<div class="dashboard-panel">
-<img alt="" width="400" height="250" src="http://chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b,6fad0c&chl=Xlarge%20/%20mdpi| Large%20/%20mdpi|Normal%20/%20hdpi|Normal%20/%20ldpi|Normal%20/%20mdpi|Small%20/%20hdpi&chd=t%3A1.5, 3.2,74,0.9,16.9,3.5" />
+<img alt="" width="400" height="250"
+src="http://chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b,6fad0c&chl=Xlarge%20/%20mdpi|Large%20/%20ldpi|Large%20/%20mdpi|Normal%20/%20hdpi|Normal%20/%20ldpi|Normal%20/%20mdpi|Small%20/%20hdpi|Small%20/%20ldpi&chd=t%3A2.6,0.1,3.0,71.9,0.9,17.6,2.7,1.2" />
<table>
<tr>
@@ -70,31 +71,31 @@
<th scope="col">xhdpi</th>
</tr>
<tr><th scope="row">small</th>
-<td></td> <!-- small/ldpi -->
+<td>1.2%</td> <!-- small/ldpi -->
<td></td> <!-- small/mdpi -->
-<td>3.5%</td> <!-- small/hdpi -->
+<td>2.7%</td> <!-- small/hdpi -->
<td></td> <!-- small/xhdpi -->
</tr>
<tr><th scope="row">normal</th>
<td>0.9%</td> <!-- normal/ldpi -->
-<td>16.9%</td> <!-- normal/mdpi -->
-<td>74%</td> <!-- normal/hdpi -->
+<td>17.6%</td> <!-- normal/mdpi -->
+<td>71.9%</td> <!-- normal/hdpi -->
<td></td> <!-- normal/xhdpi -->
</tr>
<tr><th scope="row">large</th>
-<td></td> <!-- large/ldpi -->
-<td>3.2%</td> <!-- large/mdpi -->
+<td>0.1%</td> <!-- large/ldpi -->
+<td>3.0%</td> <!-- large/mdpi -->
<td></td> <!-- large/hdpi -->
<td></td> <!-- large/xhdpi -->
</tr>
<tr><th scope="row">xlarge</th>
<td></td> <!-- xlarge/ldpi -->
-<td>1.5%</td> <!-- xlarge/mdpi -->
+<td>2.6%</td> <!-- xlarge/mdpi -->
<td></td> <!-- xlarge/hdpi -->
<td></td> <!-- xlarge/xhdpi -->
</tr>
</table>
-<p><em>Data collected during a 7-day period ending on September 2, 2011</em></p>
+<p><em>Data collected during a 7-day period ending on October 3, 2011</em></p>
</div>
diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js
index 310310e..237e18c 100644
--- a/docs/html/resources/resources-data.js
+++ b/docs/html/resources/resources-data.js
@@ -398,16 +398,6 @@
}
},
{
- tags: ['sample', 'accessibility'],
- path: 'samples/AccessibilityService/index.html',
- title: {
- en: 'Accessibility Service'
- },
- description: {
- en: 'Illustrates an accessibility service that provides custom feedback for the Clock application which comes by default with Android devices'
- }
- },
- {
tags: ['sample', 'new', 'ui', 'compatibility', 'newfeature'],
path: 'samples/ActionBarCompat/index.html',
title: {
@@ -599,12 +589,22 @@
},
{
tags: ['sample', 'input', 'new'],
- path: 'samples/SampleSpellCheckerService/index.html',
+ path: 'samples/SpellChecker/SampleSpellCheckerService/index.html',
title: {
- en: 'Spell Checker'
+ en: 'Spell Checker Service'
},
description: {
- en: 'An example spell checker service, using the <a href="'+toRoot+'reference/android/service/textservice/SpellCheckerService.html"><code>SpellCheckerservice</code></a>.'
+ en: 'An example spell checker service, using the <a href="'+toRoot+'reference/android/service/textservice/SpellCheckerService.html"><code>SpellCheckerService</code></a>.'
+ }
+ },
+ {
+ tags: ['sample', 'input', 'new'],
+ path: 'samples/SpellChecker/HelloSpellChecker/index.html',
+ title: {
+ en: 'Spell Checker Client'
+ },
+ description: {
+ en: 'An example spell checker client, using the <a href="'+toRoot+'reference/android/view/textservice/TextServicesManager.html"><code>TextServicesManager</code></a> and <a href="'+toRoot+'reference/android/view/textservice/SpellCheckerSession.html"><code>SpellCheckerSession</code></a>.'
}
},
{
diff --git a/docs/html/sdk/android-4.0-highlights.jd b/docs/html/sdk/android-4.0-highlights.jd
new file mode 100644
index 0000000..c1162d4
--- /dev/null
+++ b/docs/html/sdk/android-4.0-highlights.jd
@@ -0,0 +1,1009 @@
+page.title=Android 4.0 Platform Highlights
+
+@jd:body
+
+
+<style type="text/css">
+#jd-content {
+ max-width:1024px;
+}
+#jd-content div.screenshot {
+ float:left;
+ clear:left;
+ padding:15px 30px 15px 0;
+}
+#jd-content div.video {
+ float:right;
+ padding:0 0 40px 60px;
+ margin-top:-30px;
+}
+#jd-content table.columns {
+ margin:0 0 1em 0;
+}
+#jd-content table.columns td {
+ padding:0;
+}
+#jd-content table.columns td+td {
+ padding:0 2em;
+}
+#jd-content table.columns td img {
+ margin:0;
+}
+#jd-content table.columns td+td>*:first-child {
+ margin-top:-2em;
+}
+.green {
+ color:#8db529;
+ font-weight:bold;
+}
+</style>
+
+<div class="video">
+<iframe width="380" height="223" src="http://www.youtube.com/embed/-F_ke3rxopc?hd=1" frameborder="0"
+allowfullscreen></iframe>
+</div>
+
+<p>Welcome to Android 4.0!</p>
+
+<p>Android 4.0 delivers a refined, unified UI for phones and tablets and
+introduces innovative features for users and developers. This document provides
+a glimpse of the many new features and technologies that make Android 4.0
+simple, beautiful, and beyond smart. <!--For technical details about
+new developer APIs described below, see the <a
+href="{@docRoot}sdk/android-4.0.html">Android 4.0 API Overview</a>
+document.--></p>
+
+<ul>
+ <li><a href="#UserFeatures">Android 4.0 for Users</a></li>
+ <li><a href="#DeveloperApis">Android 4.0 for Developers</a></li>
+</ul>
+
+<h2 id="UserFeatures" style="clear:right">Android 4.0 for Users</h2>
+
+<div style="padding-bottom:0em;">
+<a href="{@docRoot}sdk/images/4.0/home-lg.png" target="_android"><img style="float:right;xborder:1px solid #ddd;border-radius: 5px;" src="{@docRoot}sdk/images/4.0/home.png" alt="" height="300" width="180" /></a>
+<a href="{@docRoot}sdk/images/4.0/lock-lg.png" target="_android"><img style="float:right;border:1px solid #ddd;border-radius: 5px;" src="{@docRoot}sdk/images/4.0/lock.png" alt="" height="300" width="180" /></a>
+</div>
+
+
+<h3 id="simple" style="color:#172861">Simple, beautiful, beyond smart</h3>
+
+<p>Android 4.0 builds on the things people love most about Android — easy
+multitasking, rich notifications, customizable home screens, resizable widgets,
+and deep interactivity — and adds powerful new ways of communicating and
+sharing.</p>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Refined, evolved UI</strong></p>
+
+<p>Focused on bringing the power of Android to the surface, Android 4.0 makes
+<strong>common actions more visible</strong> and lets users navigate with
+simple, intuitive gestures. Refined <strong>animations</strong> and feedback
+throughout the system make interactions engaging and interesting. An entirely
+<strong>new typeface</strong> optimized for high-resolution screens improves
+readability and brings a polished, modern feel to the user interface.</p>
+
+<p>Virtual buttons in the System Bar let users navigate instantly to Back, Home,
+and Recent Apps. The <strong>System Bar</strong> and virtual buttons are present
+across all apps, but can be dimmed by applications for full-screen viewing.
+Users can access each application's contextual options in the <strong>Action
+Bar</strong>, displayed at the top (and sometimes also at the bottom) of the
+screen.</p>
+
+<p><strong>Multitasking</strong> is a key strength of Android and it's made even
+easier and more visual on Android 4.0. The Recent Apps button lets users jump
+instantly from one task to another using the list in the System Bar. The list
+pops up to show thumbnail images of apps used recently — tapping a
+thumbnail switches to the app.</p>
+
+<div style="padding-top:0em;">
+<div style="margin-right:.5em;float:left;width:182px;padding-top:.5em;">
+<a href="{@docRoot}sdk/images/4.0/tasks-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/tasks.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1em;font-size:.9em;padding-right:1em;">The Recent Apps list makes multitasking simple.</div>
+<a href="{@docRoot}sdk/images/4.0/lock-camera-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/lock-camera.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1em;font-size:.9em;padding-right:1.75em;">Jump to the camera or see notifications without unlocking.</div>
+<a href="{@docRoot}sdk/images/4.0/contact-call-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/contact-call.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;padding:0" /></a>
+<!--<a href="{@docRoot}sdk/images/4.0/quick-response-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/quick-responses-new.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>-->
+<div style="padding-left:1em;padding-bottom:.5em;font-size:.9em;padding-right:1.75em;">For incoming calls, you can respond instantly by text.</div>
+</div>
+</div>
+
+<p>Rich and interactive <strong>notifications</strong> let users keep in
+constant touch with incoming messages, play music tracks, see real-time updates
+from apps, and much more. On smaller-screen devices, notifications appear at the
+top of the screen, while on larger-screen devices they appear in the System
+Bar.</p>
+
+<div style="padding-top:0em;">
+<div style="margin-right:1em;float:right;margin-left:1em;margin-top:.5em;margin-bottom:0;padding-bottom:0;width:326px">
+<a href="{@docRoot}sdk/images/4.0/allapps-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/allapps.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<a href="{@docRoot}sdk/images/4.0/calendar-widget-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/calendar-widget.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1em;margin-top:0;padding-top:0;font-size:.9em"><!--<strong>Figure 3.</strong>-->The All Apps launcher (left) and resizable widgets (right) give you apps and rich content from the home screen.</div>
+</div>
+</div>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Home screen folders and
+favorites tray</strong></p>
+
+<p>New home screen <strong>folders</strong> offer a new way for users to group
+their apps and shortcuts logically, just by dragging one onto another. Also,
+in All Apps launcher, users can now simply <strong>drag an app</strong> to get
+information about it or immediately uninstall it, or disable a pre-installed app.</p>
+
+<p>On smaller-screen devices, the home screen now includes a customizable
+<strong>favorites tray</strong> visible from all home screens. Users can drag
+apps, shortcuts, folders, and other priority items in or out of the favorites
+tray for instant access from any home screen.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Resizable
+widgets</strong></p>
+
+<p>Home screens in Android 4.0 are designed to be content-rich and customizable.
+Users can do much more than add shortcuts — they can embed live
+application content directly through interactive <strong>widgets</strong>.
+Widgets let users check email, flip through a calendar, play music, check social
+streams, and more — right from the home screen, without having to launch
+apps. Widgets are resizable, so users can expand them to show more content or
+shrink them to save space.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>New lock screen
+actions</strong></p>
+
+<p>The lock screens now let users do more without unlocking. From the slide lock
+screen, users can <strong>jump directly to the camera</strong> for a picture or
+<strong>pull down the notifications window</strong> to check for messages. When
+listening to music, users can even manage music tracks and see album art. </p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Quick responses for
+incoming calls</strong></p>
+
+<p>When an incoming call arrives, users can now quickly <strong>respond by text
+message</strong>, without needing to pick up the call or unlock the device. On
+the incoming call screen, users simply slide a control to see a list of text
+responses and then tap to send and end the call. Users can add their own
+responses and manage the list from the Settings app.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Swipe to dismiss
+notifications, tasks, and browser tabs</strong></p>
+
+<p>Android 4.0 makes managing notifications, recent apps, and browser tabs even
+easier. Users can now dismiss individual notifications, apps from the Recent
+Apps list, and browser tabs with a simple swipe of a finger. </p>
+
+<div style="padding-top:0em;">
+<div style="margin-right:1em;float:right;margin-left:1em;margin-top:1.5em;margin-bottom:0;padding-bottom:0;width:200px">
+<a href="{@docRoot}sdk/images/4.0/text-replace-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/text-replace.png" alt="" width="190" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1.25em;margin-top:0;padding-top:0;font-size:.9em"><!--<strong>Figure 3.</strong>-->A spell-checker lets you find errors and fix them faster. </div>
+<a href="{@docRoot}sdk/images/4.0/tts-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/tts.png" alt="" width="190" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1.25em;margin-top:0;padding-top:0;font-size:.9em">A powerful voice input engine lets you dictate continously.</div>
+</div>
+</div>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Improved text input and
+spell-checking</strong></p>
+
+<p>The soft keyboard in Android 4.0 makes text input even faster and more
+accurate. Error correction and word suggestion are improved through a new set of
+default dictionaries and more accurate heuristics for handling cases such as
+double-typed characters, skipped letters, and omitted spaces. Word suggestion
+is also improved and the suggestion strip is simplified to show only three
+words at a time.</p>
+
+<p>To fix misspelled words more easily, Android 4.0 adds a
+<strong>spell-checker</strong> that locates and underlines errors and suggests
+replacement words. With one tap, users can choose from multiple spelling
+suggestions, delete a word, or add it to the dictionary. Users can even tap to
+see replacement suggestions for words that are spelled correctly. For
+specialized features or additional languages, users can now download and install
+third-party dictionaries, spell-checkers, and other text services.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Powerful voice input
+engine</strong></p>
+
+<p>Android 4.0 introduces a powerful new voice input engine that offers a
+continuous "open microphone" experience and streaming voice recognition. The new
+voice input engine lets users dictate the text they want, for as long as they
+want, using the language they want. Users can <strong>speak continously</strong> for a prolonged
+time, even pausing for intervals if needed, and dictate punctuation to create
+correct sentences. As the voice input engine enters text, it underlines possible
+dictation errors in gray. After dictating, users can tap the underlined words to
+quickly replace them from a list of suggestions.</p>
+
+<div style="padding-top:0em;">
+<div style="margsin-right:.8em;float:left;width:350px;padding-top:1em;">
+<a href="{@docRoot}sdk/images/4.0/usage-all-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/usage-all.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<a href="{@docRoot}sdk/images/4.0/usage-maps-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/usage-maps.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1em;font-size:.9em;padding-right:1.75em;"><!--<strong>Figure 3.</strong>--> Data usage controls let you monitor total usage by network type and application and then set limits if needed.</div>
+</div>
+</div>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Control over network
+data</strong></p>
+
+<p>Mobile devices can make extensive use of network data for streaming content,
+synchronizing data, downloading apps, and more. To meet the needs of users with
+<strong>tiered or metered data plans</strong>, Android 4.0 adds new controls for
+managing network data usage.</p>
+
+<p>In the Settings app, colorful charts show the total data usage on each
+network type (mobile or Wi-Fi), as well as amount of data used by each running
+application. Based on their data plans, users can optionally set warning levels
+or hard limits on data usage or disable mobile data altogether. Users can also
+manage the background data used by individual applications as needed.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Designed for
+accessibility</strong></p>
+
+<p>A variety of new features greatly enhance the accessibility of Android 4.0
+for blind or visually impaired users. Most important is a new
+<strong>explore-by-touch mode</strong> that lets users navigate without having
+to see the screen. Touching the screen once triggers audible feedback that
+identifies the UI component below; a second touch in the same component
+activates it with a full touch event. The new mode is especially important to
+support users on new devices that use virtual buttons in the System Bar, rather
+than dedicated hardware buttons or trackballs. Also, standard apps are updated
+to offer an improved accessibility experience. The <strong>Browser</strong>
+supports a script-based screen reader for reading favorite web content and
+navigating sites. For improved readability, users can also increase the default
+font size used across the system.</p>
+
+<p>The accessibility experience begins at first setup — a simple
+<strong>touch gesture</strong> during setup (clockwise square from upper left)
+activates all accessibility features and loads a setup tutorial. Once
+accessibility features are active, everything visible on the screen can be
+spoken aloud by the standard screen reader.</p>
+
+
+<h3 id="comms" style="color:#172861">Communication and sharing</h3>
+
+<div style="padding-top:0em;">
+<div style="margin-right:1em;float:right;margin-left:.5em;margin-top:1.5em;margin-bottom:0;padding-bottom:0;width:490px">
+<!--<img src="{@docRoot}sdk/images/4.0/contact-call.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" />-->
+<a href="{@docRoot}sdk/images/4.0/contact-faves-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/contact-faves.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;padding:0" /></a>
+<a href="{@docRoot}sdk/images/4.0/contact-connect-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/contact-connect.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;padding:0" /></a>
+<a href="{@docRoot}sdk/images/4.0/contact-email-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/contact-email.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;padding:0" /></a>
+
+<div style="padding-left:1em;padding-bottom:1.25em;margin-top:0;padding-top:0;font-size:.9em"><!--<strong>Figure 3.</strong>-->Contacts and profiles are integrated across apps and social networks, for a consistent, personal experience everywhere — from incoming calls to emails.</div>
+</div>
+</div>
+
+<p>Designed for the way people live, Android 4.0 integrates rich social
+communication and sharing touchpoints across the system, making it easy to talk,
+email, text, and share.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>People and
+profiles</strong></p>
+
+<p>Throughout the system, a user’s social groups, profiles, and contacts are
+linked together and integrated for easy accessibility. At the center is a new
+<strong>People app</strong> that offers richer profile information, including a
+large profile picture, phone numbers, addresses and accounts, status updates,
+events, and a new button for connecting on integrated social networks. </p>
+
+<p>The user's own contact information is stored in a new <strong>"Me"
+profile</strong>, allowing easier sharing with apps and people. All of the
+user's integrated contacts are displayed in an easy to manage list, including
+controls over which contacts are shown from any integrated account or social
+network. Wherever the user navigates across the system, tapping a profile photo
+displays Quick Contacts, with large profile pictures, shortcuts to phone numbers,
+text messaging, and more. </p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Unified calendar, visual
+voicemail</strong></p>
+
+<p>To help organize appointments and events, an updated <strong>Calendar
+app</strong> brings together personal, work, school, and social agendas. With
+user permission, other applications can contribute events to the calendar and
+manage reminders, for an integrated view across multiple calendar providers. The
+app is redesigned to let users manage events more easily. Calendars are
+color-coded and users can <strong>swipe left or right</strong> to change dates
+and pinch to zoom in or out agendas. </p>
+
+<p>In the phone app, a new <strong>visual voicemail</strong> features integrates
+incoming messages, voice transcriptions, and audio files from one or more
+providers. Third-party applications can integrate with the Phone app to add
+their own voice messages, transcriptions, and more to the visual voicemail
+inbox. </p>
+
+<div style="padding-top:0em;">
+<div style="margsin-right:0em;float:left;width:282px;padding-top:1em;">
+<a href="{@docRoot}sdk/images/4.0/camera-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/camera.png" alt="" width="240" height="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<a href="{@docRoot}sdk/images/4.0/gallery-edit-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/gallery-edit.png" alt="" width="240" height="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<a href="{@docRoot}sdk/images/4.0/gallery-share-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/gallery-share.png" alt="" width="240" height="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1em;font-size:.9em;padding-right:2.75em;">Capture the picture you want, edit, and share instantly. </div>
+</div>
+</div>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Rich and versatile camera
+capabilities</strong></p>
+
+<p>The Camera app includes many new features that let users capture special moments
+with great photos and videos. After capturing images, they can edit and share
+them easily with friemds. </p>
+
+<p>When taking pictures, <strong>continuous focus</strong>, <strong>zero shutter
+lag exposure</strong>, and decreased shot-to-shot speed help capture clear,
+precise images. <strong>Stabilized image zoom</strong> lets users compose photos
+and video in the way they want, including while video is recording. For new
+flexibility and convenience while shooting video, users can now take
+<strong>snapshots at full video resolution</strong> just by tapping the screen
+as video continues to record.</p>
+
+<p>To make it easier to take great pictures of people, built-in <strong>face
+detection</strong> locates faces in the frame and automatically sets focus. For
+more control, users can <strong>tap to focus</strong> anywhere in the preview
+image. </p>
+
+<p>For capturing larger scenes, the Camera introduces a <strong>single-motion
+panorama</strong> mode. In this mode, the user starts an exposure and then
+slowly turns the Camera to encompass as wide a perspective as needed. The Camera
+assembles the full range of continuous imagery into a single panoramic
+photo.</p>
+
+<p>After taking a picture or video, users can quickly share it by email, text
+message, bluetooth, social networks, and more, just by tapping the thumbnail in
+the camera controls. </p>
+
+
+<div style="padding-top:0em;">
+<div style="margin-right:1em;float:right;margin-left:1em;padding-top:1em;margin-bottom:1em;padding-bottom:0;width:160px">
+<img src="{@docRoot}sdk/images/4.0/gallery-widget.png" alt="" width="144" style="border:1px solid #ddd;border-radius: 6px;" />
+<div style="padding-left:1em;padding-bottom:1.25em;margin-top:0;padding-top:0;font-size:.9em">A Photo Gallery widget on the home screen.</div>
+</div>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Redesigned Gallery app
+with photo editor</strong></p>
+
+<p>The Gallery app now makes it easier to manage, show, and share photos and
+videos. For managing collections, a <strong>redesigned album layout</strong>
+shows many more albums and offers larger thumbnails. There are many ways to sort
+albums, including by time, location, people, and tags. To help pictures look
+their best, the Gallery now includes a powerful <strong>photo editor</strong>.
+Users can crop and rotate pictures, set levels, remove red eyes, add effects,
+and much more. After retouching, users can select one or multiple pictures or
+videos to share instantly over email, text messaging, bluetooth, social
+networks, or other apps.</p>
+
+<p>An improved <strong>Picture Gallery widget</strong> lets users look at
+pictures directly on their home screen. The widget can display pictures from a
+selected album, shuffle pictures from all albums, or show a single image. After
+adding the widget to the home screen, users can flick through the photo stacks
+to locate the image they want, then tap to load it in Gallery. </p>
+
+<div style="padding-top:0em;clear:right;">
+<div style="margin-right:1em;float:right;margin-left:1em;padding-top:1em;margin-bottom:1em;padding-bottom:0;width:320px">
+<img src="{@docRoot}sdk/images/4.0/live-effects.png" alt="" width="297" style="border:1px solid #ddd;border-radius: 6px;" />
+<div style="padding-left:1em;padding-bottom:1em;margin-top:0;padding-top:0;font-size:.9em">Live Effects let you change backgrounds and use Silly Faces during video.</div>
+</div>
+</div>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Live Effects for transforming video</strong></p>
+
+<p>Live Effects is a collection of graphical transformations that add interest
+and fun to videos captured in the Camera app. For example, users can
+<strong>change the background</strong> behind them to any stock or custom image,
+for just the right setting when shooting videeo. Also available for video is
+Silly Faces, a set of morphing effects that use state-of-the-art face
+recognition and GPU filters to transform facial features. For example, you can
+use effects such as small eyes, big mouth, big nose, face squeeze, and more.
+Outside of the Camera app, Live Effects is available during video chat in the
+Google Talk app.</p>
+
+<div style="padding-top:0em;">
+<div style="margsin-right:.8em;float:left;width:186px;padding-top:1em;">
+<a href="{@docRoot}sdk/images/4.0/screenshot-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/screenshot.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1.25em;margin-top:0;padding-top:0;font-size:.9em"> Snapping a screenshot.</div>
+</div>
+</div>
+</div>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Sharing with screenshots</strong></p>
+
+<p>Users can now share what's on their screens more easily by taking
+screenshots. Hardware buttons let them snap a <strong>screenshot</strong> and
+store it locally. Afterward, they can view, edit, and share the screen shot in
+Gallery or a similar app.</p>
+
+
+<h3 id="cloud" style="color:#172861">Cloud-connected experience</h3>
+
+<div style="padding-top:0em;">
+<div style="margin-right:1em;float:right;margin-left:1em;padding-top:1em;margin-bottom:0;padding-bottom:0;width:326px">
+<a href="{@docRoot}sdk/images/4.0/browser-tabs-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/browser-tabs.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<a href="{@docRoot}sdk/images/4.0/browser-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/browser.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1.25em;margin-top:0;padding-top:0;font-size:.9em"><!--<strong>Figure 3.</strong>-->The Browser tabs menu <em>(left)</em> lets you quickly switch browser tabs. The options menu <em>(right)</em> gives you new ways to manage your browsing experience.</div>
+<img src="{@docRoot}sdk/images/4.0/bbench.png" alt="" width="310" />
+<div style="padding-left:1em;padding-bottom:1em;margin-top:0;padding-top:0;font-size:.9em">Benchmark comparisons of Android Browser.</div>
+</div>
+</div>
+
+<p>Android has always been cloud-connected, letting users browse the web and
+sync photos, apps, games, email, and contacts — wherever they are and
+across all of their devices. Android 4.0 adds new browsing and email
+capabilities to let users take even more with them and keep communication
+organized.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Powerful web
+browsing</strong></p>
+
+<p>The Android Browser offers an experience that’s as rich and convenient as a
+desktop browser. It lets users instantly sync and manage <strong>Google Chrome
+bookmarks</strong> from all of their accounts, jump to their favorite content
+faster, and even save it for reading later in case there's no network
+available.</p>
+
+<p>To get the most out of web content, users can now request full
+<strong>desktop versions</strong> of web sites, rather than their mobile
+versions. Users can set their preference for web sites separately for each
+<strong>browser tab</strong>. For longer content, users can save a copy for
+<strong>offline reading</strong>. To find and open saved pages, users can browse
+a visual list that’s included with browser bookmarks and history. For better
+readability and accessibility, users can increase the browser’s <strong>zoom
+levels</strong> and override the system default <strong>text sizes</strong>.</p>
+
+<p>Across all types of content, the Android Browser offers dramatically improved
+<strong>page rendering performance</strong> through updated versions of the
+WebKit core and the V8 Crankshaft compilation engine for JavaScript. In
+benchmarks run on a Nexus S device, the Android 4.0 browser showed an
+improvement of nearly 220% over the Android 2.3 browser in the V8 Benchmark
+Suite and more than 35% in the SunSpider 9.1 JavaScript Benchmark. When run on a
+Galaxy Nexus device, the Android 4.0 browser showed improvement of nearly 550%
+in the V8 benchmark and nearly 70% in the SunSpider benchmark.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Improved
+email</strong></p>
+
+<p>In Android 4.0, email is easier to send, read, and manage. For composing
+email, <strong>improved auto-completion</strong> of recipients helps with
+finding and adding frequent contacts more quickly. For easier input of frequent
+text, users can now create <strong>quick responses</strong> and store them in
+the app, then enter them from a convenient menu when composing. When replying to
+a message, users can now toggle the message to Reply All and Forward without
+changing screens.</p>
+
+<p>For easier browsing across accounts and labels, the app adds an
+<strong>integrated menu</strong> of accounts and recent labels. To help users
+locate and organize IMAP and Exchange email, the Email app now supports
+<strong>nested mail subfolders</strong>, each with synchronization rules. Users
+can also search across folders on the server, for faster results. </p>
+
+<p>For <strong>enterprises</strong>, the Email app supports EAS v14. It supports
+EAS certificate authentication, provides ABQ strings for device type and mode,
+and allows automatic sync to be disabled while roaming. Administrators can also
+limit attachment size or disable attachments.</p>
+
+<p>For keeping track of incoming email more easily, a <strong>resizable Email
+widget</strong> lets users flick through recent email right from the home
+screen, then jump into the Email app to compose or reply.</p>
+
+
+<div style="padding-top:0em;">
+<div style="margsin-right:.8em;float:left;width:186px;padding-top:1em;">
+<a href="{@docRoot}sdk/images/4.0/beam-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/beam.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1em;margin-top:0;padding-top:0;font-size:.9em;padding-right:1.5em;">Android Beam lets users share what they are using with a single tap.</div>
+</div>
+</div>
+
+<h3 id="innovation" style="color:#172861">Innovation</h3>
+
+<p>Android is continously driving innovation forward, pushing the boundaries of
+communication and sharing with new capabilities and interactions.</p>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Android Beam for
+NFC-based sharing</strong></p>
+
+<p>Android Beam is an innovative, convenient feature for sharing across two
+NFC-enabled devices, It lets people instantly exchange favorite apps, contacts,
+music, videos — almost anything. It’s incredibly simple and convenient to
+use — there’s no menu to open, application to launch, or pairing needed.
+Just touch one Android-powered phone to another, then tap to send.</p>
+
+<p>For sharing apps, Android Beam pushes a link to the app's details page in
+Android Market. On the other device, the Market app launches and loads the
+details page, for easy downloading of the app. Individual apps can build on
+Android Beam to add other types of interactions, such as passing game scores,
+initiating a multiplayer game or chat, and more.</p>
+
+<div style="padding-top:0em;">
+<div style="margin-right:1em;float:right;margin-left:1em;margin-top:.5em;margin-bottom:0;padding-bottom:0;width:160px">
+<a href="{@docRoot}sdk/images/4.0/face-unlock-lg.png" target="_android">
+<img src="{@docRoot}sdk/images/4.0/face-unlock.png" alt="" height="240" width="144" style="border:1px solid #ddd;border-radius: 6px;" /></a>
+<div style="padding-left:1em;padding-bottom:1em;margin-top:0;padding-top:0;font-size:.9em">Face recognition lets you unlock your phone with your face.</div>
+</div>
+</div>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Face Unlock</strong></p>
+
+<p>Android 4.0 introduces a completely new approach to securing a device, making
+each person's device even more personal — Face Unlock is a new screen-lock
+option that lets users unlock their devices with their faces. It takes advantage
+of the device front-facing camera and state-of-the-art facial recognition
+technology to register a face during setup and then to recognize it again when
+unlocking the device. Users just hold their devices in front of their faces to
+unlock, or use a backup PIN or pattern. </p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Wi-Fi Direct and Bluetooth HDP</strong></p>
+
+<p>Support for <strong>Wi-Fi Direct</strong> lets users connect directly to
+nearby peer devices over Wi-Fi, for more reliable, higher-speed communication.
+No internet connection or tethering is needed. Through third-party apps, users
+can connect to compatible devices to take advantage of new features such as
+instant sharing of files, photos, or other media; streaming video or audio from
+another device; or connecting to compatible printers or other devices.</p>
+
+<p>Android 4.0 also introduces built-in support for connecting to <strong>Bluetooth Health Device Profile (HDP)</strong> devices. With support from third-party apps, users can connect to wireless medical devices and sensors in hospitals, fitness centers, homes, and elsewhere. In addition, for connecting to higher quality Bluetooth audio devices, Android 4.0 adds support for Bluetooth Hands Free Profile (HFP) 1.6.</p>
+
+
+<h2 id="DeveloperApis" style="clear:right">New Developer Features</h2>
+
+<!-- <ul>
+<li><a href="#ui-dev">Unified UI framework for phones, tablets, and more</a></li>
+<li><a href="#communication-dev">Communication and sharing</a></li>
+<li><a href="#media-dev">New media capabilities</a></li>
+<li><a href="#connectivity-dev">New types of connectivity</a></li>
+<li><a href="#uicomp-dev">New UI components and capabilities</a></li>
+<li><a href="input-dev">New input types and text services</a></li>
+<li><a href="#accessibility-dev">Enhanced accessibility APIs</a></li>
+<li><a href="#data-dev">Efficient network usage</a></li>
+<li><a href="#security-dev">Security for apps and content</a></li>
+<li><a href="#enterprise-dev">Enhancements for Enterprise</a></li>
+</ul>-->
+
+<h3 id="ui-dev">Unified UI framework for phones, tablets, and more</h3>
+
+<p>Android 4.0 brings a unified UI framework that lets developers create
+elegant, innovative apps for phones, tablets, and more. It includes all of the
+familiar Android 3.x interface elements and APIs — fragments, content
+loaders, Action Bar, rich notifications, resizable home screen widgets, and more
+— as well as new elements and APIs.</p>
+
+<p>For developers, the unified UI framework in Android 4.0 means new UI tools,
+consistent design practices, simplified code and resources, and streamlined
+development across the range of Android-powered devices.</p>
+
+<div class="sidebox-wrapper">
+<div class="sidebox" style="border-left:1px solid #22a5ca;background-color:#fff;">
+ <h3>Key Android 3.x developer features, <br>now for phones too</h3>
+
+<p>Core UI</p>
+<ul>
+<li>Fragments and content loaders</li>
+<li>Resizeable home screen widgets</li>
+<li>Rich notifications</li>
+<li>Multi-selection, drag-drop, clipboard</li>
+<li>Improved screen-support API</li>
+<li>Hardware-accelerated 2D graphics</li>
+</ul>
+
+<p>Graphics and animation</p>
+<ul>
+<li>Property-based animation</li>
+<li>Renderscript 3D graphics</li>
+</ul>
+
+<p>Media and connectivity</p>
+<ul>
+<li>HTTP Live streaming</li>
+<li>Bluetooth A2DP and HSP devices</li>
+<li>Support for RTP</li>
+<li>MTP/PTP file transfer</li>
+<li>DRM framework</li>
+<li>Input from keyboard, mouse, gamepad, joystick</li>
+</ul>
+
+<p>Enterprise</p>
+<ul>
+<li>Full device encryption</li>
+<li>DPM policies for encrypted storage and passwords</li>
+</ul>
+</div>
+</div>
+
+<h3 id="communication-dev">Communication and sharing</h3>
+
+<p>Android 4.0 extends social and sharing features to any application on the
+device. Applications can integrate contacts, profile data, and calendar events
+from any of the user’s activities or social networks.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Social API</strong></p>
+
+<p>A shared social provider and API provide a new unified store for contacts,
+profile data, status updates, and photos. Any app or social network with user
+permission can contribute raw contacts and make them accessible to other apps
+and networks. Applications with user permission can also read profile data from
+the provider and display it in their applications.</p>
+
+<p>The social API lets applications store standard contact data as well as new
+types of content for any given contact, including large profile photos and
+recent activity feedback. Recent activity feedback is a standard way for
+applications to “tag” a contact with common activity, such as when the user
+calls the contact or sends an email or SMS message. The social provider uses the
+recent activity feedback as a new signal in ranking, such as for name
+auto-complete, to keep the most relevant contacts ranked closest to the top.</p>
+
+<p>Applications can also let users set up a social connection to a contact from
+the People app. When the user touches Add Connection in a contact, the app
+sends a public intent that other apps can handle, displaying any UI needed
+to create the social connection.</p>
+
+<p>Building on the social API, developers can add powerful new interactions that
+span multiple social networks and contacts sources.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Calendar API</strong></p>
+
+<p>A shared calendar content provider and framework API make it easier for
+developers to add calendar services to their apps.</p>
+
+<p>With user permission, any application can add events to the shared database
+and manage dates, attendees, alerts, and reminders. Applications can also read
+entries from the database, including events contributed by other applications,
+and handle the display of event alerts and reminders. Using the calendar
+provider, applications can take advantage of event data sourced from a variety
+of apps and protocols, to offer innovative ways of viewing and managing a user’s
+events. Apps can also use calendar data to improve the relevance of their
+other content.</p>
+
+<p>For lighter-weight access to calendar services, the Calendar app defines a
+set of public Intents for creating, viewing, and editing events. Rather than
+needing to implement a calendar UI and integrate directly with the calendar
+provider, applications can simply broadcast calendar Intents. When the Calendar
+app receives the Intents, it launches the appropriate UI and stores any event
+data entered. Using calendar Intents, for example, apps can let users add events
+directly from lists, dialogs, or home screen widgets, such as for making
+restaurant reservations or booking time with friends.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Visual voicemail
+API</strong></p>
+
+<p>A shared Voicemail provider and API allow developers to build applications
+that contribute to a unified voicemail store. Voicemails are displayed and
+played in the call log tab of the platform’s Phone app.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Android Beam</strong></p>
+
+<p>Android Beam is an NFC-based feature that lets users instantly share
+information about the apps they are using, just by touching two NFC-enabled
+phones together. When the devices are in range — within a few centimeters
+— the system sets up an NFC connection and displays a sharing UI. To share
+whatever they are viewing with the other device, users just touch the screen.
+</p>
+
+<p>For developers, Android Beam is a new way of triggering almost any type of
+proximity-based interaction. For example, it can let users instantly exchange
+contacts, set up multiplayer gaming, join a chat or video call, share a photo or
+video, and more. The system provides the low-level NFC support and the sharing
+UI, while the foreground app provides lightweight data to transfer to the other
+device. Developers have complete control over the data that is shared and how it
+is handled, so almost any interaction is possible. For larger payloads,
+developers can even use Android Beam to initiate a connection and transfer the
+data over Bluetooth, without the need for user-visible pairing.</p>
+
+<p>Even if developers do not add custom interactions based on Android Beam they
+can still benefit from it being deeply integrated into Android. By default the
+system shares the app’s Android Market URL, so it’s easy for the user to
+download or purchase the app right away.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Modular sharing
+widget</strong></p>
+
+<p>The UI framework includes a new widget, ShareActionProvider, that lets
+developers quickly embed standard share functionality and UI in the Action Bar
+of their applications. Developers simply add ShareActionProvider to the menu and
+set an intent that describes the desired sharing action. The system handles the
+rest, building up the list of applications that can handle the share intent and
+dispatching the intent when the user chooses from the menu.</p>
+
+
+<h3 id="media-dev">New media capabilities</h3>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Low-level streaming
+multimedia</strong></p>
+
+<p>Android 4.0 provides a direct, efficient path for low-level streaming
+multimedia. The new path is ideal for applications that need to maintain
+complete control over media data before passing it to the platform for
+presentation. For example, media applications can now retrieve data from any
+source, apply proprietary encryption/decryption, and then send the data to the
+platform for display.</p>
+
+<p>Applications can now send processed data to the platform as a multiplexed
+stream of audio/video content in MPEG-2 transport stream format. The platform
+de-muxes, decodes, and renders the content. The audio track is rendered to the
+active audio device, while the video track is rendered to either a Surface or a
+SurfaceTexture. When rendering to a SurfaceTexture, the application can apply
+subsequent graphics effects to each frame using OpenGL.</p>
+
+<p>To support this low-level streaming, the platform introduces a new native API
+based on <a href="http://www.khronos.org/openmax/al/" target="_top">Khronos
+OpenMAX AL 1.0.1</a>. The API is implemented on the same underlying services as
+the platform’s existing OpenSL ES API, so developers can make use of both APIs
+together if needed. Tools support for low-level streaming multimedia will be
+available in an upcoming release of the Android NDK.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>New camera
+capabilities</strong></p>
+
+<p>Developers can take advantage of a variety of new camera features in Android
+4.0. ZSL exposure, continuous focus, and image zoom let apps capture better
+still and video images, including during video capture. Apps can even capture
+full-resolution snapshots while shooting video. Apps can now set custom metering
+regions in a camera preview, then manage white balance and exposure dynamically
+for those regions. For easier focusing and image processing, a face-detection
+service identifies and tracks faces in a preview and returns their screen
+coordinates.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Media effects for
+transforming images and video</strong></p>
+
+<p>A set of high-performance transformation filters let developers apply rich
+effects to any image passed as an OpenGL ES 2.0 texture. Developers can adjust
+color levels and brightness, change backgrounds, sharpen, crop, rotate, add lens
+distortion, and apply other effects. The transformations are processed by the
+GPU, so they are fast enough for processing image frames loaded from disk,
+camera, or video stream.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Audio remote
+controls</strong></p>
+
+<p>Android 4.0 adds a new audio remote control API that lets media applications
+integrate with playback controls that are displayed in a remote view. Media
+applications can integrate with a remote music playback control that’s built
+into in the platform’s lock screen, allowing users to control song selection and
+playback without having to unlock and navigate to the music app.</p>
+
+<p>Using the audio remote control API, any music or media app can register to
+receive media button events from the remote control and then manage play state
+accordingly. The application can also supply metadata to the remote control,
+such as album art or image, play state, track number and description, duration,
+genre, and more.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>New media codecs and
+containers</strong></p>
+
+<p>Android 4.0 adds support for additional media types and containers to give
+developers access to the formats they need. For high-quality compressed images,
+the media framework adds support for WebP content. For video, the framework now
+supports streaming VP8 content. For streaming multimedia, the framework supports
+HTTP Live streaming protocol version 3 and encoding of ADTS-contained AAC
+content. Additionally, developers can now use Matroska containers for Vorbis and
+VP8 content.</p>
+
+
+<h3 id="connectivity-dev">New types of connectivity</h3>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Wi-Fi Direct</strong></p>
+
+<p>Developers can use a framework API to discover and connect directly to nearby
+devices over a high-performance, secure Wi-Fi Direct connection. No internet
+connection or hotspot is needed.</p>
+
+<p>Wi-Fi Direct opens new opportunities for developers to add innovative
+features to their applications. Applications can use Wi-Fi Direct to share
+files, photos, or other media between devices or between a desktop computer and
+an Android-powered device. Applications could also use Wi-Fi Direct to stream
+media content from a peer device such as a digital television or audio player,
+connect a group of users for gaming, print files, and more.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Bluetooth Health Device
+Profile (HDP)</strong></p>
+
+<p>Developers can now build powerful medical applications that use Bluetooth to
+communicate with wireless devices and sensors in hospitals, fitness centers,
+homes, and elsewhere. Applications can collect and manage data from HDP source
+devices and transmit it to backend medical applications such as records systems,
+data analysis services, and others.</p>
+
+<p>Using a framework API, applications can use Bluetooth to discover nearby
+devices, establish reliable or streaming data channels, and manage data
+transmission. Applications can supply any IEEE 11073 Manager to retrieve and
+interpret health data from Continua-certified devices such as heart-rate
+monitors, blood meters, thermometers, and scales. </p>
+
+
+<h3 id="uicomp-dev">New UI components and capabilities</h3>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Layout
+enhancements</strong></p>
+
+<p>A new layout, GridLayout, improves the performance of Android applications by
+supporting flatter view hierarchies that are faster to layout and render.
+Because hierarchies are flatter, developers can also manage alignments between
+components that are visually related to each other even when they are not
+logically related, for precise control over application UI. GridLayout is also
+specifically designed to be configured by drag-and-drop design tools such as the
+ADT Plug-in for Eclipse.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>OpenGL ES texture
+views</strong></p>
+
+<p>A new TextureView object lets developers directly integrate OpenGL ES
+textures as rendering targets in a UI hierarchy. The object lets developers
+display and manipulate OpenGL ES rendering just as they would a normal view
+object in the hierarchy, including moving, transforming, and animating the view
+as needed. The TextureView object makes it easy for developers to embed camera
+preview, decoded video, OpenGL game scenes, and more. TextureView can be viewed
+as a more powerful version of the existing SurfaceView object, since it offers
+the same benefits of access to a GL rendering surface, with the added advantage
+of having that surface participate fully in the normal view hierarchy.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Hardware-accelerated 2D
+drawing</strong></p>
+
+<p>All Android-powered devices running Android 4.0 are required to support
+hardware-accelerated 2D drawing. Developers can take advantage of this to add
+great UI effects while maintaining optimal performance on high-resolution
+screens, even on phones. For example, developers can rely on accelerated
+scaling, rotation, and other 2D operations, as well as accelerated UI components
+such as TextureView and compositing modes such as filtering, blending, and
+opacity.</p>
+
+
+<h3 id="input-dev">New input types and text services</h3>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Stylus input, button
+support, hover events</strong></p>
+
+<p>Android 4.0 includes full support for stylus input events, including tilt and
+distance axes, pressure, and related motion event properties. To help
+applications distinguish motion events from different sources, the platform adds
+distinct tool types for stylus, finger, mouse, and eraser. For improved input
+from multi-button pointing devices, the platform now provides distinct primary,
+secondary, and tertiary buttons, as well as back and forward buttons.
+Hover-enter and hover-exit events are also added, for improved navigation and
+accessibility. Developers can build on these new input features to add powerful
+interactions to their apps, such as precise drawing and gesturing, handwriting
+and shape recognition, improved mouse input, and others.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Text services API for
+integrating spelling checkers</strong></p>
+
+<p>Android 4.0 lets applications query available text services such as
+dictionaries and spell checkers for word suggestions, corrections, and similar
+data. The text services are external to the active IME, so developers can create
+and distribute dictionaries and suggestion engines that plug into the platform.
+When an application receives results from a text service — for example,
+word suggestions — it can display them in a dedicated suggestion popup
+window directly inside the text view, rather than relying on the IME to display
+them. </p>
+
+
+<h3 id="accessibility-dev">Enhanced accessibility APIs</h3>
+
+<p>Android 4.0 adds new accessibility features and an enhanced API to let
+developers improve the user experience in their apps, especially on devices that
+don’t have hardware buttons. For accessibility services such as screen readers
+in particular, the platform offers new APIs to query window content, for easier
+navigation, better feedback, and richer user interfaces.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Accessibility
+API</strong></p>
+
+<p>To let applications manage interactions more effectively when accessibility
+features are enabled, the platform adds accessibility events for
+explore-by-touch mode, scrolling, and text selection. For these and other
+events, the platform can attach a new object called an accessibility record that
+provides extra information about the event context.</p>
+
+<p>Using the accessibility record and related APIs, applications can now access
+the view hierarchy associated with an event. Applications can query for key
+properties such as parent and child nodes, available states, supported actions,
+screen position, and more. Applications can also request changes to certain
+properties to help manage focus and selected state. For example, an
+accessibility service could use these new capabilities to add convenient
+features such as screen-search by text. </p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Text-to-speech
+API</strong></p>
+
+<p>A new framework API lets developers write text-to-speech engines and make
+them available to any app requesting TTS capabilities.</p>
+
+
+<h3 id="data-dev">Efficient network usage</h3>
+
+<p>In Android 4.0, users can see how much network data their running apps are
+using. They can also set limits on data usage by network type and disable
+background data usage for specific applications. In this context, developers
+need to design their apps to run efficiently and follow best practices for
+checking the network connection. Android 4.0 provides network APIs to let
+applications meet those goals.</p>
+
+<p>As users move between networks or set limits on network data, the platform
+lets applications query for connection type and availability. Developers can use
+this information to dynamically manage network requests to ensure the best
+experience for users. Developers can also build custom network and data-usage
+options into their apps, then expose them to users directly from Settings by
+means of a new system Intent.</p>
+
+
+<h3 id="security-dev">Security for apps and content</h3>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Secure management of
+credentials</strong></p>
+
+<p>Android 4.0 makes it easier for applications to manage authentication and
+secure sessions. A new keychain API and underlying encrypted storage let
+applications store and retrieve private keys and their corresponding certificate
+chains. Any application can use the keychain API to install and store user
+certificates and CAs securely.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Address Space Layout
+Randomization</strong></p>
+
+<p>Android 4.0 now provides address space layout randomization (ASLR) to help
+protect system and third party applications from exploitation due to
+memory-management issues.</p>
+
+
+<h3 id="enterprise-dev">Enhancements for Enterprise</h3>
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>VPN client
+API</strong></p>
+
+<p>Developers can now build or extend their own VPN solutions on the platform
+using a new VPN API and underlying secure credential storage. With user
+permission, applications can configure addresses and routing rules, process
+outgoing and incoming packets, and establish secure tunnels to a remote server.
+Enterprises can also take advantage of a standard VPN client built into the
+platform that provides access to L2TP and IPSec protocols.</p>
+
+
+<p style="margin-top:1em;margin-bottom:.75em;"><strong>Device policy management
+for camera</strong></p>
+
+<p>The platform adds a new policy control for administrators who manage devices
+using an installed Device Policy Manager. Administrators can now remotely
+disable the camera on a managed device for users working in sensitive
+environments.</p>
+
+
+
+
+
diff --git a/docs/html/sdk/android-4.0.jd b/docs/html/sdk/android-4.0.jd
index 9a9f02a..2ccc927 100644
--- a/docs/html/sdk/android-4.0.jd
+++ b/docs/html/sdk/android-4.0.jd
@@ -11,7 +11,6 @@
<li><a href="#relnotes">Revisions</a></li>
<li><a href="#api">API Overview</a></li>
<li><a href="#Honeycomb">Previous APIs</a></li>
- <li><a href="#api-diff">API Differences Report</a></li>
<li><a href="#api-level">API Level</a></li>
<li><a href="#apps">Built-in Applications</a></li>
<li><a href="#locs">Locales</a></li>
@@ -31,14 +30,19 @@
<p><em>API Level:</em> <strong>{@sdkPlatformApiLevel}</strong></p>
-<p>Android 4.0 (Ice Cream Sandwich) is a major platform release that adds new
-capabilities for users and developers. The sections below provide an overview
-of the new features and developer APIs.</p>
+<p>Android 4.0 is a major platform release that adds a variety of new features for users and app
+developers. Besides all the new features and APIs discussed below, Android 4.0 is an important
+platform release because it brings the extensive set of APIs and Holographic themes from Android 3.x
+to smaller screens. As an app developer, you now have a single platform and unified API framework
+that enables you to develop and publish your application with a single APK that provides an
+optimized user experience for handsets, tablets, and more, when running the same version of
+Android—Android 4.0 (API level 14) or greater. </p>
-<p>For developers, the Android {@sdkPlatformVersion} platform is available as a
-downloadable component for the Android SDK. The downloadable platform includes
+<p>The Android {@sdkPlatformVersion} platform is available as a
+downloadable component for the Android SDK so you can begin developing and testing your
+applications on Android 4.0 with the Android emulator. The downloadable platform includes
an Android library and system image, as well as a set of emulator skins and
-more. The downloadable platform includes no external libraries.</p>
+more. The downloadable platform does not include any external libraries.</p>
<p>To start developing or testing against Android {@sdkPlatformVersion},
use the Android SDK Manager to download the platform into your SDK. For more
@@ -51,10 +55,11 @@
soon as possible to be sure your application provides the best
experience possible on the latest Android-powered devices.</p>
-<p>For a high-level introduction to the new user and developer features in Android 4.0, see the
+<p>For a high-level overview of the new user and developer features in Android 4.0, see the
<a href="http://developer.android.com/sdk/android-4.0-highlights.html">Platform Highlights</a>.</p>
+
<h2 id="relnotes">Revisions</h2>
<p>To determine what revision of the Android {@sdkPlatformVersion} platform you
@@ -72,7 +77,12 @@
<div class="toggle-content-toggleme" style="padding-left:2em;">
<dl>
-<dt>Initial release. SDK Tools r14 or higher is recommended.</dt>
+<dt>Initial release. SDK Tools r14 or higher is required.
+ <p class="caution"><strong>Important:</strong> To download the new Android
+ 4.0 system components from the Android SDK Manager, you must first update the
+ SDK tools to revision 14 or later and restart the Android SDK Manager. If you do not,
+ the Android 4.0 system components will not be available for download.</p>
+</dt>
</dl>
</div>
@@ -93,23 +103,24 @@
<div class="toggle-content-toggleme" style="padding-left:2em;">
<ol class="toc" style="margin-left:-1em">
- <li><a href="#Contacts">Contact Provider</a></li>
+ <li><a href="#Contacts">Social APIs in Contacts Provider</a></li>
<li><a href="#Calendar">Calendar Provider</a></li>
<li><a href="#Voicemail">Voicemail Provider</a></li>
- <li><a href="#Camera">Camera</a></li>
<li><a href="#Multimedia">Multimedia</a></li>
- <li><a href="#Bluetooth">Bluetooth</a></li>
+ <li><a href="#Camera">Camera</a></li>
<li><a href="#AndroidBeam">Android Beam (NDEF Push with NFC)</a></li>
<li><a href="#WiFiDirect">Wi-Fi Direct</a></li>
+ <li><a href="#Bluetooth">Bluetooth Health Devices</a></li>
+ <li><a href="#A11y">Accessibility</a></li>
+ <li><a href="#SpellChecker">Spell Checker Services</a></li>
+ <li><a href="#TTS">Text-to-speech Engines</a></li>
<li><a href="#NetworkUsage">Network Usage</a></li>
<li><a href="#RenderScript">RenderScript</a></li>
- <li><a href="#A11y">Accessibility</a></li>
<li><a href="#Enterprise">Enterprise</a></li>
<li><a href="#Sensors">Device Sensors</a></li>
- <li><a href="#TTS">Text-to-speech Engines</a></li>
- <li><a href="#SpellChecker">Spell Checker Services</a></li>
<li><a href="#ActionBar">Action Bar</a></li>
<li><a href="#UI">User Interface and Views</a></li>
+ <li><a href="#Input">Input Framework</a></li>
<li><a href="#Properties">Properties</a></li>
<li><a href="#HwAccel">Hardware Acceleration</a></li>
<li><a href="#Jni">JNI Changes</a></li>
@@ -124,12 +135,12 @@
-<h3 id="Contacts">Contact Provider</h3>
+<h3 id="Contacts">Social APIs in Contacts Provider</h3>
-<p>The contact APIs that are defined by the {@link android.provider.ContactsContract} provider have
-been extended to support new features such as a personal profile for the device owner, high
-resolution contact photos, and the ability for users to invite individual contacts to social
-networks that are installed on the device.</p>
+<p>The contact APIs defined by the {@link android.provider.ContactsContract} provider have been
+extended to support new social-oriented features such as a personal profile for the device owner and
+the ability for users to invite individual contacts to social networks that are installed on the
+device.</p>
<h4>User Profile</h4>
@@ -147,22 +158,11 @@
<p>Adding a new raw contact for the profile requires the {@link
android.Manifest.permission#WRITE_PROFILE} permission. Likewise, in order to read from the profile
table, you must request the {@link android.Manifest.permission#READ_PROFILE} permission. However,
-most apps should need to read the user profile, even when contributing data to the
+most apps should not need to read the user profile, even when contributing data to the
profile. Reading the user profile is a sensitive permission and you should expect users to be
skeptical of apps that request it.</p>
-<h4>Large photos</h4>
-
-<p>Android now supports high resolution photos for contacts. Now, when you push a photo into a
-contact record, the system processes it into both a 96x96 thumbnail (as it has previously) and a
-256x256 "display photo" that's stored in a new file-based photo store (the exact dimensions that the
-system chooses may vary in the future). You can add a large photo to a contact by putting a large
-photo in the usual {@link android.provider.ContactsContract.CommonDataKinds.Photo#PHOTO} column of a
-data row, which the system will then process into the appropriate thumbnail and display photo
-records.</p>
-
-
<h4>Invite Intent</h4>
<p>The {@link android.provider.ContactsContract.Intents#INVITE_CONTACT} intent action allows an app
@@ -187,6 +187,17 @@
file).</p>
+<h4>Large photos</h4>
+
+<p>Android now supports high resolution photos for contacts. Now, when you push a photo into a
+contact record, the system processes it into both a 96x96 thumbnail (as it has previously) and a
+256x256 "display photo" that's stored in a new file-based photo store (the exact dimensions that the
+system chooses may vary in the future). You can add a large photo to a contact by putting a large
+photo in the usual {@link android.provider.ContactsContract.CommonDataKinds.Photo#PHOTO} column of a
+data row, which the system will then process into the appropriate thumbnail and display photo
+records.</p>
+
+
<h4>Contact Usage Feedback</h4>
<p>The new {@link android.provider.ContactsContract.DataUsageFeedback} APIs allow you to help track
@@ -253,10 +264,11 @@
<h4>Event intent</h4>
-<p>If all you want to do is add an event to the user’s calendar, you can use an
-{@link android.content.Intent#ACTION_INSERT} intent with a {@code "vnd.android.cursor.item/event"}
-MIME type to start an activity in the Calendar app that creates new events. Using the intent does
-not require any permission and you can specify event details with the following extras:</p>
+<p>If all you want to do is add an event to the user’s calendar, you can use an {@link
+android.content.Intent#ACTION_INSERT} intent with the data defined by {@link
+android.provider.CalendarContract.Events#CONTENT_URI Events.CONTENT_URI} in order to start an
+activity in the Calendar app that creates new events. Using the intent does not require any
+permission and you can specify event details with the following extras:</p>
<ul>
<li>{@link android.provider.CalendarContract.EventsColumns#TITLE Events.TITLE}: Name for the
@@ -287,20 +299,23 @@
<h3 id="Voicemail">Voicemail Provider</h3>
-<p>The new voicemail APIs allows applications to add voicemails to a content provider on the device.
-Because the APIs currently do not allow third party apps to read all the voicemails from the system,
-the only third-party apps that should use the voicemail APIs are those that have voicemail to
-deliver to the user. For instance, it’s possible that a user has multiple voicemail sources, such as
-one provided by the phone’s service provider and others from VoIP or other alternative voice
-services. These apps can use the APIs to add their voicemails to the system for quick playback. The
-built-in Phone application presents all voicemails from the Voicemail Provider with a single list.
+<p>The new Voicemail Provider allows applications to add voicemails to the
+device, in order to present all the user's voicemails in a single visual presentation. For instance,
+it’s possible that a user has multiple voicemail sources, such as
+one from the phone’s service provider and others from VoIP or other alternative voice
+services. These apps can use the Voicemail Provider APIs to add their voicemails to the device. The
+built-in Phone application then presents all voicemails to the user in a unified presentation.
Although the system’s Phone application is the only application that can read all the voicemails,
each application that provides voicemails can read those that it has added to the system (but cannot
read voicemails from other services).</p>
+<p>Because the APIs currently do not allow third-party apps to read all the voicemails from the
+system, the only third-party apps that should use the voicemail APIs are those that have voicemail
+to deliver to the user.</p>
+
<p>The {@link android.provider.VoicemailContract} class defines the content provider for the
-voicemail APIs. The subclasses {@link android.provider.VoicemailContract.Voicemails} and {@link
-android.provider.VoicemailContract.Status} provide tables in which the Voicemail Providers can
+Voicemail Provder. The subclasses {@link android.provider.VoicemailContract.Voicemails} and {@link
+android.provider.VoicemailContract.Status} provide tables in which apps can
insert voicemail data for storage on the device. For an example of a voicemail provider app, see the
<a href="{@docRoot}resources/samples/VoicemailProviderDemo/index.html">Voicemail Provider
Demo</a>.</p>
@@ -308,6 +323,142 @@
+
+<h3 id="Multimedia">Multimedia</h3>
+
+<p>Android 4.0 adds several new APIs for applications that interact with media such as photos,
+videos, and music.</p>
+
+
+<h4>Media Effects</h4>
+
+<p>A new media effects framework allows you to apply a variety of visual effects to images and
+videos. For example, image effects allow you to easily fix red-eye, convert an image to grayscale,
+adjust brightness, adjust saturation, rotate an image, apply a fisheye effect, and much more. The
+system performs all effects processing on the GPU to obtain maximum performance.</p>
+
+<p>For maximum performance, effects are applied directly to OpenGL textures, so your application
+must have a valid OpenGL context before it can use the effects APIs. The textures to which you apply
+effects may be from bitmaps, videos or even the camera. However, there are certain restrictions that
+textures must meet:</p>
+<ol>
+<li>They must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture image</li>
+<li>They must contain at least one mipmap level</li>
+</ol>
+
+<p>An {@link android.media.effect.Effect} object defines a single media effect that you can apply to
+an image frame. The basic workflow to create an {@link android.media.effect.Effect} is:</p>
+
+<ol>
+<li>Call {@link android.media.effect.EffectContext#createWithCurrentGlContext
+EffectContext.createWithCurrentGlContext()} from your OpenGL ES 2.0 context.</li>
+<li>Use the returned {@link android.media.effect.EffectContext} to call {@link
+android.media.effect.EffectContext#getFactory EffectContext.getFactory()}, which returns an instance
+of {@link android.media.effect.EffectFactory}.</li>
+<li>Call {@link android.media.effect.EffectFactory#createEffect createEffect()}, passing it an
+effect name from @link android.media.effect.EffectFactory}, such as {@link
+android.media.effect.EffectFactory#EFFECT_FISHEYE} or {@link
+android.media.effect.EffectFactory#EFFECT_VIGNETTE}.</li>
+</ol>
+
+<p>You can adjust an effect’s parameters by calling {@link android.media.effect.Effect#setParameter
+setParameter()} and passing a parameter name and parameter value. Each type of effect accepts
+different parameters, which are documented with the effect name. For example, {@link
+android.media.effect.EffectFactory#EFFECT_FISHEYE} has one parameter for the {@code scale} of the
+distortion.</p>
+
+<p>To apply an effect on a texture, call {@link android.media.effect.Effect#apply apply()} on the
+{@link
+android.media.effect.Effect} and pass in the input texture, it’s width and height, and the output
+texture. The input texture must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture
+image (usually done by calling the {@link android.opengl.GLES20#glTexImage2D glTexImage2D()}
+function). You may provide multiple mipmap levels. If the output texture has not been bound to a
+texture image, it will be automatically bound by the effect as a {@link
+android.opengl.GLES20#GL_TEXTURE_2D} and with one mipmap level (0), which will have the same
+size as the input.</p>
+
+<p>All effects listed in {@link android.media.effect.EffectFactory} are guaranteed to be supported.
+However, some additional effects available from external libraries are not supported by all devices,
+so you must first check if the desired effect from the external library is supported by calling
+{@link android.media.effect.EffectFactory#isEffectSupported isEffectSupported()}.</p>
+
+
+<h4>Remote control client</h4>
+
+<p>The new {@link android.media.RemoteControlClient} allows media players to enable playback
+controls from remote control clients such as the device lock screen. Media players can also expose
+information about the media currently playing for display on the remote control, such as track
+information and album art.</p>
+
+<p>To enable remote control clients for your media player, instantiate a {@link
+android.media.RemoteControlClient} with its constructor, passing it a {@link
+android.app.PendingIntent} that broadcasts {@link
+android.content.Intent#ACTION_MEDIA_BUTTON}. The intent must also declare the explicit {@link
+android.content.BroadcastReceiver} component in your app that handles the {@link
+android.content.Intent#ACTION_MEDIA_BUTTON} event.</p>
+
+<p>To declare which media control inputs your player can handle, you must call {@link
+android.media.RemoteControlClient#setTransportControlFlags setTransportControlFlags()} on your
+{@link android.media.RemoteControlClient}, passing a set of {@code FLAG_KEY_MEDIA_*} flags, such as
+{@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS} and {@link
+android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT}.</p>
+
+<p>You must then register your {@link android.media.RemoteControlClient} by passing it to {@link
+android.media.AudioManager#registerRemoteControlClient MediaManager.registerRemoteControlClient()}.
+Once registered, the broadcast receiver you declared when you instantiated the {@link
+android.media.RemoteControlClient} will receive {@link android.content.Intent#ACTION_MEDIA_BUTTON}
+events when a button is pressed from a remote control. The intent you receive includes the {@link
+android.view.KeyEvent} for the media key pressed, which you can retrieve from the intent with {@link
+android.content.Intent#getParcelableExtra getParcelableExtra(Intent.EXTRA_KEY_EVENT)}.</p>
+
+<p>To display information on the remote control about the media playing, call {@link
+android.media.RemoteControlClient#editMetadata editMetaData()} and add metadata to the returned
+{@link android.media.RemoteControlClient.MetadataEditor}. You can supply a bitmap for media artwork,
+numerical information such as elapsed time, and text information such as the track title. For
+information on available keys see the {@code METADATA_KEY_*} flags in {@link
+android.media.MediaMetadataRetriever}.</p>
+
+<p>For a sample implementation, see the <a
+href="{@docRoot}resources/samples/RandomMusicPlayer/index.html">Random Music Player</a>, which
+provides compatibility logic such that it enables the remote control client on Android 4.0
+devices while continuing to support devices back to Android 2.1.</p>
+
+
+<h4>Media player</h4>
+
+<ul>
+<li>Streaming online media from {@link android.media.MediaPlayer} now requires the {@link
+android.Manifest.permission#INTERNET} permission. If you use {@link android.media.MediaPlayer} to
+play content from the Internet, be sure to add the {@link android.Manifest.permission#INTERNET}
+permission to your manifest or else your media playback will not work beginning with Android
+4.0.</li>
+
+<li>{@link android.media.MediaPlayer#setSurface(Surface) setSurface()} allows you define a {@link
+android.view.Surface} to behave as the video sink.</li>
+
+<li>{@link android.media.MediaPlayer#setDataSource(Context,Uri,Map) setDataSource()} allows you to
+send additional HTTP headers with your request, which can be useful for HTTP(S) live streaming</li>
+
+<li>HTTP(S) live streaming now respects HTTP cookies across requests</li>
+</ul>
+
+
+<h4>Media types</h4>
+
+<p>Android 4.0 adds support for:</p>
+<ul>
+<li>HTTP/HTTPS live streaming protocol version 3 </li>
+<li>ADTS raw AAC audio encoding</li>
+<li>WEBP images</li>
+<li>Matroska video</li>
+</ul>
+<p>For more info, see <a href="{@docRoot}guide/appendix/media-formats.html">Supported Media
+Formats</a>.</p>
+
+
+
+
+
<h3 id="Camera">Camera</h3>
<p>The {@link android.hardware.Camera} class now includes APIs for detecting faces and controlling
@@ -382,7 +533,7 @@
to {@link android.hardware.Camera.Parameters#setFocusMode setFocusMode()}. When ready to capture
a photo, call {@link android.hardware.Camera#autoFocus autoFocus()}. Your {@link
android.hardware.Camera.AutoFocusCallback} immediately receives a callback to indicate whether
-focus was acheived. To resume CAF after receiving the callback, you must call {@link
+focus was achieved. To resume CAF after receiving the callback, you must call {@link
android.hardware.Camera#cancelAutoFocus()}.</p>
<p class="note"><strong>Note:</strong> Continuous auto focus is also supported when capturing
@@ -426,173 +577,6 @@
-<h3 id="Multimedia">Multimedia</h3>
-
-<p>Android 4.0 adds several new APIs for applications that interact with media such as photos,
-videos, and music.</p>
-
-
-<h4>Media player</h4>
-
-<ul>
-<li>Streaming online media from {@link android.media.MediaPlayer} now requires the {@link
-android.Manifest.permission#INTERNET} permission. If you use {@link android.media.MediaPlayer} to
-play content from the Internet, be sure to add the {@link android.Manifest.permission#INTERNET}
-permission to your manifest or else your media playback will not work beginning with Android
-4.0.</li>
-
-<li>{@link android.media.MediaPlayer#setSurface(Surface) setSurface()} allows you define a {@link
-android.view.Surface} to behave as the video sink.</li>
-
-<li>{@link android.media.MediaPlayer#setDataSource(Context,Uri,Map) setDataSource()} allows you to
-send additional HTTP headers with your request, which can be useful for HTTP(S) live streaming</li>
-
-<li>HTTP(S) live streaming now respects HTTP cookies across requests</li>
-</ul>
-
-
-<h4>Media types</h4>
-
-<p>Android 4.0 adds support for:</p>
-<ul>
-<li>HTTP/HTTPS live streaming protocol version 3 </li>
-<li>ADTS raw AAC audio encoding</li>
-<li>WEBP images</li>
-<li>Matroska video</li>
-</ul>
-<p>For more info, see <a href="{@docRoot}guide/appendix/media-formats.html">Supported Media
-Formats</a>.</p>
-
-
-
-<h4>Remote control client</h4>
-
-<p>The new {@link android.media.RemoteControlClient} allows media players to enable playback
-controls from remote control clients such as the device lock screen. Media players can also expose
-information about the media currently playing for display on the remote control, such as track
-information and album art.</p>
-
-<p>To enable remote control clients for your media player, instantiate a {@link
-android.media.RemoteControlClient} with its constructor, passing it a {@link
-android.app.PendingIntent} that broadcasts {@link
-android.content.Intent#ACTION_MEDIA_BUTTON}. The intent must also declare the explicit {@link
-android.content.BroadcastReceiver} component in your app that handles the {@link
-android.content.Intent#ACTION_MEDIA_BUTTON} event.</p>
-
-<p>To declare which media control inputs your player can handle, you must call {@link
-android.media.RemoteControlClient#setTransportControlFlags setTransportControlFlags()} on your
-{@link android.media.RemoteControlClient}, passing a set of {@code FLAG_KEY_MEDIA_*} flags, such as
-{@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS} and {@link
-android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT}.</p>
-
-<p>You must then register your {@link android.media.RemoteControlClient} by passing it to {@link
-android.media.AudioManager#registerRemoteControlClient MediaManager.registerRemoteControlClient()}.
-Once registered, the broadcast receiver you declared when you instantiated the {@link
-android.media.RemoteControlClient} will receive {@link android.content.Intent#ACTION_MEDIA_BUTTON}
-events when a button is pressed from a remote control. The intent you receive includes the {@link
-android.view.KeyEvent} for the media key pressed, which you can retrieve from the intent with {@link
-android.content.Intent#getParcelableExtra getParcelableExtra(Intent.EXTRA_KEY_EVENT)}.</p>
-
-<p>To display information on the remote control about the media playing, call {@link
-android.media.RemoteControlClient#editMetadata editMetaData()} and add metadata to the returned
-{@link android.media.RemoteControlClient.MetadataEditor}. You can supply a bitmap for media artwork,
-numerical information such as elapsed time, and text information such as the track title. For
-information on available keys see the {@code METADATA_KEY_*} flags in {@link
-android.media.MediaMetadataRetriever}.</p>
-
-<p>For a sample implementation, see the <a
-href="{@docRoot}resources/samples/RandomMusicPlayer/index.html">Random Music Player</a>, which
-provides compatibility logic such that it enables the remote control client on Android 4.0
-devices while continuing to support devices back to Android 2.1.</p>
-
-
-<h4>Media Effects</h4>
-
-<p>A new media effects framework allows you to apply a variety of visual effects to images and
-videos. For example, image effects allow you to easily fix red-eye, convert an image to grayscale,
-adjust brightness, adjust saturation, rotate an image, apply a fisheye effect, and much more. The
-system performs all effects processing on the GPU to obtain maximum performance.</p>
-
-<p>For maximum performance, effects are applied directly to OpenGL textures, so your application
-must have a valid OpenGL context before it can use the effects APIs. The textures to which you apply
-effects may be from bitmaps, videos or even the camera. However, there are certain restrictions that
-textures must meet:</p>
-<ol>
-<li>They must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture image</li>
-<li>They must contain at least one mipmap level</li>
-</ol>
-
-<p>An {@link android.media.effect.Effect} object defines a single media effect that you can apply to
-an image frame. The basic workflow to create an {@link android.media.effect.Effect} is:</p>
-
-<ol>
-<li>Call {@link android.media.effect.EffectContext#createWithCurrentGlContext
-EffectContext.createWithCurrentGlContext()} from your OpenGL ES 2.0 context.</li>
-<li>Use the returned {@link android.media.effect.EffectContext} to call {@link
-android.media.effect.EffectContext#getFactory EffectContext.getFactory()}, which returns an instance
-of {@link android.media.effect.EffectFactory}.</li>
-<li>Call {@link android.media.effect.EffectFactory#createEffect createEffect()}, passing it an
-effect name from @link android.media.effect.EffectFactory}, such as {@link
-android.media.effect.EffectFactory#EFFECT_FISHEYE} or {@link
-android.media.effect.EffectFactory#EFFECT_VIGNETTE}.</li>
-</ol>
-
-<p>Not all devices support all effects, so you must first check if the desired effect is supported
-by calling {@link android.media.effect.EffectFactory#isEffectSupported isEffectSupported()}.</p>
-
-<p>You can adjust an effect’s parameters by calling {@link android.media.effect.Effect#setParameter
-setParameter()} and passing a parameter name and parameter value. Each type of effect accepts
-different parameters, which are documented with the effect name. For example, {@link
-android.media.effect.EffectFactory#EFFECT_FISHEYE} has one parameter for the {@code scale} of the
-distortion.</p>
-
-<p>To apply an effect on a texture, call {@link android.media.effect.Effect#apply apply()} on the
-{@link
-android.media.effect.Effect} and pass in the input texture, it’s width and height, and the output
-texture. The input texture must be bound to a {@link android.opengl.GLES20#GL_TEXTURE_2D} texture
-image (usually done by calling the {@link android.opengl.GLES20#glTexImage2D glTexImage2D()}
-function). You may provide multiple mipmap levels. If the output texture has not been bound to a
-texture image, it will be automatically bound by the effect as a {@link
-android.opengl.GLES20#GL_TEXTURE_2D} and with one mipmap level (0), which will have the same
-size as the input.</p>
-
-
-
-
-
-
-
-<h3 id="Bluetooth">Bluetooth</h3>
-
-<p>Android now supports Bluetooth Health Profile devices, so you can create applications that use
-Bluetooth to communicate with health devices that support Bluetooth, such as heart-rate monitors,
-blood meters, thermometers, and scales.</p>
-
-<p>Similar to regular headset and A2DP profile devices, you must call {@link
-android.bluetooth.BluetoothAdapter#getProfileProxy getProfileProxy()} with a {@link
-android.bluetooth.BluetoothProfile.ServiceListener} and the {@link
-android.bluetooth.BluetoothProfile#HEALTH} profile type to establish a connection with the profile
-proxy object.</p>
-
-<p>Once you’ve acquired the Health Profile proxy (the {@link android.bluetooth.BluetoothHealth}
-object), connecting to and communicating with paired health devices involves the following new
-Bluetooth classes:</p>
-<ul>
-<li>{@link android.bluetooth.BluetoothHealthCallback}: You must extend this class and implement the
-callback methods to receive updates about changes in the application’s registration state and
-Bluetooth channel state.</li>
-<li>{@link android.bluetooth.BluetoothHealthAppConfiguration}: During callbacks to your {@link
-android.bluetooth.BluetoothHealthCallback}, you’ll receive an instance of this object, which
-provides configuration information about the available Bluetooth health device, which you must use
-to perform various operations such as initiate and terminate connections with the {@link
-android.bluetooth.BluetoothHealth} APIs.</li>
-</ul>
-
-<p>For more information about using the Bluetooth Health Profile, see the documentation for {@link
-android.bluetooth.BluetoothHealth}.</p>
-
-
-
<h3 id="AndroidBeam">Android Beam (NDEF Push with NFC)</h3>
<p>Android Beam is a new NFC feature that allows you to send NDEF messages from one device to
@@ -670,9 +654,12 @@
application installed, the system launches it; if it’s not installed, Android Market opens and takes
the user to your application in order to install it.</p>
-<p>For some example code, see the <a
+<p>You can read more about Android Beam and other NFC features in the <a
+href="{@docRoot}guide/topics/nfc/nfc.html">NFC Basics</a> developer guide. For some example code
+using Android Beam, see the <a
href="{@docRoot}resources/samples/AndroidBeamDemo/src/com/example/android/beam/Beam.html">Android
-Beam Demo</a> sample app.</p>
+Beam Demo</a>.</p>
+
@@ -763,85 +750,34 @@
-<h3 id="NetworkUsage">Network Usage</h3>
+<h3 id="Bluetooth">Bluetooth Health Devices</h3>
-<p>Android 4.0 gives users precise visibility of how much network data their applications are using.
-The Settings app provides controls that allow users to manage set limits for network data usage and
-even disable the use of background data for individual apps. In order to avoid users disabling your
-app’s access to data from the background, you should develop strategies to use use the data
-connection efficiently and adjust your usage depending on the type of connection available.</p>
+<p>Android now supports Bluetooth Health Profile devices, so you can create applications that use
+Bluetooth to communicate with health devices that support Bluetooth, such as heart-rate monitors,
+blood meters, thermometers, and scales.</p>
-<p>If your application performs a lot of network transactions, you should provide user settings that
-allow users to control your app’s data habits, such as how often your app syncs data, whether to
-perform uploads/downloads only when on Wi-Fi, whether to use data while roaming, etc. With these
-controls available to them, users are much less likely to disable your app’s access to data when
-they approach their limits, because they can instead precisely control how much data your app uses.
-If you provide a preference activity with these settings, you should include in its manifest
-declaration an intent filter for the {@link android.content.Intent#ACTION_MANAGE_NETWORK_USAGE}
-action. For example:</p>
+<p>Similar to regular headset and A2DP profile devices, you must call {@link
+android.bluetooth.BluetoothAdapter#getProfileProxy getProfileProxy()} with a {@link
+android.bluetooth.BluetoothProfile.ServiceListener} and the {@link
+android.bluetooth.BluetoothProfile#HEALTH} profile type to establish a connection with the profile
+proxy object.</p>
-<pre>
-<activity android:name="DataPreferences" android:label="@string/title_preferences">
- <intent-filter>
- <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
-</activity>
-</pre>
-
-<p>This intent filter indicates to the system that this is the activity that controls your
-application’s data usage. Thus, when the user inspects how much data your app is using from the
-Settings app, a “View application settings" button is available that launches your
-preference activity so the user can refine how much data your app uses.</p>
-
-<p>Also beware that {@link android.net.ConnectivityManager#getBackgroundDataSetting()} is now
-deprecated and always returns true—use {@link
-android.net.ConnectivityManager#getActiveNetworkInfo()} instead. Before you attempt any network
-transactions, you should always call {@link android.net.ConnectivityManager#getActiveNetworkInfo()}
-to get the {@link android.net.NetworkInfo} that represents the current network and query {@link
-android.net.NetworkInfo#isConnected()} to check whether the device has a
-connection. You can then check other connection properties, such as whether the device is
-roaming or connected to Wi-Fi.</p>
-
-
-
-
-
-
-
-
-<h3 id="RenderScript">RenderScript</h3>
-
-<p>Three major features have been added to RenderScript:</p>
-
+<p>Once you’ve acquired the Health Profile proxy (the {@link android.bluetooth.BluetoothHealth}
+object), connecting to and communicating with paired health devices involves the following new
+Bluetooth classes:</p>
<ul>
- <li>Off-screen rendering to a framebuffer object</li>
- <li>Rendering inside a view</li>
- <li>RS for each from the framework APIs</li>
+<li>{@link android.bluetooth.BluetoothHealthCallback}: You must extend this class and implement the
+callback methods to receive updates about changes in the application’s registration state and
+Bluetooth channel state.</li>
+<li>{@link android.bluetooth.BluetoothHealthAppConfiguration}: During callbacks to your {@link
+android.bluetooth.BluetoothHealthCallback}, you’ll receive an instance of this object, which
+provides configuration information about the available Bluetooth health device, which you must use
+to perform various operations such as initiate and terminate connections with the {@link
+android.bluetooth.BluetoothHealth} APIs.</li>
</ul>
-<p>The {@link android.renderscript.Allocation} class now supports a {@link
-android.renderscript.Allocation#USAGE_GRAPHICS_RENDER_TARGET} memory space, which allows you to
-render things directly into the {@link android.renderscript.Allocation} and use it as a framebuffer
-object.</p>
-
-<p>{@link android.renderscript.RSTextureView} provides a means to display RenderScript graphics
-inside of a {@link android.view.View}, unlike {@link android.renderscript.RSSurfaceView}, which
-creates a separate window. This key difference allows you to do things such as move, transform, or
-animate an {@link android.renderscript.RSTextureView} as well as draw RenderScript graphics inside
-a view that lies within an activity layout.</p>
-
-<p>The {@link android.renderscript.Script#forEach Script.forEach()} method allows you to call
-RenderScript compute scripts from the VM level and have them automatically delegated to available
-cores on the device. You do not use this method directly, but any compute RenderScript that you
-write will have a {@link android.renderscript.Script#forEach forEach()} method that you can call in
-the reflected RenderScript class. You can call the reflected {@link
-android.renderscript.Script#forEach forEach()} method by passing in an input {@link
-android.renderscript.Allocation} to process, an output {@link android.renderscript.Allocation} to
-write the result to, and a {@link android.renderscript.FieldPacker} data structure in case the
-RenderScript needs more information. Only one of the {@link android.renderscript.Allocation}s is
-necessary and the data structure is optional.</p>
-
+<p>For more information about using the Bluetooth Health Profile, see the documentation for {@link
+android.bluetooth.BluetoothHealth}.</p>
@@ -939,6 +875,7 @@
+
<h4>Accessibility services</h4>
<p>If you're developing an accessibility service, the information about various accessibility events
@@ -1000,78 +937,31 @@
-<h3 id="Enterprise">Enterprise</h3>
-
-<p>Android 4.0 expands the capabilities for enterprise application with the following features.</p>
-
-<h4>VPN services</h4>
-
-<p>The new {@link android.net.VpnService} allows applications to build their own VPN (Virtual
-Private Network), running as a {@link android.app.Service}. A VPN service creates an interface for a
-virtual network with its own address and routing rules and performs all reading and writing with a
-file descriptor.</p>
-
-<p>To create a VPN service, use {@link android.net.VpnService.Builder}, which allows you to specify
-the network address, DNS server, network route, and more. When complete, you can establish the
-interface by calling {@link android.net.VpnService.Builder#establish()}, which returns a {@link
-android.os.ParcelFileDescriptor}. </p>
-
-<p>Because a VPN service can intercept packets, there are security implications. As such, if you
-implement {@link android.net.VpnService}, then your service must require the {@link
-android.Manifest.permission#BIND_VPN_SERVICE} to ensure that only the system can bind to it (only
-the system is granted this permission—apps cannot request it). To then use your VPN service,
-users must manually enable it in the system settings.</p>
-
-
-<h4>Device restrictions</h4>
-
-<p>Applications that manage the device restrictions can now disable the camera using {@link
-android.app.admin.DevicePolicyManager#setCameraDisabled setCameraDisabled()} and the {@link
-android.app.admin.DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} property (applied with a {@code
-<disable-camera />} element in the policy configuration file).</p>
-
-
-<h4>Certificate management</h4>
-
-<p>The new {@link android.security.KeyChain} class provides APIs that allow you to import and access
-certificates in the system key store. Certificates streamline the installation of both client
-certificates (to validate the identity of the user) and certificate authority certificates (to
-verify server identity). Applications such as web browsers or email clients can access the installed
-certificates to authenticate users to servers. See the {@link android.security.KeyChain}
-documentation for more information.</p>
+<h3 id="SpellChecker">Spell Checker Services</h3>
+<p>A new spell checker framework allows apps to create spell checkers in a manner similar to the
+input method framework (for IMEs). To create a new spell checker, you must implement a service that
+extends
+{@link android.service.textservice.SpellCheckerService} and extend the {@link
+android.service.textservice.SpellCheckerService.Session} class to provide spelling suggestions based
+on text provided by the interface's callback methods. In the {@link
+android.service.textservice.SpellCheckerService.Session} callback methods, you must return the
+spelling suggestions as {@link android.view.textservice.SuggestionsInfo} objects. </p>
+<p>Applications with a spell checker service must declare the {@link
+android.Manifest.permission#BIND_TEXT_SERVICE} permission as required by the service.
+The service must also declare an intent filter with {@code <action
+android:name="android.service.textservice.SpellCheckerService" />} as the intent’s action and should
+include a {@code <meta-data>} element that declares configuration information for the spell
+checker. </p>
-
-<h3 id="Sensors">Device Sensors</h3>
-
-<p>Two new sensor types have been added in Android 4.0:</p>
-
-<ul>
- <li>{@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE}: A temperature sensor that provides
-the ambient (room) temperature in degrees Celsius.</li>
- <li>{@link android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY}: A humidity sensor that provides the
-relative ambient (room) humidity as a percentage.</li>
-</ul>
-
-<p>If a device has both {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} and {@link
-android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY} sensors, you can use them to calculate the dew point
-and the absolute humidity.</p>
-
-<p>The previous temperature sensor, {@link android.hardware.Sensor#TYPE_TEMPERATURE}, has been
-deprecated. You should use the {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} sensor
-instead.</p>
-
-<p>Additionally, Android’s three synthetic sensors have been improved so they now have lower latency
-and smoother output. These sensors include the gravity sensor ({@link
-android.hardware.Sensor#TYPE_GRAVITY}), rotation vector sensor ({@link
-android.hardware.Sensor#TYPE_ROTATION_VECTOR}), and linear acceleration sensor ({@link
-android.hardware.Sensor#TYPE_LINEAR_ACCELERATION}). The improved sensors rely on the gyroscope
-sensor to improve their output, so the sensors appear only on devices that have a gyroscope.</p>
-
+<p>See the sample <a href="{@docRoot}resources/samples/SpellChecker/SampleSpellCheckerService/index.html">
+Spell Checker Service</a> app and
+sample <a href="{@docRoot}resources/samples/SpellChecker/HelloSpellChecker/index.html">
+Spell Checker Client</a> app for example code.</p>
@@ -1133,23 +1023,45 @@
-<h3 id="SpellChecker">Spell Checker Services</h3>
+<h3 id="NetworkUsage">Network Usage</h3>
-<p>A new spell checker framework allows apps to create spell checkers in a manner similar to the
-input method framework. To create a new spell checker, you must implement a service that extends
-{@link android.service.textservice.SpellCheckerService} and extend the {@link
-android.service.textservice.SpellCheckerService.Session} class to provide spelling suggestions based
-on text provided by interface callback methods. In the {@link
-android.service.textservice.SpellCheckerService.Session} callback methods, you must return the
-spelling suggestions as {@link android.view.textservice.SuggestionsInfo} objects. </p>
+<p>Android 4.0 gives users precise visibility of how much network data their applications are using.
+The Settings app provides controls that allow users to manage set limits for network data usage and
+even disable the use of background data for individual apps. In order to avoid users disabling your
+app’s access to data from the background, you should develop strategies to use use the data
+connection efficiently and adjust your usage depending on the type of connection available.</p>
-<p>Applications with a spell checker service must declare the {@link
-android.Manifest.permission#BIND_TEXT_SERVICE} permission as required by the service, such that
-other services must have this permission in order for them to bind with the spell checker service.
-The service must also declare an intent filter with {@code <action
-android:name="android.service.textservice.SpellCheckerService" />} as the intent’s action and should
-include a {@code <meta-data>} element that declares configuration information for the spell
-checker. </p>
+<p>If your application performs a lot of network transactions, you should provide user settings that
+allow users to control your app’s data habits, such as how often your app syncs data, whether to
+perform uploads/downloads only when on Wi-Fi, whether to use data while roaming, etc. With these
+controls available to them, users are much less likely to disable your app’s access to data when
+they approach their limits, because they can instead precisely control how much data your app uses.
+If you provide a preference activity with these settings, you should include in its manifest
+declaration an intent filter for the {@link android.content.Intent#ACTION_MANAGE_NETWORK_USAGE}
+action. For example:</p>
+
+<pre>
+<activity android:name="DataPreferences" android:label="@string/title_preferences">
+ <intent-filter>
+ <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+</activity>
+</pre>
+
+<p>This intent filter indicates to the system that this is the activity that controls your
+application’s data usage. Thus, when the user inspects how much data your app is using from the
+Settings app, a “View application settings" button is available that launches your
+preference activity so the user can refine how much data your app uses.</p>
+
+<p>Also beware that {@link android.net.ConnectivityManager#getBackgroundDataSetting()} is now
+deprecated and always returns true—use {@link
+android.net.ConnectivityManager#getActiveNetworkInfo()} instead. Before you attempt any network
+transactions, you should always call {@link android.net.ConnectivityManager#getActiveNetworkInfo()}
+to get the {@link android.net.NetworkInfo} that represents the current network and query {@link
+android.net.NetworkInfo#isConnected()} to check whether the device has a
+connection. You can then check other connection properties, such as whether the device is
+roaming or connected to Wi-Fi.</p>
@@ -1158,6 +1070,121 @@
+<h3 id="RenderScript">RenderScript</h3>
+
+<p>Three major features have been added to RenderScript:</p>
+
+<ul>
+ <li>Off-screen rendering to a framebuffer object</li>
+ <li>Rendering inside a view</li>
+ <li>RS for each from the framework APIs</li>
+</ul>
+
+<p>The {@link android.renderscript.Allocation} class now supports a {@link
+android.renderscript.Allocation#USAGE_GRAPHICS_RENDER_TARGET} memory space, which allows you to
+render things directly into the {@link android.renderscript.Allocation} and use it as a framebuffer
+object.</p>
+
+<p>{@link android.renderscript.RSTextureView} provides a means to display RenderScript graphics
+inside of a {@link android.view.View}, unlike {@link android.renderscript.RSSurfaceView}, which
+creates a separate window. This key difference allows you to do things such as move, transform, or
+animate an {@link android.renderscript.RSTextureView} as well as draw RenderScript graphics inside
+a view that lies within an activity layout.</p>
+
+<p>The {@link android.renderscript.Script#forEach Script.forEach()} method allows you to call
+RenderScript compute scripts from the VM level and have them automatically delegated to available
+cores on the device. You do not use this method directly, but any compute RenderScript that you
+write will have a {@link android.renderscript.Script#forEach forEach()} method that you can call in
+the reflected RenderScript class. You can call the reflected {@link
+android.renderscript.Script#forEach forEach()} method by passing in an input {@link
+android.renderscript.Allocation} to process, an output {@link android.renderscript.Allocation} to
+write the result to, and a {@link android.renderscript.FieldPacker} data structure in case the
+RenderScript needs more information. Only one of the {@link android.renderscript.Allocation}s is
+necessary and the data structure is optional.</p>
+
+
+
+
+
+
+
+
+
+<h3 id="Enterprise">Enterprise</h3>
+
+<p>Android 4.0 expands the capabilities for enterprise application with the following features.</p>
+
+<h4>VPN services</h4>
+
+<p>The new {@link android.net.VpnService} allows applications to build their own VPN (Virtual
+Private Network), running as a {@link android.app.Service}. A VPN service creates an interface for a
+virtual network with its own address and routing rules and performs all reading and writing with a
+file descriptor.</p>
+
+<p>To create a VPN service, use {@link android.net.VpnService.Builder}, which allows you to specify
+the network address, DNS server, network route, and more. When complete, you can establish the
+interface by calling {@link android.net.VpnService.Builder#establish()}, which returns a {@link
+android.os.ParcelFileDescriptor}. </p>
+
+<p>Because a VPN service can intercept packets, there are security implications. As such, if you
+implement {@link android.net.VpnService}, then your service must require the {@link
+android.Manifest.permission#BIND_VPN_SERVICE} to ensure that only the system can bind to it (only
+the system is granted this permission—apps cannot request it). To then use your VPN service,
+users must manually enable it in the system settings.</p>
+
+
+<h4>Device policies</h4>
+
+<p>Applications that manage the device restrictions can now disable the camera using {@link
+android.app.admin.DevicePolicyManager#setCameraDisabled setCameraDisabled()} and the {@link
+android.app.admin.DeviceAdminInfo#USES_POLICY_DISABLE_CAMERA} property (applied with a {@code
+<disable-camera />} element in the policy configuration file).</p>
+
+
+<h4>Certificate management</h4>
+
+<p>The new {@link android.security.KeyChain} class provides APIs that allow you to import and access
+certificates in the system key store. Certificates streamline the installation of both client
+certificates (to validate the identity of the user) and certificate authority certificates (to
+verify server identity). Applications such as web browsers or email clients can access the installed
+certificates to authenticate users to servers. See the {@link android.security.KeyChain}
+documentation for more information.</p>
+
+
+
+
+
+
+
+<h3 id="Sensors">Device Sensors</h3>
+
+<p>Two new sensor types have been added in Android 4.0:</p>
+
+<ul>
+ <li>{@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE}: A temperature sensor that provides
+the ambient (room) temperature in degrees Celsius.</li>
+ <li>{@link android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY}: A humidity sensor that provides the
+relative ambient (room) humidity as a percentage.</li>
+</ul>
+
+<p>If a device has both {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} and {@link
+android.hardware.Sensor#TYPE_RELATIVE_HUMIDITY} sensors, you can use them to calculate the dew point
+and the absolute humidity.</p>
+
+<p>The previous temperature sensor, {@link android.hardware.Sensor#TYPE_TEMPERATURE}, has been
+deprecated. You should use the {@link android.hardware.Sensor#TYPE_AMBIENT_TEMPERATURE} sensor
+instead.</p>
+
+<p>Additionally, Android’s three synthetic sensors have been greatly improved so they now have lower
+latency and smoother output. These sensors include the gravity sensor ({@link
+android.hardware.Sensor#TYPE_GRAVITY}), rotation vector sensor ({@link
+android.hardware.Sensor#TYPE_ROTATION_VECTOR}), and linear acceleration sensor ({@link
+android.hardware.Sensor#TYPE_LINEAR_ACCELERATION}). The improved sensors rely on the gyroscope
+sensor to improve their output, so the sensors appear only on devices that have a gyroscope.</p>
+
+
+
+
<h3 id="ActionBar">Action Bar</h3>
@@ -1177,8 +1204,10 @@
allows you to enable “split action bar" so that more action items can appear on the screen in a
separate bar at the bottom of the screen. To enable split action bar, add {@link
android.R.attr#uiOptions android:uiOptions} with {@code "splitActionBarWhenNarrow"} to either your
-<a href="guide/topics/manifest/application-element.html">{@code <application>}</a> tag or
-individual <a href="guide/topics/manifest/activity-element.html">{@code <activity>}</a> tags
+<a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a>
+tag or
+individual <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
+<activity>}</a> tags
in your manifest file. When enabled, the system will add an additional bar at the bottom of the
screen for all action items when the screen is narrow (no action items will appear in the primary
action bar).</p>
@@ -1248,9 +1277,8 @@
</pre>
<p>For an example using the {@link android.widget.ShareActionProvider}, see the <a
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/
-ActionBarActionProviderActivity.html">ActionBarActionProviderActivity</a>
-class in ApiDemos.</p>
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/ActionBarActionProviderActivity.html"
+>ActionBarActionProviderActivity</a> class in ApiDemos.</p>
<h4>Collapsible action views</h4>
@@ -1313,56 +1341,6 @@
<p>Android 4.0 introduces a variety of new views and other UI components.</p>
-<h4>System UI</h4>
-
-<p>Since the early days of Android, the system has managed a UI component known as the <em>status
-bar</em>, which resides at the top of handset devices to deliver information such as the carrier
-signal, time, notifications, and so on. Android 3.0 added the <em>system bar</em> for tablet
-devices, which resides at the bottom of the screen to provide system navigation controls (Home,
-Back, and so forth) and also an interface for elements traditionally provided by the status bar. In
-Android 4.0, the system provides a new type of system UI called the <em>navigation bar</em>. The
-navigation bar shares some qualities with the system bar, because it provides navigation controls
-for devices that don’t have hardware counterparts for navigating the system, but the navigation
-controls is all that the navigation bar offers (a device with the navigation bar, thus, also
-includes the status bar at the top of the screen).</p>
-
-<p>To this day, you can hide the status bar on handsets using the {@link
-android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} flag. In Android 4.0, the APIs that control
-the system bar’s visibility have been updated to better reflect the behavior of both the system bar
-and navigation bar:</p>
-<ul>
-<li>The {@link android.view.View#SYSTEM_UI_FLAG_LOW_PROFILE} flag replaces View.STATUS_BAR_HIDDEN
-flag. When set, this flag enables “low profile" mode for the system bar or
-navigation bar. Navigation buttons dim and other elements in the system bar also hide.</li>
-
-<li>The {@link android.view.View#SYSTEM_UI_FLAG_VISIBLE} flag replaces the {@code
-STATUS_BAR_VISIBLE} flag to request the system bar or navigation bar be visible.</li>
-
-<li>The {@link android.view.View#SYSTEM_UI_FLAG_HIDE_NAVIGATION} is a new flag that requests that
-the navigation bar hide completely. Take note that this works only for the <em>navigation bar</em>
-used by some handsets (it does <strong>not</strong> hide the system bar on tablets). The navigation
-bar returns as soon as the system receives user input. As such, this mode is generally used for
-video playback or other cases in which the whole screen is needed but user input is not
-required.</li>
-</ul>
-
-<p>You can set each of these flags for the system bar and navigation bar by calling {@link
-android.view.View#setSystemUiVisibility setSystemUiVisibility()} on any view in your activity. The
-window manager will combine (OR-together) all flags from all views in your window and
-apply them to the system UI as long as your window has input focus. When your window loses input
-focus (the user navigates away from your app, or a dialog appears), your flags cease to have effect.
-Similarly, if you remove those views from the view hierarchy their flags no longer apply.</p>
-
-<p>To synchronize other events in your activity with visibility changes to the system UI (for
-example, hide the action bar or other UI controls when the system UI hides), you should register a
-{@link android.view.View.OnSystemUiVisibilityChangeListener} to be notified when the visibility
-of the system bar or navigation bar changes.</p>
-
-<p>See the <a
-href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/OverscanActivity.html">
-OverscanActivity</a> class for a demonstration of different system UI options.</p>
-
-
<h4>GridLayout</h4>
<p>{@link android.widget.GridLayout} is a new view group that places child views in a rectangular
@@ -1437,6 +1415,102 @@
android.preference.SwitchPreference} for the Wi-Fi and Bluetooth settings.</p>
+
+<h4>System themes</h4>
+
+<p>The default theme for all applications that target Android 4.0 (by setting either <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> or
+<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a> to
+{@code “14"} or higher) is now the
+"device default" theme: {@link android.R.style#Theme_DeviceDefault Theme.DeviceDefault}. This may be
+the dark Holo theme or a different dark theme defined by the specific device.</p>
+
+<p>The {@link android.R.style#Theme_Holo Theme.Holo} family of themes are guaranteed to not change
+from one device to another when running the same version of Android. If you explicitly
+apply any of the {@link android.R.style#Theme_Holo Theme.Holo} themes to your activities, you can
+rest assured that these themes will not change character on different devices within the same
+platform version.</p>
+
+<p>If you wish for your app to blend in with the overall device theme (such as when different OEMs
+provide different default themes for the system), you should explicitly apply themes from the {@link
+android.R.style#Theme_DeviceDefault Theme.DeviceDefault} family.</p>
+
+
+<h4>Options menu button</h4>
+
+<p>Beginning with Android 4.0, you'll notice that handsets no longer require a Menu hardware button.
+However, there's no need for you to worry about this if your existing application provides an <a
+href="{@docRoot}guide/topics/ui/menus.html#options-menu">options menu</a> and expects there to be a
+Menu button. To ensure that existing apps continue to work as they expect, the system provides an
+on-screen Menu button for apps that were designed for older versions of Android.</p>
+
+<p>For the best user experience, new and updated apps should instead use the {@link
+android.app.ActionBar} to provide access to menu items and set <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> to
+{@code "14"} to take advantage of the latest framework default behaviors.</p>
+
+
+
+<h4>Controls for system UI visibility</h4>
+
+<p>Since the early days of Android, the system has managed a UI component known as the <em>status
+bar</em>, which resides at the top of handset devices to deliver information such as the carrier
+signal, time, notifications, and so on. Android 3.0 added the <em>system bar</em> for tablet
+devices, which resides at the bottom of the screen to provide system navigation controls (Home,
+Back, and so forth) and also an interface for elements traditionally provided by the status bar. In
+Android 4.0, the system provides a new type of system UI called the <em>navigation bar</em>. You
+might consider the navigation bar a re-tuned version of the system bar designed for
+handsets—it provides navigation controls
+for devices that don’t have hardware counterparts for navigating the system, but it leaves out the
+system bar's notification UI and setting controls. As such, a device that provides the navigation
+bar also has the status bar at the top.</p>
+
+<p>To this day, you can hide the status bar on handsets using the {@link
+android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN} flag. In Android 4.0, the APIs that control
+the system bar’s visibility have been updated to better reflect the behavior of both the system bar
+and navigation bar:</p>
+<ul>
+<li>The {@link android.view.View#SYSTEM_UI_FLAG_LOW_PROFILE} flag replaces the {@code
+STATUS_BAR_HIDDEN} flag. When set, this flag enables “low profile" mode for the system bar or
+navigation bar. Navigation buttons dim and other elements in the system bar also hide. Enabling
+this is useful for creating more immersive games without distraction for the system navigation
+buttons.</li>
+
+<li>The {@link android.view.View#SYSTEM_UI_FLAG_VISIBLE} flag replaces the {@code
+STATUS_BAR_VISIBLE} flag to request the system bar or navigation bar be visible.</li>
+
+<li>The {@link android.view.View#SYSTEM_UI_FLAG_HIDE_NAVIGATION} is a new flag that requests
+the navigation bar hide completely. Be aware that this works only for the <em>navigation bar</em>
+used by some handsets (it does <strong>not</strong> hide the system bar on tablets). The navigation
+bar returns to view as soon as the system receives user input. As such, this mode is useful
+primarily for video playback or other cases in which the whole screen is needed but user input is
+not required.</li>
+</ul>
+
+<p>You can set each of these flags for the system bar and navigation bar by calling {@link
+android.view.View#setSystemUiVisibility setSystemUiVisibility()} on any view in your activity. The
+window manager combines (OR-together) all flags from all views in your window and
+apply them to the system UI as long as your window has input focus. When your window loses input
+focus (the user navigates away from your app, or a dialog appears), your flags cease to have effect.
+Similarly, if you remove those views from the view hierarchy their flags no longer apply.</p>
+
+<p>To synchronize other events in your activity with visibility changes to the system UI (for
+example, hide the action bar or other UI controls when the system UI hides), you should register a
+{@link android.view.View.OnSystemUiVisibilityChangeListener} to be notified when the visibility
+of the system bar or navigation bar changes.</p>
+
+<p>See the <a
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/OverscanActivity.html">
+OverscanActivity</a> class for a demonstration of different system UI options.</p>
+
+
+
+
+
+<h3 id="Input">Input Framework</h3>
+
+<p>Android 4.0 adds support for cursor hover events and new stylus and mouse button events.</p>
+
<h4>Hover events</h4>
<p>The {@link android.view.View} class now supports “hover" events to enable richer interactions
@@ -1465,7 +1539,7 @@
provide a different background drawable when a cursor hovers over the view.</p>
<p>For a demonstration of the new hover events, see the <a
-href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/view/Hover.html">Hover</a> class in
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/Hover.html">Hover</a> class in
ApiDemos.</p>
@@ -1506,7 +1580,7 @@
android.view.MotionEvent#AXIS_ORIENTATION}.</p>
<p>For a demonstration of tool types, button states and the new axis codes, see the <a
-href="{@docRoot}samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html">TouchPaint
+href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchPaint.html">TouchPaint
</a> class in ApiDemos.</p>
@@ -1666,11 +1740,17 @@
</ul>
+<div class="special" style="margin-top:3em">
+<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API Level
+{@sdkPlatformApiLevel}), see the <a
+href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API Differences Report</a>.</p>
+</div>
+
<h2 id="Honeycomb">Previous APIs</h2>
<p>In addition to everything above, Android 4.0 naturally supports all APIs from previous releases.
-Because the Android 3.x (Honeycomb) platform is available only for large-screen devices, if you've
+Because the Android 3.x platform is available only for large-screen devices, if you've
been developing primarily for handsets, then you might not be aware of all the APIs added to Android
in these recent releases.</p>
@@ -1688,7 +1768,7 @@
the activity window. It includes the application logo in the left corner and provides a new
interface for menu items. See the
<a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> developer guide.</li>
- <li>{@link android.content.Loader}: A framework component that facilitates asynchronour
+ <li>{@link android.content.Loader}: A framework component that facilitates asynchronous
loading of data in combination with UI components to dynamically load data without blocking the
main thread. See the
<a href="{@docRoot}guide/topics/fundamentals/loaders.html">Loaders</a> developer guide.</li>
@@ -1702,7 +1782,7 @@
object (View, Drawable, Fragment, Object, or anything else) and define animation aspects such
as duration, interpolation, repeat and more. The new framework makes Animations in Android
simpler than ever. See the
-<a href="{@docRoot}guide/topics/graphics/property-animation.html">Property Animation</a> developer
+<a href="{@docRoot}guide/topics/graphics/prop-animation.html">Property Animation</a> developer
guide.</li>
<li>RenderScript graphics and compute engine: RenderScript offers a high performance 3D
graphics rendering and compute API at the native level, which you write in the C (C99 standard),
@@ -1780,16 +1860,6 @@
-
-
-<h2 id="api-diff">API Differences Report</h2>
-
-<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API Level
-{@sdkPlatformApiLevel}), see the <a
-href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API Differences Report</a>.</p>
-
-
-
<h2 id="api-level">API Level</h2>
<p>The Android {@sdkPlatformVersion} API is assigned an integer
@@ -1840,7 +1910,6 @@
<li>Search</li>
<li>Settings</li>
<li>Speech Recorder</li>
-<li>Speech Recorder</li>
<li>Widget Preview</li>
</ul>
</td>
diff --git a/docs/html/sdk/compatibility-library.jd b/docs/html/sdk/compatibility-library.jd
index c8cd5b2..8b19fb47 100644
--- a/docs/html/sdk/compatibility-library.jd
+++ b/docs/html/sdk/compatibility-library.jd
@@ -1,4 +1,4 @@
-page.title=Compatibility Package
+page.title=Support Package
@jd:body
@@ -8,7 +8,7 @@
<h2>In this document</h2>
<ol>
<li><a href="#Notes">Revisions</a></li>
- <li><a href="#Downloading">Downloading the Compatibility Package</a></li>
+ <li><a href="#Downloading">Downloading the Support Package</a></li>
<li><a href="#SettingUp">Setting Up a Project to Use a Library</a></li>
<li><a href="#Using">Using the v4 Library APIs</a></li>
<li><a href="#Docs">Reference Docs</a></li>
@@ -27,28 +27,118 @@
<p><em>Minimum API level supported:</em> <b>4</b></p>
-<p>The Compatibility Package includes static "support libraries" that you can add to your Android
+<p>The Support Package includes static "support libraries" that you can add to your Android
application in order to use APIs that are either not available for older platform versions or that
offer "utility" APIs that aren't a part of the framework APIs. The goal is to simplify your
development by offering more APIs that you can bundle with your application so you can
worry less about platform versions.</p>
-<p class="note"><strong>Note:</strong> The Compatibility Package includes more than one support
+<p class="note"><strong>Note:</strong> The Support Package includes more than one support
library. Each one has a different <em>minimum API level</em>. For example, one library requires API
-level 4 or higher, while another requires API level 13 or higher. The minimum version is indicated
+level 4 or higher, while another requires API level 13 or higher (v13 is a superset of v4 and includes additional
+support classes to work with v13 APIs). The minimum version is indicated
by the directory name, such as {@code v4/} and {@code v13/}.</p>
<h2 id="Notes">Revisions</h2>
<p>The sections below provide notes about successive releases of
-the Compatibility Package, as denoted by revision number.</p>
+the Support Package, as denoted by revision number.</p>
+
<div class="toggle-content open">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" />
+ Support Package, revision 4 (October 2011)
+ </a></p>
+
+ <div class="toggle-content-toggleme" style="padding-left:2em">
+ <dl>
+ <dt>Changes for v4 support library:</dt>
+ <dd>
+ <ul>
+ <li>Support for Accessiblity APIs:
+ <ul>
+ <li>Added <code>AccessibilityDelegateCompat</code> to support
+ {@link android.view.View.AccessibilityDelegate}.</li>
+
+ <li>Added <code>AccessibilityEventCompat</code> to support
+ {@link android.view.accessibility.AccessibilityEvent}.</li>
+
+ <li>Added <code>AccessibilityManagerCompat</code> to support
+ {@link android.view.accessibility.AccessibilityManager}.</li>
+
+ <li>Added <code>AccessibilityNodeInfoCompat</code> to support
+ {@link android.view.accessibility.AccessibilityNodeInfo}.</li>
+
+ <li>Added <code>AccessibilityRecordCompat</code> to support
+ {@link android.view.accessibility.AccessibilityRecord}.</li>
+
+ <li>Added <code>AccessibilityServiceInfoCompat</code> to support
+ {@link android.accessibilityservice.AccessibilityServiceInfo}.</li>
+
+ <li>Added <code>ViewGroupCompat</code>
+ to support accessibility features in {@link android.view.ViewGroup}.
+ </li>
+
+ <li>Modified <code>ViewCompat</code>
+ to support accessibility features in {@link android.view.View}.</li>
+ </ul>
+ </li>
+
+ <li>Added <code>EdgeEffectCompat</code> to
+ support {@link android.widget.EdgeEffect}.</li>
+
+ <li>Added <code>LocalBroadcastManager</code> to allow applications to easily
+ register for and receive intents within a single application without
+ broadcasting them globally.</li>
+
+ <li>Added support in <code>ViewCompat</code> to check for and set overscroll
+ modes for {@link android.view.View}s on Android 2.3 and later.</li>
+ <li>Changes to Fragment APIs:
+ <ul>
+ <li>Added new APIs to control the visibility of new menus.</li>
+ <li>Added custom animation APIs.</li>
+ <li>Added APIs in <code>FragmentActivity</code> to retain custom,
+ non-configuration instance data.</li>
+ <li>Various bug fixes.</li>
+ </ul>
+ </li>
+ <li>Changes to <code>ViewPager</code>:
+ <ul>
+ <li>Added support for margins between pages.
+ An optional {@link android.graphics.drawable.Drawable} can be provided
+ to fill the margins.</li>
+ <li>Added support for {@link android.widget.EdgeEffect}.</li>
+ <li>Added support for keyboard navigation</li>
+ <li>Added support to control how many pages are kept to either side
+ of the current page.</li>
+ <li>Improved touch physics.</li>
+ </ul>
+ </li>
+
+ <li>Fixed a {@link android.content.Loader} bug that caused issues in
+ canceling {@link android.os.AsyncTask}s when running on Froyo and older
+ versions of the platform. The support
+ code now uses its own version of {@link android.os.AsyncTask} to keep the same
+ behavior on all platform versions.</li>
+
+ </ul>
+ </dd>
+ </dl>
+ </div>
+
+
+
+</div>
+
+
+<div class="toggle-content closed">
+
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" />
Compatibility Package, revision 3 (July 2011)
</a></p>
@@ -136,9 +226,9 @@
-<h2 id="Downloading">Downloading the Compatibility Package</h2>
+<h2 id="Downloading">Downloading the Support Package</h2>
-<p>The Compatibility Package is provided as a downloadable package from the Android SDK and AVD
+<p>The Support Package is provided as a downloadable package from the Android SDK and AVD
Manager. To install:</p>
<ol>
@@ -147,13 +237,13 @@
> <strong>Android SDK and AVD Manager</strong>. Or, launch {@code SDK Manager.exe} from
the {@code <sdk>/} directory (on Windows only) or {@code android} from the {@code
<sdk>/tools/} directory.</p></li>
- <li>Expand the Android Repository, check <strong>Android Compatibility package</strong>
+ <li>Expand the Android Repository, check <strong>Android Support package</strong>
and click <strong>Install selected</strong>.</li>
<li>Proceed to install the package.</li>
</ol>
<p>When done, all files (including source code, samples, and the {@code .jar} files) are saved
-into the <code><sdk>/extras/android/compatibility/</code> directory. This directory contains
+into the <code><sdk>/extras/android/support/</code> directory. This directory contains
each of the different support libraries, such as the library for API level 4 and up and the library
for API level 13 and up, each named with the respective version (such as {@code v4/}).</p>
@@ -167,7 +257,7 @@
<li>Locate the JAR file for the library you want to use and copy it into the {@code
libs/} directory.
<p>For example, the library that supports API level 4 and up is located at {@code
-<sdk>/extras/android/compatibility/v4/android-support-v4.jar}.</p>
+<sdk>/extras/android/support/v4/android-support-v4.jar}.</p>
</li>
<li>Add the JAR to your project build path.
<p>In Eclipse, right-click the JAR file in the Package Explorer, select <strong>Build
@@ -181,7 +271,7 @@
example, {@code android.support.v4}).</p>
<p class="note"><strong>Tip:</strong> To see the library APIs in action, take a look at the sample
-apps in {@code extras/android/compatibility/<version>/samples/}.</p>
+apps in {@code extras/android/support/<version>/samples/}.</p>
<p class="warning"><strong>Warning:</strong> Be certain that you not confuse the standard
{@code android} packages with those in {@code android.support} library. Some code completion tools
@@ -265,7 +355,7 @@
library:</p>
<pre class="no-pretty-print">
-cd <sdk>/extras/android/compatibility/v4/
+cd <sdk>/extras/android/support/v4/
mkdir docs
javadoc -sourcepath src/java/ -subpackages android.support.v4 -d docs
</pre>
@@ -275,8 +365,8 @@
<h2 id="Samples">Samples</h2>
<p>If you want to see some code that uses the support libraries, samples are included with the
-Compatibility Package, inside each support library directory. For example, at {@code
-extras/android/compatibility/v4/samples/}.</p>
+Support Package, inside each support library directory. For example, at {@code
+extras/android/support/v4/samples/}.</p>
<p>Additionally, the <a href="http://code.google.com/p/iosched/">Google I/O App</a> is a complete
application that uses the v4 support library to provide a single APK for both handsets and tablets
diff --git a/docs/html/sdk/eclipse-adt.jd b/docs/html/sdk/eclipse-adt.jd
index 59675a8..941f693 100644
--- a/docs/html/sdk/eclipse-adt.jd
+++ b/docs/html/sdk/eclipse-adt.jd
@@ -1,8 +1,8 @@
page.title=ADT Plugin for Eclipse
-adt.zip.version=14.0.0
-adt.zip.download=ADT-14.0.0.zip
-adt.zip.bytes=6747816
-adt.zip.checksum=3883973cd229dc4336911117af949509
+adt.zip.version=15.0.0
+adt.zip.download=ADT-15.0.0.zip
+adt.zip.bytes=6750682
+adt.zip.checksum=264f40a89a1107b0c422adae4e1ce0d1
@jd:body
@@ -67,7 +67,7 @@
the ADT Plugin, as denoted by revision number. </p>
<p>For a summary of all known issues in ADT, see <a
-href="http://tools.android.com/release/knownissues">http://tools.android.com/release/knownissues</a>.</p>
+href="http://tools.android.com/knownissues">http://tools.android.com/knownissues</a>.</p>
<script type="text/javascript">
function toggleDiv(link) {
@@ -113,6 +113,37 @@
<a href="#" onclick="return toggleDiv(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px"
width="9px" />
+ADT 15.0.0</a> <em>(October 2011)</em>
+ <div class="toggleme">
+<dl>
+
+<dt>Dependencies:</dt>
+
+<dd>ADT 15.0.0 is designed for use with <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r15</a>.
+If you haven't already installed SDK Tools r15 into your SDK, use the Android SDK and AVD Manager to
+do so.</dd>
+
+<dt>Bug fixes:</dt>
+<dd>
+<ul>
+ <li>Fixed build issue when using Renderscript in projects that target API levels 11-13
+ (<a href="http://code.google.com/p/android/issues/detail?id=21006">Issue 21006</a>).</li>
+ <li>Fixed issue when creating projects from existing source code.</li>
+ <li>Fixed issues in the SDK Manager
+ (<a href="http://code.google.com/p/android/issues/detail?id=20939">Issue 20939</a>,
+ <a href="http://code.google.com/p/android/issues/detail?id=20607">Issue 20607</a>).</li>
+ <li>Fixed scrolling issue in the new Logcat panel of DDMS.</li>
+</ul>
+</dd>
+</dl>
+
+</div>
+</div>
+
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px"
+width="9px" />
ADT 14.0.0</a> <em>(October 2011)</em>
<div class="toggleme">
<dl>
diff --git a/docs/html/sdk/images/4.0/allapps-lg.png b/docs/html/sdk/images/4.0/allapps-lg.png
new file mode 100644
index 0000000..f5eba3c
--- /dev/null
+++ b/docs/html/sdk/images/4.0/allapps-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/allapps.png b/docs/html/sdk/images/4.0/allapps.png
new file mode 100644
index 0000000..317a49a
--- /dev/null
+++ b/docs/html/sdk/images/4.0/allapps.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/bbench.png b/docs/html/sdk/images/4.0/bbench.png
new file mode 100644
index 0000000..f113092
--- /dev/null
+++ b/docs/html/sdk/images/4.0/bbench.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/beam-lg.png b/docs/html/sdk/images/4.0/beam-lg.png
new file mode 100644
index 0000000..608fc94
--- /dev/null
+++ b/docs/html/sdk/images/4.0/beam-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/beam-maps-lg.png b/docs/html/sdk/images/4.0/beam-maps-lg.png
new file mode 100644
index 0000000..96ac235
--- /dev/null
+++ b/docs/html/sdk/images/4.0/beam-maps-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/beam-maps.png b/docs/html/sdk/images/4.0/beam-maps.png
new file mode 100644
index 0000000..63b6756
--- /dev/null
+++ b/docs/html/sdk/images/4.0/beam-maps.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/beam.png b/docs/html/sdk/images/4.0/beam.png
new file mode 100644
index 0000000..0eb7d26
--- /dev/null
+++ b/docs/html/sdk/images/4.0/beam.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/browser-lg.png b/docs/html/sdk/images/4.0/browser-lg.png
new file mode 100644
index 0000000..fe3fe81
--- /dev/null
+++ b/docs/html/sdk/images/4.0/browser-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/browser-tabs-lg.png b/docs/html/sdk/images/4.0/browser-tabs-lg.png
new file mode 100644
index 0000000..0ea8f10
--- /dev/null
+++ b/docs/html/sdk/images/4.0/browser-tabs-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/browser-tabs.png b/docs/html/sdk/images/4.0/browser-tabs.png
new file mode 100644
index 0000000..413b0c6
--- /dev/null
+++ b/docs/html/sdk/images/4.0/browser-tabs.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/browser.png b/docs/html/sdk/images/4.0/browser.png
new file mode 100644
index 0000000..4bc8179
--- /dev/null
+++ b/docs/html/sdk/images/4.0/browser.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/calendar-widget-lg.png b/docs/html/sdk/images/4.0/calendar-widget-lg.png
new file mode 100644
index 0000000..39fc986
--- /dev/null
+++ b/docs/html/sdk/images/4.0/calendar-widget-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/calendar-widget.png b/docs/html/sdk/images/4.0/calendar-widget.png
new file mode 100644
index 0000000..80a57f7
--- /dev/null
+++ b/docs/html/sdk/images/4.0/calendar-widget.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/camera-lg.png b/docs/html/sdk/images/4.0/camera-lg.png
new file mode 100644
index 0000000..7d96a4f
--- /dev/null
+++ b/docs/html/sdk/images/4.0/camera-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/camera.png b/docs/html/sdk/images/4.0/camera.png
new file mode 100644
index 0000000..7454549
--- /dev/null
+++ b/docs/html/sdk/images/4.0/camera.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-call-lg.png b/docs/html/sdk/images/4.0/contact-call-lg.png
new file mode 100644
index 0000000..40b1f40
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-call-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-call.png b/docs/html/sdk/images/4.0/contact-call.png
new file mode 100644
index 0000000..5550b57
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-call.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-call.xcf b/docs/html/sdk/images/4.0/contact-call.xcf
new file mode 100644
index 0000000..3046e92
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-call.xcf
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-connect-lg.png b/docs/html/sdk/images/4.0/contact-connect-lg.png
new file mode 100644
index 0000000..ad0d04c
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-connect-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-connect.png b/docs/html/sdk/images/4.0/contact-connect.png
new file mode 100644
index 0000000..d958206
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-connect.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-email-lg.png b/docs/html/sdk/images/4.0/contact-email-lg.png
new file mode 100644
index 0000000..db75a46
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-email-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-email.png b/docs/html/sdk/images/4.0/contact-email.png
new file mode 100644
index 0000000..9e5460d
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-email.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-faves-lg.png b/docs/html/sdk/images/4.0/contact-faves-lg.png
new file mode 100644
index 0000000..1ec3fd0
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-faves-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/contact-faves.png b/docs/html/sdk/images/4.0/contact-faves.png
new file mode 100644
index 0000000..57e4ca6
--- /dev/null
+++ b/docs/html/sdk/images/4.0/contact-faves.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/face-unlock-lg.png b/docs/html/sdk/images/4.0/face-unlock-lg.png
new file mode 100644
index 0000000..3fd1695
--- /dev/null
+++ b/docs/html/sdk/images/4.0/face-unlock-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/face-unlock.png b/docs/html/sdk/images/4.0/face-unlock.png
new file mode 100644
index 0000000..00afb83
--- /dev/null
+++ b/docs/html/sdk/images/4.0/face-unlock.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/folders.xcf b/docs/html/sdk/images/4.0/folders.xcf
new file mode 100644
index 0000000..66cc02c
--- /dev/null
+++ b/docs/html/sdk/images/4.0/folders.xcf
Binary files differ
diff --git a/docs/html/sdk/images/4.0/gallery-edit-lg.png b/docs/html/sdk/images/4.0/gallery-edit-lg.png
new file mode 100644
index 0000000..3d6688f
--- /dev/null
+++ b/docs/html/sdk/images/4.0/gallery-edit-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/gallery-edit.png b/docs/html/sdk/images/4.0/gallery-edit.png
new file mode 100644
index 0000000..69744ec
--- /dev/null
+++ b/docs/html/sdk/images/4.0/gallery-edit.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/gallery-share-lg.png b/docs/html/sdk/images/4.0/gallery-share-lg.png
new file mode 100644
index 0000000..749f51e
--- /dev/null
+++ b/docs/html/sdk/images/4.0/gallery-share-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/gallery-share.png b/docs/html/sdk/images/4.0/gallery-share.png
new file mode 100644
index 0000000..443a70c
--- /dev/null
+++ b/docs/html/sdk/images/4.0/gallery-share.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/gallery-widget.png b/docs/html/sdk/images/4.0/gallery-widget.png
new file mode 100644
index 0000000..e72fd0d
--- /dev/null
+++ b/docs/html/sdk/images/4.0/gallery-widget.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/home-lg.png b/docs/html/sdk/images/4.0/home-lg.png
new file mode 100644
index 0000000..5b9021d
--- /dev/null
+++ b/docs/html/sdk/images/4.0/home-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/home.png b/docs/html/sdk/images/4.0/home.png
new file mode 100644
index 0000000..cd24732
--- /dev/null
+++ b/docs/html/sdk/images/4.0/home.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/live-effects.png b/docs/html/sdk/images/4.0/live-effects.png
new file mode 100644
index 0000000..11a0122
--- /dev/null
+++ b/docs/html/sdk/images/4.0/live-effects.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/lock-camera-lg.png b/docs/html/sdk/images/4.0/lock-camera-lg.png
new file mode 100644
index 0000000..c82cec6
--- /dev/null
+++ b/docs/html/sdk/images/4.0/lock-camera-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/lock-camera.png b/docs/html/sdk/images/4.0/lock-camera.png
new file mode 100644
index 0000000..d3cc153
--- /dev/null
+++ b/docs/html/sdk/images/4.0/lock-camera.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/lock-lg.png b/docs/html/sdk/images/4.0/lock-lg.png
new file mode 100644
index 0000000..b859e117
--- /dev/null
+++ b/docs/html/sdk/images/4.0/lock-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/lock.png b/docs/html/sdk/images/4.0/lock.png
new file mode 100644
index 0000000..d168826
--- /dev/null
+++ b/docs/html/sdk/images/4.0/lock.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/quick-responses-lg.png b/docs/html/sdk/images/4.0/quick-responses-lg.png
new file mode 100644
index 0000000..39cea9a
--- /dev/null
+++ b/docs/html/sdk/images/4.0/quick-responses-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/quick-responses.png b/docs/html/sdk/images/4.0/quick-responses.png
new file mode 100644
index 0000000..d43f348
--- /dev/null
+++ b/docs/html/sdk/images/4.0/quick-responses.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/screenshot-lg.png b/docs/html/sdk/images/4.0/screenshot-lg.png
new file mode 100644
index 0000000..30ac339
--- /dev/null
+++ b/docs/html/sdk/images/4.0/screenshot-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/screenshot.png b/docs/html/sdk/images/4.0/screenshot.png
new file mode 100644
index 0000000..b23c913
--- /dev/null
+++ b/docs/html/sdk/images/4.0/screenshot.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/tasks-lg.png b/docs/html/sdk/images/4.0/tasks-lg.png
new file mode 100644
index 0000000..58b5c5d
--- /dev/null
+++ b/docs/html/sdk/images/4.0/tasks-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/tasks.png b/docs/html/sdk/images/4.0/tasks.png
new file mode 100644
index 0000000..34a9d4a
--- /dev/null
+++ b/docs/html/sdk/images/4.0/tasks.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/text-replace-lg.png b/docs/html/sdk/images/4.0/text-replace-lg.png
new file mode 100644
index 0000000..047d802
--- /dev/null
+++ b/docs/html/sdk/images/4.0/text-replace-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/text-replace.png b/docs/html/sdk/images/4.0/text-replace.png
new file mode 100644
index 0000000..d2bda3e
--- /dev/null
+++ b/docs/html/sdk/images/4.0/text-replace.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/tts-lg.png b/docs/html/sdk/images/4.0/tts-lg.png
new file mode 100644
index 0000000..2f49051
--- /dev/null
+++ b/docs/html/sdk/images/4.0/tts-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/tts.png b/docs/html/sdk/images/4.0/tts.png
new file mode 100644
index 0000000..3eae634
--- /dev/null
+++ b/docs/html/sdk/images/4.0/tts.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/usage-all-lg.png b/docs/html/sdk/images/4.0/usage-all-lg.png
new file mode 100644
index 0000000..fd7eeba
--- /dev/null
+++ b/docs/html/sdk/images/4.0/usage-all-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/usage-all.png b/docs/html/sdk/images/4.0/usage-all.png
new file mode 100644
index 0000000..048db83
--- /dev/null
+++ b/docs/html/sdk/images/4.0/usage-all.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/usage-maps-lg.png b/docs/html/sdk/images/4.0/usage-maps-lg.png
new file mode 100644
index 0000000..b144370
--- /dev/null
+++ b/docs/html/sdk/images/4.0/usage-maps-lg.png
Binary files differ
diff --git a/docs/html/sdk/images/4.0/usage-maps.png b/docs/html/sdk/images/4.0/usage-maps.png
new file mode 100644
index 0000000..a6dcd21
--- /dev/null
+++ b/docs/html/sdk/images/4.0/usage-maps.png
Binary files differ
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index 82db803..193066b 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -1,21 +1,21 @@
page.title=Android SDK
sdk.redirect=0
-sdk.win_installer=installer_r14-windows.exe
-sdk.win_installer_bytes=33853391
-sdk.win_installer_checksum=4f1cb329a41328c2cee2908b31ae6f6b
+sdk.win_installer=installer_r15-windows.exe
+sdk.win_installer_bytes=33902520
+sdk.win_installer_checksum=ee8481cb86a6646a4d963d5142902c5c
-sdk.win_download=android-sdk_r14-windows.zip
-sdk.win_bytes=33846273
-sdk.win_checksum=48d44ae4cfcadede68621acb53caee80
+sdk.win_download=android-sdk_r15-windows.zip
+sdk.win_bytes=33895447
+sdk.win_checksum=cc2aadf7120d12b574981461736a96e9
-sdk.mac_download=android-sdk_r14-macosx.zip
-sdk.mac_bytes=30428734
-sdk.mac_checksum=812887018435382de8486f3bb26a5db4
+sdk.mac_download=android-sdk_r15-macosx.zip
+sdk.mac_bytes=30469921
+sdk.mac_checksum=03d2cdd3565771e8c7a438f1c40cc8a5
-sdk.linux_download=android-sdk_r14-linux.tgz
-sdk.linux_bytes=26075938
-sdk.linux_checksum=35c989ff67184766dc4960813ede8ab5
+sdk.linux_download=android-sdk_r15-linux.tgz
+sdk.linux_bytes=26124434
+sdk.linux_checksum=f529681fd1eda11c6e1e1d44b42c1432
@jd:body
diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs
index 9bc9b9a..9a18f7da 100644
--- a/docs/html/sdk/sdk_toc.cs
+++ b/docs/html/sdk/sdk_toc.cs
@@ -79,7 +79,7 @@
<div><a href="<?cs var:toroot ?>sdk/android-4.0.html">
<span class="en">Android 4.0 Platform</span></a> <span class="new">new!</span></div>
<ul>
- <!-- <li><a href="<?cs var:toroot ?>sdk/android-4.0-highlights.html">Platform Highlights</a></li> -->
+ <li><a href="<?cs var:toroot ?>sdk/android-4.0-highlights.html">Platform Highlights</a></li>
<li><a href="<?cs var:toroot ?>sdk/api_diff/14/changes.html">API Differences Report »</a></li>
</ul>
</li>
@@ -150,11 +150,11 @@
</li>
</ul>
<ul>
- <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r14</a> <span
+ <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r15</a> <span
class="new">new!</span></li>
<li><a href="<?cs var:toroot ?>sdk/win-usb.html">Google USB Driver, r4</a></li>
- <li><a href="<?cs var:toroot ?>sdk/compatibility-library.html">Compatibility Package,
-r3</a></li>
+ <li><a href="<?cs var:toroot ?>sdk/compatibility-library.html">Support Package, r4</a>
+ <span class="new">new!</span></li>
</ul>
</li>
<li>
@@ -169,7 +169,7 @@
<span style="display:none" class="zh-TW"></span>
</h2>
<ul>
- <li><a href="<?cs var:toroot ?>sdk/eclipse-adt.html">ADT 14.0.0
+ <li><a href="<?cs var:toroot ?>sdk/eclipse-adt.html">ADT 15.0.0
<span style="display:none" class="de"></span>
<span style="display:none" class="es"></span>
<span style="display:none" class="fr"></span>
diff --git a/docs/html/sdk/tools-notes.jd b/docs/html/sdk/tools-notes.jd
index f5b61ee..cd03d9f 100644
--- a/docs/html/sdk/tools-notes.jd
+++ b/docs/html/sdk/tools-notes.jd
@@ -24,7 +24,7 @@
and AVD Manager. </p>
<p>For a summary of all known issues in SDK Tools, see <a
-href="http://tools.android.com/release/knownissues">http://tools.android.com/release/knownissues</a>.</p>
+href="http://tools.android.com/knownissues">http://tools.android.com/knownissues</a>.</p>
<script type="text/javascript">
function toggleDiv(link) {
@@ -65,9 +65,57 @@
}
</style>
+
<div class="toggleable opened">
<a href="#" onclick="return toggleDiv(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px"
+ width="9px" />SDK Tools, Revision 15</a> <em>(October 2011)</em>
+
+ <div class="toggleme">
+ <p class="caution"><strong>Important:</strong> To download the new Android
+ 4.0 system components from the Android SDK Manager, you must first update the
+ SDK tools to revision 14 or later and restart the Android SDK Manager. If you do not,
+ the Android 4.0 system components will not be available for download.</p>
+ <dl>
+<dt>Dependencies:</dt>
+<dd>
+ <ul><li>Android SDK Platform-tools revision 9 or later.</li>
+ <li>If you are developing in Eclipse with ADT, note that the SDK Tools r15 is designed for use
+ with ADT 15.0.0 and later. If you haven't already, we highly recommend updating your <a
+ href="{@docRoot}sdk/eclipse-adt.html">ADT Plugin</a> to 15.0.0.</li>
+ <li>If you are developing outside Eclipse, you must have <a href="http://ant.apache.org/">Apache
+ Ant</a> 1.8 or later.</li>
+</ul>
+
+<dt>Bug fixes:</dt>
+<dd>
+ <ul>
+ <li>Fixed emulator crash on Linux due to improper webcam detection
+ (<a href="http://code.google.com/p/android/issues/detail?id=20952">Issue 20952</a>).</li>
+ <li>Fixed emulator issue when using the <code>-wipe-data</code> argument.</li>
+ <li>Fixed build issue when using Renderscript in projects that target API levels 11-13
+ (<a href="http://code.google.com/p/android/issues/detail?id=21006">Issue 21006</a>).</li>
+ <li>Fixed issue when creating an AVD using the GoogleTV addon
+ (<a href="http://code.google.com/p/android/issues/detail?id=20963">Issue 20963</a>).</li>
+ <li>Fixed <code>ant test</code>
+ (<a href="http://code.google.com/p/android/issues/detail?id=20979">Issue 20979</a>).</li>
+ <li>Fixed <code>android update project</code>
+ (<a href="http://code.google.com/p/android/issues/detail?id=20535">Issue 20535</a>).</li>
+ <li>Fixed scrolling issue in the new Logcat panel of DDMS.</li>
+ <li>Fixed issue with MonkeyRunner
+ (<a href="http://code.google.com/p/android/issues/detail?id=20964">Issue 20964</a>).</li>
+ <li>Fixed issues in the SDK Manager
+ (<a href="http://code.google.com/p/android/issues/detail?id=20939">Issue 20939</a>,
+ <a href="http://code.google.com/p/android/issues/detail?id=20607">Issue 20607</a>).</li>
+ </ul>
+</dd>
+</dl>
+</div>
+</div>
+
+<div class="toggleable closed">
+ <a href="#" onclick="return toggleDiv(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px"
width="9px" />SDK Tools, Revision 14</a> <em>(October 2011)</em>
<div class="toggleme">
diff --git a/docs/html/shareables/adl/2011Q3_Android_Market_for_Developers.pdf b/docs/html/shareables/adl/2011Q3_Android_Market_for_Developers.pdf
new file mode 100644
index 0000000..598a27e
--- /dev/null
+++ b/docs/html/shareables/adl/2011Q3_Android_Market_for_Developers.pdf
Binary files differ
diff --git a/docs/html/shareables/adl/2011Q3_Designing_UIs_for_Phones_and_Tablets.pdf b/docs/html/shareables/adl/2011Q3_Designing_UIs_for_Phones_and_Tablets.pdf
new file mode 100644
index 0000000..6ef41dd
--- /dev/null
+++ b/docs/html/shareables/adl/2011Q3_Designing_UIs_for_Phones_and_Tablets.pdf
Binary files differ
diff --git a/docs/html/shareables/adl/2011Q3_Introduction_to_Honeycomb_APIs.pdf b/docs/html/shareables/adl/2011Q3_Introduction_to_Honeycomb_APIs.pdf
new file mode 100644
index 0000000..da954d8
--- /dev/null
+++ b/docs/html/shareables/adl/2011Q3_Introduction_to_Honeycomb_APIs.pdf
Binary files differ
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index eefd21e..e1c73fd 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -29,6 +29,12 @@
* the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect,
* Path, text, Bitmap), and a paint (to describe the colors and styles for the
* drawing).
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use Canvas, read the
+ * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html">
+ * Canvas and Drawables</a> developer guide.</p></div>
*/
public class Canvas {
// assigned in constructors, freed in finalizer
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 0a3deb1..4b9c98f 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -103,9 +103,15 @@
* <li> <b>Scale</b>: a compound drawable with a single child drawable,
* whose overall size is modified based on the current level.
* </ul>
- * <p>For information and examples of creating drawable resources (XML or bitmap files that
- * can be loaded in code), see <a
- * href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use drawables, read the
+ * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html">Canvas and Drawables</a> developer
+ * guide. For information and examples of creating drawable resources (XML or bitmap files that
+ * can be loaded in code), read the
+ * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>
+ * document.</p></div>
*/
public abstract class Drawable {
private static final Rect ZERO_BOUNDS_RECT = new Rect();
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index c32a5b6..bc7e906 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -31,9 +31,15 @@
/**
*
* A resizeable bitmap, with stretchable areas that you define. This type of image
- * is defined in a .png file with a special format, described in <a link="../../../resources.html#ninepatch">
- * Resources</a>.
+ * is defined in a .png file with a special format.
*
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use a NinePatchDrawable, read the
+ * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">
+ * Canvas and Drawables</a> developer guide. For information about creating a NinePatch image
+ * file using the draw9patch tool, see the
+ * <a href="{@docRoot}guide/developing/tools/draw9patch.html">Draw 9-patch</a> tool guide.</p></div>
*/
public class NinePatchDrawable extends Drawable {
// dithering helps a lot, and is pretty cheap, so default is true
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index 4445b6a..a3622a2 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -34,9 +34,16 @@
* the ShapeDrawable will default to a
* {@link android.graphics.drawable.shapes.RectShape}.
*
- * <p>It can be defined in an XML file with the <code><shape></code> element. For more
- * information, see the guide to <a
- * href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>.</p>
+ * <p>This object can be defined in an XML file with the <code><shape></code> element.</p>
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use ShapeDrawable, read the
+ * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#shape-drawable">
+ * Canvas and Drawables</a> document. For more information about defining a ShapeDrawable in
+ * XML, read the
+ * <a href="{@docRoot}guide/topics/resources/drawable-resource.html#Shape">Drawable Resources</a>
+ * document.</p></div>
*
* @attr ref android.R.styleable#ShapeDrawablePadding_left
* @attr ref android.R.styleable#ShapeDrawablePadding_top
diff --git a/include/camera/CameraParameters.h b/include/camera/CameraParameters.h
index ef4cf5c..7edf6b4 100644
--- a/include/camera/CameraParameters.h
+++ b/include/camera/CameraParameters.h
@@ -644,15 +644,17 @@
// than FOCUS_MODE_CONTINUOUS_VIDEO. Auto focus starts when the parameter is
// set.
//
- // If applications call CameraHardwareInterface.autoFocus in this mode, the
- // focus callback will immediately return with a boolean that indicates
- // whether the focus is sharp or not. The apps can then decide if they want
- // to take a picture immediately or to change the focus mode to auto, and
- // run a full autofocus cycle. The focus position is locked after autoFocus
- // call. If applications want to resume the continuous focus,
- // cancelAutoFocus must be called. Restarting the preview will not resume
- // the continuous autofocus. To stop continuous focus, applications should
- // change the focus mode to other modes.
+ // Applications can call CameraHardwareInterface.autoFocus in this mode. If
+ // the autofocus is in the middle of scanning, the focus callback will
+ // return when it completes. If the autofocus is not scanning, focus
+ // callback will immediately return with a boolean that indicates whether
+ // the focus is sharp or not. The apps can then decide if they want to take
+ // a picture immediately or to change the focus mode to auto, and run a full
+ // autofocus cycle. The focus position is locked after autoFocus call. If
+ // applications want to resume the continuous focus, cancelAutoFocus must be
+ // called. Restarting the preview will not resume the continuous autofocus.
+ // To stop continuous focus, applications should change the focus mode to
+ // other modes.
static const char FOCUS_MODE_CONTINUOUS_PICTURE[];
private:
diff --git a/include/media/IOMX.h b/include/media/IOMX.h
index 02ad703..c4cc947 100644
--- a/include/media/IOMX.h
+++ b/include/media/IOMX.h
@@ -78,6 +78,9 @@
node_id node, OMX_INDEXTYPE index,
const void *params, size_t size) = 0;
+ virtual status_t getState(
+ node_id node, OMX_STATETYPE* state) = 0;
+
virtual status_t storeMetaDataInBuffers(
node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h
index e98d55c..08835fb 100644
--- a/include/media/mediaplayer.h
+++ b/include/media/mediaplayer.h
@@ -209,7 +209,6 @@
status_t prepareAsync_l();
status_t getDuration_l(int *msec);
status_t attachNewPlayer(const sp<IMediaPlayer>& player);
- void disconnectNativeWindow();
status_t reset_l();
sp<IMediaPlayer> mPlayer;
@@ -233,8 +232,6 @@
int mVideoHeight;
int mAudioSessionId;
float mSendLevel;
- sp<ANativeWindow> mConnectedWindow;
- sp<IBinder> mConnectedWindowBinder;
};
}; // namespace android
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 0d5a726..c21d19d 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -277,6 +277,7 @@
status_t queueBufferToNativeWindow(BufferInfo *info);
status_t cancelBufferToNativeWindow(BufferInfo *info);
BufferInfo* dequeueBufferFromNativeWindow();
+ status_t pushBlankBuffersToNativeWindow();
status_t freeBuffersOnPort(
OMX_U32 portIndex, bool onlyThoseWeOwn = false);
diff --git a/include/surfaceflinger/ISurfaceComposer.h b/include/surfaceflinger/ISurfaceComposer.h
index ea022a6..e7a33f1 100644
--- a/include/surfaceflinger/ISurfaceComposer.h
+++ b/include/surfaceflinger/ISurfaceComposer.h
@@ -53,6 +53,7 @@
eFXSurfaceNormal = 0x00000000,
eFXSurfaceBlur = 0x00010000,
eFXSurfaceDim = 0x00020000,
+ eFXSurfaceScreenshot= 0x00030000,
eFXSurfaceMask = 0x000F0000,
};
diff --git a/libs/binder/CursorWindow.cpp b/libs/binder/CursorWindow.cpp
index 1b85a71..60681c4 100644
--- a/libs/binder/CursorWindow.cpp
+++ b/libs/binder/CursorWindow.cpp
@@ -211,7 +211,7 @@
uint32_t offset = mHeader->freeOffset + padding;
uint32_t nextFreeOffset = offset + size;
if (nextFreeOffset > mSize) {
- LOGE("Window is full: requested allocation %d bytes, "
+ LOGW("Window is full: requested allocation %d bytes, "
"free space %d bytes, window size %d bytes",
size, freeSpace(), mSize);
return 0;
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 0bee0f1..98fa171 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -409,9 +409,9 @@
int SurfaceTextureClient::disconnect(int api) {
LOGV("SurfaceTextureClient::disconnect");
Mutex::Autolock lock(mMutex);
+ freeAllBuffers();
int err = mSurfaceTexture->disconnect(api);
if (!err) {
- freeAllBuffers();
mReqFormat = 0;
mReqWidth = 0;
mReqHeight = 0;
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 2d51208..5291a1f 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -279,6 +279,8 @@
rsc->timerSet(RS_TIMER_INTERNAL);
rsc->timerPrint();
rsc->timerReset();
+ } else {
+ doWait = true;
}
}
@@ -357,6 +359,7 @@
mTargetSdkVersion = 14;
mDPI = 96;
mIsContextLite = false;
+ memset(&watchdog, 0, sizeof(watchdog));
}
Context * Context::createContext(Device *dev, const RsSurfaceConfig *sc) {
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 1d20e248..2f32bd8 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -16,6 +16,10 @@
package android.media;
+import static android.media.AudioManager.RINGER_MODE_NORMAL;
+import static android.media.AudioManager.RINGER_MODE_SILENT;
+import static android.media.AudioManager.RINGER_MODE_VIBRATE;
+
import android.app.ActivityManagerNative;
import android.app.KeyguardManager;
import android.app.PendingIntent;
@@ -528,8 +532,8 @@
(!mVoiceCapable && streamType != AudioSystem.STREAM_VOICE_CALL &&
streamType != AudioSystem.STREAM_BLUETOOTH_SCO) ||
(mVoiceCapable && streamTypeAlias == AudioSystem.STREAM_RING)) {
- // do not vibrate if already in silent mode
- if (mRingerMode != AudioManager.RINGER_MODE_NORMAL) {
+ // do not vibrate if already in vibrate mode
+ if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
flags &= ~AudioManager.FLAG_VIBRATE;
}
// Check if the ringer mode changes with this volume adjustment. If
@@ -1621,26 +1625,38 @@
boolean adjustVolumeIndex = true;
int newRingerMode = mRingerMode;
int uiIndex = (oldIndex + 5) / 10;
+ boolean vibeInSilent = System.getInt(mContentResolver, System.VIBRATE_IN_SILENT, 1) == 1;
- if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
+ if (mRingerMode == RINGER_MODE_NORMAL) {
if ((direction == AudioManager.ADJUST_LOWER) && (uiIndex <= 1)) {
// enter silent mode if current index is the last audible one and not repeating a
// volume key down
- if (mPrevVolDirection != AudioManager.ADJUST_LOWER) {
+ if (vibeInSilent || mPrevVolDirection != AudioManager.ADJUST_LOWER) {
// "silent mode", but which one?
- newRingerMode = System.getInt(mContentResolver, System.VIBRATE_IN_SILENT, 1) == 1
- ? AudioManager.RINGER_MODE_VIBRATE
- : AudioManager.RINGER_MODE_SILENT;
+ newRingerMode = vibeInSilent ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT;
}
- if (uiIndex == 0 || (mPrevVolDirection == AudioManager.ADJUST_LOWER &&
- mVoiceCapable && streamType == AudioSystem.STREAM_RING)) {
+ if (uiIndex == 0 ||
+ (!vibeInSilent &&
+ mPrevVolDirection == AudioManager.ADJUST_LOWER &&
+ mVoiceCapable && streamType == AudioSystem.STREAM_RING)) {
adjustVolumeIndex = false;
}
}
+ } else if (mRingerMode == RINGER_MODE_VIBRATE) {
+ if ((direction == AudioManager.ADJUST_LOWER)) {
+ // Set it to silent, if it wasn't a long-press
+ if (mPrevVolDirection != AudioManager.ADJUST_LOWER) {
+ newRingerMode = RINGER_MODE_SILENT;
+ }
+ } else if (direction == AudioManager.ADJUST_RAISE) {
+ newRingerMode = RINGER_MODE_NORMAL;
+ }
+ adjustVolumeIndex = false;
} else {
if (direction == AudioManager.ADJUST_RAISE) {
// exiting silent mode
- newRingerMode = AudioManager.RINGER_MODE_NORMAL;
+ // If VIBRATE_IN_SILENT, then go into vibrate mode
+ newRingerMode = vibeInSilent ? RINGER_MODE_VIBRATE : RINGER_MODE_NORMAL;
}
adjustVolumeIndex = false;
}
diff --git a/media/java/android/media/JetPlayer.java b/media/java/android/media/JetPlayer.java
index 1570db4..06cda34 100644
--- a/media/java/android/media/JetPlayer.java
+++ b/media/java/android/media/JetPlayer.java
@@ -52,8 +52,13 @@
* <li>the number of segments left to play in the queue,</li>
* <li>application controller events (CC80-83) to mark points in the MIDI segments.</li>
* </ul>
- * Use {@link #getJetPlayer()} to construct a JetPlayer instance. JetPlayer is a singleton class.
- *
+ * Use {@link #getJetPlayer()} to construct a JetPlayer instance. JetPlayer is a singleton class.
+ * </p>
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use JetPlayer, read the
+ * <a href="{@docRoot}guide/topics/media/jetplayer.html">JetPlayer</a> developer guide.</p></div>
*/
public class JetPlayer
{
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index ec1c27a..eb32563 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -43,8 +43,6 @@
* MediaPlayer class can be used to control playback
* of audio/video files and streams. An example on how to use the methods in
* this class can be found in {@link android.widget.VideoView}.
- * Please see <a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a>
- * for additional help using MediaPlayer.
*
* <p>Topics covered here are:
* <ol>
@@ -54,6 +52,12 @@
* <li><a href="#Callbacks">Register informational and error callbacks</a>
* </ol>
*
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use MediaPlayer, read the
+ * <a href="{@docRoot}guide/topics/media/mediaplayer.html">Media Playback</a> developer guide.</p>
+ * </div>
+ *
* <a name="StateDiagram"></a>
* <h3>State Diagram</h3>
*
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 8f5d0e5..7b42ac3 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -60,9 +60,15 @@
* applications are required to create MediaRecorder objects on threads with a
* Looper running (the main UI thread by default already has a Looper running).
*
- * <p>See the <a href="{@docRoot}guide/topics/media/index.html">Audio and Video</a>
- * documentation for additional help with using MediaRecorder.
- * <p>Note: Currently, MediaRecorder does not work on the emulator.
+ * <p><strong>Note:</strong> Currently, MediaRecorder does not work on the emulator.
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use MediaRecorder for recording video, read the
+ * <a href="{@docRoot}guide/topics/media/camera.html#capture-video">Camera</a> developer guide.
+ * For more information about how to use MediaRecorder for recording sound, read the
+ * <a href="{@docRoot}guide/topics/media/audio-capture.html">Audio Capture</a> developer guide.</p>
+ * </div>
*/
public class MediaRecorder
{
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index d3aab08..7d2fbce 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -38,6 +38,7 @@
SET_PARAMETER,
GET_CONFIG,
SET_CONFIG,
+ GET_STATE,
ENABLE_GRAPHIC_BUFFERS,
USE_BUFFER,
USE_GRAPHIC_BUFFER,
@@ -198,6 +199,17 @@
return reply.readInt32();
}
+ virtual status_t getState(
+ node_id node, OMX_STATETYPE* state) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
+ data.writeIntPtr((intptr_t)node);
+ remote()->transact(GET_STATE, data, &reply);
+
+ *state = static_cast<OMX_STATETYPE>(reply.readInt32());
+ return reply.readInt32();
+ }
+
virtual status_t enableGraphicBuffers(
node_id node, OMX_U32 port_index, OMX_BOOL enable) {
Parcel data, reply;
@@ -524,6 +536,20 @@
return NO_ERROR;
}
+ case GET_STATE:
+ {
+ CHECK_INTERFACE(IOMX, data, reply);
+
+ node_id node = (void*)data.readIntPtr();
+ OMX_STATETYPE state = OMX_StateInvalid;
+
+ status_t err = getState(node, &state);
+ reply->writeInt32(state);
+ reply->writeInt32(err);
+
+ return NO_ERROR;
+ }
+
case ENABLE_GRAPHIC_BUFFERS:
{
CHECK_INTERFACE(IOMX, data, reply);
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 37a82e9..f72300b 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -86,8 +86,6 @@
if (p != 0) {
p->disconnect();
}
-
- disconnectNativeWindow();
}
// always call with lock held
@@ -221,63 +219,12 @@
return mPlayer->getMetadata(update_only, apply_filter, metadata);
}
-void MediaPlayer::disconnectNativeWindow() {
- if (mConnectedWindow != NULL) {
- status_t err = native_window_api_disconnect(mConnectedWindow.get(),
- NATIVE_WINDOW_API_MEDIA);
-
- if (err != OK) {
- LOGW("native_window_api_disconnect returned an error: %s (%d)",
- strerror(-err), err);
- }
- }
- mConnectedWindow.clear();
-}
-
status_t MediaPlayer::setVideoSurface(const sp<Surface>& surface)
{
LOGV("setVideoSurface");
Mutex::Autolock _l(mLock);
if (mPlayer == 0) return NO_INIT;
-
- sp<IBinder> binder(surface == NULL ? NULL : surface->asBinder());
- if (mConnectedWindowBinder == binder) {
- return OK;
- }
-
- if (surface != NULL) {
- status_t err = native_window_api_connect(surface.get(),
- NATIVE_WINDOW_API_MEDIA);
-
- if (err != OK) {
- LOGE("setVideoSurface failed: %d", err);
- // Note that we must do the reset before disconnecting from the ANW.
- // Otherwise queue/dequeue calls could be made on the disconnected
- // ANW, which may result in errors.
- reset_l();
-
- disconnectNativeWindow();
-
- return err;
- }
- }
-
- // Note that we must set the player's new surface before disconnecting the
- // old one. Otherwise queue/dequeue calls could be made on the disconnected
- // ANW, which may result in errors.
- status_t err = mPlayer->setVideoSurface(surface);
-
- disconnectNativeWindow();
-
- mConnectedWindow = surface;
-
- if (err == OK) {
- mConnectedWindowBinder = binder;
- } else {
- disconnectNativeWindow();
- }
-
- return err;
+ return mPlayer->setVideoSurface(surface);
}
status_t MediaPlayer::setVideoSurfaceTexture(
@@ -286,48 +233,7 @@
LOGV("setVideoSurfaceTexture");
Mutex::Autolock _l(mLock);
if (mPlayer == 0) return NO_INIT;
-
- sp<IBinder> binder(surfaceTexture == NULL ? NULL :
- surfaceTexture->asBinder());
- if (mConnectedWindowBinder == binder) {
- return OK;
- }
-
- sp<ANativeWindow> anw;
- if (surfaceTexture != NULL) {
- anw = new SurfaceTextureClient(surfaceTexture);
- status_t err = native_window_api_connect(anw.get(),
- NATIVE_WINDOW_API_MEDIA);
-
- if (err != OK) {
- LOGE("setVideoSurfaceTexture failed: %d", err);
- // Note that we must do the reset before disconnecting from the ANW.
- // Otherwise queue/dequeue calls could be made on the disconnected
- // ANW, which may result in errors.
- reset_l();
-
- disconnectNativeWindow();
-
- return err;
- }
- }
-
- // Note that we must set the player's new SurfaceTexture before
- // disconnecting the old one. Otherwise queue/dequeue calls could be made
- // on the disconnected ANW, which may result in errors.
- status_t err = mPlayer->setVideoSurfaceTexture(surfaceTexture);
-
- disconnectNativeWindow();
-
- mConnectedWindow = anw;
-
- if (err == OK) {
- mConnectedWindowBinder = binder;
- } else {
- disconnectNativeWindow();
- }
-
- return err;
+ return mPlayer->setVideoSurfaceTexture(surfaceTexture);
}
// must call with lock held
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index b5eef94..ba9f54f 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -40,6 +40,7 @@
#include <binder/IServiceManager.h>
#include <binder/MemoryHeapBase.h>
#include <binder/MemoryBase.h>
+#include <gui/SurfaceTextureClient.h>
#include <utils/Errors.h> // for status_t
#include <utils/String8.h>
#include <utils/SystemClock.h>
@@ -374,11 +375,13 @@
} else {
for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) {
sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote();
- snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid);
- result.append(buffer);
- write(fd, result.string(), result.size());
- result = "\n";
- c->dump(fd, args);
+ if (c != 0) {
+ snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid);
+ result.append(buffer);
+ write(fd, result.string(), result.size());
+ result = "\n";
+ c->dump(fd, args);
+ }
}
}
@@ -526,6 +529,8 @@
p->reset();
}
+ disconnectNativeWindow();
+
IPCThreadState::self()->flushCommands();
}
@@ -787,13 +792,67 @@
return p->setVideoSurface(surface);
}
+void MediaPlayerService::Client::disconnectNativeWindow() {
+ if (mConnectedWindow != NULL) {
+ status_t err = native_window_api_disconnect(mConnectedWindow.get(),
+ NATIVE_WINDOW_API_MEDIA);
+
+ if (err != OK) {
+ LOGW("native_window_api_disconnect returned an error: %s (%d)",
+ strerror(-err), err);
+ }
+ }
+ mConnectedWindow.clear();
+}
+
status_t MediaPlayerService::Client::setVideoSurfaceTexture(
const sp<ISurfaceTexture>& surfaceTexture)
{
LOGV("[%d] setVideoSurfaceTexture(%p)", mConnId, surfaceTexture.get());
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
- return p->setVideoSurfaceTexture(surfaceTexture);
+
+ sp<IBinder> binder(surfaceTexture == NULL ? NULL :
+ surfaceTexture->asBinder());
+ if (mConnectedWindowBinder == binder) {
+ return OK;
+ }
+
+ sp<ANativeWindow> anw;
+ if (surfaceTexture != NULL) {
+ anw = new SurfaceTextureClient(surfaceTexture);
+ status_t err = native_window_api_connect(anw.get(),
+ NATIVE_WINDOW_API_MEDIA);
+
+ if (err != OK) {
+ LOGE("setVideoSurfaceTexture failed: %d", err);
+ // Note that we must do the reset before disconnecting from the ANW.
+ // Otherwise queue/dequeue calls could be made on the disconnected
+ // ANW, which may result in errors.
+ reset();
+
+ disconnectNativeWindow();
+
+ return err;
+ }
+ }
+
+ // Note that we must set the player's new SurfaceTexture before
+ // disconnecting the old one. Otherwise queue/dequeue calls could be made
+ // on the disconnected ANW, which may result in errors.
+ status_t err = p->setVideoSurfaceTexture(surfaceTexture);
+
+ disconnectNativeWindow();
+
+ mConnectedWindow = anw;
+
+ if (err == OK) {
+ mConnectedWindowBinder = binder;
+ } else {
+ disconnectNativeWindow();
+ }
+
+ return err;
}
status_t MediaPlayerService::Client::invoke(const Parcel& request,
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index 53e625a..62214ba 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -318,6 +318,9 @@
// @param type Of the metadata to be recorded.
void addNewMetadataUpdate(media::Metadata::Type type);
+ // Disconnect from the currently connected ANativeWindow.
+ void disconnectNativeWindow();
+
mutable Mutex mLock;
sp<MediaPlayerBase> mPlayer;
sp<MediaPlayerService> mService;
@@ -329,6 +332,8 @@
int32_t mConnId;
int mAudioSessionId;
uid_t mUID;
+ sp<ANativeWindow> mConnectedWindow;
+ sp<IBinder> mConnectedWindowBinder;
// Metadata filters.
media::Metadata::Filter mMetadataAllow; // protected by mLock
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 7c34257..b20bfcb 100755
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -52,6 +52,13 @@
// buffers after 3 seconds.
const static int64_t kBufferFilledEventTimeOutNs = 3000000000LL;
+// OMX Spec defines less than 50 color formats. If the query for
+// color format is executed for more than kMaxColorFormatSupported,
+// the query will fail to avoid looping forever.
+// 1000 is more than enough for us to tell whether the omx
+// component in question is buggy or not.
+const static uint32_t kMaxColorFormatSupported = 1000;
+
struct CodecInfo {
const char *mime;
const char *codec;
@@ -818,6 +825,11 @@
}
++index;
+ if (index >= kMaxColorFormatSupported) {
+ CODEC_LOGE("color format %d or compression format %d is not supported",
+ colorFormat, compressionFormat);
+ return UNKNOWN_ERROR;
+ }
}
if (!found) {
@@ -901,22 +913,19 @@
// the incremented index (bug 2897413).
CHECK_EQ(index, portFormat.nIndex);
if (portFormat.eColorFormat == colorFormat) {
- LOGV("Found supported color format: %d", portFormat.eColorFormat);
+ CODEC_LOGV("Found supported color format: %d", portFormat.eColorFormat);
return OK; // colorFormat is supported!
}
++index;
portFormat.nIndex = index;
- // OMX Spec defines less than 50 color formats
- // 1000 is more than enough for us to tell whether the omx
- // component in question is buggy or not.
- if (index >= 1000) {
- LOGE("More than %ld color formats are supported???", index);
+ if (index >= kMaxColorFormatSupported) {
+ CODEC_LOGE("More than %ld color formats are supported???", index);
break;
}
}
- LOGE("color format %d is not supported", colorFormat);
+ CODEC_LOGE("color format %d is not supported", colorFormat);
return UNKNOWN_ERROR;
}
@@ -1992,6 +2001,157 @@
return bufInfo;
}
+status_t OMXCodec::pushBlankBuffersToNativeWindow() {
+ status_t err = NO_ERROR;
+ ANativeWindowBuffer* anb = NULL;
+ int numBufs = 0;
+ int minUndequeuedBufs = 0;
+
+ // We need to reconnect to the ANativeWindow as a CPU client to ensure that
+ // no frames get dropped by SurfaceFlinger assuming that these are video
+ // frames.
+ err = native_window_api_disconnect(mNativeWindow.get(),
+ NATIVE_WINDOW_API_MEDIA);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: api_disconnect failed: %s (%d)",
+ strerror(-err), -err);
+ return err;
+ }
+
+ err = native_window_api_connect(mNativeWindow.get(),
+ NATIVE_WINDOW_API_CPU);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: api_connect failed: %s (%d)",
+ strerror(-err), -err);
+ return err;
+ }
+
+ err = native_window_set_scaling_mode(mNativeWindow.get(),
+ NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ err = native_window_set_buffers_geometry(mNativeWindow.get(), 1, 1,
+ HAL_PIXEL_FORMAT_RGBX_8888);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ err = native_window_set_usage(mNativeWindow.get(),
+ GRALLOC_USAGE_SW_WRITE_OFTEN);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: set_usage failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ err = mNativeWindow->query(mNativeWindow.get(),
+ NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query "
+ "failed: %s (%d)", strerror(-err), -err);
+ goto error;
+ }
+
+ numBufs = minUndequeuedBufs + 1;
+ err = native_window_set_buffer_count(mNativeWindow.get(), numBufs);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: set_buffer_count failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ // We push numBufs + 1 buffers to ensure that we've drawn into the same
+ // buffer twice. This should guarantee that the buffer has been displayed
+ // on the screen and then been replaced, so an previous video frames are
+ // guaranteed NOT to be currently displayed.
+ for (int i = 0; i < numBufs + 1; i++) {
+ err = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &anb);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ sp<GraphicBuffer> buf(new GraphicBuffer(anb, false));
+ err = mNativeWindow->lockBuffer(mNativeWindow.get(),
+ buf->getNativeBuffer());
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: lockBuffer failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ // Fill the buffer with the a 1x1 checkerboard pattern ;)
+ uint32_t* img = NULL;
+ err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img));
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: lock failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ *img = 0;
+
+ err = buf->unlock();
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: unlock failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ err = mNativeWindow->queueBuffer(mNativeWindow.get(),
+ buf->getNativeBuffer());
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: queueBuffer failed: %s (%d)",
+ strerror(-err), -err);
+ goto error;
+ }
+
+ anb = NULL;
+ }
+
+error:
+
+ if (err != NO_ERROR) {
+ // Clean up after an error.
+ if (anb != NULL) {
+ mNativeWindow->cancelBuffer(mNativeWindow.get(), anb);
+ }
+
+ native_window_api_disconnect(mNativeWindow.get(),
+ NATIVE_WINDOW_API_CPU);
+ native_window_api_connect(mNativeWindow.get(),
+ NATIVE_WINDOW_API_MEDIA);
+
+ return err;
+ } else {
+ // Clean up after success.
+ err = native_window_api_disconnect(mNativeWindow.get(),
+ NATIVE_WINDOW_API_CPU);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: api_disconnect failed: %s (%d)",
+ strerror(-err), -err);
+ return err;
+ }
+
+ err = native_window_api_connect(mNativeWindow.get(),
+ NATIVE_WINDOW_API_MEDIA);
+ if (err != NO_ERROR) {
+ LOGE("error pushing blank frames: api_connect failed: %s (%d)",
+ strerror(-err), -err);
+ return err;
+ }
+
+ return NO_ERROR;
+ }
+}
+
int64_t OMXCodec::retrieveDecodingTimeUs(bool isCodecSpecific) {
CHECK(mIsEncoder);
@@ -2580,6 +2740,15 @@
mPortStatus[kPortIndexInput] = ENABLED;
mPortStatus[kPortIndexOutput] = ENABLED;
+ if ((mFlags & kEnableGrallocUsageProtected) &&
+ mNativeWindow != NULL) {
+ // We push enough 1x1 blank buffers to ensure that one of
+ // them has made it to the display. This allows the OMX
+ // component teardown to zero out any protected buffers
+ // without the risk of scanning out one of those buffers.
+ pushBlankBuffersToNativeWindow();
+ }
+
setState(IDLE_TO_LOADED);
}
break;
@@ -3600,11 +3769,24 @@
mAsyncCompletion.wait(mLock);
}
+ bool isError = false;
switch (mState) {
case LOADED:
- case ERROR:
break;
+ case ERROR:
+ {
+ OMX_STATETYPE state = OMX_StateInvalid;
+ status_t err = mOMX->getState(mNode, &state);
+ CHECK_EQ(err, (status_t)OK);
+
+ if (state != OMX_StateExecuting) {
+ break;
+ }
+ // else fall through to the idling code
+ isError = true;
+ }
+
case EXECUTING:
{
setState(EXECUTING_TO_IDLE);
@@ -3639,6 +3821,12 @@
mAsyncCompletion.wait(mLock);
}
+ if (isError) {
+ // We were in the ERROR state coming in, so restore that now
+ // that we've idled the OMX component.
+ setState(ERROR);
+ }
+
break;
}
diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h
index d54b1c1..53e764f 100644
--- a/media/libstagefright/include/OMX.h
+++ b/media/libstagefright/include/OMX.h
@@ -59,6 +59,9 @@
node_id node, OMX_INDEXTYPE index,
const void *params, size_t size);
+ virtual status_t getState(
+ node_id node, OMX_STATETYPE* state);
+
virtual status_t enableGraphicBuffers(
node_id node, OMX_U32 port_index, OMX_BOOL enable);
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h
index 1ccf50d..47ca579 100644
--- a/media/libstagefright/include/OMXNodeInstance.h
+++ b/media/libstagefright/include/OMXNodeInstance.h
@@ -49,6 +49,8 @@
status_t getConfig(OMX_INDEXTYPE index, void *params, size_t size);
status_t setConfig(OMX_INDEXTYPE index, const void *params, size_t size);
+ status_t getState(OMX_STATETYPE* state);
+
status_t enableGraphicBuffers(OMX_U32 portIndex, OMX_BOOL enable);
status_t getGraphicBufferUsage(OMX_U32 portIndex, OMX_U32* usage);
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 33d3f30..3715fe9 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -303,6 +303,12 @@
index, params, size);
}
+status_t OMX::getState(
+ node_id node, OMX_STATETYPE* state) {
+ return findInstance(node)->getState(
+ state);
+}
+
status_t OMX::enableGraphicBuffers(
node_id node, OMX_U32 port_index, OMX_BOOL enable) {
return findInstance(node)->enableGraphicBuffers(port_index, enable);
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index b612f89..0ff398a 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -266,6 +266,14 @@
return StatusFromOMXError(err);
}
+status_t OMXNodeInstance::getState(OMX_STATETYPE* state) {
+ Mutex::Autolock autoLock(mLock);
+
+ OMX_ERRORTYPE err = OMX_GetState(mHandle, state);
+
+ return StatusFromOMXError(err);
+}
+
status_t OMXNodeInstance::enableGraphicBuffers(
OMX_U32 portIndex, OMX_BOOL enable) {
Mutex::Autolock autoLock(mLock);
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 4c7f84e..51b7c58 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -54,6 +54,12 @@
* <li>Optionally wraps, traces, and/or error-checks the renderer's OpenGL calls.
* </ul>
*
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use OpenGL, read the
+ * <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL</a> developer guide.</p>
+ * </div>
+ *
* <h3>Using GLSurfaceView</h3>
* <p>
* Typically you use GLSurfaceView by subclassing it and overriding one or more of the
@@ -636,6 +642,13 @@
* this interface, and then call {@link GLSurfaceView#setRenderer} to
* register the renderer with the GLSurfaceView.
* <p>
+ *
+ * <div class="special reference">
+ * <h3>Developer Guides</h3>
+ * <p>For more information about how to use OpenGL, read the
+ * <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL</a> developer guide.</p>
+ * </div>
+ *
* <h3>Threading</h3>
* The renderer will be called on a separate thread, so that rendering
* performance is decoupled from the UI thread. Clients typically need to
diff --git a/opengl/java/android/opengl/package.html b/opengl/java/android/opengl/package.html
index 7175b33..3c57af9 100644
--- a/opengl/java/android/opengl/package.html
+++ b/opengl/java/android/opengl/package.html
@@ -1,5 +1,8 @@
<HTML>
<BODY>
-Provides OpenGL utilities.
+<p>Provides an OpenGL ES static interface and utilities.</p>
+
+<p>For more information about how to use OpenGL, read the
+<a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL</a> developer guide.</p>
</BODY>
</HTML>
diff --git a/opengl/java/javax/microedition/khronos/opengles/package.html b/opengl/java/javax/microedition/khronos/opengles/package.html
new file mode 100644
index 0000000..0e3dbee
--- /dev/null
+++ b/opengl/java/javax/microedition/khronos/opengles/package.html
@@ -0,0 +1,8 @@
+<HTML>
+<BODY>
+<p>Provides a standard OpenGL interface.</p>
+
+<p>For more information about how to use OpenGL, read the
+<a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL</a> developer guide.</p>
+</BODY>
+</HTML>
\ No newline at end of file
diff --git a/packages/BackupRestoreConfirmation/res/values-bg/strings.xml b/packages/BackupRestoreConfirmation/res/values-bg/strings.xml
index 914750a..a431bf7 100644
--- a/packages/BackupRestoreConfirmation/res/values-bg/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-bg/strings.xml
@@ -25,10 +25,8 @@
<string name="allow_restore_button_label" msgid="3081286752277127827">"Възстановяване на данните ми"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Без възстановяване"</string>
<string name="current_password_text" msgid="8268189555578298067">"Моля, въведете текущата си парола за резервно копие по-долу:"</string>
- <!-- no translation found for device_encryption_restore_text (1570864916855208992) -->
- <skip />
- <!-- no translation found for device_encryption_backup_text (5866590762672844664) -->
- <skip />
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Моля, въведете паролата си за шифроване на устройството по-долу."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Моля, въведете паролата си за шифроване на устройството по-долу. Тя ще се използва и за шифроване на резервното копие на архива."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Моля, въведете парола, която да използвате за шифроване на пълното резервно копие на данните. Ако не е попълнена, ще бъде използвана текущата ви парола за резервно копие:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ако искате да шифровате пълното резервно копие на данните, въведете парола по-долу:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ако възстановените данни са шифровани, моля, въведете паролата по-долу:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-de/strings.xml b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
index 7a19b2e..a8f2d13 100644
--- a/packages/BackupRestoreConfirmation/res/values-de/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-de/strings.xml
@@ -26,7 +26,7 @@
<string name="deny_restore_button_label" msgid="1724367334453104378">"Nicht wiederherstellen"</string>
<string name="current_password_text" msgid="8268189555578298067">"Geben Sie Ihr aktuelles Sicherungspasswort unten ein:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"Geben Sie Ihr Passwort zur Geräteverschlüsselung unten ein."</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"Geben Sie Ihr Passwort zur Geräteverschlüsselung unten ein. Damit wird ebenfalls das Sicherungsarchiv verschlüsselt."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Geben Sie Ihr Passwort zur Geräteverschlüsselung unten ein. Damit wird auch das Sicherungsarchiv verschlüsselt."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Geben Sie ein Passwort für die Verschlüsselung der vollständigen Sicherungsdaten ein. Wenn Sie dieses Feld leer lassen, wird Ihr aktuelles Sicherungspasswort verwendet:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Wenn Sie die gesamten Sicherungsdaten verschlüsseln möchten, geben Sie unten ein Passwort ein:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Geben Sie das Passwort unten ein, wenn die Daten für die Wiederherstellung verschlüsselt sind:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml b/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml
index 7a732df..21afa31 100644
--- a/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-es-rUS/strings.xml
@@ -26,7 +26,7 @@
<string name="deny_restore_button_label" msgid="1724367334453104378">"No restaurar"</string>
<string name="current_password_text" msgid="8268189555578298067">"Introduce tu contraseña actual de copia de seguridad a continuación:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"Introduce tu contraseña de encriptación del dispositivo a continuación:"</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"Introduce tu contraseña de encriptación del dispositivo a continuación. Esto también se utilizará para encriptar la copia de seguridad."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Introduce tu contraseña de encriptación del dispositivo a continuación. Esta contraseña también se utilizará para encriptar la copia de seguridad."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Introduce una contraseña para encriptar los datos de la copia de seguridad completa. Si dejas este campo en blanco, se utilizará tu contraseña actual de copia de seguridad:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Si deseas encriptar los datos de la copia de seguridad completa, introduce una contraseña a continuación:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Si los datos de recuperación están encriptados, vuelve a introducir la contraseña a continuación:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-hr/strings.xml b/packages/BackupRestoreConfirmation/res/values-hr/strings.xml
index 0c4cfd9..c5c4ce9 100644
--- a/packages/BackupRestoreConfirmation/res/values-hr/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-hr/strings.xml
@@ -25,10 +25,8 @@
<string name="allow_restore_button_label" msgid="3081286752277127827">"Vrati moje podatke"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Ne vraćaj"</string>
<string name="current_password_text" msgid="8268189555578298067">"U nastavku unesite trenutačnu zaporku za sigurnosnu kopiju:"</string>
- <!-- no translation found for device_encryption_restore_text (1570864916855208992) -->
- <skip />
- <!-- no translation found for device_encryption_backup_text (5866590762672844664) -->
- <skip />
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"U nastavku unesite svoju zaporku za enkripciju uređaja."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"U nastavku unesite svoju zaporku enkripcije za uređaj. Ona će se upotrijebiti i za enkripciju te za arhivu sigurnosnih kopija."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Unesite zaporku koju ćete upotrebljavati za kriptiranje podataka potpune sigurnosne kopije. Ako je ostavite praznom, bit će upotrijebljena vaša trenutačna zaporka za sigurnosno kopiranje:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Ako želite kriptirati podatke potpune sigurnosne kopije, u nastavku unesite zaporku:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Ako su podaci za vraćanje kriptirani, unesite zaporku u nastavku:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-in/strings.xml b/packages/BackupRestoreConfirmation/res/values-in/strings.xml
index 65196bd..3fb6d6b 100644
--- a/packages/BackupRestoreConfirmation/res/values-in/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-in/strings.xml
@@ -25,10 +25,8 @@
<string name="allow_restore_button_label" msgid="3081286752277127827">"Memulihkan data saya"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Jangan pulihkan"</string>
<string name="current_password_text" msgid="8268189555578298067">"Masukkan sandi cadangan Anda saat ini di bawah:"</string>
- <!-- no translation found for device_encryption_restore_text (1570864916855208992) -->
- <skip />
- <!-- no translation found for device_encryption_backup_text (5866590762672844664) -->
- <skip />
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Masukkan sandi enkripsi perangkat Anda di bawah."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Masukkan sandi enkripsi perangkat Anda di bawah. Sandi ini juga akan digunakan untuk mengenkripsi arsip cadangan."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Masukkan sandi yang digunakan untuk mengenkripsi data cadangan lengkap. Jika bidang ini dikosongkan, sandi cadangan Anda saat ini akan digunakan:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Jika Anda ingin mengenkripsi data cadangan lengkap, masukkan sandi di bawah:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Jika data pemulihan dienkripsi, masukkan sandi di bawah:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-ja/strings.xml b/packages/BackupRestoreConfirmation/res/values-ja/strings.xml
index 5ddcc22..98916c5 100644
--- a/packages/BackupRestoreConfirmation/res/values-ja/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ja/strings.xml
@@ -25,10 +25,8 @@
<string name="allow_restore_button_label" msgid="3081286752277127827">"データを復元する"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"復元しない"</string>
<string name="current_password_text" msgid="8268189555578298067">"以下に現在のバックアップ用のパスワードを入力してください:"</string>
- <!-- no translation found for device_encryption_restore_text (1570864916855208992) -->
- <skip />
- <!-- no translation found for device_encryption_backup_text (5866590762672844664) -->
- <skip />
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"以下に端末暗号化用のパスワードを入力してください。"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"以下に端末暗号化用のパスワードを入力してください。このパスワードはバックアップアーカイブの暗号化にも使用します。"</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"フルバックアップデータの暗号化に使用するパスワードを入力してください。空白のままにした場合、現在のバックアップ用のパスワードが使用されます:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"フルバックアップのデータを暗号化する場合は、以下にパスワードを入力してください:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"復元するデータが暗号化されている場合、以下にパスワードを入力してください:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-nb/strings.xml b/packages/BackupRestoreConfirmation/res/values-nb/strings.xml
index a04d90d..a93c081 100644
--- a/packages/BackupRestoreConfirmation/res/values-nb/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-nb/strings.xml
@@ -18,10 +18,10 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="backup_confirm_title" msgid="827563724209303345">"Fullstendig sikkerhetskopi"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"Fullstendig gjenoppretting"</string>
- <string name="backup_confirm_text" msgid="1878021282758896593">"En full sikkerhetskopi av alle dataene til en tilkoblet stasjonær datamaskin er forespurt. Vil du tillate dette?"\n\n"Hvis du ikke har bedt om sikkerhetskopieringen selv, må du ikke tillate at operasjonen fortsetter."</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"En full sikkerhetskopi av alle dataene til en tilkoblet datamaskin er forespurt. Vil du tillate dette?"\n\n"Hvis du ikke har bedt om sikkerhetskopieringen selv, må du ikke tillate at operasjonen fortsetter."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Sikkerhetskopier dataene mine"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Ikke sikkerhetskopiér"</string>
- <string name="restore_confirm_text" msgid="7499866728030461776">"En full gjenoppretting av alle data fra en tilkoblet stasjonær datamaskin er forespurt. Vil du tillate dette?"\n\n"Hvis du ikke har bedt om gjenopprettingen selv, må du ikke la operasjonen fortsette. Handlingen vil erstatte alle dataene som ligger på enheten!"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"En full gjenoppretting av alle data fra en tilkoblet datamaskin er forespurt. Vil du tillate dette?"\n\n"Hvis du ikke har bedt om gjenopprettingen selv, må du ikke la operasjonen fortsette. Handlingen vil erstatte alle dataene som ligger på enheten!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"Gjenopprett dataene mine"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Ikke gjenopprett"</string>
<string name="current_password_text" msgid="8268189555578298067">"Skriv inn ditt nåværende passord for sikkerhetskopiering nedenfor:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
index 82cdfaf..4c49bf8 100644
--- a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
@@ -25,10 +25,8 @@
<string name="allow_restore_button_label" msgid="3081286752277127827">"Restabiliţi datele dvs."</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Nu restabiliţi"</string>
<string name="current_password_text" msgid="8268189555578298067">"Introduceţi mai jos parola actuală pentru copia de rezervă:"</string>
- <!-- no translation found for device_encryption_restore_text (1570864916855208992) -->
- <skip />
- <!-- no translation found for device_encryption_backup_text (5866590762672844664) -->
- <skip />
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"Introduceţi mai jos parola pentru criptarea dispozitivului."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Introduceţi mai jos parola de criptare a dispozitivului. Aceasta va fi utilizată, de asemenea, pentru a cripta arhiva copiei de rezervă."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Introduceţi o parolă pentru a o utiliza la criptarea datelor copiei de rezervă complete. Dacă acest câmp rămâne necompletat, pentru copierea de rezervă se va utiliza parola dvs. actuală."</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Dacă doriţi să criptaţi datele copiei de rezervă complete, introduceţi o parolă mai jos:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Dacă datele pentru restabilire sunt criptate, introduceţi parola mai jos:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-ru/strings.xml b/packages/BackupRestoreConfirmation/res/values-ru/strings.xml
index 2ce3ff6..98b8bfc 100644
--- a/packages/BackupRestoreConfirmation/res/values-ru/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ru/strings.xml
@@ -26,7 +26,7 @@
<string name="deny_restore_button_label" msgid="1724367334453104378">"Не восстанавливать"</string>
<string name="current_password_text" msgid="8268189555578298067">"Введите пароль для резервного копирования:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"Введите пароль для шифрования устройства."</string>
- <string name="device_encryption_backup_text" msgid="5866590762672844664">"Введите пароль для шифрования устройства, а также архива резервных копий."</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"Введите пароль для шифрования устройства и архива резервных копий."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Введите пароль для шифрования всех резервных данных. Если поле останется пустым, будет использован текущий пароль:"</string>
<string name="backup_enc_password_optional" msgid="1350137345907579306">"Чтобы зашифровать все резервные данные, введите пароль:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Если восстановленные данные зашифрованы, введите пароль:"</string>
diff --git a/packages/SystemUI/res/anim/recent_appear.xml b/packages/SystemUI/res/anim/recent_appear.xml
index 20fe052..4400d9d 100644
--- a/packages/SystemUI/res/anim/recent_appear.xml
+++ b/packages/SystemUI/res/anim/recent_appear.xml
@@ -16,5 +16,5 @@
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_mediumAnimTime"
+ android:duration="@android:integer/config_shortAnimTime"
/>
diff --git a/packages/SystemUI/res/drawable-hdpi/global_screenshot_background.9.png b/packages/SystemUI/res/drawable-hdpi/global_screenshot_background.9.png
deleted file mode 100644
index e14111d..0000000
--- a/packages/SystemUI/res/drawable-hdpi/global_screenshot_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.png
index 4a1d37e..84e6bc8 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_default.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_default.png
index a371caa..3071fb3 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_default.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_ime_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_land.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_land.png
index 5a172a8..782d214 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_land.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_back_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_highlight.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_highlight.png
index 9378fac..7b10824 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_highlight.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_highlight.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
index 908056f..38e4f45 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home_land.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home_land.png
index 843cd9d..c39f7b1 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home_land.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.png
index 6db0c05..bf9f300 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent_land.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent_land.png
index 113f1f6..194c51f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent_land.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_recent_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/screenshot_panel.9.png b/packages/SystemUI/res/drawable-hdpi/screenshot_panel.9.png
new file mode 100644
index 0000000..9447e01
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/screenshot_panel.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_notify_image.png b/packages/SystemUI/res/drawable-hdpi/stat_notify_image.png
new file mode 100644
index 0000000..319f925
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_notify_image.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_notify_image_error.png b/packages/SystemUI/res/drawable-hdpi/stat_notify_image_error.png
new file mode 100644
index 0000000..fa8d4bf
--- /dev/null
+++ b/packages/SystemUI/res/drawable-hdpi/stat_notify_image_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
index cbd9b87..72e6821 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/global_screenshot_background.9.png b/packages/SystemUI/res/drawable-mdpi/global_screenshot_background.9.png
deleted file mode 100644
index e14111d..0000000
--- a/packages/SystemUI/res/drawable-mdpi/global_screenshot_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png
index 39e3df0..a00bc5b 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png
index aadee3b..72b5ffe 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_ime_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_land.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_land.png
index 98954aa..8605701 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_land.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
index 9820a79..dc3183b 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_land.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_land.png
index 556de0a..5dff6e7 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_land.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent.png
index 358c5ca..b07f611 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_land.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_land.png
index 7a6ddd9..47e209e 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_land.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_recent_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/screenshot_panel.9.png b/packages/SystemUI/res/drawable-mdpi/screenshot_panel.9.png
new file mode 100644
index 0000000..7f1aea1
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/screenshot_panel.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_notify_image.png b/packages/SystemUI/res/drawable-mdpi/stat_notify_image.png
new file mode 100644
index 0000000..5036e8d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_notify_image.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_notify_image_error.png b/packages/SystemUI/res/drawable-mdpi/stat_notify_image_error.png
new file mode 100644
index 0000000..94487bf
--- /dev/null
+++ b/packages/SystemUI/res/drawable-mdpi/stat_notify_image_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
index faefe36..900a717 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/global_screenshot_background.9.png b/packages/SystemUI/res/drawable-xhdpi/global_screenshot_background.9.png
deleted file mode 100644
index db116b1..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/global_screenshot_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back.png
index faeee29..bd60cd6 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_default.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_default.png
index 88ef1b9..7f05602 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_default.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_ime_default.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_land.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_land.png
index 34bfaf7..5272c91a 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_land.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_back_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
index 0b41317..c5bc5c9 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home_land.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home_land.png
index 234d434..33e1801 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home_land.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent.png
index 09eeb7d..f621d9c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent_land.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent_land.png
index 874eaf5..b530638 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent_land.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_recent_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/screenshot_panel.9.png b/packages/SystemUI/res/drawable-xhdpi/screenshot_panel.9.png
new file mode 100644
index 0000000..e5cfc36
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/screenshot_panel.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_notify_image.png b/packages/SystemUI/res/drawable-xhdpi/stat_notify_image.png
new file mode 100644
index 0000000..3c5c082
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_notify_image.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_notify_image_error.png b/packages/SystemUI/res/drawable-xhdpi/stat_notify_image_error.png
new file mode 100644
index 0000000..8aa19e4
--- /dev/null
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_notify_image_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png
index a8e8e0f..d2d03cd 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_ringer_vibrate.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable/status_bar_recents_background.xml b/packages/SystemUI/res/drawable/status_bar_recents_background.xml
index 8b22bf1..7831db0 100644
--- a/packages/SystemUI/res/drawable/status_bar_recents_background.xml
+++ b/packages/SystemUI/res/drawable/status_bar_recents_background.xml
@@ -17,9 +17,9 @@
*/
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient name="status_bar_recents_background"
- android:startColor="#cc000000"
- android:endColor="#66000000"
- android:angle="@integer/status_bar_recents_bg_gradient_degrees"
- />
+ <gradient name="status_bar_recents_background"
+ android:startColor="#e6000000"
+ android:endColor="#c0000000"
+ android:angle="@integer/status_bar_recents_bg_gradient_degrees"
+ />
</shape>
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
index 83c4faf..2d76455 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
@@ -39,11 +39,11 @@
android:layout_marginTop="@dimen/status_bar_recents_thumbnail_top_margin"
android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_left_margin"
android:background="@drawable/recents_thumbnail_bg"
- android:foreground="@drawable/recents_thumbnail_fg">
+ android:foreground="@drawable/recents_thumbnail_fg"
+ android:visibility="invisible">
<ImageView android:id="@+id/app_thumbnail_image"
android:layout_width="@dimen/status_bar_recents_thumbnail_width"
android:layout_height="@dimen/status_bar_recents_thumbnail_height"
- android:visibility="invisible"
/>
</FrameLayout>
@@ -58,7 +58,6 @@
android:maxHeight="@dimen/status_bar_recents_app_icon_max_height"
android:scaleType="centerInside"
android:adjustViewBounds="true"
- android:visibility="invisible"
/>
<TextView android:id="@+id/app_label"
@@ -74,7 +73,6 @@
android:layout_marginLeft="@dimen/status_bar_recents_app_label_left_margin"
android:singleLine="true"
android:ellipsize="marquee"
- android:visibility="invisible"
android:textColor="@color/status_bar_recents_app_label_color"
/>
diff --git a/packages/SystemUI/res/layout-port/status_bar_recent_item.xml b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
index 3d8b9d6..b653fcd 100644
--- a/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-port/status_bar_recent_item.xml
@@ -52,11 +52,11 @@
android:layout_toRightOf="@id/app_label"
android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_left_margin"
android:background="@drawable/recents_thumbnail_bg"
- android:foreground="@drawable/recents_thumbnail_fg">
+ android:foreground="@drawable/recents_thumbnail_fg"
+ android:visibility="invisible">
<ImageView android:id="@+id/app_thumbnail_image"
android:layout_width="@dimen/status_bar_recents_thumbnail_width"
android:layout_height="@dimen/status_bar_recents_thumbnail_height"
- android:visibility="invisible"
/>
</FrameLayout>
<View android:id="@+id/recents_callout_line"
diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
index e6336718..18a31f7 100644
--- a/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_recent_item.xml
@@ -31,11 +31,11 @@
android:layout_marginLeft="@dimen/status_bar_recents_thumbnail_left_margin"
android:scaleType="center"
android:background="@drawable/recents_thumbnail_bg"
- android:foreground="@drawable/recents_thumbnail_fg">
+ android:foreground="@drawable/recents_thumbnail_fg"
+ android:visibility="invisible">
<ImageView android:id="@+id/app_thumbnail_image"
android:layout_width="@dimen/status_bar_recents_thumbnail_width"
android:layout_height="@dimen/status_bar_recents_thumbnail_height"
- android:visibility="invisible"
/>
<ImageView android:id="@+id/app_icon"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml
index 6d70135..d416af9 100644
--- a/packages/SystemUI/res/layout/global_screenshot.xml
+++ b/packages/SystemUI/res/layout/global_screenshot.xml
@@ -26,11 +26,16 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:background="@drawable/global_screenshot_background"
+ android:background="@drawable/screenshot_panel"
android:visibility="gone">
<ImageView android:id="@+id/global_screenshot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true" />
</FrameLayout>
+ <ImageView android:id="@+id/global_screenshot_flash"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#FFFFFFFF"
+ android:visibility="gone" />
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml
index 25bc2ea..d19fd81 100644
--- a/packages/SystemUI/res/layout/navigation_bar.xml
+++ b/packages/SystemUI/res/layout/navigation_bar.xml
@@ -156,7 +156,7 @@
android:layout_height="match_parent"
android:layout_width="match_parent"
android:visibility="gone"
- android:paddingTop="24dp"
+ android:paddingTop="0dp"
>
<LinearLayout
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index cde7613..617e475 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Strek om skerm te vul"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Versoenbaarheid-zoem"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"As \'n program vir \'n kleiner skerm ontwerp is, sal \'n zoemkontrole naby die horlosie verskyn"</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Stoor tans kiekie..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Stoor tans skermkiekie..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Skermkiekie word tans gestoor."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skermkiekie geneem."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Raak om jou skermkiekie te sien."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Kon nie skermkiekie neem nie"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Kon nie skermkiekie stoor nie. Geheue kan dalk in gebruik wees."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-lêeroordrag-opsies"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Heg as \'n mediaspeler (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Heg as \'n kamera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter geaktiveer."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Luitoestel-vibreer."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Luitoestel stil."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwerp."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-data gedeaktiveer"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data gedeaktiveer"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobieldata gedeaktiveer"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index e7a19cc..299e6d9 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"ማያ ለመሙለት ሳብ"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"የተኳኋኝነት አጉላ"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"ትግበራ ለትንሽ ማያ ሲነደፍ፣ የአጉላ መቆመጣጠሪያ በሰዓት በኩል ብቅ ይላል።"</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"ቅጽበታዊ ገጽ እይታ እየተቀመጠ ነው::"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"ቅጽበታዊ ገጽ እይታ ተቀርጿል"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"ያንተን ቅጽበታዊ ገጽ እይታ ለማየት ንካ"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ቅጽበታዊ ገጽ እይታ መቅረጽ አልተቻለም::"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"የማያ ፎቶማስቀመጥ አልተቻለም። ማከማቻም አገልግሎት ላይ ሊሆን ይችላል።"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"የUSB ፋይል ሰደዳ አማራጮች"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"እንደ ማህደረ አጫዋች (MTP) ሰካ"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"እንደ ካሜራ (PTP) ሰካ"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter ነቅቷል።"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"የስልክ ጥሪ ይንዘር።"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"የስልክ ጥሪ ፀጥታ።"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ተሰናብቷል::"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G ውሂብ ቦዝኗል"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G ውሂብ ቦዝኗል"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"የተንቀሳቃሽ ውሂብ ቦዝኗል"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 8c35ba7..07b07e1 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"توسيع بملء الشاشة"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"تكبير/تصغير التوافق"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"عند تصميم تطبيق لشاشة أصغر، سيظهر عنصر تحكم في التكبير/التصغير بجوار الساعة."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"جارٍ حفظ لقطة الشاشة..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"جارٍ حفظ لقطة الشاشة..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"يتم حفظ لقطة."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"تم التقاط لقطة الشاشة."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"المس لعرض لقطة الشاشة."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"تعذر التقاط لقطة الشاشة."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"تعذر حفظ لقطة الشاشة. قد يكون التخزين قيد الاستخدام."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"خيارات نقل الملفات عبر USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"تحميل كمشغل وسائط (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"تحميل ككاميرا (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"تم تمكين المبرقة الكاتبة."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"رنين مع الاهتزاز."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"رنين صامت."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"تمت إزالة <xliff:g id="APP">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"تم تعطيل بيانات شبكات الجيل الثاني والجيل الثالث"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"تم تعطيل بيانات شبكة الجيل الرابع"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"تم تعطيل بيانات الجوال"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 1b5244e..937f924 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Разпъване – запълва екрана"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Промяна на мащаба за съвместимост"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Когато дадено приложение е създадено за по-малък екран, до часовника ще се покаже управление за промяна на мащаба."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Екранната снимка се запазва..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Екранната снимка се запазва..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Екранната снимка се запазва."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Екранната снимка е заснета."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Докоснете, за да видите екранната си снимка."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Екранната снимка не можа да бъде заснета."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Екранната снимка не можа да бъде запазена. Възможно е хранилището да се използва."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Опции за пренос на файлове чрез USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Свързване като медиен плейър (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Свързване като камера (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter бе активиран."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Вибрира при звънене."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Звънът е заглушен."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Приложението <xliff:g id="APP">%s</xliff:g> е отхвърлено."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G данните са деактивирани"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G данните са деактивирани"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Мобилните данни са деактивирани"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index c9bda33..71ec5a2 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Estira per omplir pant."</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom de compatibilitat"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Quan una aplicació s\'hagi dissenyat per a una pantalla més petita, apareixerà un control de zoom al costat del rellotge."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Desant captura de pantalla..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"S\'està desant la captura de pantalla..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"La captura de pantalla s\'ha desat."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"S\'ha fet una captura de pantalla."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Toca per veure la captura de pantalla."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"No s\'ha pogut fer una captura de pantalla."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"No s\'ha pogut desar la captura de pantalla. És possible que l\'emmagatzematge estigui en ús."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opcions transf. fitxers USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Munta com a reproductor multimèdia (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Munta com a càmera (PTP)"</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Teletip activat."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Mode vibració."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Mode silenci."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"S\'ha omès <xliff:g id="APP">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dades 2G-3G desactivades"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dades 4G desactivades"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Dades mòbils desactivades"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 1ae0071..a0932b2 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -42,7 +42,7 @@
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavení"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Režim V letadle"</string>
- <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatické otočení obrazovky"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Autom. otočení obrazovky"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"ZTLUM."</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"Oznámení"</string>
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Na celou obrazovku"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kompatibilní přiblížení"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Pokud je aplikace navržena pro menší obrazovku, zobrazí se vedle hodin ovládací prvek přiblížení."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ukládání snímku obrazovky..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Ukládání snímku obrazovky..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Probíhá ukládání snímku obrazovky."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Snímek obrazovky byl zachycen."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Snímek obrazovky zobrazíte dotykem."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Snímek obrazovky se nepodařilo zachytit."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Snímek obrazovky se nepodařilo uložit. Je možné, že je externí úložiště právě používáno."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Možnosti přenosu souborů pomocí rozhraní USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Připojit jako přehrávač médií (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Připojit jako fotoaparát (PTP)"</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Rozhraní TeleTypewriter zapnuto."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibrační vyzvánění."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Tiché vyzvánění."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikace <xliff:g id="APP">%s</xliff:g> byla odebrána."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datové přenosy 2G a 3G jsou zakázány"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datové přenosy 4G jsou zakázány"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobilní data jsou zakázána"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index f1704b1..49e027c 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Stræk til fuld skærm"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kompatibilitetszoom"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Når en app er udviklet til en mindre skærm, vises der en zoomfunktion ved uret."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Gemmer skærmbillede..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Gemmer skærmbillede..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Skærmbilledet gemmes."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skærmbilledet er taget."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Tryk for at se dit skærmbillede."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Skærmbilledet kunne ikke tages."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Skærmbilledet kunne ikke gemmes. Eksternt lager kan være i brug."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Muligheder for USB-filoverførsel"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Isæt som en medieafspiller (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Isæt som et kamera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter aktiveret."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Ringervibration."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Lydløs."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> er annulleret."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-data er deaktiveret"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-data er deaktiveret"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobildata er deaktiveret"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index e5d23ad..5a18d11 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Auf Bildschirmgröße anpassen"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kompatibilitätszoom"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Wenn eine App für einen kleineren Bildschirm ausgelegt ist, wird ein Zoom-Steuerelement neben der Uhr angezeigt."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Screenshot wird gespeichert..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot wird gespeichert..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot wird gespeichert..."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot aufgenommen"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Zum Anzeigen Ihres Screenshots berühren"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Screenshot konnte nicht aufgenommen werden."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Screenshot konnte nicht gespeichert werden. Eventuell wird der Speicher gerade verwendet."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-Dateiübertragungsoptionen"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Als Medienplayer (MTP) bereitstellen"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Als Kamera (PTP) bereitstellen"</string>
@@ -119,7 +112,9 @@
<string name="accessibility_no_sim" msgid="8274017118472455155">"Keine SIM-Karte"</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-Tethering"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Flugmodus"</string>
- <string name="accessibility_battery_level" msgid="7451474187113371965">"Akku bei <xliff:g id="NUMBER">%d</xliff:g> Prozent"</string>
+ <!-- String.format failed for translation -->
+ <!-- no translation found for accessibility_battery_level (7451474187113371965) -->
+ <skip />
<string name="accessibility_settings_button" msgid="799583911231893380">"Systemeinstellungen"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Benachrichtigungen"</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"Benachrichtigung löschen"</string>
@@ -128,13 +123,12 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Schreibtelefonie aktiviert"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Klingeltonmodus \"Vibration\""</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Klingelton lautlos"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> entfernt"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-/3G-Daten deaktiviert"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-Daten deaktiviert"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobile Daten deaktiviert"</string>
<string name="data_usage_disabled_dialog_title" msgid="2086815304858964954">"Daten deaktiviert"</string>
- <string name="data_usage_disabled_dialog" msgid="6524467913290900042">"Das für die Datennutzung festgelegte Limit wurde erreicht."\n\n"Eine weitere Datennutzung kann mit zusätzlichen Kosten vonseiten des Mobilfunkanbieters verbunden sein."</string>
+ <string name="data_usage_disabled_dialog" msgid="6524467913290900042">"Das für den Datenverbrauch festgelegte Limit wurde erreicht."\n\n"Weiterer Datenverbrauch kann mit zusätzlichen Kosten vonseiten des Mobilfunkanbieters verbunden sein."</string>
<string name="data_usage_disabled_dialog_enable" msgid="7729772039208664606">"Daten erneut aktivieren"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Keine Internetverbindung"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"WLAN verbunden"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index aca9004..e3e8cff 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Προβoλή σε πλήρη οθ."</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Ζουμ για συμβατότητα"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Όταν μια εφαρμογή έχει σχεδιαστεί για προβολή σε μικρότερη οθόνη, δίπλα από το ρολόι θα εμφανιστεί ένα στοιχείο ελέγχου ζουμ."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Αποθήκ. στιγμιότυπου οθόνης..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Αποθήκευση στιγμιότυπου οθόνης..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Γίνεται αποθήκευση του στιγμιότυπου οθόνης."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Λήφθηκε το στιγμιότυπο οθόνης ."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Αγγίξτε για να δείτε το στιγμιότυπο οθόνης σας"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Αδύνατη η αποθήκευση του στιγμιότυπου οθόνης."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Αδύνατη η αποθήκευση στιγμιότυπου οθόνης. Ο εξωτερικός χώρος αποθήκευσης μπορεί να είναι σε χρήση."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Επιλογές μεταφοράς αρχείων μέσω USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Προσάρτηση ως μονάδας αναπαραγωγής μέσων (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Προσάρτηση ως κάμερας (PTP)"</string>
@@ -117,7 +110,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="1127208787254436420">"WiFi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Δεν υπάρχει SIM."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth tethering"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Πρόσδεση Bluetooth"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Λειτουργία πτήσης."</string>
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Το TeleTypewriter ενεργοποιήθηκε."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Δόνηση ειδοποίησης ήχου."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ειδοποίηση ήχου στο αθόρυβο."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Απορρίφθηκαν <xliff:g id="APP">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Τα δεδομένα 2G-3G απενεργοποιήθηκαν"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Τα δεδομένα 4G απενεργοποιήθηκαν"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Τα δεδομένα κινητής τηλεφωνίας απενεργοποιήθηκαν"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index d8b0408..53e298b 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Compatibility Zoom"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"When an app was designed for a smaller screen, a zoom control will appear by the clock."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Saving screenshot…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot is being saved."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot captured."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Touch to view your screenshot."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Couldn\'t capture screenshot."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Couldn\'t save screenshot. Storage may be in use."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB file transfer options"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Mount as a media player (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Mount as a camera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter enabled."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Ringer vibrate."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Ringer silent."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G data disabled"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G data disabled"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobile data disabled"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index b21a1c7..192a687 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Estirar p/ ocupar la pantalla"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom de compatibilidad"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Cuando una aplicación fue diseñada para una pantalla más pequeña, aparece un control de zoom junto al reloj."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Guardando captura de pantalla"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando la captura de pantalla..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"La captura de pantalla se está guardando."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Se guardó la captura de pantalla."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Toca para ver tu captura de pantalla."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"No se pudo guardar la captura de pantalla."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"No se pudo guardar la captura de pantalla. Puede que el almacenamiento esté en uso."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Activar como reproductor de medios (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Activar como cámara (PTP)"</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter habilitado"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Timbre en vibración"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Timbre en silencio"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartada."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datos de 2G-3G inhabilitados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datos de 4G inhabilitados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Se inhabilitaron los datos móviles"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 367791a..5f9eb6a 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Expandir para ajustar"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom de compatibilidad"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Si la aplicación se ha diseñado para una pantalla más pequeña, aparecerá un control de zoom junto al reloj."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Guardando captura..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando captura..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"La captura de pantalla se está guardando."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura de pantalla guardada"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Toca para ver la captura de pantalla"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"No se ha podido guardar la captura de pantalla."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"No se ha podido guardar la captura de pantalla. Puede que el almacenamiento esté en uso."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Activar como reproductor de medios (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Activar como cámara (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Teletipo habilitado"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Modo vibración"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Modo silencio"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Se ha eliminado <xliff:g id="APP">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datos 2G-3G inhabilitados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datos 4G inhabilitados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Datos móviles inhabilitados"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index ef1bf8e..0e20da0 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"گسترده کردن برای پر کردن صفحه"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"بزرگنمایی سازگاری"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"اگر یک برنامه برای صفحه کوچک تری طراحی شده باشد، یک کنترل بزرگنمایی توسط ساعت نشان داده می شود."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"در حال ذخیره تصویر صفحه..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"در حال ذخیره تصویر صفحه..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"تصویر صفحه ذخیره شد."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"تصویر صفحه گرفته شد."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"برای مشاهده تصویر صفحه خود، لمس کنید."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"تصویر صفحه گرفته نشد."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"تصویر صفحه ذخیره نشد. ممکن است دستگاه ذخیره در حال استفاده باشد."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"گزینه های انتقال فایل USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"نصب به عنوان دستگاه پخش رسانه (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"تصب به عنوان دوربین (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter فعال شد."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"زنگ لرزشی."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"زنگ بیصدا."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> نادیده گرفته شد."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"داده 2G-3G غیرفعال شد"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"داده 4G غیر فعال شد"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"دادههای تلفن همراه غیرفعال است"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 5ffa449..346bb57 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Venytä koko näyttöön"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Yhteensopivuustilan zoomaus"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Jos sovellus on suunniteltu pienemmälle näytölle, kellon viereen tulee näkyviin zoomaussäädin."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Tallennetaan kuvakaappausta..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Tallennetaan kuvakaappausta..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Kuvakaappausta tallennetaan."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Kuvakaappaus tallennettu"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Katso kuvakaappaus koskettamalla."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Kuvakaappausta ei voitu tallentaa"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Kuvakaappauksen tallennus epäonnistui. Ulkoinen tallennustila voi olla käytössä."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-tiedostonsiirtoasetukset"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Käytä mediasoittimena (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Käytä kamerana (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Tekstipuhelin käytössä."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Soittoääni: värinä."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Soittoääni: äänetön."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> hylättiin."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-tiedonsiirto pois käytöstä"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-tiedonsiirto pois käytöstä"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobiilitiedonsiirto pois käytöstä"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 29c608e..55d101a 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom de compatibilité"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Si une application a été conçue pour un écran plus petit, une commande de zoom s\'affiche à côté de l\'horloge."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Enregistrement capture écran…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Enregistrement de la capture d\'écran…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Enregistrement de la capture d\'écran en cours…"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Capture d\'écran réussie"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Appuyez pour afficher votre capture d\'écran."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Impossible de réaliser une capture d\'écran"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Impossible enregistrer capture d\'écran. Périphérique de stockage peut-être en cours d\'utilisation."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Installer en tant que lecteur multimédia (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Installer en tant qu\'appareil photo (PTP)"</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Téléscripteur activé"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Sonnerie en mode vibreur"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Données 2G-3G désactivées"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Données 4G désactivées"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Données mobiles désactivées"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 688cc1b..f6b5865 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"स्क्रीन को भरने के लिए खींचें"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"संगतता ज़ूम"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"जब किसी छोटी स्क्रीन के लिए एप्लिकेशन को डिज़ाइन किया जाता है, तो ज़ूम नियंत्रण क्लॉक के पास दिखाई देगा."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"स्क्रीनशॉट सहेजा जा रहा है..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"स्क्रीनशॉट सहेजा जा रहा है..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"स्क्रीनशॉट सहेजा जा रहा है."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"स्क्रीनशॉट कैप्चर किया गया."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"अपना स्क्रीनशॉट देखने के लिए स्पर्श करें."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"स्क्रीनशॉट को कैप्चर नहीं किया जा सका."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"स्क्रीनशॉट को सहेजा नहीं जा सका. संभवत: संग्रहण उपयोग में है."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB फ़ाइल स्थानांतरण विकल्प"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"मीडिया प्लेयर के रूप में माउंट करें (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"कैमरे के रूप में माउंट करें (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"टेलीटाइपराइटर सक्षम."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"रिंगर कंपन."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"रिंगर मौन."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खा़रिज कर दिया गया."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G डेटा अक्षम"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G डेटा अक्षम"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"मोबाइल डेटा अक्षम"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 017c72f..d0ec22c 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Rastegni i ispuni zaslon"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kompatibilni zum"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Kada je aplikacija dizajnirana za manji zaslon, kontrole zumiranja prikazuju se pored sata."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Spremanje snimke zaslona..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Spremanje snimke zaslona..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Spremanje snimke zaslona."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Zaslon je snimljen."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Dodirnite za prikaz snimke zaslona."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Nije bilo moguće snimiti zaslon."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Nije bilo moguće spremiti snimku zaslona. Možda se upotrebljava pohrana."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opcije USB prijenosa datoteka"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Učitaj kao media player (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Učitaj kao fotoaparat (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter je omogućen."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibracija softvera zvona."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Softver zvona utišan."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> odbačena je."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Onemogućeni su 2G-3G podaci"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Onemogućeni su 4G podaci"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Onemogućeni su mobilni podaci"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 73ae3dc..85353d5 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Nyújtás kitöltéshez"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kompatibilitás -- nagyítás/kicsinyítés"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Ha egy alkalmazást kisebb képernyőre terveztek, akkor a nagyítás/kicsinyítés vezérlője az óra mellett jelenik meg."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Képernyőkép mentése..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Képernyőkép mentése..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Képernyőkép mentése."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Képernyőkép rögzítve."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Megérintésével megtekintheti a képernyőképet."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Nem sikerült rögzíteni a képernyőképet."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Nem lehet menteni a képernyőképet. Lehet, hogy a tároló használatban van."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-fájlátvitel beállításai"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Csatlakoztatás médialejátszóként (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Csatlakoztatás kameraként (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter engedélyezve."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Csengő rezeg."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Csengő néma."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eltávolítva."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G adatforgalom letiltva"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G adatforgalom letiltva"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobil adatforgalom letiltva"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 1f53b1b..d70f605 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Rentangkn utk mngisi layar"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom Kompatibilitas"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Saat apl dirancang untuk layar yang lebih kecil, kontrol zoom akan tampil di dekat jam."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan tangkapan layar..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan tangkapan layar..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Tangkapan layar sedang disimpan."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Tangkapan layar diambil."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Sentuh untuk melihat tangkapan layar Anda."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Tidak dapat mengambil tangkapan layar."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Tidak dapat menyimpan tangkapan layar. Penyimpanan mungkin sedang digunakan."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opsi transfer berkas USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Pasang sebagai pemutar media (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Pasang sebagai kamera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter diaktifkan."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Pendering bergetar."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Pendering senyap."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> disingkirkan."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data 2G-3G dinonaktifkan"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data 4G dinonaktifkan"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Data seluler dinonaktifkan"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index c2cb0e7..b40bca3 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Estendi per riemp. schermo"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom compatibilità"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Se un\'applicazione è stata progettata per uno schermo più piccolo, accanto all\'orologio viene visualizzato un controllo dello zoom."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvataggio screenshot..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Salvataggio screenshot..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot in corso di salvataggio."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot acquisito."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Tocca per visualizzare il tuo screenshot."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Impossibile acquisire lo screenshot."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Impossibile salvare lo screenshot. L\'archivio esterno potrebbe essere in uso."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opzioni trasferimento file USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Monta come lettore multimediale (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Monta come videocamera (PTP)"</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Telescrivente abilitata."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Suoneria vibrazione."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Suoneria silenziosa."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eliminata."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dati 2G-3G disattivati"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dati 4G disattivati"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Dati mobili disattivati"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index cdd36a6..d54c7e2 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"מתח כדי למלא את המסך"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"שינוי מרחק מתצוגה לתאימות"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"כאשר יישום מיועד למסך קטן יותר, פקד של מרחק מתצוגה יופיע ליד השעון."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"שומר צילום מסך..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"שומר צילום מסך..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"מתבצעת שמירה של צילום המסך."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"צילום המסך בוצע."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"גע כדי להציג את צילום המסך שלך"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"לא ניתן לבצע צילום מסך."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"לא ניתן לשמור את צילום המסך. ייתכן שנעשה שימוש באמצעי אחסון."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"אפשרויות העברת קבצים ב-USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"טען כנגן מדיה (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"טען כמצלמה (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter מופעל"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"צלצול ורטט."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"צלצול שקט."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> נדחה."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"נתוני 2G-3G מושבתים"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"נתוני 4G מושבתים"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"נתונים לנייד מושבתים"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 47292fb..8af5deb 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"画面サイズに合わせて拡大"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"互換ズーム"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"より小型の画面向けのアプリの場合は、ズームコントロールが時計のそばに表示されます。"</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"スクリーンショットを保存中..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"スクリーンショットを保存しています..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"スクリーンショットを保存しています。"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"スクリーンショットをキャプチャしました。"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"タップしてスクリーンショットを表示します。"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"スクリーンショットをキャプチャできませんでした。"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"スクリーンショットを保存できませんでした。ストレージが使用中の可能性があります。"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USBファイル転送オプション"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"メディアプレーヤー(MTP)としてマウント"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"カメラ(PTP)としてマウント"</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"テレタイプライターが有効です。"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"バイブレーション着信。"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"マナーモード着信。"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>は削除されました。"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G~3Gデータが無効になりました"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4Gデータが無効になりました"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"モバイルデータが無効になりました"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index e0a0ecf..ab947bd 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -36,7 +36,7 @@
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string>
<string name="battery_low_title" msgid="7923774589611311406">"충전기를 연결하세요."</string>
<string name="battery_low_subtitle" msgid="1752040062087829196">"배터리가 얼마 남지 않았습니다."</string>
- <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g>개 남음"</string>
+ <string name="battery_low_percent_format" msgid="1077244949318261761">"<xliff:g id="NUMBER">%d%%</xliff:g> 남음"</string>
<string name="invalid_charger" msgid="4549105996740522523">"USB 충전이 지원되지 않습니다."\n"제공된 충전기만 사용하세요."</string>
<string name="battery_low_why" msgid="7279169609518386372">"배터리 사용량"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"설정"</string>
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"전체화면 모드로 확대"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"호환성 확대/축소"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"앱이 작은 화면에 맞도록 설계된 경우 시계 옆에 확대/축소 컨트롤이 표시됩니다."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"캡쳐화면 저장 중..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"캡쳐화면 저장 중..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"캡쳐화면을 저장하는 중입니다."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"캡쳐화면 저장됨"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"캡쳐화면을 보려면 터치하세요."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"캡쳐화면을 캡쳐하지 못했습니다."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"캡쳐화면을 저장할 수 없습니다. 저장소를 사용 중인 것 같습니다."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 파일 전송 옵션"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"미디어 플레이어로 마운트(MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"카메라로 마운트(PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"전신 타자기(TTY)가 사용 설정되었습니다."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"벨소리가 진동입니다."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"벨소리가 무음입니다."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>이(가) 제거되었습니다."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G 데이터 사용중지됨"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G 데이터 사용중지됨"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"모바일 데이터 사용중지됨"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index b7f5aba..5fe86af 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Ištempti, kad atit. ekr."</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Suderinamumo mastelio keitimas"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Kai programa bus pritaikyta mažesniam ekranui, mastelio keitimo valdiklis bus parodytas šalia laikrodžio."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Išsaugoma ekrano kopija..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Išsaugoma ekrano kopija..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Išsaugoma ekrano kopija."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekrano kopija užfiksuota."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Palieskite, kad peržiūrėtumėte ekrano kopiją."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Nepavyko užfiksuoti ekrano kopijos."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Nepavyko išsaugoti ekrano kopijos. Gali būti naudojama atmintis."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB failo perdavimo parinktys"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Įmontuoti kaip medijos grotuvą (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Įmontuoti kaip fotoaparatą (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"„TeleTypewriter“ įgalinta."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibracija skambinant."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Skambutis tylus."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Atsisakyta programos „<xliff:g id="APP">%s</xliff:g>“."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G–3G duomenys neleidžiami"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G duomenys neleidžiami"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobilieji duomenys neleidžiami"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index d6409c2..5aec86f 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -42,7 +42,7 @@
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Iestatījumi"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lidmašīnas režīms"</string>
- <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ekrāna automātiska pagriešana"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automātiska ekrāna pagriešana"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"IZ. SK."</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"Paziņojumi"</string>
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Stiepiet, lai aizp. ekr."</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Saderības tālummaiņa"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Ja lietotne ir paredzēta mazākam ekrānam, blakus pulkstenim tiks parādīta tālummaiņas vadīkla."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Notiek ekrānuzņ. saglabāšana"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Notiek ekrānuzņēmuma saglabāšana..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Notiek ekrānuzņēmuma saglabāšana."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekrānuzņēmums ir uzņemts."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Pieskarieties, lai skatītu ekrānuzņēmumu."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Nevarēja uzņemt ekrānuzņēmumu."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Nevarēja saglabāt ekrānuzņēmumu. Iespējams, tiek izmantota atmiņa."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB failu pārsūtīšanas opcijas"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Pievienot kā multivides atskaņotāju (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Pievienot kā kameru (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Teletaips ir iespējots."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Zvana signāls — vibrācija."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zvana signāls — kluss."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Lietotne <xliff:g id="APP">%s</xliff:g> vairs netiek rādīta."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G–3G dati atspējoti"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G dati atspējoti"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobilie dati atspējoti"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index f84af39..924bf66 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Regang utk memenuhi skrin"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Keserasian Zum"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Apabila apl direka untuk skrin yang lebih kecil, kawalan zum akan muncul di tepi jam."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan tangkapan skrin..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan tangkapan skrin..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Tangkapan skrin sedang disimpan."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Tangkapan skrin ditangkap."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Sentuh untuk melihat tangkapan skrin anda."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Tidak dapat menangkap tangkapan skrin."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Tidak boleh menyimpan tangkapan skrin. Storan mungkin sedang digunakan."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Pilihan pemindahan fail USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Lekapkan sebagai pemain media (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Lekapkan sebagai kamera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Mesin Teletaip didayakan."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Pendering bergetar."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Pendering senyap."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ditolak."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data 2G-3G dilumpuhkan"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data 4G dilumpuhkan"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Data mudah alih dilumpuhkan"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 4db2e074..5b00b1f 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Strekk for å fylle skjerm"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kompatibilitets-zooming"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Når en app er utformet for en mindre skjerm, vises det en zoomkontroll ved klokken."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Lagrer skjermdumpen …"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Lagrer skjermdumpen …"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Skjermdumpen lagres."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skjermdumpen er lagret."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Trykk for å se skjermdumpen."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Kan ikke lagre skjermdumpen."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Kan ikke ikke lagre skjermdumpen. Det er mulig ekstern lagring er i bruk."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Altern. for USB-filoverføring"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Sett inn som mediespiller (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Sett inn som kamera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter er aktivert."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibreringsmodus."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Stille modus."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> avvist."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G-data er deaktivert"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-data er deaktivert"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobildata er deaktivert"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 2a5cc66..451b55c 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Rek uit v. schermvulling"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Compatibiliteitszoom"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Wanneer een app is ontworpen voor een kleiner scherm, wordt naast de klok een zoomknop weergegeven."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Schermafbeelding opslaan..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Schermafbeelding opslaan..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Schermafbeelding wordt opgeslagen."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Schermafbeelding gemaakt."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Raak aan om uw schermafbeelding te bekijken."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Schermafbeelding is niet gemaakt."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Kan schermafbeelding niet opslaan. Mogelijk is de opslag in gebruik."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opties voor USB-bestandsoverdracht"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Koppelen als mediaspeler (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Koppelen als camera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter ingeschakeld."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Belsoftware trilt."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Belsoftware stil."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwijderd."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-/3G-gegevens uitgeschakeld"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G-gegevens uitgeschakeld"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobiele gegevens uitgeschakeld"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 00cbf95..e673e7b 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -35,7 +35,7 @@
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Bieżące"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Powiadomienia"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Podłącz ładowarkę"</string>
- <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria wkrótce zostanie rozładowana."</string>
+ <string name="battery_low_subtitle" msgid="1752040062087829196">"Bateria wkrótce się rozładuje."</string>
<string name="battery_low_percent_format" msgid="1077244949318261761">"Pozostało: <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
<string name="invalid_charger" msgid="4549105996740522523">"Ładowanie przy użyciu złącza USB nie jest obsługiwane."\n"Należy używać tylko dołączonej ładowarki."</string>
<string name="battery_low_why" msgid="7279169609518386372">"Użycie baterii"</string>
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Rozciągnij, aby wypełnić ekran"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Powiększenie w trybie zgodności"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Jeśli aplikacja została przystosowana do mniejszego ekranu, obok zegara zostanie wyświetlony element sterujący powiększeniem."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Zapisywanie zrzutu ekranu..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Zapisywanie zrzutu ekranu..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Zapisywanie zrzutu ekranu."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Wykonano zrzut ekranu."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Dotknij, aby wyświetlić zrzut ekranu."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Nie udało się wykonać zrzutu ekranu."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Nie udało się zapisać zrzutu ekranu. Pamięć może być w użyciu."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB – opcje przesyłania plików"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Podłącz jako odtwarzacz multimedialny (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Podłącz jako aparat (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Dalekopis (TTY) włączony."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Dzwonek z wibracjami."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Dzwonek wyciszony."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>: zamknięto."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Wyłączono transmisję danych 2G/3G"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Wyłączono transmisję danych 4G"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Wyłączono komórkową transmisję danych"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c65ad95..0f02582 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Esticar p. caber em ec. int."</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Compatibilidade de zoom"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Sempre que uma aplicação tiver sido concebida para ecrãs mais pequenos, aparecerá um controlo de zoom junto ao relógio."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"A guardar captura de ecrã..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"A guardar captura de ecrã..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"A guardar captura de ecrã."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura de ecrã efetuada"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Toque para ver a captura de ecrã"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Não foi possível obter captura de ecrã."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Não foi possível guardar a captura de ecrã. O armazenamento poderá estar a ser utilizado."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opções de transm. de fich. USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Montar como leitor de multimédia (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Montar como câmara (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Teletipo ativado."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Campainha em vibração."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Campainha em silêncio."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ignorado."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Os dados 2G-3G estão desativados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Os dados 4G estão desativados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Os dados móveis estão desativados"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index a37fdca..d08ef41 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom em modo de compatibilidade"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Quando um aplicativo é desenvolvido para uma tela menor, um controle de zoom é exibido perto do relógio."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvar captura de tela..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Salvar captura de tela..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"A captura de tela está sendo salva."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captura de tela obtida."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Toque para visualizar a captura de tela."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Não foi possível obter a captura de tela."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Não foi possível salvar a captura de tela. O armazenamento pode estar em uso."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opções transf. arq. por USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Conectar como media player (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Montar como uma câmera (PTP)"</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTYpewriter ativado."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibração da campainha."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Campainha silenciosa."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartado."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dados 2G e 3G desativados"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dados 4G desativados"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Dados móveis desativados"</string>
diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml
index 90271a3..e1db314 100644
--- a/packages/SystemUI/res/values-rm/strings.xml
+++ b/packages/SystemUI/res/values-rm/strings.xml
@@ -92,19 +92,19 @@
<skip />
<!-- no translation found for compat_mode_help_body (4946726776359270040) -->
<skip />
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
+ <!-- no translation found for screenshot_saving_ticker (7403652894056693515) -->
<skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
+ <!-- no translation found for screenshot_saving_title (8242282144535555697) -->
<skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
+ <!-- no translation found for screenshot_saving_text (2419718443411738818) -->
<skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
+ <!-- no translation found for screenshot_saved_title (6461865960961414961) -->
<skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
+ <!-- no translation found for screenshot_saved_text (1152839647677558815) -->
<skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
+ <!-- no translation found for screenshot_failed_title (705781116746922771) -->
<skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
+ <!-- no translation found for screenshot_failed_text (8134011269572415402) -->
<skip />
<!-- no translation found for usb_preference_title (6551050377388882787) -->
<skip />
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 084993b..5c388d2 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Înt. pt. a umple ecranul"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom de compatibilitate"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Atunci când o aplicaţie a fost concepută pentru un ecran mai mic, o comandă pentru mărire/micşorare va apărea alături de ceas."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Se salv. captura de ecran..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Se salvează captura de ecran..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Captura de ecran este salvată."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Captură de ecran realizată."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Atingeţi pentru a vedea captura de ecran."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Captura de ecran nu a putut fi realizată."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Captura de ecran nu a putut fi salvată. Este posibil să fie utilizată stocarea."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opţiuni pentru transferul de fişiere prin USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Montaţi ca player media (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Montaţi drept cameră foto (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter activat."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibrare sonerie."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonerie silenţioasă."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> a fost eliminată."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Datele 2G-3G au fost dezactivate"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Datele 4G au fost dezactivate"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Datele mobile au fost dezactivate"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index c23d82b..d7c73c4 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Растянуть на весь экран"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Масштаб и совместимость"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Если приложение рассчитано на экран меньших размеров, рядом с часами появятся средства масштабирования."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Сохранение..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Сохранение..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Сохранение..."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Скриншот сохранен."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Нажмите, чтобы просмотреть"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Не удалось сохранить скриншот."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Не удалось сохранить скриншот. Возможно, накопители заняты."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Параметры передачи через USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Подключить как мультимедийный проигрыватель (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Установить как камеру (PTP)"</string>
@@ -122,7 +115,7 @@
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
<skip />
- <string name="accessibility_settings_button" msgid="799583911231893380">"Настройки системы"</string>
+ <string name="accessibility_settings_button" msgid="799583911231893380">"Настройки"</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Уведомления"</string>
<string name="accessibility_remove_notification" msgid="3603099514902182350">"Удалить уведомление"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"Система GPS включена."</string>
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Телетайп включен."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Вибровызов."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Беззвучный режим."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" удалено из списка."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Передача данных по каналам 2G и 3G отключена"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Передача данных по каналу 4G отключена"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Мобильный Интернет отключен"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index af3ed00..559a98a 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Na celú obrazovku"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kompatibilné priblíženie"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Ak je aplikácia navrhnutá pre menšiu obrazovku, zobrazí sa vedľa hodín ovládací prvok priblíženia."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Prebieha ukladanie snímky obrazovky..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Prebieha ukladanie snímky obrazovky..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Snímka obrazovky sa ukladá."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Snímka obrazovky bola zaznamenaná."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Snímku obrazovky zobrazíte dotykom."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Snímku obrazovky sa nepodarilo zachytiť."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Snímku obrazovky sa nepodarilo uložiť. Ukladací priestor sa možno práve používa."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Možnosti prenosu súborov USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Pripojiť ako prehrávač médií (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Pripojiť ako fotoaparát (PTP)"</string>
@@ -117,7 +110,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="1127208787254436420">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"Žiadna karta SIM."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Zdieľanie dátového pripojenia cez Bluetooth."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Pripojenie cez Bluetooth."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim V lietadle."</string>
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Rozhranie TeleTypewriter je povolené."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibračné zvonenie."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Tiché zvonenie."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikácia <xliff:g id="APP">%s</xliff:g> bola zrušená."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Dátové prenosy 2G a 3G sú zakázané"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Dátové prenosy 4G sú zakázané"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobilné dátové prenosy sú zakázané"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 34c5e0b1..da4d7ce 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Raztegnitev čez zaslon"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Povečava združljivosti"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Če je program izdelan za manjše zaslone, se ob uri pokaže kontrolnik za povečavo."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Shranjev. posnetka zaslona ..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Shranjevanje posnetka zaslona ..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Shranjevanje posnetka zaslona."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Posnetek zaslona je shranjen."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Dotaknite se, če si želite ogledati posnetek zaslona."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Posnetka zaslona ni bilo mogoče shraniti."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Posnetka zaslona ni bilo mogoče shraniti. Shramba je morda v uporabi."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Možnosti prenosa datotek prek USB-ja"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Vpni kot predvajalnik (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Vpni kot fotoaparat (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter omogočen."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Zvonjenje z vibriranjem."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Zvonjenje izklopljeno."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Program <xliff:g id="APP">%s</xliff:g> je bil odstranjen."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Podatki 2G-3G so onemogočeni"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Podatki 4G so onemogočeni"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobilni podatki so onemogočeni"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index d0f24b2..46d5777 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Развуци на цео екран"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Компатибилно зумирање"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Када је апликација намењена мањем екрану, контрола зумирања приказује се поред сата."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Чување снимка екрана..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Чување снимка екрана..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Снимак екрана се чува."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Снимак екрана је направљен."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Додирните да бисте видели снимак екрана."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Није могуће направити снимак екрана."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Није могуће сачувати снимак екрана. Могуће је да је меморија у употреби."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Опције USB преноса датотека"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Прикључи као медија плејер (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Прикључи као камеру (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter је омогућен."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Вибрација звона."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Нечујно звоно."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Апликација <xliff:g id="APP">%s</xliff:g> је одбачена."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G–3G подаци су онемогућени"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G подаци су онемогућени"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Подаци мобилне мреже су онемогућени"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index ab438e8..a073897 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Dra för att fylla skärmen"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom i kompatibilitetsläge"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"När en app är anpassad för en mindre skärm visas ett zoomreglage vid klockan."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skärmdumpen sparas ..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Skärmdumpen sparas ..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Skärmdumpen sparas."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Skärmdumpen har tagits."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Tryck här om du vill visa skärmdumpen."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Det gick inte att ta någon skärmdump."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Det gick inte att spara skärmdumpen. Extern lagring kanske används."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Överföringsalternativ"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Montera som mediaspelare (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Montera som kamera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter aktiverad."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Vibrerande ringsignal."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Tyst ringsignal."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> togs bort permanent."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data via 2G-3G har inaktiverats"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data via 4G har inaktiverats"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobildata har inaktiverats"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 98e2310..a870752 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -60,20 +60,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Tanua ili kujaza skrini"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Kukuza kwa Utangamanifu"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Wakati programu ilibuniwa kwa skrini ndogo, kidhibiti cha kukuza kitaonekana kwa saa."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Inahifadhi picha"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Inahifadhi picha..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Picha ya kiwamba inahifadhiwa"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Picha imenaswa."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Gusa ili kuona picha"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Haikuweza kupiga picha"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Haikuweza kuhifadhi picha. Hifadhi inaweza kuwa inatumika"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Machaguo ya uhamisho wa faili la USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Angika kama kichezeshi cha midia (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Angika kama kamera (PTP)"</string>
@@ -126,8 +119,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Kichapishaji cha Tele kimewezeshwa."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Mtetemo wa mlio"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Mlio wa simu uko kimya."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> Ondoa"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Data ya 2G-3G imelemazwa"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Data ya 4G imelemazwa"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Data ya kifaa cha mkononi imelemazwa"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ee2af5d..f017f96 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"ความเข้ากันได้ของการย่อ/ขยาย"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"สำหรับแอปพลิเคชันที่ออกแบบมาสำหรับหน้าจอขนาดเล็ก ตัวควบคุมการย่อ/ขยายจะปรากฏขึ้นข้างนาฬิกา"</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"กำลังบันทึกภาพหน้าจอ..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"กำลังบันทึกภาพหน้าจอ..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"กำลังบันทึกภาพหน้าจอ"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"จับภาพหน้าจอแล้ว"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"แตะเพื่อดูภาพหน้าจอของคุณ"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"ไม่สามารถจับภาพหน้าจอ"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"ไม่สามารถบันทึกภาพหน้าจอ ที่จัดเก็บข้อมูลอาจมีการใช้งานอยู่"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"ตัวเลือกการถ่ายโอนไฟล์ USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"ต่อเชื่อมเป็นโปรแกรมเล่นสื่อ (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"ต่อเชื่อมเป็นกล้องถ่ายรูป (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"เปิดใช้งาน TeleTypewriter อยู่"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"เสียงเรียกเข้าแบบสั่น"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"เสียงเรียกเข้าแบบปิดเสียง"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ถูกนำออกไปแล้ว"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"ปิดใช้งานข้อมูล 2G-3G แล้ว"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"ปิดใช้งานข้อมูล 4G แล้ว"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"ปิดใช้งานข้อมูลมือถือแล้ว"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 8cff0b3..35cbcf2 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"I-stretch upang mapuno screen"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Zoom sa Pagiging Tugma"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Kapag nakadisenyo ang isang app para sa mas maliit na screen, isang kontrol ng zoom ang lalabas sa may orasan."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Sine-save ang screenshot…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Sine-save ang screenshot…"</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Sine-save ang screenshot."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Nakuha ang screenshot."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Pindutin upang tingnan ang iyong screenshot."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Hindi makuha ang screenshot."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Hindi ma-save ang screenshot. Maaaring ginagamit ang storage."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Opsyon paglipat ng USB file"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"I-mount bilang isang media player (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"I-mount bilang camera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Pinapagana ang TeleTypewriter."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Pag-vibrate ng ringer."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Naka-silent ang ringer."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Hindi pinansin ang <xliff:g id="APP">%s</xliff:g>."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Di pinapagana ang 2G-3G na data"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Hindi pinapagana ang 4G na data"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Hindi pinapagana ang data ng mobile"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 7fd5c61..df0c072 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Genişlet (ekran kapansın)"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Uyumluluk Zum\'u"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Uygulama küçük bir ekran için tasarlanmışsa saatin yanında bir yakınlaştırma denetimi görünür."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ekran görüntüsü kaydediliyor..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Ekran görüntüsü kaydediliyor..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Ekran görüntüsü kaydediliyor."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Ekran görüntüsü alındı."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Ekran görüntünüzü izlemek için dokunun."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Ekran görüntüsü alınamadı."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Ekran görüntüsü kaydedilemedi. Depolama birimi kullanımda olabilir."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB dosya aktarım seçenekleri"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Medya oynatıcı olarak ekle (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Kamera olarak ekle (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter etkin."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Telefon zili titreşim."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Telefon zili sessiz."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> kaldırıldı."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G verileri devre dışı bırakıldı"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G verileri devre dışı"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Mobil veriler devre dışı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 5b92cc0..88344ca 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Розтягнути на весь екран"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Елемент керування масштабом для сумісності"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Якщо програму призначено для менших екранів, елемент керування масштабом буде відображатися біля годинника."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Збереження знімка екрана..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Збереження знімка екрана..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Зберігається знімок екрана."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Знімок екрана зроблено."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Торкніться, щоб переглянути знімок екрана."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Не вдалося зробити знімок екрана."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Не вдалося зберегти знімок екрана. Можливо, пам’ять використовується."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Парам.передав.файлів через USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Підключити як медіапрогравач (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Підключити як камеру (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Телетайп увімкнено."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Дзвінок на вібросигналі."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Дзвінок беззвучний."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Програму <xliff:g id="APP">%s</xliff:g> закрито."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Дані 2G–3G вимкнено"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Дані 4G вимкнено"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Мобільне передавання даних вимкнено"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index d1158e4..02873b3 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Giãn ra để lấp đầy m.hình"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Thu phóng tương thích"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Khi ứng dụng được thiết kế cho một màn hình nhỏ hơn, điều khiển thu phóng sẽ xuất hiện bên cạnh đồng hồ."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Đang lưu ảnh chụp màn hình..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Đang lưu ảnh chụp màn hình..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Ảnh chụp màn hình đang được lưu."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Đã chụp ảnh màn hình."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Chạm để xem ảnh chụp màn hình của bạn."</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Không thể chụp ảnh màn hình."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Không thể lưu ảnh chụp màn hình. Bộ lưu trữ có thể đang được sử dụng."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Tùy chọn truyền tệp USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Gắn như một trình phát đa phương tiện (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Gắn như một máy ảnh (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Đã bật TeleTypewriter."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Chuông rung."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Chuông im lặng."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> đã bị loại bỏ."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"Đã tắt dữ liệu 2G-3G"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Đã tắt dữ liệu 4G"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Dữ liệu di động bị vô hiệu hóa"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 2b1bfd6..ff5a58a 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -46,7 +46,7 @@
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"静音"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"自动"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"通知"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"蓝牙已绑定"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"已通过蓝牙共享网络"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="737483394044014246">"配置输入法"</string>
<string name="status_bar_use_physical_keyboard" msgid="3695516942412442936">"使用物理键盘"</string>
<string name="usb_device_permission_prompt" msgid="3816016361969816903">"允许应用程序<xliff:g id="APPLICATION">%1$s</xliff:g>访问 USB 设备吗?"</string>
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"拉伸以填满屏幕"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"兼容性缩放"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"如果应用程序是针对较小屏幕设计的,则时钟旁会显示缩放控件。"</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在保存屏幕截图..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"正在保存屏幕截图..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"正在保存屏幕截图。"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"已捕获屏幕截图。"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"触摸可查看您的屏幕截图。"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"无法捕获屏幕截图。"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"无法保存屏幕截图。存储设备可能正在使用中。"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 文件传输选项"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"作为媒体播放器 (MTP) 装载"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"作为摄像头 (PTP) 装载"</string>
@@ -117,7 +110,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="1127208787254436420">"WiFi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"无 SIM 卡。"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"蓝牙网络共享。"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"蓝牙共享网络。"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飞行模式。"</string>
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"电传打字机已启用。"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"振铃器振动。"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"振铃器静音。"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"已删除<xliff:g id="APP">%s</xliff:g>"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"2G-3G 数据网络已停用"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"4G 数据网络已停用"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"移动数据已停用"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 2ffca64..710aac8 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -46,8 +46,8 @@
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"關閉"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"自動"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"通知"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"已透過 Bluetooth 進行網路共用"</string>
- <string name="status_bar_input_method_settings_configure_input_methods" msgid="737483394044014246">"設定輸入方式"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"藍牙網路共用已開"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="737483394044014246">"設定輸入法"</string>
<string name="status_bar_use_physical_keyboard" msgid="3695516942412442936">"使用實體鍵盤"</string>
<string name="usb_device_permission_prompt" msgid="3816016361969816903">"允許 <xliff:g id="APPLICATION">%1$s</xliff:g> 應用程式存取 USB 裝置嗎?"</string>
<string name="usb_accessory_permission_prompt" msgid="6888598803988889959">"允許 <xliff:g id="APPLICATION">%1$s</xliff:g> 應用程式存取 USB 配件嗎?"</string>
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"相容性縮放"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"執行專為較小螢幕設計的應用程式時,系統會在時鐘旁顯示縮放控制項。"</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在儲存螢幕擷取畫面..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"正在儲存螢幕擷取畫面..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"正在儲存螢幕擷取畫面。"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"已拍攝螢幕擷取畫面。"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"輕觸即可查看螢幕擷取畫面。"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"無法拍攝螢幕擷取畫面。"</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"無法儲存螢幕擷取畫面,儲存空間可能正在使用中。"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 檔案傳輸選項"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"掛接為媒體播放器 (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"掛接為相機 (PTP)"</string>
@@ -117,7 +110,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="1127208787254436420">"WiFi"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"沒有 SIM 卡。"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"藍牙數據連線"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"藍牙網路共用"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"飛行模式。"</string>
<!-- String.format failed for translation -->
<!-- no translation found for accessibility_battery_level (7451474187113371965) -->
@@ -130,8 +123,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter (TTY) 已啟用。"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"鈴聲震動。"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"鈴聲靜音。"</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"「<xliff:g id="APP">%s</xliff:g>」已關閉。"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"已停用 2G-3G 數據"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"已停用 4G 數據"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"已停用行動數據"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 5ef5152..f5618b3 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -62,20 +62,13 @@
<string name="compat_mode_off" msgid="4434467572461327898">"Nweba ukugcwalisa isikrini"</string>
<string name="compat_mode_help_header" msgid="7020175705401506719">"Ukuhambelana Kokusondeza"</string>
<string name="compat_mode_help_body" msgid="4946726776359270040">"Uma uhlelo lokusebenza lwenzelwe isikrini ezincane, isilawuli sokusondeza sizovela ngakuyiwashi."</string>
- <!-- no translation found for screenshot_saving_ticker (3808900131607378535) -->
- <skip />
- <!-- no translation found for screenshot_saving_title (7158814134399651627) -->
- <skip />
- <!-- no translation found for screenshot_saving_text (7138808001579871654) -->
- <skip />
- <!-- no translation found for screenshot_saved_title (1656379291643543172) -->
- <skip />
- <!-- no translation found for screenshot_saved_text (5040360894749163221) -->
- <skip />
- <!-- no translation found for screenshot_failed_title (1140968728869009679) -->
- <skip />
- <!-- no translation found for screenshot_failed_text (9163506496592455352) -->
- <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ilondoloz umfanekiso weskrini..."</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"Ilondoloz umfanekiso weskrini..."</string>
+ <string name="screenshot_saving_text" msgid="2419718443411738818">"Umfanekiso weskrini uyalondolozwa."</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"Umfanekiso weskrini uqoshiwe"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Thinta ukubona imifanekiso yakho yeskrini"</string>
+ <string name="screenshot_failed_title" msgid="705781116746922771">"Yehlulekile ukulondoloza umfanekiso weskrini."</string>
+ <string name="screenshot_failed_text" msgid="8134011269572415402">"Ayikwazanga ukulondoloza isithombe-skrini. Ukugcina kwangaphandle kungenzeka kuyasetshenziswa."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"Okukhethwa kokudluliswa kwefayela ye-USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Lengisa njengesidlali semediya (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Lengisa ikhamera (PTP)"</string>
@@ -128,8 +121,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"i-TeleTypewriter inikwe amandla"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Ukudlidliza kweringa."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Isikhali sithulile."</string>
- <!-- no translation found for accessibility_recents_item_dismissed (6803574935084867070) -->
- <skip />
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ivaliwe."</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="5257833881698644687">"idatha ye-2G-3G ivimbelwe"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4789143363492682629">"Idatha ye-4G ivimbelwe"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="1046047248844821202">"Idatha yefoni ivimbelwe"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index bce0bc4..ce390a0 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -29,5 +29,5 @@
<drawable name="notification_header_bg">#d8000000</drawable>
<drawable name="notification_tracking_bg">#d8000000</drawable>
<color name="notification_list_shadow_top">#80000000</color>
- <drawable name="recents_callout_line">#66ffffff</drawable>
+ <drawable name="recents_callout_line">#99ffffff</drawable>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index bf19286..8fba86a 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -57,7 +57,7 @@
<dimen name="status_bar_icon_drawing_size">18dip</dimen>
<!-- opacity at which Notification icons will be drawn in the status bar -->
- <item type="dimen" name="status_bar_icon_drawing_alpha">40%</item>
+ <item type="dimen" name="status_bar_icon_drawing_alpha">55%</item>
<!-- gap on either side of status bar notification icons -->
<dimen name="status_bar_icon_padding">0dp</dimen>
@@ -89,9 +89,6 @@
<dimen name="collapse_accel">2000dp</dimen>
<!-- The padding on the global screenshot background image -->
- <dimen name="global_screenshot_bg_padding">0dp</dimen>
- <!-- The top-left offset for the screenshot drop animation target bounds -->
- <dimen name="global_screenshot_drop_offset_x">6dp</dimen>
- <dimen name="global_screenshot_drop_offset_y">0dp</dimen>
+ <dimen name="global_screenshot_bg_padding">20dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index a717b57..b26709d 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -169,19 +169,19 @@
<string name="compat_mode_help_body">When an app was designed for a smaller screen, a zoom control will appear by the clock.</string>
<!-- Notification ticker displayed when a screenshot is being saved to the Gallery. [CHAR LIMIT=30] -->
- <string name="screenshot_saving_ticker">Saving...</string>
+ <string name="screenshot_saving_ticker">Saving screenshot\u2026</string>
<!-- Notification title displayed when a screenshot is being saved to the Gallery. [CHAR LIMIT=50] -->
- <string name="screenshot_saving_title">Saving screenshot...</string>
+ <string name="screenshot_saving_title">Saving screenshot\u2026</string>
<!-- Notification text displayed when a screenshot is being saved to the Gallery. [CHAR LIMIT=100] -->
- <string name="screenshot_saving_text">Please wait for screenshot to be saved</string>
+ <string name="screenshot_saving_text">Screenshot is being saved.</string>
<!-- Notification title displayed when a screenshot is saved to the Gallery. [CHAR LIMIT=50] -->
- <string name="screenshot_saved_title">Screenshot captured</string>
+ <string name="screenshot_saved_title">Screenshot captured.</string>
<!-- Notification text displayed when a screenshot is saved to the Gallery. [CHAR LIMIT=100] -->
- <string name="screenshot_saved_text">Touch to view your screenshot</string>
+ <string name="screenshot_saved_text">Touch to view your screenshot.</string>
<!-- Notification title displayed when we fail to take a screenshot. [CHAR LIMIT=50] -->
- <string name="screenshot_failed_title">Screenshot failed</string>
+ <string name="screenshot_failed_title">Couldn\'t capture screenshot.</string>
<!-- Notification text displayed when we fail to take a screenshot. [CHAR LIMIT=100] -->
- <string name="screenshot_failed_text">Failed to save screenshot. External storage may be in use.</string>
+ <string name="screenshot_failed_text">Couldn\'t save screenshot. Storage may be in use.</string>
<!-- Title for the USB function chooser in UsbPreferenceActivity. [CHAR LIMIT=30] -->
<string name="usb_preference_title">USB file transfer options</string>
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java b/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java
index 47aa849..dcda9c2 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java
@@ -86,8 +86,8 @@
mIconDpi = isTablet ? DisplayMetrics.DENSITY_HIGH : res.getDisplayMetrics().densityDpi;
// Render the default thumbnail background
- int width = (int) res.getDimension(R.dimen.status_bar_recents_thumbnail_width);
- int height = (int) res.getDimension(R.dimen.status_bar_recents_thumbnail_height);
+ int width = (int) res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
+ int height = (int) res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
int color = res.getColor(R.drawable.status_bar_recents_app_thumbnail_background);
mDefaultThumbnailBackground = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
@@ -106,6 +106,10 @@
mRecentsPanel = recentsPanel;
}
+ public Bitmap getDefaultThumbnail() {
+ return mDefaultThumbnailBackground;
+ }
+
// Create an TaskDescription, returning null if the title or icon is null, or if it's the
// home activity
TaskDescription createTaskDescription(int taskId, int persistentTaskId, Intent baseIntent,
@@ -278,7 +282,7 @@
TaskDescription td = descriptions.get(i);
loadThumbnail(td);
long now = SystemClock.uptimeMillis();
- nextTime += 150;
+ nextTime += 0;
if (nextTime > now) {
try {
Thread.sleep(nextTime-now);
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index bd1fcfc..343b33514 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -37,6 +37,7 @@
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AnimationUtils;
@@ -57,8 +58,8 @@
import com.android.systemui.statusbar.tablet.StatusBarPanel;
import com.android.systemui.statusbar.tablet.TabletStatusBar;
-public class RecentsPanelView extends RelativeLayout
- implements OnItemClickListener, RecentsCallback, StatusBarPanel, Animator.AnimatorListener {
+public class RecentsPanelView extends RelativeLayout implements OnItemClickListener, RecentsCallback,
+ StatusBarPanel, Animator.AnimatorListener, View.OnTouchListener {
static final String TAG = "RecentsPanelView";
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
private Context mContext;
@@ -74,6 +75,7 @@
private RecentTasksLoader mRecentTasksLoader;
private ArrayList<TaskDescription> mRecentTaskDescriptions;
+ private boolean mRecentTasksDirty = true;
private TaskDescriptionAdapter mListAdapter;
private int mThumbnailWidth;
@@ -94,6 +96,7 @@
/* package */ final static class ViewHolder {
View thumbnailView;
ImageView thumbnailViewImage;
+ Bitmap thumbnailViewImageBitmap;
ImageView iconView;
TextView labelView;
TextView descriptionView;
@@ -127,6 +130,10 @@
holder.thumbnailView = convertView.findViewById(R.id.app_thumbnail);
holder.thumbnailViewImage = (ImageView) convertView.findViewById(
R.id.app_thumbnail_image);
+ // If we set the default thumbnail now, we avoid an onLayout when we update
+ // the thumbnail later (if they both have the same dimensions)
+ updateThumbnail(holder, mRecentTasksLoader.getDefaultThumbnail(), false, false);
+
holder.iconView = (ImageView) convertView.findViewById(R.id.app_icon);
holder.labelView = (TextView) convertView.findViewById(R.id.app_label);
holder.descriptionView = (TextView) convertView.findViewById(R.id.app_description);
@@ -139,12 +146,15 @@
// index is reverse since most recent appears at the bottom...
final int index = mRecentTaskDescriptions.size() - position - 1;
- final TaskDescription taskDescription = mRecentTaskDescriptions.get(index);
- applyTaskDescription(holder, taskDescription, false);
+ final TaskDescription td = mRecentTaskDescriptions.get(index);
+ holder.iconView.setImageDrawable(td.getIcon());
+ holder.labelView.setText(td.getLabel());
+ holder.thumbnailView.setContentDescription(td.getLabel());
+ updateThumbnail(holder, td.getThumbnail(), true, false);
- holder.thumbnailView.setTag(taskDescription);
+ holder.thumbnailView.setTag(td);
holder.thumbnailView.setOnLongClickListener(new OnLongClickDelegate(convertView));
- holder.taskDescription = taskDescription;
+ holder.taskDescription = td;
return convertView;
}
@@ -193,6 +203,7 @@
}
} else {
mRecentTasksLoader.cancelLoadingThumbnails();
+ mRecentTasksDirty = true;
}
if (animate) {
if (mShowing != show) {
@@ -250,9 +261,7 @@
createCustomAnimations(transitioner);
} else {
((ViewGroup)mRecentsContainer).setLayoutTransition(null);
- // Clear memory used by screenshots
- mRecentTaskDescriptions.clear();
- mListAdapter.notifyDataSetInvalidated();
+ clearRecentTasksList();
}
}
@@ -374,47 +383,33 @@
}
}
-
- void applyTaskDescription(ViewHolder h, TaskDescription td, boolean anim) {
- h.iconView.setImageDrawable(td.getIcon());
- if (h.iconView.getVisibility() != View.VISIBLE) {
- if (anim) {
- h.iconView.setAnimation(AnimationUtils.loadAnimation(
- mContext, R.anim.recent_appear));
- }
- h.iconView.setVisibility(View.VISIBLE);
- }
- h.labelView.setText(td.getLabel());
- h.thumbnailView.setContentDescription(td.getLabel());
- if (h.labelView.getVisibility() != View.VISIBLE) {
- if (anim) {
- h.labelView.setAnimation(AnimationUtils.loadAnimation(
- mContext, R.anim.recent_appear));
- }
- h.labelView.setVisibility(View.VISIBLE);
- }
- Bitmap thumbnail = td.getThumbnail();
+ private void updateThumbnail(ViewHolder h, Bitmap thumbnail, boolean show, boolean anim) {
if (thumbnail != null) {
// Should remove the default image in the frame
// that this now covers, to improve scrolling speed.
// That can't be done until the anim is complete though.
h.thumbnailViewImage.setImageBitmap(thumbnail);
- // scale to fill up the full width
- Matrix scaleMatrix = new Matrix();
- float scale = mThumbnailWidth / (float) thumbnail.getWidth();
- scaleMatrix.setScale(scale, scale);
- h.thumbnailViewImage.setScaleType(ScaleType.MATRIX);
- h.thumbnailViewImage.setImageMatrix(scaleMatrix);
- if (h.thumbnailViewImage.getVisibility() != View.VISIBLE) {
- if (anim) {
- h.thumbnailViewImage.setAnimation(
- AnimationUtils.loadAnimation(
- mContext, R.anim.recent_appear));
- }
- h.thumbnailViewImage.setVisibility(View.VISIBLE);
+
+ // scale the image to fill the full width of the ImageView. do this only if
+ // we haven't set a bitmap before, or if the bitmap size has changed
+ if (h.thumbnailViewImageBitmap == null ||
+ h.thumbnailViewImageBitmap.getWidth() != thumbnail.getWidth() ||
+ h.thumbnailViewImageBitmap.getHeight() != thumbnail.getHeight()) {
+ Matrix scaleMatrix = new Matrix();
+ float scale = mThumbnailWidth / (float) thumbnail.getWidth();
+ scaleMatrix.setScale(scale, scale);
+ h.thumbnailViewImage.setScaleType(ScaleType.MATRIX);
+ h.thumbnailViewImage.setImageMatrix(scaleMatrix);
}
+ if (show && h.thumbnailView.getVisibility() != View.VISIBLE) {
+ if (anim) {
+ h.thumbnailView.setAnimation(
+ AnimationUtils.loadAnimation(mContext, R.anim.recent_appear));
+ }
+ h.thumbnailView.setVisibility(View.VISIBLE);
+ }
+ h.thumbnailViewImageBitmap = thumbnail;
}
- //h.descriptionView.setText(ad.description);
}
void onTaskThumbnailLoaded(TaskDescription ad) {
@@ -432,7 +427,11 @@
if (v.getTag() instanceof ViewHolder) {
ViewHolder h = (ViewHolder)v.getTag();
if (h.taskDescription == ad) {
- applyTaskDescription(h, ad, true);
+ // only fade in the thumbnail if recents is already visible-- we
+ // show it immediately otherwise
+ boolean animateShow = mShowing &&
+ mRecentsGlowView.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD;
+ updateThumbnail(h, ad.getThumbnail(), true, animateShow);
}
}
}
@@ -440,14 +439,55 @@
}
}
- private void refreshRecentTasksList(ArrayList<TaskDescription> recentTasksList) {
- if (recentTasksList != null) {
- mRecentTaskDescriptions = recentTasksList;
- } else {
- mRecentTaskDescriptions = mRecentTasksLoader.getRecentTasks();
+ // additional optimization when we have sofware system buttons - start loading the recent
+ // tasks on touch down
+ @Override
+ public boolean onTouch(View v, MotionEvent ev) {
+ if (!mShowing) {
+ int action = ev.getAction() & MotionEvent.ACTION_MASK;
+ if (action == MotionEvent.ACTION_DOWN) {
+ // If we set our visibility to INVISIBLE here, we avoid an extra call to onLayout
+ // later when we become visible
+ setVisibility(INVISIBLE);
+ refreshRecentTasksList();
+ } else if (action == MotionEvent.ACTION_CANCEL) {
+ setVisibility(GONE);
+ clearRecentTasksList();
+ } else if (action == MotionEvent.ACTION_UP) {
+ if (!v.isPressed()) {
+ setVisibility(GONE);
+ clearRecentTasksList();
+ }
+ }
}
- mListAdapter.notifyDataSetInvalidated();
- updateUiElements(getResources().getConfiguration());
+ return false;
+ }
+
+ public void clearRecentTasksList() {
+ // Clear memory used by screenshots
+ if (mRecentTaskDescriptions != null) {
+ mRecentTasksLoader.cancelLoadingThumbnails();
+ mRecentTaskDescriptions.clear();
+ mListAdapter.notifyDataSetInvalidated();
+ mRecentTasksDirty = true;
+ }
+ }
+
+ public void refreshRecentTasksList() {
+ refreshRecentTasksList(null);
+ }
+
+ private void refreshRecentTasksList(ArrayList<TaskDescription> recentTasksList) {
+ if (mRecentTasksDirty) {
+ if (recentTasksList != null) {
+ mRecentTaskDescriptions = recentTasksList;
+ } else {
+ mRecentTaskDescriptions = mRecentTasksLoader.getRecentTasks();
+ }
+ mListAdapter.notifyDataSetInvalidated();
+ updateUiElements(getResources().getConfiguration());
+ mRecentTasksDirty = false;
+ }
}
public ArrayList<TaskDescription> getRecentTasksList() {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 181cc98..6549610 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -34,10 +34,10 @@
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.PointF;
-import android.graphics.RectF;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
+import android.os.Process;
import android.os.ServiceManager;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
@@ -51,10 +51,10 @@
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
-import com.android.server.wm.WindowManagerService;
import com.android.systemui.R;
import java.io.File;
@@ -68,6 +68,7 @@
class SaveImageInBackgroundData {
Context context;
Bitmap image;
+ Uri imageUri;
Runnable finisher;
int iconSize;
int result;
@@ -128,9 +129,6 @@
(iconHeight - data.iconSize) / 2, data.iconSize, data.iconSize);
// Show the intermediate notification
- mLaunchIntent = new Intent(Intent.ACTION_VIEW);
- mLaunchIntent.setDataAndType(Uri.fromFile(new File(mImageFilePath)), "image/png");
- mLaunchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mTickerAddSpace = !mTickerAddSpace;
mNotificationId = nId;
mNotificationBuilder = new Notification.Builder(context)
@@ -139,7 +137,7 @@
+ (mTickerAddSpace ? " " : ""))
.setContentTitle(r.getString(R.string.screenshot_saving_title))
.setContentText(r.getString(R.string.screenshot_saving_text))
- .setSmallIcon(android.R.drawable.ic_menu_gallery)
+ .setSmallIcon(R.drawable.stat_notify_image)
.setWhen(System.currentTimeMillis());
Notification n = mNotificationBuilder.getNotification();
n.flags |= Notification.FLAG_NO_CLEAR;
@@ -152,6 +150,10 @@
protected SaveImageInBackgroundData doInBackground(SaveImageInBackgroundData... params) {
if (params.length != 1) return null;
+ // By default, AsyncTask sets the worker thread to have background thread priority, so bump
+ // it back up so that we save a little quicker.
+ Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
+
Context context = params[0].context;
Bitmap image = params[0].image;
@@ -178,6 +180,7 @@
values.put(MediaStore.Images.ImageColumns.SIZE, new File(mImageFilePath).length());
resolver.update(uri, values, null, null);
+ params[0].imageUri = uri;
params[0].result = 0;
} catch (Exception e) {
// IOException/UnsupportedOperationException may be thrown if external storage is not
@@ -197,6 +200,11 @@
// Show the final notification to indicate screenshot saved
Resources r = params.context.getResources();
+ // Create the intent to show the screenshot in gallery
+ mLaunchIntent = new Intent(Intent.ACTION_VIEW);
+ mLaunchIntent.setDataAndType(params.imageUri, "image/png");
+ mLaunchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
mNotificationBuilder
.setContentTitle(r.getString(R.string.screenshot_saved_title))
.setContentText(r.getString(R.string.screenshot_saved_text))
@@ -221,15 +229,18 @@
class GlobalScreenshot {
private static final String TAG = "GlobalScreenshot";
private static final int SCREENSHOT_NOTIFICATION_ID = 789;
- private static final int SCREENSHOT_FADE_IN_DURATION = 250;
- private static final int SCREENSHOT_FADE_OUT_DELAY = 750;
- private static final int SCREENSHOT_FADE_OUT_DURATION = 500;
- private static final int SCREENSHOT_FAST_FADE_OUT_DURATION = 350;
- private static final float BACKGROUND_ALPHA = 0.65f;
- private static final float SCREENSHOT_SCALE_FUDGE = 0.075f; // To account for the border padding
- private static final float SCREENSHOT_SCALE = 0.55f;
- private static final float SCREENSHOT_FADE_IN_MIN_SCALE = SCREENSHOT_SCALE * 0.975f;
- private static final float SCREENSHOT_FADE_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.925f;
+ private static final int SCREENSHOT_FLASH_TO_PEAK_DURATION = 130;
+ private static final int SCREENSHOT_DROP_IN_DURATION = 430;
+ private static final int SCREENSHOT_DROP_OUT_DELAY = 500;
+ private static final int SCREENSHOT_DROP_OUT_DURATION = 430;
+ private static final int SCREENSHOT_DROP_OUT_SCALE_DURATION = 370;
+ private static final int SCREENSHOT_FAST_DROP_OUT_DURATION = 320;
+ private static final float BACKGROUND_ALPHA = 0.5f;
+ private static final float SCREENSHOT_SCALE = 1f;
+ private static final float SCREENSHOT_DROP_IN_MIN_SCALE = SCREENSHOT_SCALE * 0.725f;
+ private static final float SCREENSHOT_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.45f;
+ private static final float SCREENSHOT_FAST_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.6f;
+ private static final float SCREENSHOT_DROP_OUT_MIN_SCALE_OFFSET = 0f;
private Context mContext;
private LayoutInflater mLayoutInflater;
@@ -246,13 +257,11 @@
private ImageView mBackgroundView;
private FrameLayout mScreenshotContainerView;
private ImageView mScreenshotView;
+ private ImageView mScreenshotFlash;
private AnimatorSet mScreenshotAnimation;
- private int mStatusBarIconSize;
private int mNotificationIconSize;
- private float mDropOffsetX;
- private float mDropOffsetY;
private float mBgPadding;
private float mBgPaddingScale;
@@ -272,6 +281,7 @@
mBackgroundView = (ImageView) mScreenshotLayout.findViewById(R.id.global_screenshot_background);
mScreenshotContainerView = (FrameLayout) mScreenshotLayout.findViewById(R.id.global_screenshot_container);
mScreenshotView = (ImageView) mScreenshotLayout.findViewById(R.id.global_screenshot);
+ mScreenshotFlash = (ImageView) mScreenshotLayout.findViewById(R.id.global_screenshot_flash);
mScreenshotLayout.setFocusable(true);
mScreenshotLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
@@ -301,16 +311,12 @@
mDisplay.getRealMetrics(mDisplayMetrics);
// Get the various target sizes
- mStatusBarIconSize =
- r.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size);
mNotificationIconSize =
r.getDimensionPixelSize(android.R.dimen.notification_large_icon_height);
- mDropOffsetX = r.getDimensionPixelSize(R.dimen.global_screenshot_drop_offset_x);
- mDropOffsetY = r.getDimensionPixelSize(R.dimen.global_screenshot_drop_offset_y);
// Scale has to account for both sides of the bg
mBgPadding = (float) r.getDimensionPixelSize(R.dimen.global_screenshot_bg_padding);
- mBgPaddingScale = (2f * mBgPadding) / mDisplayMetrics.widthPixels;
+ mBgPaddingScale = mBgPadding / mDisplayMetrics.widthPixels;
}
/**
@@ -405,11 +411,11 @@
}
mWindowManager.addView(mScreenshotLayout, mWindowLayoutParams);
- ValueAnimator screenshotFadeInAnim = createScreenshotFadeInAnimation();
- ValueAnimator screenshotFadeOutAnim = createScreenshotFadeOutAnimation(w, h,
+ ValueAnimator screenshotDropInAnim = createScreenshotDropInAnimation();
+ ValueAnimator screenshotFadeOutAnim = createScreenshotDropOutAnimation(w, h,
statusBarVisible, navBarVisible);
mScreenshotAnimation = new AnimatorSet();
- mScreenshotAnimation.play(screenshotFadeInAnim).before(screenshotFadeOutAnim);
+ mScreenshotAnimation.playSequentially(screenshotDropInAnim, screenshotFadeOutAnim);
mScreenshotAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -427,42 +433,71 @@
}
});
}
- private ValueAnimator createScreenshotFadeInAnimation() {
+ private ValueAnimator createScreenshotDropInAnimation() {
+ final float flashPeakDurationPct = ((float) (SCREENSHOT_FLASH_TO_PEAK_DURATION)
+ / SCREENSHOT_DROP_IN_DURATION);
+ final float flashDurationPct = 2f * flashPeakDurationPct;
+ final Interpolator flashAlphaInterpolator = new Interpolator() {
+ @Override
+ public float getInterpolation(float x) {
+ // Flash the flash view in and out quickly
+ if (x <= flashDurationPct) {
+ return (float) Math.sin(Math.PI * (x / flashDurationPct));
+ }
+ return 0;
+ }
+ };
+ final Interpolator scaleInterpolator = new Interpolator() {
+ @Override
+ public float getInterpolation(float x) {
+ // We start scaling when the flash is at it's peak
+ if (x < flashPeakDurationPct) {
+ return 0;
+ }
+ return (x - flashDurationPct) / (1f - flashDurationPct);
+ }
+ };
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
- anim.setInterpolator(new AccelerateInterpolator(1.5f));
- anim.setDuration(SCREENSHOT_FADE_IN_DURATION);
+ anim.setDuration(SCREENSHOT_DROP_IN_DURATION);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
mBackgroundView.setAlpha(0f);
mBackgroundView.setVisibility(View.VISIBLE);
+ mScreenshotContainerView.setAlpha(0f);
mScreenshotContainerView.setTranslationX(0f);
mScreenshotContainerView.setTranslationY(0f);
- mScreenshotContainerView.setScaleX(SCREENSHOT_FADE_IN_MIN_SCALE);
- mScreenshotContainerView.setScaleY(SCREENSHOT_FADE_IN_MIN_SCALE);
- mScreenshotContainerView.setAlpha(0f);
+ mScreenshotContainerView.setScaleX(SCREENSHOT_SCALE + mBgPaddingScale);
+ mScreenshotContainerView.setScaleY(SCREENSHOT_SCALE + mBgPaddingScale);
mScreenshotContainerView.setVisibility(View.VISIBLE);
+ mScreenshotFlash.setAlpha(0f);
+ mScreenshotFlash.setVisibility(View.VISIBLE);
+ }
+ @Override
+ public void onAnimationEnd(android.animation.Animator animation) {
+ mScreenshotFlash.setVisibility(View.GONE);
}
});
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float t = ((Float) animation.getAnimatedValue()).floatValue();
- float scaleT = (SCREENSHOT_FADE_IN_MIN_SCALE)
- + (float) t * (SCREENSHOT_SCALE - SCREENSHOT_FADE_IN_MIN_SCALE);
- mBackgroundView.setAlpha(t * BACKGROUND_ALPHA);
+ float scaleT = (SCREENSHOT_SCALE + mBgPaddingScale)
+ - (float) scaleInterpolator.getInterpolation(t)
+ * (SCREENSHOT_SCALE - SCREENSHOT_DROP_IN_MIN_SCALE);
+ mBackgroundView.setAlpha(scaleInterpolator.getInterpolation(t) * BACKGROUND_ALPHA);
+ mScreenshotContainerView.setAlpha(t);
mScreenshotContainerView.setScaleX(scaleT);
mScreenshotContainerView.setScaleY(scaleT);
- mScreenshotContainerView.setAlpha(t);
+ mScreenshotFlash.setAlpha(flashAlphaInterpolator.getInterpolation(t));
}
});
return anim;
}
- private ValueAnimator createScreenshotFadeOutAnimation(int w, int h, boolean statusBarVisible,
+ private ValueAnimator createScreenshotDropOutAnimation(int w, int h, boolean statusBarVisible,
boolean navBarVisible) {
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
- anim.setInterpolator(new DecelerateInterpolator(0.5f));
- anim.setStartDelay(SCREENSHOT_FADE_OUT_DELAY);
+ anim.setStartDelay(SCREENSHOT_DROP_OUT_DELAY);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -474,54 +509,58 @@
if (!statusBarVisible || !navBarVisible) {
// There is no status bar/nav bar, so just fade the screenshot away in place
- anim.setDuration(SCREENSHOT_FAST_FADE_OUT_DURATION);
+ anim.setDuration(SCREENSHOT_FAST_DROP_OUT_DURATION);
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float t = ((Float) animation.getAnimatedValue()).floatValue();
- float scaleT = (SCREENSHOT_FADE_OUT_MIN_SCALE)
- + (float) (1f - t) * (SCREENSHOT_SCALE - SCREENSHOT_FADE_OUT_MIN_SCALE);
+ float scaleT = (SCREENSHOT_DROP_IN_MIN_SCALE + mBgPaddingScale)
+ - (float) t * (SCREENSHOT_DROP_IN_MIN_SCALE
+ - SCREENSHOT_FAST_DROP_OUT_MIN_SCALE);
mBackgroundView.setAlpha((1f - t) * BACKGROUND_ALPHA);
- mScreenshotContainerView.setAlpha((1f - t) * BACKGROUND_ALPHA);
+ mScreenshotContainerView.setAlpha(1f - t);
mScreenshotContainerView.setScaleX(scaleT);
mScreenshotContainerView.setScaleY(scaleT);
}
});
} else {
+ // In the case where there is a status bar, animate to the origin of the bar (top-left)
+ final float scaleDurationPct = (float) SCREENSHOT_DROP_OUT_SCALE_DURATION
+ / SCREENSHOT_DROP_OUT_DURATION;
+ final Interpolator scaleInterpolator = new Interpolator() {
+ @Override
+ public float getInterpolation(float x) {
+ if (x < scaleDurationPct) {
+ // Decelerate, and scale the input accordingly
+ return (float) (1f - Math.pow(1f - (x / scaleDurationPct), 2f));
+ }
+ return 1f;
+ }
+ };
+
// Determine the bounds of how to scale
float halfScreenWidth = (w - 2f * mBgPadding) / 2f;
float halfScreenHeight = (h - 2f * mBgPadding) / 2f;
- final RectF finalBounds = new RectF(mDropOffsetX, mDropOffsetY,
- mDropOffsetX + mStatusBarIconSize,
- mDropOffsetY + mStatusBarIconSize);
- final PointF currentPos = new PointF(0f, 0f);
- final PointF finalPos = new PointF(-halfScreenWidth + finalBounds.centerX(),
- -halfScreenHeight + finalBounds.centerY());
- final DecelerateInterpolator d = new DecelerateInterpolator(2f);
- // Note: since the scale origin is in the center of the view, divide difference by 2
- float tmpMinScale = 0f;
- if (w > h) {
- tmpMinScale = finalBounds.width() / (2f * w);
- } else {
- tmpMinScale = finalBounds.height() / (2f * h);
- }
- final float minScale = tmpMinScale;
+ final float offsetPct = SCREENSHOT_DROP_OUT_MIN_SCALE_OFFSET;
+ final PointF finalPos = new PointF(
+ -halfScreenWidth + (SCREENSHOT_DROP_OUT_MIN_SCALE + offsetPct) * halfScreenWidth,
+ -halfScreenHeight + (SCREENSHOT_DROP_OUT_MIN_SCALE + offsetPct) * halfScreenHeight);
// Animate the screenshot to the status bar
- anim.setDuration(SCREENSHOT_FADE_OUT_DURATION);
+ anim.setDuration(SCREENSHOT_DROP_OUT_DURATION);
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float t = ((Float) animation.getAnimatedValue()).floatValue();
- float scaleT = minScale
- + (float) (1f - t) * (SCREENSHOT_SCALE - minScale - mBgPaddingScale)
- + mBgPaddingScale;
- mScreenshotContainerView.setAlpha(d.getInterpolation(1f - t));
- mScreenshotContainerView.setTranslationX(d.getInterpolation(t) * finalPos.x);
- mScreenshotContainerView.setTranslationY(d.getInterpolation(t) * finalPos.y);
+ float scaleT = (SCREENSHOT_DROP_IN_MIN_SCALE + mBgPaddingScale)
+ - (float) scaleInterpolator.getInterpolation(t)
+ * (SCREENSHOT_DROP_IN_MIN_SCALE - SCREENSHOT_DROP_OUT_MIN_SCALE);
+ mBackgroundView.setAlpha((1f - t) * BACKGROUND_ALPHA);
+ mScreenshotContainerView.setAlpha(1f - scaleInterpolator.getInterpolation(t));
mScreenshotContainerView.setScaleX(scaleT);
mScreenshotContainerView.setScaleY(scaleT);
- mBackgroundView.setAlpha((1f - t) * BACKGROUND_ALPHA);
+ mScreenshotContainerView.setTranslationX(t * finalPos.x);
+ mScreenshotContainerView.setTranslationY(t * finalPos.y);
}
});
}
@@ -536,7 +575,7 @@
.setTicker(r.getString(R.string.screenshot_failed_title))
.setContentTitle(r.getString(R.string.screenshot_failed_title))
.setContentText(r.getString(R.string.screenshot_failed_text))
- .setSmallIcon(android.R.drawable.ic_menu_report_image)
+ .setSmallIcon(R.drawable.stat_notify_image_error)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.getNotification();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index b724552..87e505b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -113,6 +113,8 @@
// will likely move to a resource or other tunable param at some point
private static final int INTRUDER_ALERT_DECAY_MS = 10000;
+ private static final boolean CLOSE_PANEL_WHEN_EMPTIED = true;
+
// fling gesture tuning parameters, scaled to display density
private float mSelfExpandVelocityPx; // classic value: 2000px/s
private float mSelfCollapseVelocityPx; // classic value: 2000px/s (will be negated to collapse "up")
@@ -295,15 +297,15 @@
mStatusBarView = sb;
try {
- boolean showNav = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
+ boolean showNav = mWindowManager.hasNavigationBar();
if (showNav) {
mNavigationBarView =
(NavigationBarView) View.inflate(context, R.layout.navigation_bar, null);
mNavigationBarView.setDisabledFlags(mDisabled);
}
- } catch (Resources.NotFoundException ex) {
- // no nav bar for you
+ } catch (RemoteException ex) {
+ // no window manager? good luck with that
}
// figure out which pixel-format to use for the status bar.
@@ -435,13 +437,18 @@
}
};
+ private void prepareNavigationBarView() {
+ mNavigationBarView.reorient();
+
+ mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener);
+ mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPanel);
+ }
+
// For small-screen devices (read: phones) that lack hardware navigation buttons
private void addNavigationBar() {
if (mNavigationBarView == null) return;
- mNavigationBarView.reorient();
-
- mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener);
+ prepareNavigationBarView();
WindowManagerImpl.getDefault().addView(
mNavigationBarView, getNavigationBarLayoutParams());
@@ -450,9 +457,7 @@
private void repositionNavigationBar() {
if (mNavigationBarView == null) return;
- mNavigationBarView.reorient();
-
- mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener);
+ prepareNavigationBarView();
WindowManagerImpl.getDefault().updateViewLayout(
mNavigationBarView, getNavigationBarLayoutParams());
@@ -695,6 +700,10 @@
// Recalculate the position of the sliding windows and the titles.
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
+
+ if (CLOSE_PANEL_WHEN_EMPTIED && mNotificationData.size() == 0 && !mAnimating) {
+ animateCollapse();
+ }
}
setAreThereNotifications();
@@ -2007,8 +2016,8 @@
}
public void toggleRecentApps() {
- int msg = (mRecentsPanel.getVisibility() == View.GONE)
- ? MSG_OPEN_RECENTS_PANEL : MSG_CLOSE_RECENTS_PANEL;
+ int msg = (mRecentsPanel.getVisibility() == View.VISIBLE)
+ ? MSG_CLOSE_RECENTS_PANEL : MSG_OPEN_RECENTS_PANEL;
mHandler.removeMessages(msg);
mHandler.sendEmptyMessage(msg);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index 3a06068..5e5bc1a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -45,6 +45,7 @@
private static final String TAG = "StatusBar.KeyButtonView";
final float GLOW_MAX_SCALE_FACTOR = 1.8f;
+ final float BUTTON_QUIESCENT_ALPHA = 0.6f;
IWindowManager mWindowManager;
long mDownTime;
@@ -86,7 +87,7 @@
mGlowBG = a.getDrawable(R.styleable.KeyButtonView_glowBackground);
if (mGlowBG != null) {
- mDrawingAlpha = 0.5f;
+ mDrawingAlpha = BUTTON_QUIESCENT_ALPHA;
}
a.recycle();
@@ -175,8 +176,10 @@
if (pressed != isPressed()) {
AnimatorSet as = new AnimatorSet();
if (pressed) {
- if (mGlowScale < 1.7f) mGlowScale = 1.7f;
- if (mGlowAlpha < 0.5f) mGlowAlpha = 0.5f;
+ if (mGlowScale < GLOW_MAX_SCALE_FACTOR)
+ mGlowScale = GLOW_MAX_SCALE_FACTOR;
+ if (mGlowAlpha < BUTTON_QUIESCENT_ALPHA)
+ mGlowAlpha = BUTTON_QUIESCENT_ALPHA;
setDrawingAlpha(1f);
as.playTogether(
ObjectAnimator.ofFloat(this, "glowAlpha", 1f),
@@ -187,7 +190,7 @@
as.playTogether(
ObjectAnimator.ofFloat(this, "glowAlpha", 0f),
ObjectAnimator.ofFloat(this, "glowScale", 1f),
- ObjectAnimator.ofFloat(this, "drawingAlpha", 0.5f)
+ ObjectAnimator.ofFloat(this, "drawingAlpha", BUTTON_QUIESCENT_ALPHA)
);
as.setDuration(500);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 4f9eb38..1d4b9ba 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -95,7 +95,7 @@
final WifiManager mWifiManager;
AsyncChannel mWifiChannel;
boolean mWifiEnabled, mWifiConnected;
- int mWifiLevel;
+ int mWifiRssi, mWifiLevel;
String mWifiSsid;
int mWifiIconId = 0;
int mWifiActivityIconId = 0; // overlay arrows for wifi direction
@@ -654,24 +654,29 @@
mWifiConnected = networkInfo != null && networkInfo.isConnected();
// If we just connected, grab the inintial signal strength and ssid
if (mWifiConnected && !wasConnected) {
- WifiInfo info = mWifiManager.getConnectionInfo();
+ // try getting it out of the intent first
+ WifiInfo info = (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
+ if (info == null) {
+ info = mWifiManager.getConnectionInfo();
+ }
if (info != null) {
- mWifiLevel = WifiManager.calculateSignalLevel(info.getRssi(),
- WifiIcons.WIFI_LEVEL_COUNT);
mWifiSsid = huntForSsid(info);
} else {
- mWifiLevel = 0;
mWifiSsid = null;
}
} else if (!mWifiConnected) {
- mWifiLevel = 0;
mWifiSsid = null;
}
-
+ // Apparently the wifi level is not stable at this point even if we've just connected to
+ // the network; we need to wait for an RSSI_CHANGED_ACTION for that. So let's just set
+ // it to 0 for now
+ mWifiLevel = 0;
+ mWifiRssi = -200;
} else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
if (mWifiConnected) {
- final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
- mWifiLevel = WifiManager.calculateSignalLevel(newRssi, WifiIcons.WIFI_LEVEL_COUNT);
+ mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
+ mWifiLevel = WifiManager.calculateSignalLevel(
+ mWifiRssi, WifiIcons.WIFI_LEVEL_COUNT);
}
}
@@ -1031,6 +1036,8 @@
pw.println(mWifiEnabled);
pw.print(" mWifiConnected=");
pw.println(mWifiConnected);
+ pw.print(" mWifiRssi=");
+ pw.println(mWifiRssi);
pw.print(" mWifiLevel=");
pw.println(mWifiLevel);
pw.print(" mWifiSsid=");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index f0a10f3..00bdd44 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -444,11 +444,14 @@
sb.setHandler(mHandler);
- // Sanity-check that someone hasn't set up the config wrong and asked for a navigation bar
- // on a tablet that has only the system bar
- if (mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_showNavigationBar)) {
- throw new RuntimeException("Tablet device cannot show navigation bar and system bar");
+ try {
+ // Sanity-check that someone hasn't set up the config wrong and asked for a navigation
+ // bar on a tablet that has only the system bar
+ if (mWindowManager.hasNavigationBar()) {
+ throw new RuntimeException(
+ "Tablet device cannot show navigation bar and system bar");
+ }
+ } catch (RemoteException ex) {
}
mBarContents = (ViewGroup) sb.findViewById(R.id.bar_contents);
@@ -587,6 +590,7 @@
// Add the windows
addPanelWindows();
+ mRecentButton.setOnTouchListener(mRecentsPanel);
mPile = (ViewGroup)mNotificationPanel.findViewById(R.id.content);
mPile.removeAllViews();
@@ -1805,8 +1809,8 @@
}
public void toggleRecentApps() {
- int msg = (mRecentsPanel.getVisibility() == View.GONE)
- ? MSG_OPEN_RECENTS_PANEL : MSG_CLOSE_RECENTS_PANEL;
+ int msg = (mRecentsPanel.getVisibility() == View.VISIBLE)
+ ? MSG_CLOSE_RECENTS_PANEL : MSG_OPEN_RECENTS_PANEL;
mHandler.removeMessages(msg);
mHandler.sendEmptyMessage(msg);
}
diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java
index 11b6c15..f040e87 100644
--- a/policy/src/com/android/internal/policy/impl/GlobalActions.java
+++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java
@@ -121,10 +121,9 @@
R.string.global_action_silent_mode_off_status) {
void willCreate() {
- // XXX: FIXME: Add vibrate indicator when available
mEnabledIconResId = (Settings.System.getInt(mContext.getContentResolver(),
Settings.System.VIBRATE_IN_SILENT, 1) == 1)
- ? R.drawable.ic_audio_vol_mute
+ ? R.drawable.ic_audio_ring_notif_vibrate
: R.drawable.ic_audio_vol_mute;
}
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
index de156c9..26bd697 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
@@ -47,29 +47,34 @@
private AudioManager mAudioManager;
private TelephonyManager mTelephonyManager = null;
+ // This is a faster way to draw the background on devices without hardware acceleration
+ Drawable mBackgroundDrawable = new Drawable() {
+ @Override
+ public void draw(Canvas canvas) {
+ canvas.drawColor(BACKGROUND_COLOR, PorterDuff.Mode.SRC);
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.TRANSLUCENT;
+ }
+ };
+
public KeyguardViewBase(Context context) {
super(context);
+ resetBackground();
+ }
- // This is a faster way to draw the background on devices without hardware acceleration
- setBackgroundDrawable(new Drawable() {
- @Override
- public void draw(Canvas canvas) {
- canvas.drawColor(BACKGROUND_COLOR, PorterDuff.Mode.SRC);
- }
-
- @Override
- public void setAlpha(int alpha) {
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
- });
+ public void resetBackground() {
+ setBackgroundDrawable(mBackgroundDrawable);
}
// used to inject callback
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
index 0471dfe..c802bc1 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
@@ -616,8 +616,8 @@
final IccCard.State state = mUpdateMonitor.getSimState();
final boolean lockedOrMissing = state.isPinLocked()
|| ((state == IccCard.State.ABSENT
- || state == IccCard.State.PERM_DISABLED)
- && requireSim);
+ || state == IccCard.State.PERM_DISABLED)
+ && requireSim);
if (!lockedOrMissing && !provisioned) {
if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned"
@@ -625,7 +625,7 @@
return;
}
- if (mLockPatternUtils.isLockScreenDisabled()) {
+ if (mLockPatternUtils.isLockScreenDisabled() && !lockedOrMissing) {
if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off");
return;
}
diff --git a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
index ac2a41e..81e1901 100644
--- a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
+++ b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
@@ -42,8 +42,10 @@
import android.content.ServiceConnection;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
@@ -241,6 +243,9 @@
// TODO: examine all widgets to derive clock status
mUpdateMonitor.reportClockVisible(false);
+
+ // TODO: We should disable the wallpaper instead
+ setBackgroundColor(0xff000000);
}
public void requestHide(View view) {
@@ -249,6 +254,7 @@
// TODO: examine all widgets to derive clock status
mUpdateMonitor.reportClockVisible(true);
+ resetBackground();
}
public boolean isVisible(View self) {
@@ -352,15 +358,16 @@
public void takeEmergencyCallAction() {
mHasOverlay = true;
- // FaceLock must be stopped if it is running when emergency call is pressed
- stopAndUnbindFromFaceLock();
- // Continue showing FaceLock area until dialer comes up
+ // Continue showing FaceLock area until dialer comes up or call is resumed
if (mLockPatternUtils.usingBiometricWeak() &&
- mLockPatternUtils.isBiometricWeakInstalled()) {
+ mLockPatternUtils.isBiometricWeakInstalled() && mFaceLockServiceRunning) {
showFaceLockAreaWithTimeout(FACELOCK_VIEW_AREA_EMERGENCY_DIALER_TIMEOUT);
}
+ // FaceLock must be stopped if it is running
+ stopAndUnbindFromFaceLock();
+
pokeWakelock(EMERGENCY_CALL_TIMEOUT);
if (TelephonyManager.getDefault().getCallState()
== TelephonyManager.CALL_STATE_OFFHOOK) {
@@ -1140,14 +1147,25 @@
// Everything below pertains to FaceLock - might want to separate this out
- // Only pattern and pin unlock screens actually have a view for the FaceLock area, so it's not
- // uncommon for it to not exist. But if it does exist, we need to make sure it's shown (hiding
- // the fallback) if FaceLock is enabled, and make sure it's hidden (showing the unlock) if
- // FaceLock is disabled
+ // Take care of FaceLock area when layout is created
private void initializeFaceLockAreaView(View view) {
- mFaceLockAreaView = view.findViewById(R.id.faceLockAreaView);
- if (mFaceLockAreaView == null) {
- if (DEBUG) Log.d(TAG, "Layout does not have faceLockAreaView");
+ if (mLockPatternUtils.usingBiometricWeak() &&
+ mLockPatternUtils.isBiometricWeakInstalled()) {
+ mFaceLockAreaView = view.findViewById(R.id.faceLockAreaView);
+ if (mFaceLockAreaView == null) {
+ Log.e(TAG, "Layout does not have faceLockAreaView and FaceLock is enabled");
+ } else {
+ if (mBoundToFaceLockService) {
+ // If we are creating a layout when we are already bound to FaceLock, then we
+ // are undergoing an orientation change. Stop FaceLock and restart it in the
+ // new location.
+ if (DEBUG) Log.d(TAG, "Restarting FL - creating view while already bound");
+ stopAndUnbindFromFaceLock();
+ activateFaceLockIfAble();
+ }
+ }
+ } else {
+ mFaceLockAreaView = null; // Set to null if not using FaceLock
}
}
@@ -1164,7 +1182,7 @@
break;
case MSG_HIDE_FACELOCK_AREA_VIEW:
if (mFaceLockAreaView != null) {
- mFaceLockAreaView.setVisibility(View.GONE);
+ mFaceLockAreaView.setVisibility(View.INVISIBLE);
}
break;
default:
@@ -1200,7 +1218,8 @@
mHandler.sendEmptyMessageDelayed(MSG_HIDE_FACELOCK_AREA_VIEW, timeoutMillis);
}
- // Binds to FaceLock service, but does not tell it to start
+ // Binds to FaceLock service. This call does not tell it to start, but it causes the service
+ // to call the onServiceConnected callback, which then starts FaceLock.
public void bindToFaceLock() {
if (mLockPatternUtils.usingBiometricWeak() &&
mLockPatternUtils.isBiometricWeakInstalled()) {
@@ -1236,9 +1255,10 @@
if (DEBUG) Log.d(TAG, "after unbind from FaceLock service");
mBoundToFaceLockService = false;
} else {
- // This could probably happen after the session when someone activates FaceLock
- // because it wasn't active when the phone was turned on
- Log.w(TAG, "Attempt to unbind from FaceLock when not bound");
+ // This is usually not an error when this happens. Sometimes we will tell it to
+ // unbind multiple times because it's called from both onWindowFocusChanged and
+ // onDetachedFromWindow.
+ if (DEBUG) Log.d(TAG, "Attempt to unbind from FaceLock when not bound");
}
}
}
@@ -1356,6 +1376,13 @@
mKeyguardScreenCallback.pokeWakelock(BACKUP_LOCK_TIMEOUT);
}
+ // Removes the black area that covers the backup unlock method
+ @Override
+ public void exposeFallback() {
+ if (DEBUG) Log.d(TAG, "FaceLock exposeFallback()");
+ hideFaceLockArea(); // Expose fallback
+ }
+
// Allows the Face Unlock service to poke the wake lock to keep the lockscreen alive
@Override
public void pokeWakelock() {
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index b9fe182..0a77654 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -571,7 +571,9 @@
if (!mPowerKeyHandled) {
mHandler.removeCallbacks(mPowerLongPress);
}
- mPendingPowerKeyUpCanceled = true;
+ if (mPowerKeyTriggered) {
+ mPendingPowerKeyUpCanceled = true;
+ }
}
private void interceptScreenshotChord() {
@@ -823,6 +825,14 @@
mHasNavigationBar = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_showNavigationBar);
+ // Allow a system property to override this. Used by the emulator.
+ // See also hasNavigationBar().
+ String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
+ if (! "".equals(navBarOverride)) {
+ if (navBarOverride.equals("1")) mHasNavigationBar = false;
+ else if (navBarOverride.equals("0")) mHasNavigationBar = true;
+ }
+
mNavigationBarHeight = mHasNavigationBar
? mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.navigation_bar_height)
@@ -3725,6 +3735,12 @@
return diff;
}
+ // Use this instead of checking config_showNavigationBar so that it can be consistently
+ // overridden by qemu.hw.mainkeys in the emulator.
+ public boolean hasNavigationBar() {
+ return mHasNavigationBar;
+ }
+
public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) {
pw.print(prefix); pw.print("mSafeMode="); pw.print(mSafeMode);
pw.print(" mSystemReady="); pw.print(mSystemReady);
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index ab49f93..69560e5 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -1332,7 +1332,13 @@
int sessionId)
{
Mutex::Autolock _l(mLock);
+ checkSuspendOnEffectEnabled_l(effect, enabled, sessionId);
+}
+void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
+ bool enabled,
+ int sessionId)
+{
if (mType != RECORD) {
// suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on
// another session. This gives the priority to well behaved effect control panels
@@ -1832,7 +1838,9 @@
size_t mixBufferSize = mFrameCount * mFrameSize;
// FIXME: Relaxed timing because of a certain device that can't meet latency
// Should be reduced to 2x after the vendor fixes the driver issue
- nsecs_t maxPeriod = seconds(mFrameCount) / mSampleRate * 3;
+ // increase threshold again due to low power audio mode. The way this warning threshold is
+ // calculated and its usefulness should be reconsidered anyway.
+ nsecs_t maxPeriod = seconds(mFrameCount) / mSampleRate * 15;
nsecs_t lastWarning = 0;
bool longStandbyExit = false;
uint32_t activeSleepTime = activeSleepTimeUs();
@@ -1886,7 +1894,9 @@
mixBufferSize = mFrameCount * mFrameSize;
// FIXME: Relaxed timing because of a certain device that can't meet latency
// Should be reduced to 2x after the vendor fixes the driver issue
- maxPeriod = seconds(mFrameCount) / mSampleRate * 3;
+ // increase threshold again due to low power audio mode. The way this warning
+ // threshold is calculated and its usefulness should be reconsidered anyway.
+ maxPeriod = seconds(mFrameCount) / mSampleRate * 15;
activeSleepTime = activeSleepTimeUs();
idleSleepTime = idleSleepTimeUs();
}
@@ -1983,7 +1993,7 @@
mInWrite = false;
nsecs_t now = systemTime();
nsecs_t delta = now - mLastWriteTime;
- if (delta > maxPeriod) {
+ if (!mStandby && delta > maxPeriod) {
mNumDelayedWrites++;
if ((now - lastWarning) > kWarningThrottle) {
LOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
@@ -5220,6 +5230,9 @@
sp<EffectHandle> handle = effect->mHandles[j].promote();
if (handle != 0) {
handle->mEffect.clear();
+ if (handle->mHasControl && handle->mEnabled) {
+ t->checkSuspendOnEffectEnabled_l(effect, false, effect->sessionId());
+ }
}
}
AudioSystem::unregisterEffect(effect->id());
@@ -6840,7 +6853,7 @@
}
mEffect->disconnect(this, unpiniflast);
- if (mEnabled) {
+ if (mHasControl && mEnabled) {
sp<ThreadBase> thread = mEffect->thread().promote();
if (thread != 0) {
thread->checkSuspendOnEffectEnabled(mEffect, false, mEffect->sessionId());
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index ed9d81e..4b794ef 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -492,10 +492,12 @@
int sessionId = AUDIO_SESSION_OUTPUT_MIX);
// check if some effects must be suspended/restored when an effect is enabled
// or disabled
- virtual void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
+ void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
bool enabled,
int sessionId = AUDIO_SESSION_OUTPUT_MIX);
-
+ void checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
+ bool enabled,
+ int sessionId = AUDIO_SESSION_OUTPUT_MIX);
mutable Mutex mLock;
protected:
@@ -1299,7 +1301,7 @@
// suspend all eligible effects
void setEffectSuspendedAll_l(bool suspend);
// check if effects should be suspend or restored when a given effect is enable or disabled
- virtual void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
+ void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
bool enabled);
status_t dump(int fd, const Vector<String16>& args);
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 171710a..bb0e664 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -331,14 +331,8 @@
Mutex::Autolock lock(mSoundLock);
sp<MediaPlayer> player = mSoundPlayer[kind];
if (player != 0) {
- // do not play the sound if stream volume is 0
- // (typically because ringer mode is silent).
- int index;
- AudioSystem::getStreamVolumeIndex(mAudioStreamType, &index);
- if (index != 0) {
- player->seekTo(0);
- player->start();
- }
+ player->seekTo(0);
+ player->start();
}
}
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 498bdfc..851cb33 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -2450,6 +2450,12 @@
int defaultVal = (SystemProperties.get("ro.tether.denied").equals("true") ? 0 : 1);
boolean tetherEnabledInSettings = (Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.TETHER_SUPPORTED, defaultVal) != 0);
+ // Short term disabling of Tethering if DUN is required.
+ // TODO - fix multi-connection tethering using policy-base routing
+ int[] upstreamConnTypes = mTethering.getUpstreamIfaceTypes();
+ for (int i : upstreamConnTypes) {
+ if (i == ConnectivityManager.TYPE_MOBILE_DUN) return false;
+ }
return tetherEnabledInSettings && mTetheringConfigValid;
}
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java
index f1b8bae..47644de 100644
--- a/services/java/com/android/server/DevicePolicyManagerService.java
+++ b/services/java/com/android/server/DevicePolicyManagerService.java
@@ -44,6 +44,7 @@
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.os.Binder;
+import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.IPowerManager;
@@ -1656,8 +1657,18 @@
}
}
+ private boolean isExtStorageEncrypted() {
+ String state = SystemProperties.get("vold.decrypt");
+ return !"".equals(state);
+ }
+
void wipeDataLocked(int flags) {
- if ((flags&DevicePolicyManager.WIPE_EXTERNAL_STORAGE) != 0) {
+ // If the SD card is encrypted and non-removable, we have to force a wipe.
+ boolean forceExtWipe = !Environment.isExternalStorageRemovable() && isExtStorageEncrypted();
+ boolean wipeExtRequested = (flags&DevicePolicyManager.WIPE_EXTERNAL_STORAGE) != 0;
+
+ // Note: we can only do the wipe via ExternalStorageFormatter if the volume is not emulated.
+ if ((forceExtWipe || wipeExtRequested) && !Environment.isExternalStorageEmulated()) {
Intent intent = new Intent(ExternalStorageFormatter.FORMAT_AND_FACTORY_RESET);
intent.setComponent(ExternalStorageFormatter.COMPONENT_NAME);
mWakeLock.acquire(10000);
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 994201b..fdae4bd 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -1698,6 +1698,11 @@
// make sure button and key backlights are off too
mButtonLight.turnOff();
mKeyboardLight.turnOff();
+ // clear current value so we will update based on the new conditions
+ // when the sensor is reenabled.
+ mLightSensorValue = -1;
+ // reset our highest light sensor value when the screen turns off
+ mHighestLightSensorValue = -1;
}
}
}
@@ -2467,7 +2472,6 @@
synchronized (mLocks) {
mIsDocked = (state != Intent.EXTRA_DOCK_STATE_UNDOCKED);
if (mIsDocked) {
- // allow brightness to decrease when docked
mHighestLightSensorValue = -1;
}
if ((mPowerState & SCREEN_ON_BIT) != 0) {
@@ -3039,25 +3043,20 @@
}
if (mSensorManager != null && mLightSensorEnabled != enable) {
mLightSensorEnabled = enable;
+ // clear previous values so we will adjust to current brightness when
+ // auto-brightness is reenabled
+ mHighestLightSensorValue = -1;
+ mLightSensorValue = -1;
+
// clear calling identity so sensor manager battery stats are accurate
long identity = Binder.clearCallingIdentity();
try {
if (enable) {
- // reset our highest value when reenabling
- mHighestLightSensorValue = -1;
- // force recompute of backlight values
- if (mLightSensorValue >= 0) {
- int value = (int)mLightSensorValue;
- mLightSensorValue = -1;
- handleLightSensorValue(value);
- }
mSensorManager.registerListener(mLightListener, mLightSensor,
SensorManager.SENSOR_DELAY_NORMAL);
} else {
mSensorManager.unregisterListener(mLightListener);
mHandler.removeCallbacks(mAutoBrightnessTask);
- mLightSensorPendingDecrease = false;
- mLightSensorPendingIncrease = false;
}
} finally {
Binder.restoreCallingIdentity(identity);
@@ -3109,45 +3108,43 @@
}
};
- private void handleLightSensorValue(int value) {
- long milliseconds = SystemClock.elapsedRealtime();
- if (mLightSensorValue == -1 ||
- milliseconds < mLastScreenOnTime + mLightSensorWarmupTime) {
- // process the value immediately if screen has just turned on
- mHandler.removeCallbacks(mAutoBrightnessTask);
- mLightSensorPendingDecrease = false;
- mLightSensorPendingIncrease = false;
- lightSensorChangedLocked(value);
- } else {
- if ((value > mLightSensorValue && mLightSensorPendingDecrease) ||
- (value < mLightSensorValue && mLightSensorPendingIncrease) ||
- (value == mLightSensorValue) ||
- (!mLightSensorPendingDecrease && !mLightSensorPendingIncrease)) {
- // delay processing to debounce the sensor
- mHandler.removeCallbacks(mAutoBrightnessTask);
- mLightSensorPendingDecrease = (value < mLightSensorValue);
- mLightSensorPendingIncrease = (value > mLightSensorValue);
- if (mLightSensorPendingDecrease || mLightSensorPendingIncrease) {
- mLightSensorPendingValue = value;
- mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY);
- }
- } else {
- mLightSensorPendingValue = value;
- }
- }
- }
-
SensorEventListener mLightListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
- if (mDebugLightSensor) {
- Slog.d(TAG, "onSensorChanged: light value: " + event.values[0]);
- }
synchronized (mLocks) {
// ignore light sensor while screen is turning off
if (isScreenTurningOffLocked()) {
return;
}
- handleLightSensorValue((int)event.values[0]);
+
+ int value = (int)event.values[0];
+ long milliseconds = SystemClock.elapsedRealtime();
+ if (mDebugLightSensor) {
+ Slog.d(TAG, "onSensorChanged: light value: " + value);
+ }
+ if (mLightSensorValue == -1 ||
+ milliseconds < mLastScreenOnTime + mLightSensorWarmupTime) {
+ // process the value immediately if screen has just turned on
+ mHandler.removeCallbacks(mAutoBrightnessTask);
+ mLightSensorPendingDecrease = false;
+ mLightSensorPendingIncrease = false;
+ lightSensorChangedLocked(value);
+ } else {
+ if ((value > mLightSensorValue && mLightSensorPendingDecrease) ||
+ (value < mLightSensorValue && mLightSensorPendingIncrease) ||
+ (value == mLightSensorValue) ||
+ (!mLightSensorPendingDecrease && !mLightSensorPendingIncrease)) {
+ // delay processing to debounce the sensor
+ mHandler.removeCallbacks(mAutoBrightnessTask);
+ mLightSensorPendingDecrease = (value < mLightSensorValue);
+ mLightSensorPendingIncrease = (value > mLightSensorValue);
+ if (mLightSensorPendingDecrease || mLightSensorPendingIncrease) {
+ mLightSensorPendingValue = value;
+ mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY);
+ }
+ } else {
+ mLightSensorPendingValue = value;
+ }
+ }
}
}
diff --git a/services/java/com/android/server/TextServicesManagerService.java b/services/java/com/android/server/TextServicesManagerService.java
index 788ecda..1976eba 100644
--- a/services/java/com/android/server/TextServicesManagerService.java
+++ b/services/java/com/android/server/TextServicesManagerService.java
@@ -691,7 +691,7 @@
}
ISpellCheckerService spellChecker = ISpellCheckerService.Stub.asInterface(service);
final SpellCheckerBindGroup group = mSpellCheckerBindGroups.get(mSciId);
- if (this == group.mInternalConnection) {
+ if (group != null && this == group.mInternalConnection) {
group.onServiceConnected(spellChecker);
}
}
@@ -701,7 +701,7 @@
public void onServiceDisconnected(ComponentName name) {
synchronized(mSpellCheckerMap) {
final SpellCheckerBindGroup group = mSpellCheckerBindGroups.get(mSciId);
- if (this == group.mInternalConnection) {
+ if (group != null && this == group.mInternalConnection) {
mSpellCheckerBindGroups.remove(mSciId);
}
}
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index a0e28ed..7fa404e8 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -102,7 +102,7 @@
* everytime the wallpaper is changed.
*/
private final FileObserver mWallpaperObserver = new FileObserver(
- WALLPAPER_DIR.getAbsolutePath(), CREATE | CLOSE_WRITE | DELETE | DELETE_SELF) {
+ WALLPAPER_DIR.getAbsolutePath(), CLOSE_WRITE | DELETE | DELETE_SELF) {
@Override
public void onEvent(int event, String path) {
if (path == null) {
@@ -118,8 +118,11 @@
File changedFile = new File(WALLPAPER_DIR, path);
if (WALLPAPER_FILE.equals(changedFile)) {
notifyCallbacksLocked();
- if (mWallpaperComponent == null || mImageWallpaperPending) {
- mImageWallpaperPending = false;
+ if (mWallpaperComponent == null || event != CLOSE_WRITE
+ || mImageWallpaperPending) {
+ if (event == CLOSE_WRITE) {
+ mImageWallpaperPending = false;
+ }
bindWallpaperComponentLocked(mImageWallpaperComponent,
true, false);
saveSettingsLocked();
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 6b9c088..1107fe9 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -160,13 +160,24 @@
mDhcpRange = DHCP_DEFAULT_RANGE;
}
- mTetherableUsbRegexs = context.getResources().getStringArray(
+ // load device config info
+ updateConfiguration();
+
+ // TODO - remove and rely on real notifications of the current iface
+ mDnsServers = new String[2];
+ mDnsServers[0] = DNS_DEFAULT_SERVER1;
+ mDnsServers[1] = DNS_DEFAULT_SERVER2;
+ }
+
+ void updateConfiguration() {
+ mTetherableUsbRegexs = mContext.getResources().getStringArray(
com.android.internal.R.array.config_tether_usb_regexs);
- mTetherableWifiRegexs = context.getResources().getStringArray(
+ mTetherableWifiRegexs = mContext.getResources().getStringArray(
com.android.internal.R.array.config_tether_wifi_regexs);
- mTetherableBluetoothRegexs = context.getResources().getStringArray(
+ mTetherableBluetoothRegexs = mContext.getResources().getStringArray(
com.android.internal.R.array.config_tether_bluetooth_regexs);
- int ifaceTypes[] = context.getResources().getIntArray(
+
+ int ifaceTypes[] = mContext.getResources().getIntArray(
com.android.internal.R.array.config_tether_upstream_types);
mUpstreamIfaceTypes = new ArrayList();
for (int i : ifaceTypes) {
@@ -175,11 +186,6 @@
// check if the upstream type list needs to be modified due to secure-settings
checkDunRequired();
-
- // TODO - remove and rely on real notifications of the current iface
- mDnsServers = new String[2];
- mDnsServers[0] = DNS_DEFAULT_SERVER1;
- mDnsServers[1] = DNS_DEFAULT_SERVER2;
}
public void interfaceStatusChanged(String iface, boolean up) {
@@ -575,6 +581,7 @@
}
public int[] getUpstreamIfaceTypes() {
+ updateConfiguration();
int values[] = new int[mUpstreamIfaceTypes.size()];
Iterator<Integer> iterator = mUpstreamIfaceTypes.iterator();
for (int i=0; i < mUpstreamIfaceTypes.size(); i++) {
@@ -584,11 +591,13 @@
}
public void checkDunRequired() {
- int requiredApn = ((Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.TETHER_DUN_REQUIRED, 0) == 1) ?
- ConnectivityManager.TYPE_MOBILE_DUN :
- ConnectivityManager.TYPE_MOBILE_HIPRI);
- if (mPreferredUpstreamMobileApn != requiredApn) {
+ int secureSetting = Settings.Secure.getInt(mContext.getContentResolver(),
+ Settings.Secure.TETHER_DUN_REQUIRED, 2);
+ // 2 = not set, 0 = DUN not required, 1 = DUN required
+ if (secureSetting != 2) {
+ int requiredApn = (secureSetting == 1 ?
+ ConnectivityManager.TYPE_MOBILE_DUN :
+ ConnectivityManager.TYPE_MOBILE_HIPRI);
if (requiredApn == ConnectivityManager.TYPE_MOBILE_DUN) {
while (mUpstreamIfaceTypes.contains(MOBILE_TYPE)) {
mUpstreamIfaceTypes.remove(MOBILE_TYPE);
@@ -610,7 +619,11 @@
mUpstreamIfaceTypes.add(HIPRI_TYPE);
}
}
- mPreferredUpstreamMobileApn = requiredApn;
+ }
+ if (mUpstreamIfaceTypes.contains(DUN_TYPE)) {
+ mPreferredUpstreamMobileApn = ConnectivityManager.TYPE_MOBILE_DUN;
+ } else {
+ mPreferredUpstreamMobileApn = ConnectivityManager.TYPE_MOBILE_HIPRI;
}
}
@@ -1251,6 +1264,15 @@
int upType = ConnectivityManager.TYPE_NONE;
String iface = null;
+ updateConfiguration();
+
+ if (VDBG) {
+ Log.d(TAG, "chooseUpstreamType has upstream iface types:");
+ for (Integer netType : mUpstreamIfaceTypes) {
+ Log.d(TAG, " " + netType);
+ }
+ }
+
for (Integer netType : mUpstreamIfaceTypes) {
NetworkInfo info = null;
try {
@@ -1314,7 +1336,6 @@
boolean retValue = true;
switch (message.what) {
case CMD_TETHER_MODE_REQUESTED:
- checkDunRequired();
TetherInterfaceSM who = (TetherInterfaceSM)message.obj;
if (VDBG) Log.d(TAG, "Tether Mode requested by " + who.toString());
mNotifyList.add(who);
@@ -1487,6 +1508,11 @@
return;
}
+ pw.println("mUpstreamIfaceTypes: ");
+ for (Integer netType : mUpstreamIfaceTypes) {
+ pw.println(" " + netType);
+ }
+
pw.println();
pw.println("Tether state:");
synchronized (mIfaces) {
diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java
index 0ce5499..00788ba 100755
--- a/services/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/java/com/android/server/location/GpsLocationProvider.java
@@ -554,13 +554,8 @@
long delay;
- // force refresh NTP cache when outdated
- if (mNtpTime.getCacheAge() >= NTP_INTERVAL) {
- mNtpTime.forceRefresh();
- }
-
- // only update when NTP time is fresh
- if (mNtpTime.getCacheAge() < NTP_INTERVAL) {
+ // GPS requires fresh NTP time
+ if (mNtpTime.forceRefresh()) {
long time = mNtpTime.getCachedNtpTime();
long timeReference = mNtpTime.getCachedNtpTimeReference();
long certainty = mNtpTime.getCacheCertainty();
diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java
index 91576e7..131f11c 100644
--- a/services/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -64,17 +64,16 @@
boolean inTransaction, int originalWidth, int originalHeight, int originalRotation) {
mContext = context;
- Bitmap screenshot = Surface.screenshot(0, 0);
-
- if (screenshot == null) {
- // Device is not capable of screenshots... we can't do an animation.
- return;
- }
-
// Screenshot does NOT include rotation!
mSnapshotRotation = 0;
- mWidth = screenshot.getWidth();
- mHeight = screenshot.getHeight();
+ if (originalRotation == Surface.ROTATION_90
+ || originalRotation == Surface.ROTATION_270) {
+ mWidth = originalHeight;
+ mHeight = originalWidth;
+ } else {
+ mWidth = originalWidth;
+ mHeight = originalHeight;
+ }
mOriginalRotation = originalRotation;
mOriginalWidth = originalWidth;
@@ -89,7 +88,12 @@
try {
try {
mSurface = new Surface(session, 0, "FreezeSurface",
- -1, mWidth, mHeight, PixelFormat.OPAQUE, 0);
+ -1, mWidth, mHeight, PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT);
+ if (mSurface == null || !mSurface.isValid()) {
+ // Screenshot failed, punt.
+ mSurface = null;
+ return;
+ }
mSurface.setLayer(FREEZE_LAYER + 1);
} catch (Surface.OutOfResourcesException e) {
Slog.w(TAG, "Unable to allocate freeze surface", e);
@@ -100,38 +104,12 @@
" FREEZE " + mSurface + ": CREATE");
setRotation(originalRotation);
-
- if (mSurface != null) {
- Rect dirty = new Rect(0, 0, mWidth, mHeight);
- Canvas c = null;
- try {
- c = mSurface.lockCanvas(dirty);
- } catch (IllegalArgumentException e) {
- Slog.w(TAG, "Unable to lock surface", e);
- } catch (Surface.OutOfResourcesException e) {
- Slog.w(TAG, "Unable to lock surface", e);
- }
- if (c == null) {
- Slog.w(TAG, "Null surface canvas");
- mSurface.destroy();
- mSurface = null;
- return;
- }
-
- Paint paint = new Paint(0);
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
- c.drawBitmap(screenshot, 0, 0, paint);
-
- mSurface.unlockCanvasAndPost(c);
- }
} finally {
if (!inTransaction) {
Surface.closeTransaction();
if (WindowManagerService.SHOW_LIGHT_TRANSACTIONS) Slog.i(WindowManagerService.TAG,
"<<< CLOSE TRANSACTION ScreenRotationAnimation");
}
-
- screenshot.recycle();
}
}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 68f0e66..a199a7e 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -3973,6 +3973,7 @@
if (w.mAppFreezing) {
w.mAppFreezing = false;
if (w.mSurface != null && !w.mOrientationChanging) {
+ if (DEBUG_ORIENTATION) Slog.v(TAG, "set mOrientationChanging of " + w);
w.mOrientationChanging = true;
}
unfrozeWindows = true;
@@ -5106,7 +5107,7 @@
}
if (rawss == null) {
- Log.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
+ Slog.w(TAG, "Failure taking screenshot for (" + dw + "x" + dh
+ ") to layer " + maxLayer);
return null;
}
@@ -5312,6 +5313,7 @@
for (int i=mWindows.size()-1; i>=0; i--) {
WindowState w = mWindows.get(i);
if (w.mSurface != null) {
+ if (DEBUG_ORIENTATION) Slog.v(TAG, "Set mOrientationChanging of " + w);
w.mOrientationChanging = true;
}
}
@@ -7128,7 +7130,7 @@
if (DEBUG_LAYERS) {
RuntimeException here = new RuntimeException("here");
here.fillInStackTrace();
- Log.v(TAG, "Assigning layers", here);
+ Slog.v(TAG, "Assigning layers", here);
}
for (i=0; i<N; i++) {
@@ -7367,6 +7369,25 @@
return mPolicy.finishLayoutLw();
}
+ void makeWindowFreezingScreenIfNeededLocked(WindowState w) {
+ // If the screen is currently frozen or off, then keep
+ // it frozen/off until this window draws at its new
+ // orientation.
+ if (mDisplayFrozen || !mPolicy.isScreenOnFully()) {
+ if (DEBUG_ORIENTATION) Slog.v(TAG,
+ "Changing surface while display frozen: " + w);
+ w.mOrientationChanging = true;
+ if (!mWindowsFreezingScreen) {
+ mWindowsFreezingScreen = true;
+ // XXX should probably keep timeout from
+ // when we first froze the display.
+ mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
+ mH.sendMessageDelayed(mH.obtainMessage(
+ H.WINDOW_FREEZE_TIMEOUT), 2000);
+ }
+ }
+ }
+
// "Something has changed! Let's make it correct now."
private final void performLayoutAndPlaceSurfacesLockedInner(
boolean recoveringMemory) {
@@ -7718,6 +7739,10 @@
+ " drawn=" + wtoken.numDrawnWindows);
wtoken.showAllWindowsLocked();
unsetAppFreezingScreenLocked(wtoken, false, true);
+ if (DEBUG_ORIENTATION) Slog.i(TAG,
+ "Setting orientationChangeComplete=true because wtoken "
+ + wtoken + " numInteresting=" + numInteresting
+ + " numDrawn=" + wtoken.numDrawnWindows);
orientationChangeComplete = true;
}
} else if (!wtoken.allDrawn) {
@@ -8225,22 +8250,7 @@
w.mLastContentInsets.set(w.mContentInsets);
w.mLastVisibleInsets.set(w.mVisibleInsets);
- // If the screen is currently frozen or off, then keep
- // it frozen/off until this window draws at its new
- // orientation.
- if (mDisplayFrozen || !mPolicy.isScreenOnFully()) {
- if (DEBUG_ORIENTATION) Slog.v(TAG,
- "Resizing while display frozen: " + w);
- w.mOrientationChanging = true;
- if (!mWindowsFreezingScreen) {
- mWindowsFreezingScreen = true;
- // XXX should probably keep timeout from
- // when we first froze the display.
- mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
- mH.sendMessageDelayed(mH.obtainMessage(
- H.WINDOW_FREEZE_TIMEOUT), 2000);
- }
- }
+ makeWindowFreezingScreenIfNeededLocked(w);
// If the orientation is changing, then we need to
// hold off on unfreezing the display until this
// window has been redrawn; to do that, we need
@@ -8563,6 +8573,8 @@
+ Integer.toHexString(diff));
}
win.mConfiguration = mCurConfiguration;
+ if (DEBUG_ORIENTATION && win.mDrawPending) Slog.i(
+ TAG, "Resizing " + win + " WITH DRAW PENDING");
win.mClient.resized((int)win.mSurfaceW, (int)win.mSurfaceH,
win.mLastContentInsets, win.mLastVisibleInsets, win.mDrawPending,
configChanged ? win.mConfiguration : null);
@@ -9087,6 +9099,7 @@
if (CUSTOM_SCREEN_ROTATION && mScreenRotationAnimation != null
&& mScreenRotationAnimation.hasScreenshot()) {
+ if (DEBUG_ORIENTATION) Slog.i(TAG, "**** Dismissing screen rotation animation");
if (mScreenRotationAnimation.dismiss(mFxSession, MAX_ANIMATION_DURATION,
mTransitionAnimationScale, mCurDisplayWidth, mCurDisplayHeight)) {
requestAnimationLocked(0);
@@ -9263,6 +9276,11 @@
}
}
+ @Override
+ public boolean hasNavigationBar() {
+ return mPolicy.hasNavigationBar();
+ }
+
void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
pw.println("WINDOW MANAGER INPUT (dumpsys window input)");
mInputManager.dump(pw);
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index e921818..e9875a5 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -600,6 +600,7 @@
if (mSurface == null) {
mReportDestroySurface = false;
mSurfacePendingDestroy = false;
+ Slog.i(WindowManagerService.TAG, "createSurface " + this + ": DRAW NOW PENDING");
mDrawPending = true;
mCommitDrawPending = false;
mReadyToShow = false;
@@ -607,6 +608,8 @@
mAppToken.allDrawn = false;
}
+ mService.makeWindowFreezingScreenIfNeededLocked(this);
+
int flags = 0;
if ((mAttrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) {
@@ -771,7 +774,7 @@
boolean finishDrawingLocked() {
if (mDrawPending) {
if (SHOW_TRANSACTIONS || WindowManagerService.DEBUG_ORIENTATION) Slog.v(
- WindowManagerService.TAG, "finishDrawingLocked: " + mSurface);
+ WindowManagerService.TAG, "finishDrawingLocked: " + this + " in " + mSurface);
mCommitDrawPending = true;
mDrawPending = false;
return true;
@@ -1120,7 +1123,11 @@
// window's center).
final float w = frame.width();
final float h = frame.height();
- tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2);
+ if (w>=1 && h>=1) {
+ tmpMatrix.setScale(1 + 2/w, 1 + 2/h, w/2, h/2);
+ } else {
+ tmpMatrix.reset();
+ }
} else {
tmpMatrix.reset();
}
diff --git a/services/jni/com_android_server_BatteryService.cpp b/services/jni/com_android_server_BatteryService.cpp
index b9f2c1f..2ceb535 100644
--- a/services/jni/com_android_server_BatteryService.cpp
+++ b/services/jni/com_android_server_BatteryService.cpp
@@ -141,10 +141,10 @@
return -1;
}
- size_t count = read(fd, buf, size);
+ ssize_t count = read(fd, buf, size);
if (count > 0) {
- count = (count < size) ? count : size - 1;
- while (count > 0 && buf[count-1] == '\n') count--;
+ while (count > 0 && buf[count-1] == '\n')
+ count--;
buf[count] = '\0';
} else {
buf[0] = '\0';
diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk
index dab0705..61a8358 100644
--- a/services/surfaceflinger/Android.mk
+++ b/services/surfaceflinger/Android.mk
@@ -5,6 +5,7 @@
Layer.cpp \
LayerBase.cpp \
LayerDim.cpp \
+ LayerScreenshot.cpp \
DdmConnection.cpp \
DisplayHardware/DisplayHardware.cpp \
DisplayHardware/DisplayHardwareBase.cpp \
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index feb2c52..50b8604 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -88,16 +88,8 @@
Layer::~Layer()
{
- class MessageDestroyGLState : public MessageBase {
- GLuint texture;
- public:
- MessageDestroyGLState(GLuint texture) : texture(texture) { }
- virtual bool handler() {
- glDeleteTextures(1, &texture);
- return true;
- }
- };
- mFlinger->postMessageAsync( new MessageDestroyGLState(mTextureName) );
+ mFlinger->postMessageAsync(
+ new SurfaceFlinger::MessageDestroyGLTexture(mTextureName) );
}
void Layer::onFrameQueued() {
@@ -280,33 +272,33 @@
return;
}
- GLenum target = GL_TEXTURE_EXTERNAL_OES;
if (!isProtected()) {
- glBindTexture(target, mTextureName);
+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureName);
+ GLenum filter = GL_NEAREST;
if (getFiltering() || needsFiltering() || isFixedSize() || isCropped()) {
// TODO: we could be more subtle with isFixedSize()
- glTexParameterx(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterx(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- } else {
- glTexParameterx(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameterx(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ filter = GL_LINEAR;
}
- glEnable(target);
+ glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, filter);
+ glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, filter);
glMatrixMode(GL_TEXTURE);
glLoadMatrixf(mTextureMatrix);
glMatrixMode(GL_MODELVIEW);
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_EXTERNAL_OES);
} else {
- target = GL_TEXTURE_2D;
- glBindTexture(target, mFlinger->getProtectedTexName());
- glEnable(target);
+ glBindTexture(GL_TEXTURE_2D, mFlinger->getProtectedTexName());
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
+ glEnable(GL_TEXTURE_2D);
}
drawWithOpenGL(clip);
- glDisable(target);
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
+ glDisable(GL_TEXTURE_2D);
}
// As documented in libhardware header, formats in the range
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index 7a47f62..f04add1 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -388,14 +388,9 @@
const uint32_t fbHeight = hw.getHeight();
glColor4f(red,green,blue,alpha);
-#if defined(GL_OES_EGL_image_external)
- if (GLExtensions::getInstance().haveTextureExternal()) {
- glDisable(GL_TEXTURE_EXTERNAL_OES);
- }
-#endif
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
- glDisable(GL_DITHER);
Region::const_iterator it = clip.begin();
Region::const_iterator const end = clip.end();
@@ -457,12 +452,6 @@
texCoords[3].u = 1;
texCoords[3].v = 1;
- if (needsDithering()) {
- glEnable(GL_DITHER);
- } else {
- glDisable(GL_DITHER);
- }
-
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, mVertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
@@ -476,6 +465,7 @@
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisable(GL_BLEND);
}
void LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
diff --git a/services/surfaceflinger/LayerDim.cpp b/services/surfaceflinger/LayerDim.cpp
index 654817d..e665d7a 100644
--- a/services/surfaceflinger/LayerDim.cpp
+++ b/services/surfaceflinger/LayerDim.cpp
@@ -49,7 +49,8 @@
const DisplayHardware& hw(graphicPlane(0).displayHardware());
const GLfloat alpha = s.alpha/255.0f;
const uint32_t fbHeight = hw.getHeight();
- glDisable(GL_DITHER);
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
+ glDisable(GL_TEXTURE_2D);
if (s.alpha == 0xFF) {
glDisable(GL_BLEND);
@@ -60,11 +61,6 @@
glColor4f(0, 0, 0, alpha);
-#if defined(GL_OES_EGL_image_external)
- if (GLExtensions::getInstance().haveTextureExternal()) {
- glDisable(GL_TEXTURE_EXTERNAL_OES);
- }
-#endif
glVertexPointer(2, GL_FLOAT, 0, mVertices);
while (it != end) {
@@ -73,8 +69,9 @@
glScissor(r.left, sy, r.width(), r.height());
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
+ glDisable(GL_BLEND);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
// ---------------------------------------------------------------------------
diff --git a/services/surfaceflinger/LayerScreenshot.cpp b/services/surfaceflinger/LayerScreenshot.cpp
new file mode 100644
index 0000000..e30ccbf
--- /dev/null
+++ b/services/surfaceflinger/LayerScreenshot.cpp
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <utils/Errors.h>
+#include <utils/Log.h>
+
+#include <ui/GraphicBuffer.h>
+
+#include "LayerScreenshot.h"
+#include "SurfaceFlinger.h"
+#include "DisplayHardware/DisplayHardware.h"
+
+namespace android {
+// ---------------------------------------------------------------------------
+
+LayerScreenshot::LayerScreenshot(SurfaceFlinger* flinger, DisplayID display,
+ const sp<Client>& client)
+ : LayerBaseClient(flinger, display, client),
+ mTextureName(0), mFlinger(flinger)
+{
+}
+
+LayerScreenshot::~LayerScreenshot()
+{
+ if (mTextureName) {
+ mFlinger->postMessageAsync(
+ new SurfaceFlinger::MessageDestroyGLTexture(mTextureName) );
+ }
+}
+
+status_t LayerScreenshot::capture() {
+ GLfloat u, v;
+ status_t result = mFlinger->renderScreenToTexture(0, &mTextureName, &u, &v);
+ if (result != NO_ERROR) {
+ return result;
+ }
+
+ glBindTexture(GL_TEXTURE_2D, mTextureName);
+ glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ mTexCoords[0] = 0; mTexCoords[1] = v;
+ mTexCoords[2] = 0; mTexCoords[3] = 0;
+ mTexCoords[4] = u; mTexCoords[5] = 0;
+ mTexCoords[6] = u; mTexCoords[7] = v;
+
+ return NO_ERROR;
+}
+
+void LayerScreenshot::onDraw(const Region& clip) const
+{
+ const State& s(drawingState());
+ Region::const_iterator it = clip.begin();
+ Region::const_iterator const end = clip.end();
+ if (s.alpha>0 && (it != end)) {
+ const DisplayHardware& hw(graphicPlane(0).displayHardware());
+ const GLfloat alpha = s.alpha/255.0f;
+ const uint32_t fbHeight = hw.getHeight();
+
+ if (s.alpha == 0xFF) {
+ glDisable(GL_BLEND);
+ } else {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ glColor4f(0, 0, 0, alpha);
+
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
+ glEnable(GL_TEXTURE_2D);
+
+ glBindTexture(GL_TEXTURE_2D, mTextureName);
+ glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 0, mTexCoords);
+ glVertexPointer(2, GL_FLOAT, 0, mVertices);
+
+ while (it != end) {
+ const Rect& r = *it++;
+ const GLint sy = fbHeight - (r.top + r.height());
+ glScissor(r.left, sy, r.width(), r.height());
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ }
+
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ }
+}
+
+// ---------------------------------------------------------------------------
+
+}; // namespace android
diff --git a/services/surfaceflinger/LayerScreenshot.h b/services/surfaceflinger/LayerScreenshot.h
new file mode 100644
index 0000000..e3a2b19
--- /dev/null
+++ b/services/surfaceflinger/LayerScreenshot.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_LAYER_SCREENSHOT_H
+#define ANDROID_LAYER_SCREENSHOT_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#include "LayerBase.h"
+
+// ---------------------------------------------------------------------------
+
+namespace android {
+
+class LayerScreenshot : public LayerBaseClient
+{
+ GLuint mTextureName;
+ GLfloat mTexCoords[8];
+ sp<SurfaceFlinger> mFlinger;
+public:
+ LayerScreenshot(SurfaceFlinger* flinger, DisplayID display,
+ const sp<Client>& client);
+ virtual ~LayerScreenshot();
+
+ status_t capture();
+
+ virtual void onDraw(const Region& clip) const;
+ virtual bool isOpaque() const { return false; }
+ virtual bool isSecure() const { return false; }
+ virtual bool isProtectedByApp() const { return false; }
+ virtual bool isProtectedByDRM() const { return false; }
+ virtual const char* getTypeId() const { return "LayerScreenshot"; }
+};
+
+// ---------------------------------------------------------------------------
+
+}; // namespace android
+
+#endif // ANDROID_LAYER_SCREENSHOT_H
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 7c0cd9b..ba8f630 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -50,6 +50,7 @@
#include "DdmConnection.h"
#include "Layer.h"
#include "LayerDim.h"
+#include "LayerScreenshot.h"
#include "SurfaceFlinger.h"
#include "DisplayHardware/DisplayHardware.h"
@@ -445,6 +446,11 @@
// post surfaces (if needed)
handlePageFlip();
+ if (mDirtyRegion.isEmpty()) {
+ // nothing new to do.
+ return true;
+ }
+
if (UNLIKELY(mHwWorkListDirty)) {
// build the h/w work list
handleWorkList();
@@ -478,6 +484,9 @@
void SurfaceFlinger::postFramebuffer()
{
+ // this should never happen. we do the flip anyways so we don't
+ // risk to cause a deadlock with hwc
+ LOGW_IF(mSwapRegion.isEmpty(), "mSwapRegion is empty");
const DisplayHardware& hw(graphicPlane(0).displayHardware());
const nsecs_t now = systemTime();
mDebugInSwapBuffers = now;
@@ -779,6 +788,8 @@
}
unlockPageFlip(currentLayers);
+
+ mDirtyRegion.orSelf(getAndClearInvalidateRegion());
mDirtyRegion.andSelf(screenRegion);
}
@@ -938,7 +949,7 @@
// data.
//
// Also we want to make sure to not clear areas that belong to
- // layers above that won't redraw (we would just erasing them),
+ // layers above that won't redraw (we would just be erasing them),
// that is, we can't erase anything outside the dirty region.
Region transparent;
@@ -1029,8 +1040,9 @@
composeSurfaces(repaint);
}
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
+ glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
- glDisable(GL_DITHER);
glDisable(GL_SCISSOR_TEST);
static int toggle = 0;
@@ -1073,9 +1085,6 @@
const int32_t width = hw.getWidth();
const int32_t height = hw.getHeight();
- glDisable(GL_BLEND);
- glDisable(GL_DITHER);
-
if (LIKELY(!mDebugBackground)) {
glClearColor(0,0,0,0);
Region::const_iterator it = region.begin();
@@ -1090,19 +1099,20 @@
const GLshort vertices[][2] = { { 0, 0 }, { width, 0 },
{ width, height }, { 0, height } };
const GLshort tcoords[][2] = { { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
+
glVertexPointer(2, GL_SHORT, 0, vertices);
glTexCoordPointer(2, GL_SHORT, 0, tcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-#if defined(GL_OES_EGL_image_external)
- if (GLExtensions::getInstance().haveTextureExternal()) {
- glDisable(GL_TEXTURE_EXTERNAL_OES);
- }
-#endif
+
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mWormholeTexName);
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
+
+ glDisable(GL_BLEND);
+
glScalef(width*(1.0f/32.0f), height*(1.0f/32.0f), 1);
Region::const_iterator it = region.begin();
Region::const_iterator const end = region.end();
@@ -1351,6 +1361,9 @@
case eFXSurfaceDim:
layer = createDimSurface(client, d, w, h, flags);
break;
+ case eFXSurfaceScreenshot:
+ layer = createScreenshotSurface(client, d, w, h, flags);
+ break;
}
if (layer != 0) {
@@ -1413,7 +1426,19 @@
uint32_t w, uint32_t h, uint32_t flags)
{
sp<LayerDim> layer = new LayerDim(this, display, client);
- layer->initStates(w, h, flags);
+ return layer;
+}
+
+sp<LayerScreenshot> SurfaceFlinger::createScreenshotSurface(
+ const sp<Client>& client, DisplayID display,
+ uint32_t w, uint32_t h, uint32_t flags)
+{
+ sp<LayerScreenshot> layer = new LayerScreenshot(this, display, client);
+ status_t err = layer->capture();
+ if (err != NO_ERROR) {
+ layer.clear();
+ LOGW("createScreenshotSurface failed (%s)", strerror(-err));
+ }
return layer;
}
@@ -1613,8 +1638,15 @@
result.append(buffer);
snprintf(buffer, SIZE,
" last eglSwapBuffers() time: %f us\n"
- " last transaction time : %f us\n",
- mLastSwapBufferTime/1000.0, mLastTransactionTime/1000.0);
+ " last transaction time : %f us\n"
+ " refresh-rate : %f fps\n"
+ " x-dpi : %f\n"
+ " y-dpi : %f\n",
+ mLastSwapBufferTime/1000.0,
+ mLastTransactionTime/1000.0,
+ hw.getRefreshRate(),
+ hw.getDpiX(),
+ hw.getDpiY());
result.append(buffer);
if (inSwapBuffersDuration || !locked) {
@@ -1768,14 +1800,33 @@
}
void SurfaceFlinger::repaintEverything() {
- Mutex::Autolock _l(mStateLock);
const DisplayHardware& hw(graphicPlane(0).displayHardware());
- mDirtyRegion.set(hw.bounds()); // careful that's not thread-safe
+ const Rect bounds(hw.getBounds());
+ setInvalidateRegion(Region(bounds));
signalEvent();
}
+void SurfaceFlinger::setInvalidateRegion(const Region& reg) {
+ Mutex::Autolock _l(mInvalidateLock);
+ mInvalidateRegion = reg;
+}
+
+Region SurfaceFlinger::getAndClearInvalidateRegion() {
+ Mutex::Autolock _l(mInvalidateLock);
+ Region reg(mInvalidateRegion);
+ mInvalidateRegion.clear();
+ return reg;
+}
+
// ---------------------------------------------------------------------------
+status_t SurfaceFlinger::renderScreenToTexture(DisplayID dpy,
+ GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
+{
+ Mutex::Autolock _l(mStateLock);
+ return renderScreenToTextureLocked(dpy, textureName, uOut, vOut);
+}
+
status_t SurfaceFlinger::renderScreenToTextureLocked(DisplayID dpy,
GLuint* textureName, GLfloat* uOut, GLfloat* vOut)
{
@@ -1813,6 +1864,8 @@
GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, tname, 0);
// redraw the screen entirely...
+ glDisable(GL_TEXTURE_EXTERNAL_OES);
+ glDisable(GL_TEXTURE_2D);
glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
@@ -1824,6 +1877,8 @@
layer->drawForSreenShot();
}
+ hw.compositionComplete();
+
// back to main framebuffer
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
glDisable(GL_SCISSOR_TEST);
@@ -1839,11 +1894,6 @@
status_t SurfaceFlinger::electronBeamOffAnimationImplLocked()
{
- status_t result = PERMISSION_DENIED;
-
- if (!GLExtensions::getInstance().haveFramebufferObject())
- return INVALID_OPERATION;
-
// get screen geometry
const DisplayHardware& hw(graphicPlane(0).displayHardware());
const uint32_t hw_w = hw.getWidth();
@@ -1852,7 +1902,7 @@
GLfloat u, v;
GLuint tname;
- result = renderScreenToTextureLocked(0, &tname, &u, &v);
+ status_t result = renderScreenToTextureLocked(0, &tname, &u, &v);
if (result != NO_ERROR) {
return result;
}
@@ -2004,6 +2054,7 @@
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDeleteTextures(1, &tname);
glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
return NO_ERROR;
}
@@ -2028,10 +2079,6 @@
return result;
}
- // back to main framebuffer
- glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
- glDisable(GL_SCISSOR_TEST);
-
GLfloat vtx[8];
const GLfloat texCoords[4][2] = { {0,v}, {0,0}, {u,0}, {u,v} };
glBindTexture(GL_TEXTURE_2D, tname);
@@ -2148,6 +2195,7 @@
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDeleteTextures(1, &tname);
glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
return NO_ERROR;
}
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index 0e642c1..3284fdb 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -49,6 +49,7 @@
class FreezeLock;
class Layer;
class LayerDim;
+class LayerScreenshot;
struct surface_flinger_cblk_t;
#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true ))
@@ -186,6 +187,15 @@
void screenReleased(DisplayID dpy);
void screenAcquired(DisplayID dpy);
+ status_t renderScreenToTexture(DisplayID dpy,
+ GLuint* textureName, GLfloat* uOut, GLfloat* vOut);
+
+ status_t postMessageAsync(const sp<MessageBase>& msg,
+ nsecs_t reltime=0, uint32_t flags = 0);
+
+ status_t postMessageSync(const sp<MessageBase>& msg,
+ nsecs_t reltime=0, uint32_t flags = 0);
+
status_t removeLayer(const sp<LayerBase>& layer);
status_t addLayer(const sp<LayerBase>& layer);
status_t invalidateLayerVisibility(const sp<LayerBase>& layer);
@@ -195,6 +205,18 @@
GLuint getProtectedTexName() const { return mProtectedTexName; }
+
+ class MessageDestroyGLTexture : public MessageBase {
+ GLuint texture;
+ public:
+ MessageDestroyGLTexture(GLuint texture) : texture(texture) { }
+ virtual bool handler() {
+ glDeleteTextures(1, &texture);
+ return true;
+ }
+ };
+
+
private:
// DeathRecipient interface
virtual void binderDied(const wp<IBinder>& who);
@@ -204,7 +226,6 @@
friend class LayerBase;
friend class LayerBaseClient;
friend class Layer;
- friend class LayerDim;
sp<ISurface> createSurface(
ISurfaceComposerClient::surface_data_t* params,
@@ -222,6 +243,10 @@
const sp<Client>& client, DisplayID display,
uint32_t w, uint32_t h, uint32_t flags);
+ sp<LayerScreenshot> createScreenshotSurface(
+ const sp<Client>& client, DisplayID display,
+ uint32_t w, uint32_t h, uint32_t flags);
+
status_t removeSurface(const sp<Client>& client, SurfaceID sid);
status_t destroySurface(const wp<LayerBaseClient>& layer);
uint32_t setClientStateLocked(const sp<Client>& client, const layer_state_t& s);
@@ -283,6 +308,9 @@
void composeSurfaces(const Region& dirty);
+ void setInvalidateRegion(const Region& reg);
+ Region getAndClearInvalidateRegion();
+
ssize_t addClientLayer(const sp<Client>& client,
const sp<LayerBaseClient>& lbc);
status_t addLayer_l(const sp<LayerBase>& layer);
@@ -329,12 +357,6 @@
mutable MessageQueue mEventQueue;
- status_t postMessageAsync(const sp<MessageBase>& msg,
- nsecs_t reltime=0, uint32_t flags = 0);
-
- status_t postMessageSync(const sp<MessageBase>& msg,
- nsecs_t reltime=0, uint32_t flags = 0);
-
// access must be protected by mStateLock
mutable Mutex mStateLock;
State mCurrentState;
@@ -348,6 +370,10 @@
bool mLayersRemoved;
DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayerMap;
+ // access must be protected by mInvalidateLock
+ mutable Mutex mInvalidateLock;
+ Region mInvalidateRegion;
+
// constant members (no synchronization needed for access)
sp<IMemoryHeap> mServerHeap;
surface_flinger_cblk_t* mServerCblk;
diff --git a/telephony/java/com/android/internal/telephony/IntRangeManager.java b/telephony/java/com/android/internal/telephony/IntRangeManager.java
index 970bc44..cc7774d 100644
--- a/telephony/java/com/android/internal/telephony/IntRangeManager.java
+++ b/telephony/java/com/android/internal/telephony/IntRangeManager.java
@@ -543,6 +543,14 @@
}
/**
+ * Returns whether the list of ranges is completely empty.
+ * @return true if there are no enabled ranges
+ */
+ public boolean isEmpty() {
+ return mRanges.isEmpty();
+ }
+
+ /**
* Called when the list of enabled ranges has changed. This will be
* followed by zero or more calls to {@link #addRange} followed by
* a call to {@link #finishUpdate}.
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index 8aae0d4..63c22e6d 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -1928,7 +1928,7 @@
if (RILJ_LOGD) {
riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
- + " with " + numOfConfig + "configs : ");
+ + " with " + numOfConfig + " configs : ");
for (int i = 0; i < numOfConfig; i++) {
riljLog(config[i].toString());
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
index 4f50d24..8534810 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
@@ -246,6 +246,11 @@
}
@Override
+ public void getAvailableNetworks(Message response) {
+ mCM.getAvailableNetworks(response);
+ }
+
+ @Override
public void requestIsimAuthentication(String nonce, Message result) {
mCM.requestIsimAuthentication(nonce, result);
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/SimSmsInterfaceManager.java b/telephony/java/com/android/internal/telephony/gsm/SimSmsInterfaceManager.java
index 8d0e5d3..92bf390 100644
--- a/telephony/java/com/android/internal/telephony/gsm/SimSmsInterfaceManager.java
+++ b/telephony/java/com/android/internal/telephony/gsm/SimSmsInterfaceManager.java
@@ -246,6 +246,8 @@
log("Added cell broadcast subscription for MID range " + startMessageId
+ " to " + endMessageId + " from client " + client);
+ setCellBroadcastActivation(!mCellBroadcastRangeManager.isEmpty());
+
return true;
}
@@ -271,6 +273,8 @@
log("Removed cell broadcast subscription for MID range " + startMessageId
+ " to " + endMessageId + " from client " + client);
+ setCellBroadcastActivation(!mCellBroadcastRangeManager.isEmpty());
+
return true;
}
@@ -301,14 +305,15 @@
/**
* Called to indicate the end of a range update started by the
* previous call to {@link #startUpdate}.
+ * @return true if successful, false otherwise
*/
protected boolean finishUpdate() {
if (mConfigList.isEmpty()) {
- return setCellBroadcastActivation(false);
+ return true;
} else {
SmsBroadcastConfigInfo[] configs =
mConfigList.toArray(new SmsBroadcastConfigInfo[mConfigList.size()]);
- return setCellBroadcastConfig(configs) && setCellBroadcastActivation(true);
+ return setCellBroadcastConfig(configs);
}
}
}
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index 887fa74..1ecf7da 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -14,6 +14,14 @@
#include "FileFinder.h"
#include "CacheUpdater.h"
+#if HAVE_PRINTF_ZD
+# define ZD "%zd"
+# define ZD_TYPE ssize_t
+#else
+# define ZD "%ld"
+# define ZD_TYPE long
+#endif
+
#define NOISY(x) // x
// ==========================================================================
@@ -566,11 +574,11 @@
DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > baseFiles =
baseGroup->getFiles();
for (size_t i=0; i < baseFiles.size(); i++) {
- printf("baseFile %zd has flavor %s\n", i,
+ printf("baseFile " ZD " has flavor %s\n", (ZD_TYPE) i,
baseFiles.keyAt(i).toString().string());
}
for (size_t i=0; i < overlayFiles.size(); i++) {
- printf("overlayFile %zd has flavor %s\n", i,
+ printf("overlayFile " ZD " has flavor %s\n", (ZD_TYPE) i,
overlayFiles.keyAt(i).toString().string());
}
}
@@ -584,8 +592,8 @@
keyAt(overlayGroupIndex));
if (baseFileIndex < UNKNOWN_ERROR) {
if (bundle->getVerbose()) {
- printf("found a match (%zd) for overlay file %s, for flavor %s\n",
- baseFileIndex,
+ printf("found a match (" ZD ") for overlay file %s, for flavor %s\n",
+ (ZD_TYPE) baseFileIndex,
overlayGroup->getLeaf().string(),
overlayFiles.keyAt(overlayGroupIndex).toString().string());
}
diff --git a/tools/aapt/StringPool.cpp b/tools/aapt/StringPool.cpp
index d067d59..9a0a1c4 100644
--- a/tools/aapt/StringPool.cpp
+++ b/tools/aapt/StringPool.cpp
@@ -8,6 +8,14 @@
#include <utils/ByteOrder.h>
+#if HAVE_PRINTF_ZD
+# define ZD "%zd"
+# define ZD_TYPE ssize_t
+#else
+# define ZD "%ld"
+# define ZD_TYPE long
+#endif
+
#define NOISY(x) //x
void strcpy16_htod(uint16_t* dst, const uint16_t* src)
@@ -30,7 +38,7 @@
str = String8(pool->stringAt(s, &len)).string();
}
- printf("String #%zd: %s\n", s, str);
+ printf("String #" ZD ": %s\n", (ZD_TYPE) s, str);
}
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
index 44bdff3..1e66ca2 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
@@ -467,4 +467,8 @@
public void dismissKeyguard() {
}
+
+ public boolean hasNavigationBar() {
+ return false; // should this return something else?
+ }
}
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index b76f8b9..e981da7 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -3043,9 +3043,14 @@
deferMessage(message);
}
break;
- /* Handle in DisconnectedState */
case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT:
+ /* If we get a SUPPLICANT_STATE_CHANGE_EVENT before NETWORK_DISCONNECTION_EVENT
+ * we have missed the network disconnection, transition to mDisconnectedState
+ * and handle the rest of the events there
+ */
deferMessage(message);
+ handleNetworkDisconnect();
+ transitionTo(mDisconnectedState);
break;
default:
return NOT_HANDLED;
diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
index 5d5b9ef..b4cbd01 100644
--- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
@@ -92,6 +92,14 @@
private static final String DEFAULT_WALLED_GARDEN_URL =
"http://clients3.google.com/generate_204";
private static final int WALLED_GARDEN_SOCKET_TIMEOUT_MS = 10000;
+
+ /* Some carrier apps might have support captive portal handling. Add some delay to allow
+ app authentication to be done before our test.
+ TODO: This should go away once we provide an API to apps to disable walled garden test
+ for certain SSIDs
+ */
+ private static final int WALLED_GARDEN_START_DELAY_MS = 3000;
+
private static final int DNS_INTRATEST_PING_INTERVAL_MS = 200;
/* With some router setups, it takes a few hunder milli-seconds before connection is active */
private static final int DNS_START_DELAY_MS = 1000;
@@ -101,29 +109,30 @@
/**
* Indicates the enable setting of WWS may have changed
*/
- private static final int EVENT_WATCHDOG_TOGGLED = BASE + 1;
+ private static final int EVENT_WATCHDOG_TOGGLED = BASE + 1;
/**
* Indicates the wifi network state has changed. Passed w/ original intent
* which has a non-null networkInfo object
*/
- private static final int EVENT_NETWORK_STATE_CHANGE = BASE + 2;
+ private static final int EVENT_NETWORK_STATE_CHANGE = BASE + 2;
/**
* Indicates the signal has changed. Passed with arg1
* {@link #mNetEventCounter} and arg2 [raw signal strength]
*/
- private static final int EVENT_RSSI_CHANGE = BASE + 3;
- private static final int EVENT_SCAN_RESULTS_AVAILABLE = BASE + 4;
- private static final int EVENT_WIFI_RADIO_STATE_CHANGE = BASE + 5;
- private static final int EVENT_WATCHDOG_SETTINGS_CHANGE = BASE + 6;
+ private static final int EVENT_RSSI_CHANGE = BASE + 3;
+ private static final int EVENT_SCAN_RESULTS_AVAILABLE = BASE + 4;
+ private static final int EVENT_WIFI_RADIO_STATE_CHANGE = BASE + 5;
+ private static final int EVENT_WATCHDOG_SETTINGS_CHANGE = BASE + 6;
- private static final int MESSAGE_HANDLE_WALLED_GARDEN = BASE + 100;
- private static final int MESSAGE_HANDLE_BAD_AP = BASE + 101;
+ private static final int MESSAGE_HANDLE_WALLED_GARDEN = BASE + 100;
+ private static final int MESSAGE_HANDLE_BAD_AP = BASE + 101;
/**
* arg1 == mOnlineWatchState.checkCount
*/
- private static final int MESSAGE_SINGLE_DNS_CHECK = BASE + 103;
- private static final int MESSAGE_NETWORK_FOLLOWUP = BASE + 104;
+ private static final int MESSAGE_SINGLE_DNS_CHECK = BASE + 102;
+ private static final int MESSAGE_NETWORK_FOLLOWUP = BASE + 103;
+ private static final int MESSAGE_DELAYED_WALLED_GARDEN_CHECK = BASE + 104;
private Context mContext;
private ContentResolver mContentResolver;
@@ -140,6 +149,7 @@
private DnsCheckingState mDnsCheckingState = new DnsCheckingState();
private OnlineWatchState mOnlineWatchState = new OnlineWatchState();
private DnsCheckFailureState mDnsCheckFailureState = new DnsCheckFailureState();
+ private DelayWalledGardenState mDelayWalledGardenState = new DelayWalledGardenState();
private WalledGardenState mWalledGardenState = new WalledGardenState();
private BlacklistedApState mBlacklistedApState = new BlacklistedApState();
@@ -209,6 +219,7 @@
addState(mConnectedState, mWatchdogEnabledState);
addState(mDnsCheckingState, mConnectedState);
addState(mDnsCheckFailureState, mConnectedState);
+ addState(mDelayWalledGardenState, mConnectedState);
addState(mWalledGardenState, mConnectedState);
addState(mBlacklistedApState, mConnectedState);
addState(mOnlineWatchState, mConnectedState);
@@ -727,14 +738,7 @@
return HANDLED;
}
- mLastWalledGardenCheckTime = SystemClock.elapsedRealtime();
- if (isWalledGardenConnection()) {
- if (DBG) log("Walled garden test complete - walled garden detected");
- transitionTo(mWalledGardenState);
- } else {
- if (DBG) log("Walled garden test complete - online");
- transitionTo(mOnlineWatchState);
- }
+ transitionTo(mDelayWalledGardenState);
return HANDLED;
}
@@ -780,6 +784,31 @@
}
}
+ class DelayWalledGardenState extends State {
+ @Override
+ public void enter() {
+ sendMessageDelayed(MESSAGE_DELAYED_WALLED_GARDEN_CHECK, WALLED_GARDEN_START_DELAY_MS);
+ }
+
+ @Override
+ public boolean processMessage(Message msg) {
+ switch (msg.what) {
+ case MESSAGE_DELAYED_WALLED_GARDEN_CHECK:
+ mLastWalledGardenCheckTime = SystemClock.elapsedRealtime();
+ if (isWalledGardenConnection()) {
+ if (DBG) log("Walled garden test complete - walled garden detected");
+ transitionTo(mWalledGardenState);
+ } else {
+ if (DBG) log("Walled garden test complete - online");
+ transitionTo(mOnlineWatchState);
+ }
+ return HANDLED;
+ default:
+ return NOT_HANDLED;
+ }
+ }
+ }
+
class OnlineWatchState extends State {
/**
* Signals a short-wait message is enqueued for the current 'guard' counter
diff --git a/wifi/java/android/net/wifi/p2p/package.html b/wifi/java/android/net/wifi/p2p/package.html
new file mode 100644
index 0000000..94d695f
--- /dev/null
+++ b/wifi/java/android/net/wifi/p2p/package.html
@@ -0,0 +1,68 @@
+<HTML>
+<BODY>
+<p>Provides classes to create peer-to-peer (P2P) connections with Wi-Fi Direct.</p>
+
+<p>Using these APIs, you can discover and connect to other devices when each
+device supports Wi-Fi Direct, then communicate over a speedy connection across distances much longer
+than a Bluetooth connection. The primary class you need to work with is {@link
+android.net.wifi.p2p.WifiP2pManager}, which you can acquire by calling {@link
+android.app.Activity#getSystemService getSystemService(WIFI_P2P_SERVICE)}. The {@link
+android.net.wifi.p2p.WifiP2pManager} includes APIs that allow you to:</p>
+<ul>
+<li>Initialize your application for P2P connections by calling {@link
+android.net.wifi.p2p.WifiP2pManager#initialize initialize()}</li>
+
+<li>Discover nearby devices by calling {@link android.net.wifi.p2p.WifiP2pManager#discoverPeers
+discoverPeers()}</li>
+
+<li>Start a P2P connection by calling {@link android.net.wifi.p2p.WifiP2pManager#connect
+connect()}</li>
+<li>And more</li>
+</ul>
+
+<p>Several other interfaces and classes are necessary as well, such as:</p>
+<ul>
+<li>The {@link android.net.wifi.p2p.WifiP2pManager.ActionListener} interface allows you to receive
+callbacks when an operation such as discovering peers or connecting to them succeeds or fails.</li>
+
+<li>{@link android.net.wifi.p2p.WifiP2pManager.PeerListListener} interface allows you to receive
+information about discovered peers. The callback provides a {@link
+android.net.wifi.p2p.WifiP2pDeviceList}, from which you can retrieve a {@link
+android.net.wifi.p2p.WifiP2pDevice} object for each device within range and get information such as
+the device name, address, device type, the WPS configurations the device supports, and more.</li>
+
+<li>The {@link android.net.wifi.p2p.WifiP2pManager.GroupInfoListener} interface allows you to
+receive information about a P2P group. The callback provides a {@link
+android.net.wifi.p2p.WifiP2pGroup} object, which provides group information such as the owner, the
+network name, and passphrase.</li>
+
+<li>{@link android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener} interface allows you to
+receive information about the current connection. The callback provides a {@link
+android.net.wifi.p2p.WifiP2pInfo} object, which has information such as whether a group has been
+formed and who is the group owner.</li>
+</ul>
+
+<p>In order to use the Wi-Fi P2P APIs, your app must request the following user permissions:</p>
+<ul>
+<li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
+<li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
+<li>{@link android.Manifest.permission#INTERNET} (although your app doesn’t technically connect
+to the Internet, communicating to Wi-Fi Direct peers with standard java sockets requires Internet
+permission).</li>
+</ul>
+
+<p>For example code, see the <a href="{@docRoot}resources/samples/WiFiDirectDemo/index.html">Wi-Fi
+Direct Demo</a> sample application.</p>
+
+<p class="note"><strong>Note:</strong> Not all Android-powered devices support Wi-Fi
+Direct. If your application uses Wi-Fi Direct, declare so with a <a
+href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a>
+element in the manifest file:</p>
+<pre>
+<manifest ...>
+ <uses-feature android:name="android.hardware.wifi.direct" />
+ ...
+</manifest>
+</pre>
+</BODY>
+</HTML>
diff --git a/wifi/java/android/net/wifi/package.html b/wifi/java/android/net/wifi/package.html
index 530313d..6f0d337 100644
--- a/wifi/java/android/net/wifi/package.html
+++ b/wifi/java/android/net/wifi/package.html
@@ -1,12 +1,29 @@
<HTML>
<BODY>
-Provides classes to manage Wi-Fi functionality on the device.
+<p>Provides classes to manage Wi-Fi functionality on the device.</p>
<p>The Wi-Fi APIs provide a means by which applications can communicate
with the lower-level wireless stack that provides Wi-Fi network access. Almost all
information from the device supplicant is available, including the connected network's
link speed, IP address, negotiation state, and more, plus information about other
networks that are available. Some other API features include the ability to
scan, add, save, terminate and initiate Wi-Fi connections.</p>
-<p>Remember, not all Android devices are guaranteed to have Wi-Fi functionality.</p>
+
+<p>Some APIs may require the following user permissions:</p>
+<ul>
+ <li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
+ <li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
+ <li>{@link android.Manifest.permission#CHANGE_WIFI_MULTICAST_STATE}</li>
+</ul>
+
+<p class="note"><strong>Note:</strong> Not all Android-powered devices provide Wi-Fi functionality.
+If your application uses Wi-Fi, declare so with a <a
+href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a>
+element in the manifest file:</p>
+<pre>
+<manifest ...>
+ <uses-feature android:name="android.hardware.wifi" />
+ ...
+</manifest>
+</pre>
</BODY>
</HTML>