Merge "Fix issue 2416481: Support Voice Dialer over BT SCO."
diff --git a/api/current.xml b/api/current.xml
index 701586e..e6f3788 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -87668,6 +87668,17 @@
visibility="public"
>
</field>
+<field name="TYPE_WIMAX"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="6"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
</class>
<class name="Credentials"
extends="java.lang.Object"
@@ -143010,6 +143021,17 @@
visibility="public"
>
</field>
+<field name="NETWORK_TYPE_IDEN"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="11"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
<field name="NETWORK_TYPE_UMTS"
type="int"
transient="false"
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
index 654ee68..b8ba3f6 100644
--- a/cmds/installd/commands.c
+++ b/cmds/installd/commands.c
@@ -389,9 +389,10 @@
int cachesize = 0;
/* count the source apk as code -- but only if it's not
- * on the /system partition
+ * on the /system partition and its not on the sdcard.
*/
- if (strncmp(apkpath, "/system", 7) != 0) {
+ if (strncmp(apkpath, "/system", 7) != 0 &&
+ strncmp(apkpath, SDCARD_DIR_PREFIX, 7) != 0) {
if (stat(apkpath, &s) == 0) {
codesize += stat_size(&s);
}
@@ -403,17 +404,6 @@
codesize += stat_size(&s);
}
}
-
- /* count the source apk as code -- but only if it's not
- * installed on the sdcard
- */
- if (strncmp(apkpath, SDCARD_DIR_PREFIX, 7) != 0) {
- if (stat(apkpath, &s) == 0) {
- codesize += stat_size(&s);
- }
- }
-
-
/* count the cached dexfile as code */
if (!create_cache_path(path, apkpath)) {
if (stat(path, &s) == 0) {
diff --git a/cmds/keystore/keystore_get.h b/cmds/keystore/keystore_get.h
index 8330f8e..141f69b 100644
--- a/cmds/keystore/keystore_get.h
+++ b/cmds/keystore/keystore_get.h
@@ -32,9 +32,11 @@
#endif
/* This function is provided for native components to get values from keystore.
- * Users are required to link against libcutils. The lengths of keys and values
- * are limited to KEYSTORE_MESSAGE_SIZE. This function returns the length of
- * the requested value or -1 if something goes wrong. */
+ * Users are required to link against libcutils. Keys are values are 8-bit safe.
+ * The first two arguments are the key and its length. The third argument
+ * specifies the buffer to store the retrieved value, which must be an array of
+ * KEYSTORE_MESSAGE_SIZE bytes. This function returns the length of the value or
+ * -1 if an error happens. */
static int keystore_get(const char *key, int length, char *value)
{
uint8_t bytes[2] = {length >> 8, length};
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index 5e2c61e..6658842 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -47,7 +47,7 @@
struct timeval tv;
gettimeofday(&tv, NULL);
- return (int64_t)tv.tv_usec + tv.tv_sec * 1000000;
+ return (int64_t)tv.tv_usec + tv.tv_sec * 1000000ll;
}
static void playSource(OMXClient *client, const sp<MediaSource> &source) {
@@ -434,7 +434,11 @@
sp<DataSource> dataSource;
if (!strncasecmp("http://", filename, 7)) {
dataSource = new HTTPDataSource(filename);
- dataSource = new CachingDataSource(dataSource, 64 * 1024, 10);
+ if (((HTTPDataSource *)dataSource.get())->connect() != OK) {
+ fprintf(stderr, "failed to connect to HTTP server.\n");
+ return -1;
+ }
+ dataSource = new CachingDataSource(dataSource, 32 * 1024, 20);
} else {
dataSource = new FileSource(filename);
}
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index 6d0a266..16b603c 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -1699,7 +1699,7 @@
}
}
} else {
- Account[] accounts = getAccounts(null /* type */);
+ Account[] accounts = getAccountsByType(null /* type */);
fout.println("Accounts: " + accounts.length);
for (Account account : accounts) {
fout.println(" " + account);
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index f364def..0909952 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -266,7 +266,7 @@
}
private void dismissDialog() {
- if (mDecor == null || !mShowing || mDecor.getWindowToken() == null) {
+ if (mDecor == null || !mShowing) {
return;
}
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index ebc64d7..add99d7 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -483,7 +483,7 @@
int textId = mSearchable.getSearchButtonText();
if (isBrowserSearch()){
iconLabel = getContext().getResources()
- .getDrawable(com.android.internal.R.drawable.ic_btn_search_play);
+ .getDrawable(com.android.internal.R.drawable.ic_btn_search_go);
} else if (textId != 0) {
textLabel = mActivityContext.getResources().getString(textId);
} else {
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 625b120..86224c5d 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -1654,10 +1654,17 @@
Intent intent = new Intent(INTENT_ACTION_GLOBAL_SEARCH);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(globalSearchActivity);
- // TODO: Always pass name of calling package as an extra?
- if (appSearchData != null) {
- intent.putExtra(APP_DATA, appSearchData);
+ // Make sure that we have a Bundle to put source in
+ if (appSearchData == null) {
+ appSearchData = new Bundle();
+ } else {
+ appSearchData = new Bundle(appSearchData);
}
+ // Set source to package name of app that starts global search, if not set already.
+ if (!appSearchData.containsKey("source")) {
+ appSearchData.putString("source", mContext.getPackageName());
+ }
+ intent.putExtra(APP_DATA, appSearchData);
if (!TextUtils.isEmpty(initialQuery)) {
intent.putExtra(QUERY, initialQuery);
}
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 85769a6..df48f04 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -416,6 +416,9 @@
}
private void initializeSyncAdapter(Account account, String authority) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "initializeSyncAdapter: " + account + ", authority " + authority);
+ }
SyncAdapterType syncAdapterType = SyncAdapterType.newKey(authority, account.type);
RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
mSyncAdapters.getServiceInfo(syncAdapterType);
@@ -427,9 +430,11 @@
Intent intent = new Intent();
intent.setAction("android.content.SyncAdapter");
intent.setComponent(syncAdapterInfo.componentName);
- mContext.bindService(intent, new InitializerServiceConnection(account, authority, mContext,
+ if (!mContext.bindService(intent, new InitializerServiceConnection(account, authority, mContext,
mMainHandler),
- Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND);
+ Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND)) {
+ Log.w(TAG, "initializeSyncAdapter: failed to bind to " + intent);
+ }
}
private static class InitializerServiceConnection implements ServiceConnection {
@@ -452,6 +457,9 @@
try {
if (!mInitialized) {
mInitialized = true;
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "calling initialize: " + mAccount + ", authority " + mAuthority);
+ }
ISyncAdapter.Stub.asInterface(service).initialize(mAccount, mAuthority);
}
} catch (RemoteException e) {
@@ -1307,7 +1315,6 @@
// it if sync is still failing
private boolean mErrorNotificationInstalled = false;
private volatile CountDownLatch mReadyToRunLatch = new CountDownLatch(1);
-
public void onBootCompleted() {
mBootCompleted = true;
if (mReadyToRunLatch != null) {
@@ -1603,7 +1610,9 @@
RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo =
mSyncAdapters.getServiceInfo(syncAdapterType);
if (syncAdapterInfo == null) {
- Log.d(TAG, "can't find a sync adapter for " + syncAdapterType);
+ Log.d(TAG, "can't find a sync adapter for " + syncAdapterType
+ + ", removing settings for it");
+ mSyncStorageEngine.removeAuthority(op.account, op.authority);
runStateIdle();
return;
}
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index 240da72..03e606f 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -121,6 +121,9 @@
private static final boolean SYNC_ENABLED_DEFAULT = false;
+ // the version of the accounts xml file format
+ private static final int ACCOUNTS_VERSION = 1;
+
public static class PendingOperation {
final Account account;
final int syncSource;
@@ -640,6 +643,12 @@
}
}
+ public void removeAuthority(Account account, String authority) {
+ synchronized (mAuthorities) {
+ removeAuthorityLocked(account, authority);
+ }
+ }
+
public AuthorityInfo getAuthority(int authorityId) {
synchronized (mAuthorities) {
return mAuthorities.get(authorityId);
@@ -1269,6 +1278,15 @@
return authority;
}
+ private void removeAuthorityLocked(Account account, String authorityName) {
+ AccountInfo accountInfo = mAccounts.get(account);
+ if (accountInfo != null) {
+ if (accountInfo.authorities.remove(authorityName) != null) {
+ writeAccountInfoLocked();
+ }
+ }
+ }
+
public SyncStatusInfo getOrCreateSyncStatus(AuthorityInfo authority) {
synchronized (mAuthorities) {
return getOrCreateSyncStatusLocked(authority.ident);
@@ -1322,6 +1340,7 @@
* Read all account information back in to the initial engine state.
*/
private void readAccountInfoLocked() {
+ boolean writeNeeded = false;
FileInputStream fis = null;
try {
fis = mAccountInfoFile.openRead();
@@ -1336,6 +1355,16 @@
if ("accounts".equals(tagName)) {
String listen = parser.getAttributeValue(
null, "listen-for-tickles");
+ String versionString = parser.getAttributeValue(null, "version");
+ int version;
+ try {
+ version = (versionString == null) ? 0 : Integer.parseInt(versionString);
+ } catch (NumberFormatException e) {
+ version = 0;
+ }
+ if (version < ACCOUNTS_VERSION) {
+ writeNeeded = true;
+ }
mMasterSyncAutomatically = listen == null
|| Boolean.parseBoolean(listen);
eventType = parser.next();
@@ -1346,7 +1375,7 @@
tagName = parser.getName();
if (parser.getDepth() == 2) {
if ("authority".equals(tagName)) {
- authority = parseAuthority(parser);
+ authority = parseAuthority(parser, version);
periodicSync = null;
}
} else if (parser.getDepth() == 3) {
@@ -1364,9 +1393,11 @@
}
} catch (XmlPullParserException e) {
Log.w(TAG, "Error reading accounts", e);
+ return;
} catch (java.io.IOException e) {
if (fis == null) Log.i(TAG, "No initial accounts");
else Log.w(TAG, "Error reading accounts", e);
+ return;
} finally {
if (fis != null) {
try {
@@ -1375,9 +1406,13 @@
}
}
}
+
+ if (writeNeeded) {
+ writeAccountInfoLocked();
+ }
}
- private AuthorityInfo parseAuthority(XmlPullParser parser) {
+ private AuthorityInfo parseAuthority(XmlPullParser parser, int version) {
AuthorityInfo authority = null;
int id = -1;
try {
@@ -1406,8 +1441,14 @@
if (DEBUG_FILE) Log.v(TAG, "Creating entry");
authority = getOrCreateAuthorityLocked(
new Account(accountName, accountType), authorityName, id, false);
- // clear this since we will read these later on
- authority.periodicSyncs.clear();
+ // If the version is 0 then we are upgrading from a file format that did not
+ // know about periodic syncs. In that case don't clear the list since we
+ // want the default, which is a daily periodioc sync.
+ // Otherwise clear out this default list since we will populate it later with
+ // the periodic sync descriptions that are read from the configuration file.
+ if (version > 0) {
+ authority.periodicSyncs.clear();
+ }
}
if (authority != null) {
authority.enabled = enabled == null || Boolean.parseBoolean(enabled);
@@ -1443,6 +1484,7 @@
}
final Pair<Bundle, Long> periodicSync = Pair.create(extras, period);
authority.periodicSyncs.add(periodicSync);
+
return periodicSync;
}
@@ -1491,6 +1533,7 @@
out.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
out.startTag(null, "accounts");
+ out.attribute(null, "version", Integer.toString(ACCOUNTS_VERSION));
if (!mMasterSyncAutomatically) {
out.attribute(null, "listen-for-tickles", "false");
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 271f477..e1fbe48 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -439,6 +439,15 @@
public static final int INSTALL_FAILED_INVALID_INSTALL_LOCATION = -19;
/**
+ * Installation return code: this is passed to the {@link IPackageInstallObserver} by
+ * {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} if
+ * the new package couldn't be installed in the specified install
+ * location because the media is not available.
+ * @hide
+ */
+ public static final int INSTALL_FAILED_MEDIA_UNAVAILABLE = -20;
+
+ /**
* Installation parse return code: this is passed to the {@link IPackageInstallObserver} by
* {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)}
* if the parser was given a path that is not a file, or does not end with the expected
@@ -586,6 +595,14 @@
public static final int MOVE_FAILED_INVALID_LOCATION = -5;
/**
+ * Error code that is passed to the {@link IPackageMoveObserver} by
+ * {@link #movePackage(android.net.Uri, IPackageMoveObserver)}
+ * if the specified package cannot be moved to the specified location.
+ * @hide
+ */
+ public static final int MOVE_FAILED_INTERNAL_ERROR = -6;
+
+ /**
* Flag parameter for {@link #movePackage} to indicate that
* the package should be moved to internal storage if its
* been installed on external media.
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index b232ff9..e6f9bed 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -852,7 +852,11 @@
lock();
try {
closeClosable();
- releaseReference();
+ // close this database instance - regardless of its reference count value
+ onAllReferencesReleased();
+ // set path to null, to cause bad stuff to happen if this object is reused without
+ // being opened first
+ mPath = null;
} finally {
unlock();
}
diff --git a/core/java/android/database/sqlite/SQLiteStatement.java b/core/java/android/database/sqlite/SQLiteStatement.java
index f29b69f..7f484ff 100644
--- a/core/java/android/database/sqlite/SQLiteStatement.java
+++ b/core/java/android/database/sqlite/SQLiteStatement.java
@@ -58,11 +58,10 @@
}
/**
- * Execute this SQL statement and return the ID of the most
- * recently inserted row. The SQL statement should probably be an
- * INSERT for this to be a useful call.
+ * Execute this SQL statement and return the ID of the row inserted due to this call.
+ * The SQL statement should be an INSERT for this to be a useful call.
*
- * @return the row ID of the last row inserted.
+ * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise.
*
* @throws android.database.SQLException If the SQL string is invalid for
* some reason
@@ -75,7 +74,7 @@
try {
native_execute();
mDatabase.logTimeStat(mSql, timeStart);
- return mDatabase.lastInsertRow();
+ return (mDatabase.lastChangeCount() > 0) ? mDatabase.lastInsertRow() : -1;
} finally {
releaseReference();
mDatabase.unlock();
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index a6668e7..280ded6 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -184,9 +184,15 @@
* will route over this interface if a default route exists.
*/
public static final int TYPE_MOBILE_HIPRI = 5;
- /** {@hide} */
+ /**
+ * The Default WiMAX data connection. When active, all data traffic
+ * will use this connection by default. Should not coexist with other
+ * default connections.
+ */
+ public static final int TYPE_WIMAX = 6;
+ /** {@hide} TODO: Need to adjust this for WiMAX. */
public static final int MAX_RADIO_TYPE = TYPE_WIFI;
- /** {@hide} */
+ /** {@hide} TODO: Need to adjust this for WiMAX. */
public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_HIPRI;
public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index d1d8b0a..afe4191 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -19,6 +19,7 @@
import android.net.InterfaceConfiguration;
import android.net.INetworkManagementEventObserver;
+import android.net.wifi.WifiConfiguration;
/**
* @hide
@@ -166,7 +167,7 @@
/**
* Start Wifi Access Point
*/
- void startAccessPoint();
+ void startAccessPoint(in WifiConfiguration wifiConfig, String intf);
/**
* Stop Wifi Access Point
diff --git a/core/java/android/pim/vcard/VCardEntryCommitter.java b/core/java/android/pim/vcard/VCardEntryCommitter.java
index 2f99e4a..59a2baf 100644
--- a/core/java/android/pim/vcard/VCardEntryCommitter.java
+++ b/core/java/android/pim/vcard/VCardEntryCommitter.java
@@ -58,12 +58,6 @@
mTimeToCommit += System.currentTimeMillis() - start;
}
- // TODO: Compatibility function to not break the build. Will be removed shortly
- @Deprecated
- public Uri getLastCreatedUri() {
- return mCreatedUris.size() == 0 ? null : mCreatedUris.get(mCreatedUris.size() - 1);
- }
-
/**
* Returns the list of created Uris. This list should not be modified by the caller as it is
* not a clone.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 503d8b8d..66f340e 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2502,6 +2502,27 @@
public static final String WIFI_AP_ON = "wifi_ap_on";
/**
+ * AP SSID
+ *
+ * @hide
+ */
+ public static final String WIFI_AP_SSID = "wifi_ap_ssid";
+
+ /**
+ * AP security
+ *
+ * @hide
+ */
+ public static final String WIFI_AP_SECURITY = "wifi_ap_security";
+
+ /**
+ * AP passphrase
+ *
+ * @hide
+ */
+ public static final String WIFI_AP_PASSWD = "wifi_ap_passwd";
+
+ /**
* The acceptable packet loss percentage (range 0 - 100) before trying
* another AP on the same network.
*/
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 1c0d55f..af42ce0 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -62,6 +62,10 @@
private int mLoadType;
private boolean mFirstLayoutDone = true;
private boolean mCommitted = true;
+ // Flag for blocking messages. This is used during destroy() so
+ // that if the UI thread posts any messages after the message
+ // queue has been cleared,they are ignored.
+ private boolean mBlockMessages = false;
// Is this frame the main frame?
private boolean mIsMainFrame;
@@ -383,6 +387,7 @@
public void destroy() {
mOrientationListener.disable();
nativeDestroyFrame();
+ mBlockMessages = true;
removeCallbacksAndMessages(null);
}
@@ -392,6 +397,9 @@
*/
@Override
public void handleMessage(Message msg) {
+ if (mBlockMessages) {
+ return;
+ }
switch (msg.what) {
case FRAME_COMPLETED: {
if (mSettings.getSavePassword() && hasPasswordField()) {
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index a013a9b..4f2830b 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -252,6 +252,13 @@
// 32-bit reads and writes.
switch (msg.what) {
case PAGE_STARTED:
+ // every time we start a new page, we want to reset the
+ // WebView certificate:
+ // if the new site is secure, we will reload it and get a
+ // new certificate set;
+ // if the new site is not secure, the certificate must be
+ // null, and that will be the case
+ mWebView.setCertificate(null);
if (mWebViewClient != null) {
mWebViewClient.onPageStarted(mWebView,
msg.getData().getString("url"),
diff --git a/core/java/android/webkit/FrameLoader.java b/core/java/android/webkit/FrameLoader.java
index 303e417..906264a 100644
--- a/core/java/android/webkit/FrameLoader.java
+++ b/core/java/android/webkit/FrameLoader.java
@@ -262,9 +262,13 @@
CacheLoader cacheLoader =
new CacheLoader(mListener, result);
mListener.setCacheLoader(cacheLoader);
- // Load the cached file in a separate thread
- WebViewWorker.getHandler().obtainMessage(
- WebViewWorker.MSG_ADD_STREAMLOADER, cacheLoader).sendToTarget();
+ if (mListener.isSynchronous()) {
+ cacheLoader.load();
+ } else {
+ // Load the cached file in a separate thread
+ WebViewWorker.getHandler().obtainMessage(
+ WebViewWorker.MSG_ADD_STREAMLOADER, cacheLoader).sendToTarget();
+ }
}
/*
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index 4bdab0a..a23a4ce 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -656,10 +656,14 @@
// ask for it, so make sure we have a valid CacheLoader
// before calling it.
if (mCacheLoader != null) {
- // Load the cached file in a separate thread
- WebViewWorker.getHandler().obtainMessage(
- WebViewWorker.MSG_ADD_STREAMLOADER, mCacheLoader)
- .sendToTarget();
+ if (isSynchronous()) {
+ mCacheLoader.load();
+ } else {
+ // Load the cached file in a separate thread
+ WebViewWorker.getHandler().obtainMessage(
+ WebViewWorker.MSG_ADD_STREAMLOADER, mCacheLoader)
+ .sendToTarget();
+ }
mFromCache = true;
if (DebugFlags.LOAD_LISTENER) {
Log.v(LOGTAG, "LoadListener cache load url=" + url());
@@ -718,10 +722,14 @@
Log.v(LOGTAG, "FrameLoader: HTTP URL in cache " +
"and usable: " + url());
}
- // Load the cached file in a separate thread
- WebViewWorker.getHandler().obtainMessage(
- WebViewWorker.MSG_ADD_STREAMLOADER, mCacheLoader)
- .sendToTarget();
+ if (isSynchronous()) {
+ mCacheLoader.load();
+ } else {
+ // Load the cached file in a separate thread
+ WebViewWorker.getHandler().obtainMessage(
+ WebViewWorker.MSG_ADD_STREAMLOADER, mCacheLoader)
+ .sendToTarget();
+ }
mFromCache = true;
return true;
}
diff --git a/core/java/android/webkit/ViewManager.java b/core/java/android/webkit/ViewManager.java
index 47e7791..4e0e081 100644
--- a/core/java/android/webkit/ViewManager.java
+++ b/core/java/android/webkit/ViewManager.java
@@ -16,6 +16,7 @@
package android.webkit;
+import android.view.SurfaceView;
import android.view.View;
import android.widget.AbsoluteLayout;
@@ -27,6 +28,9 @@
private boolean mHidden;
private boolean mReadyToDraw;
+ // Threshold at which a surface is prevented from further increasing in size
+ private final int MAX_SURFACE_THRESHOLD;
+
class ChildView {
int x;
int y;
@@ -34,6 +38,11 @@
int height;
View mView; // generic view to show
+ /* set to true if the view is a surface and it has exceeded the pixel
+ threshold specified in MAX_SURFACE_THRESHOLD.
+ */
+ boolean isFixedSize = false;
+
ChildView() {
}
@@ -49,15 +58,15 @@
return;
}
setBounds(x, y, width, height);
- final AbsoluteLayout.LayoutParams lp =
- new AbsoluteLayout.LayoutParams(ctvD(width), ctvD(height),
- ctvX(x), ctvY(y));
+
mWebView.mPrivateHandler.post(new Runnable() {
public void run() {
// This method may be called multiple times. If the view is
// already attached, just set the new LayoutParams,
// otherwise attach the view and add it to the list of
// children.
+ AbsoluteLayout.LayoutParams lp = computeLayout(ChildView.this);
+
if (mView.getParent() != null) {
mView.setLayoutParams(lp);
} else {
@@ -67,7 +76,7 @@
});
}
- void attachViewOnUIThread(AbsoluteLayout.LayoutParams lp) {
+ private void attachViewOnUIThread(AbsoluteLayout.LayoutParams lp) {
mWebView.addView(mView, lp);
mChildren.add(this);
if (!mReadyToDraw) {
@@ -86,7 +95,7 @@
});
}
- void removeViewOnUIThread() {
+ private void removeViewOnUIThread() {
mWebView.removeView(mView);
mChildren.remove(this);
}
@@ -94,6 +103,14 @@
ViewManager(WebView w) {
mWebView = w;
+
+ int pixelArea = w.getResources().getDisplayMetrics().widthPixels *
+ w.getResources().getDisplayMetrics().heightPixels;
+ /* set the threshold to be 275% larger than the screen size. The
+ percentage is simply an estimation and is not based on anything but
+ basic trial-and-error tests run on multiple devices.
+ */
+ MAX_SURFACE_THRESHOLD = (int)(pixelArea * 2.75);
}
ChildView createView() {
@@ -125,16 +142,37 @@
return mWebView.contentToViewY(val);
}
- void scaleAll() {
- for (ChildView v : mChildren) {
- View view = v.mView;
- AbsoluteLayout.LayoutParams lp =
- (AbsoluteLayout.LayoutParams) view.getLayoutParams();
+ /**
+ * This should only be called from the UI thread.
+ */
+ private AbsoluteLayout.LayoutParams computeLayout(ChildView v) {
+
+ // if the surface has exceed a predefined threshold then fix the size
+ // of the surface.
+ if (!v.isFixedSize && (v.width * v.height) > MAX_SURFACE_THRESHOLD
+ && v.mView instanceof SurfaceView) {
+ ((SurfaceView)v.mView).getHolder().setFixedSize(v.width, v.height);
+ v.isFixedSize = true;
+ }
+
+ AbsoluteLayout.LayoutParams lp =
+ (AbsoluteLayout.LayoutParams) v.mView.getLayoutParams();
+
+ if (lp == null)
+ lp = new AbsoluteLayout.LayoutParams(ctvD(v.width), ctvD(v.height),
+ ctvX(v.x), ctvY(v.y));
+ else {
lp.width = ctvD(v.width);
lp.height = ctvD(v.height);
lp.x = ctvX(v.x);
lp.y = ctvY(v.y);
- view.setLayoutParams(lp);
+ }
+ return lp;
+ }
+
+ void scaleAll() {
+ for (ChildView v : mChildren) {
+ v.mView.setLayoutParams(computeLayout(v));
}
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 52bc8be1..3a34fb4 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -1608,13 +1608,6 @@
}
private void goBackOrForward(int steps, boolean ignoreSnapshot) {
- // every time we go back or forward, we want to reset the
- // WebView certificate:
- // if the new site is secure, we will reload it and get a
- // new certificate set;
- // if the new site is not secure, the certificate must be
- // null, and that will be the case
- mCertificate = null;
if (steps != 0) {
clearTextEntry(false);
mWebViewCore.sendMessage(EventHub.GO_BACK_FORWARD, steps,
@@ -3858,7 +3851,6 @@
|| keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) {
if (nativeFocusIsPlugin()) {
mShiftIsPressed = false;
- return true;
} else if (commitCopy()) {
return true;
}
@@ -5761,11 +5753,11 @@
contentToViewY(docY + docHeight / 2) - viewHeight / 2,
true, 0);
} else {
- int oldScreenX = contentToViewX(docX) - mScrollX;
- int rectViewX = (int) (docX * scale);
- int rectViewWidth = (int) (docWidth * scale);
- int newMaxWidth = (int) (mContentWidth * scale);
- int newScreenX = (viewWidth - rectViewWidth) / 2;
+ float oldScreenX = docX * mActualScale - mScrollX;
+ float rectViewX = docX * scale;
+ float rectViewWidth = docWidth * scale;
+ float newMaxWidth = mContentWidth * scale;
+ float newScreenX = (viewWidth - rectViewWidth) / 2;
// pin the newX to the WebView
if (newScreenX > rectViewX) {
newScreenX = rectViewX;
@@ -5774,12 +5766,12 @@
}
mZoomCenterX = (oldScreenX * scale - newScreenX * mActualScale)
/ (scale - mActualScale);
- int oldScreenY = contentToViewY(docY) - mScrollY;
- int rectViewY = (int) (docY * scale) + getTitleHeight();
- int rectViewHeight = (int) (docHeight * scale);
- int newMaxHeight = (int) (mContentHeight * scale)
- + getTitleHeight();
- int newScreenY = (viewHeight - rectViewHeight) / 2;
+ float oldScreenY = docY * mActualScale + getTitleHeight()
+ - mScrollY;
+ float rectViewY = docY * scale + getTitleHeight();
+ float rectViewHeight = docHeight * scale;
+ float newMaxHeight = mContentHeight * scale + getTitleHeight();
+ float newScreenY = (viewHeight - rectViewHeight) / 2;
// pin the newY to the WebView
if (newScreenY > rectViewY) {
newScreenY = rectViewY;
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index a07397f..ec7424ba 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1988,7 +1988,6 @@
}
}
}
- mLastTouchMode = isInTouchMode ? TOUCH_MODE_ON : TOUCH_MODE_OFF;
}
@Override
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 65f7cdb..9537ba0 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -17,11 +17,10 @@
package android.widget;
import android.content.Context;
-import android.content.res.Configuration;
import android.content.res.TypedArray;
+import android.database.DataSetObserver;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable.Orientation;
import android.text.Editable;
import android.text.Selection;
import android.text.TextUtils;
@@ -131,10 +130,11 @@
private boolean mBlockCompletion;
- private AutoCompleteTextView.ListSelectorHider mHideSelector;
+ private ListSelectorHider mHideSelector;
private Runnable mShowDropDownRunnable;
- private AutoCompleteTextView.PassThroughClickListener mPassThroughClickListener;
+ private PassThroughClickListener mPassThroughClickListener;
+ private PopupDataSetObserver mObserver;
public AutoCompleteTextView(Context context) {
this(context, null);
@@ -220,14 +220,6 @@
}
/**
- * Sets this to be single line; a separate method so
- * MultiAutoCompleteTextView can skip this.
- */
- /* package */ void finishInit() {
- setSingleLine();
- }
-
- /**
* <p>Sets the optional hint text that is displayed at the bottom of the
* the matching list. This can be used as a cue to the user on how to
* best use the list, or to provide extra information.</p>
@@ -450,7 +442,7 @@
public boolean isDropDownDismissedOnCompletion() {
return mDropDownDismissedOnCompletion;
}
-
+
/**
* Sets whether the drop-down is dismissed when a suggestion is clicked. This is
* true by default.
@@ -592,10 +584,16 @@
* @see android.widget.ListAdapter
*/
public <T extends ListAdapter & Filterable> void setAdapter(T adapter) {
+ if (mObserver == null) {
+ mObserver = new PopupDataSetObserver();
+ } else if (mAdapter != null) {
+ mAdapter.unregisterDataSetObserver(mObserver);
+ }
mAdapter = adapter;
if (mAdapter != null) {
//noinspection unchecked
mFilter = ((Filterable) mAdapter).getFilter();
+ adapter.registerDataSetObserver(mObserver);
} else {
mFilter = null;
}
@@ -611,8 +609,7 @@
&& !mDropDownAlwaysVisible) {
// special case for the back key, we do not even try to send it
// to the drop down list but instead, consume it immediately
- if (event.getAction() == KeyEvent.ACTION_DOWN
- && event.getRepeatCount() == 0) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
getKeyDispatcherState().startTracking(event, this);
return true;
} else if (event.getAction() == KeyEvent.ACTION_UP) {
@@ -660,10 +657,19 @@
&& keyCode != KeyEvent.KEYCODE_DPAD_CENTER))) {
int curIndex = mDropDownList.getSelectedItemPosition();
boolean consumed;
+
final boolean below = !mPopup.isAboveAnchor();
- if ((below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex <= 0) ||
- (!below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN && curIndex >=
- mDropDownList.getAdapter().getCount() - 1)) {
+
+ final ListAdapter adapter = mDropDownList.getAdapter();
+ final boolean allEnabled = adapter.areAllItemsEnabled();
+
+ final int firstItem = allEnabled ? 0 :
+ mDropDownList.lookForSelectablePosition(0, true);
+ final int lastItem = allEnabled ? adapter.getCount() - 1 :
+ mDropDownList.lookForSelectablePosition(adapter.getCount() - 1, false);
+
+ if ((below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex <= firstItem) ||
+ (!below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN && curIndex >= lastItem)) {
// When the selection is at the top, we block the key
// event to prevent focus from moving.
clearListSelection();
@@ -703,11 +709,11 @@
if (below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
// when the selection is at the bottom, we block the
// event to avoid going to the next focusable widget
- Adapter adapter = mDropDownList.getAdapter();
- if (adapter != null && curIndex == adapter.getCount() - 1) {
+ if (curIndex == lastItem) {
return true;
}
- } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex == 0) {
+ } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP &&
+ curIndex == firstItem) {
return true;
}
}
@@ -860,16 +866,6 @@
return ListView.INVALID_POSITION;
}
-
- /**
- * @hide
- * @return {@link android.widget.ListView#getChildCount()} of the drop down if it is showing,
- * otherwise 0.
- */
- protected int getDropDownChildCount() {
- return mDropDownList == null ? 0 : mDropDownList.getChildCount();
- }
-
/**
* <p>Starts filtering the content of the drop down list. The filtering
* pattern is the content of the edit box. Subclasses should override this
@@ -970,25 +966,7 @@
mBlockCompletion = false;
}
}
-
- /**
- * Like {@link #setTextKeepState(CharSequence)}, except that it can disable filtering.
- *
- * @param filter If <code>false</code>, no filtering will be performed
- * as a result of this call.
- *
- * @hide Pending API council approval.
- */
- public void setTextKeepState(CharSequence text, boolean filter) {
- if (filter) {
- setTextKeepState(text);
- } else {
- mBlockCompletion = true;
- setTextKeepState(text);
- mBlockCompletion = false;
- }
- }
-
+
/**
* <p>Performs the text completion by replacing the current text by the
* selected item. Subclasses should override this method to avoid replacing
@@ -1517,24 +1495,6 @@
return view;
}
- /**
- * <p>Returns the top padding of the currently selected view.</p>
- *
- * @return the height of the top padding for the selection
- */
- public int getSelectionPaddingTop() {
- return mSelectionTopPadding;
- }
-
- /**
- * <p>Returns the bottom padding of the currently selected view.</p>
- *
- * @return the height of the bottom padding for the selection
- */
- public int getSelectionPaddingBottom() {
- return mSelectionBottomPadding;
- }
-
@Override
public boolean isInTouchMode() {
// WARNING: Please read the comment where mListSelectionHidden is declared
@@ -1632,5 +1592,23 @@
if (mWrapped != null) mWrapped.onClick(v);
}
}
-
+
+ private class PopupDataSetObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ if (isPopupShowing()) {
+ // This will resize the popup to fit the new adapter's content
+ showDropDown();
+ }
+ }
+
+ @Override
+ public void onInvalidated() {
+ if (!mDropDownAlwaysVisible) {
+ // There's no data to display so make sure we're not showing
+ // the drop down and its list
+ dismissDropDown();
+ }
+ }
+ }
}
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index c81a907..c77416b 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -769,8 +769,8 @@
} else if (ScaleType.CENTER == mScaleType) {
// Center bitmap in view, no scaling.
mDrawMatrix = mMatrix;
- mDrawMatrix.setTranslate((vwidth - dwidth) * 0.5f,
- (vheight - dheight) * 0.5f);
+ mDrawMatrix.setTranslate((int) ((vwidth - dwidth) * 0.5f + 0.5f),
+ (int) ((vheight - dheight) * 0.5f + 0.5f));
} else if (ScaleType.CENTER_CROP == mScaleType) {
mDrawMatrix = mMatrix;
@@ -786,7 +786,7 @@
}
mDrawMatrix.setScale(scale, scale);
- mDrawMatrix.postTranslate(dx, dy);
+ mDrawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
} else if (ScaleType.CENTER_INSIDE == mScaleType) {
mDrawMatrix = mMatrix;
float scale;
@@ -800,8 +800,8 @@
(float) vheight / (float) dheight);
}
- dx = (vwidth - dwidth * scale) * 0.5f;
- dy = (vheight - dheight * scale) * 0.5f;
+ dx = (int) ((vwidth - dwidth * scale) * 0.5f + 0.5f);
+ dy = (int) ((vheight - dheight * scale) * 0.5f + 0.5f);
mDrawMatrix.setScale(scale, scale);
mDrawMatrix.postTranslate(dx, dy);
diff --git a/core/java/com/android/internal/app/IMediaContainerService.aidl b/core/java/com/android/internal/app/IMediaContainerService.aidl
index fd1fd58..badabb0 100755
--- a/core/java/com/android/internal/app/IMediaContainerService.aidl
+++ b/core/java/com/android/internal/app/IMediaContainerService.aidl
@@ -27,4 +27,5 @@
boolean copyResource(in Uri packageURI,
in ParcelFileDescriptor outStream);
PackageInfoLite getMinimalPackageInfo(in Uri fileUri);
+ boolean checkFreeStorage(boolean external, in Uri fileUri);
}
\ No newline at end of file
diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java
index 80efca4..4d0a9e0 100644
--- a/core/java/com/android/internal/content/PackageHelper.java
+++ b/core/java/com/android/internal/content/PackageHelper.java
@@ -38,6 +38,7 @@
public static final int RECOMMEND_FAILED_INVALID_APK = -2;
public static final int RECOMMEND_FAILED_INVALID_LOCATION = -3;
public static final int RECOMMEND_FAILED_ALREADY_EXISTS = -4;
+ public static final int RECOMMEND_MEDIA_UNAVAILABLE = -5;
private static final boolean localLOGV = true;
private static final String TAG = "PackageHelper";
// App installation location settings values
@@ -70,7 +71,7 @@
try {
int rc = mountService.createSecureContainer(
- cid, mbLen, "vfat", sdEncKey, uid);
+ cid, mbLen, "fat", sdEncKey, uid);
if (rc != StorageResultCode.OperationSucceeded) {
Log.e(TAG, "Failed to create secure container " + cid);
return null;
diff --git a/core/java/com/android/internal/content/SelectionBuilder.java b/core/java/com/android/internal/content/SelectionBuilder.java
index 0e29411..b194756 100644
--- a/core/java/com/android/internal/content/SelectionBuilder.java
+++ b/core/java/com/android/internal/content/SelectionBuilder.java
@@ -47,7 +47,7 @@
* Append the given selection clause to the internal state. Each clause is
* surrounded with parenthesis and combined using {@code AND}.
*/
- public SelectionBuilder append(String selection, String... selectionArgs) {
+ public SelectionBuilder append(String selection, Object... selectionArgs) {
if (TextUtils.isEmpty(selection)) {
if (selectionArgs != null && selectionArgs.length > 0) {
throw new IllegalArgumentException(
@@ -63,8 +63,12 @@
}
mSelection.append("(").append(selection).append(")");
- for (String arg : selectionArgs) {
- mSelectionArgs.add(arg);
+ if (selectionArgs != null) {
+ for (Object arg : selectionArgs) {
+ // TODO: switch to storing direct Object instances once
+ // http://b/2464440 is fixed
+ mSelectionArgs.add(String.valueOf(arg));
+ }
}
return this;
diff --git a/core/java/com/android/internal/view/menu/IconMenuView.java b/core/java/com/android/internal/view/menu/IconMenuView.java
index bba2ee2..beb57ba 100644
--- a/core/java/com/android/internal/view/menu/IconMenuView.java
+++ b/core/java/com/android/internal/view/menu/IconMenuView.java
@@ -179,6 +179,10 @@
*/
private void layoutItems(int width) {
int numItems = getChildCount();
+ if (numItems == 0) {
+ mLayoutNumRows = 0;
+ return;
+ }
// Start with the least possible number of rows
int curNumRows =
@@ -470,15 +474,18 @@
// Get the desired height of the icon menu view (last row of items does
// not have a divider below)
+ final int layoutNumRows = mLayoutNumRows;
final int desiredHeight = (mRowHeight + mHorizontalDividerHeight) *
- mLayoutNumRows - mHorizontalDividerHeight;
+ layoutNumRows - mHorizontalDividerHeight;
// Maximum possible width and desired height
setMeasuredDimension(measuredWidth,
resolveSize(desiredHeight, heightMeasureSpec));
// Position the children
- positionChildren(mMeasuredWidth, mMeasuredHeight);
+ if (layoutNumRows > 0) {
+ positionChildren(mMeasuredWidth, mMeasuredHeight);
+ }
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index efd025a..9b7f487 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -47,6 +47,7 @@
public class LockPatternUtils {
private static final String TAG = "LockPatternUtils";
+ private static final boolean LDEBUG = false;
private static final String LOCK_PATTERN_FILE = "/system/gesture.key";
private static final String LOCK_PASSWORD_FILE = "/system/password.key";
@@ -126,7 +127,6 @@
public LockPatternUtils(Context context) {
mContext = context;
mContentResolver = context.getContentResolver();
- mDevicePolicyManager = getDevicePolicyManager();
// Initialize the location of gesture lock file
if (sLockPatternFilename == null) {
sLockPatternFilename = android.os.Environment.getDataDirectory()
diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp
index fb93014..4e8d05b 100644
--- a/core/jni/android_database_SQLiteDatabase.cpp
+++ b/core/jni/android_database_SQLiteDatabase.cpp
@@ -349,7 +349,7 @@
goto done;
}
- dbLocale = (rowCount >= 1) ? meta[1 * colCount + 0] : NULL;
+ dbLocale = (rowCount >= 1) ? meta[colCount] : NULL;
if (dbLocale != NULL && !strcmp(dbLocale, locale8)) {
// database locale is the same as the desired locale; set up the collators and go
@@ -360,7 +360,8 @@
if ((flags & OPEN_READONLY)) {
// read-only database, so we're going to have to put up with whatever we got
- err = register_localized_collators(handle, dbLocale ? dbLocale : locale8, UTF16_STORAGE);
+ // For registering new index. Not for modifing the read-only database.
+ err = register_localized_collators(handle, locale8, UTF16_STORAGE);
if (err != SQLITE_OK) throw_sqlite3_exception(env, handle);
goto done;
}
@@ -373,7 +374,7 @@
goto done;
}
- err = register_localized_collators(handle, dbLocale ? dbLocale : locale8, UTF16_STORAGE);
+ err = register_localized_collators(handle, locale8, UTF16_STORAGE);
if (err != SQLITE_OK) {
LOGE("register_localized_collators() failed setting locale\n");
throw_sqlite3_exception(env, handle);
diff --git a/core/res/res/drawable-hdpi/ic_btn_search_go.png b/core/res/res/drawable-hdpi/ic_btn_search_go.png
new file mode 100644
index 0000000..8a3a402
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_btn_search_go.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_btn_search_play.png b/core/res/res/drawable-hdpi/ic_btn_search_play.png
deleted file mode 100644
index fb1b974..0000000
--- a/core/res/res/drawable-hdpi/ic_btn_search_play.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_active.png b/core/res/res/drawable-hdpi/stat_sys_tether_active.png
deleted file mode 100755
index 4c14c07..0000000
--- a/core/res/res/drawable-hdpi/stat_sys_tether_active.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_general.png b/core/res/res/drawable-hdpi/stat_sys_tether_general.png
index e43fbae..c42b00c 100644
--- a/core/res/res/drawable-hdpi/stat_sys_tether_general.png
+++ b/core/res/res/drawable-hdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_btn_search_go.png b/core/res/res/drawable-mdpi/ic_btn_search_go.png
new file mode 100644
index 0000000..0ed9e8e
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_btn_search_go.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_btn_search_play.png b/core/res/res/drawable-mdpi/ic_btn_search_play.png
deleted file mode 100644
index dc25dae..0000000
--- a/core/res/res/drawable-mdpi/ic_btn_search_play.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_active.png b/core/res/res/drawable-mdpi/stat_sys_tether_active.png
deleted file mode 100644
index 2d0da4c..0000000
--- a/core/res/res/drawable-mdpi/stat_sys_tether_active.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_general.png b/core/res/res/drawable-mdpi/stat_sys_tether_general.png
index efb64ad..3688803 100644
--- a/core/res/res/drawable-mdpi/stat_sys_tether_general.png
+++ b/core/res/res/drawable-mdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 584fe25..bf7425f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2013,6 +2013,8 @@
<item quantity="one">Open Wi-Fi network available</item>
<item quantity="other">Open Wi-Fi networks available</item>
</plurals>
+ <!-- Do not translate. Default access point SSID used for tethering -->
+ <string name="wifi_tether_configure_ssid_default" translatable="false">AndroidAP</string>
<!-- Name of the dialog that lets the user choose an accented character to insert -->
<string name="select_character">Insert character</string>
diff --git a/core/tests/coretests/src/android/content/SyncStorageEngineTest.java b/core/tests/coretests/src/android/content/SyncStorageEngineTest.java
index 1505a7c..7028d1a 100644
--- a/core/tests/coretests/src/android/content/SyncStorageEngineTest.java
+++ b/core/tests/coretests/src/android/content/SyncStorageEngineTest.java
@@ -16,6 +16,8 @@
package android.content;
+import com.android.internal.os.AtomicFile;
+
import android.test.AndroidTestCase;
import android.test.RenamingDelegatingContext;
import android.test.suitebuilder.annotation.SmallTest;
@@ -26,6 +28,7 @@
import java.util.List;
import java.io.File;
+import java.io.FileOutputStream;
public class SyncStorageEngineTest extends AndroidTestCase {
@@ -193,6 +196,109 @@
assertEquals(1, engine.getIsSyncable(account1, authority2));
assertEquals(0, engine.getIsSyncable(account2, authority2));
}
+
+ @SmallTest
+ public void testAuthorityParsing() throws Exception {
+ final Account account = new Account("account1", "type1");
+ final String authority1 = "auth1";
+ final String authority2 = "auth2";
+ final String authority3 = "auth3";
+ final Bundle extras = new Bundle();
+ PeriodicSync sync1 = new PeriodicSync(account, authority1, extras, (long) (60 * 60 * 24));
+ PeriodicSync sync2 = new PeriodicSync(account, authority2, extras, (long) (60 * 60 * 24));
+ PeriodicSync sync3 = new PeriodicSync(account, authority3, extras, (long) (60 * 60 * 24));
+ PeriodicSync sync1s = new PeriodicSync(account, authority1, extras, 1000);
+ PeriodicSync sync2s = new PeriodicSync(account, authority2, extras, 1000);
+ PeriodicSync sync3s = new PeriodicSync(account, authority3, extras, 1000);
+
+ MockContentResolver mockResolver = new MockContentResolver();
+
+ final TestContext testContext = new TestContext(mockResolver, getContext());
+ SyncStorageEngine engine = SyncStorageEngine.newTestInstance(testContext);
+
+ byte[] accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ + "<accounts>\n"
+ + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
+ + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
+ + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
+ + "</accounts>\n").getBytes();
+
+ File syncDir = new File(new File(testContext.getFilesDir(), "system"), "sync");
+ syncDir.mkdirs();
+ AtomicFile accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
+ FileOutputStream fos = accountInfoFile.startWrite();
+ fos.write(accountsFileData);
+ accountInfoFile.finishWrite(fos);
+
+ engine.clearAndReadState();
+
+ List<PeriodicSync> syncs = engine.getPeriodicSyncs(account, authority1);
+ assertEquals(1, syncs.size());
+ assertEquals(sync1, syncs.get(0));
+
+ syncs = engine.getPeriodicSyncs(account, authority2);
+ assertEquals(1, syncs.size());
+ assertEquals(sync2, syncs.get(0));
+
+ syncs = engine.getPeriodicSyncs(account, authority3);
+ assertEquals(1, syncs.size());
+ assertEquals(sync3, syncs.get(0));
+
+ accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ + "<accounts version=\"1\">\n"
+ + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\" />\n"
+ + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\" />\n"
+ + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\" />\n"
+ + "</accounts>\n").getBytes();
+
+ accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
+ fos = accountInfoFile.startWrite();
+ fos.write(accountsFileData);
+ accountInfoFile.finishWrite(fos);
+
+ engine.clearAndReadState();
+
+ syncs = engine.getPeriodicSyncs(account, authority1);
+ assertEquals(0, syncs.size());
+
+ syncs = engine.getPeriodicSyncs(account, authority2);
+ assertEquals(0, syncs.size());
+
+ syncs = engine.getPeriodicSyncs(account, authority3);
+ assertEquals(0, syncs.size());
+
+ accountsFileData = ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ + "<accounts version=\"1\">\n"
+ + "<authority id=\"0\" account=\"account1\" type=\"type1\" authority=\"auth1\">\n"
+ + "<periodicSync period=\"1000\" />\n"
+ + "</authority>"
+ + "<authority id=\"1\" account=\"account1\" type=\"type1\" authority=\"auth2\">\n"
+ + "<periodicSync period=\"1000\" />\n"
+ + "</authority>"
+ + "<authority id=\"2\" account=\"account1\" type=\"type1\" authority=\"auth3\">\n"
+ + "<periodicSync period=\"1000\" />\n"
+ + "</authority>"
+ + "</accounts>\n").getBytes();
+
+ accountInfoFile = new AtomicFile(new File(syncDir, "accounts.xml"));
+ fos = accountInfoFile.startWrite();
+ fos.write(accountsFileData);
+ accountInfoFile.finishWrite(fos);
+
+ engine.clearAndReadState();
+
+ syncs = engine.getPeriodicSyncs(account, authority1);
+ assertEquals(1, syncs.size());
+ assertEquals(sync1s, syncs.get(0));
+
+ syncs = engine.getPeriodicSyncs(account, authority2);
+ assertEquals(1, syncs.size());
+ assertEquals(sync2s, syncs.get(0));
+
+ syncs = engine.getPeriodicSyncs(account, authority3);
+ assertEquals(1, syncs.size());
+ assertEquals(sync3s, syncs.get(0));
+ }
}
class TestContext extends ContextWrapper {
diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
index ab142c9..656029d 100644
--- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
@@ -16,15 +16,12 @@
package android.database;
+import static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_COLUMNNAME_INDEX;
+import static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_DEFAULT_INDEX;
import android.content.ContentValues;
import android.content.Context;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.CharArrayBuffer;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
-import android.os.Environment;
import android.os.Handler;
import android.os.Parcel;
import android.test.AndroidTestCase;
@@ -33,18 +30,14 @@
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.text.Collator;
-import java.util.Arrays;
-
import junit.framework.Assert;
-import junit.framework.TestCase;
-import static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_COLUMNNAME_INDEX;
-import static android.database.DatabaseUtils.InsertHelper.TABLE_INFO_PRAGMA_DEFAULT_INDEX;
+import java.io.File;
+import java.util.Arrays;
+import java.util.Locale;
public class DatabaseGeneralTest extends AndroidTestCase implements PerformanceTestCase {
+ private static final String TAG = "DatabaseGeneralTest";
private static final String sString1 = "this is a test";
private static final String sString2 = "and yet another test";
@@ -1029,4 +1022,91 @@
fail("unexpected, of course");
}
}
+
+ /**
+ * This test is available only when the platform has a locale with the language "ja".
+ * It finishes without failure when it is not available.
+ */
+ @MediumTest
+ public void testCollateLocalizedForJapanese() throws Exception {
+ final String testName = "DatabaseGeneralTest#testCollateLocalizedForJapanese()";
+ final Locale[] localeArray = Locale.getAvailableLocales();
+ final String japanese = Locale.JAPANESE.getLanguage();
+ final String english = Locale.ENGLISH.getLanguage();
+ Locale japaneseLocale = null;
+ Locale englishLocale = null;
+ for (Locale locale : localeArray) {
+ if (locale != null) {
+ final String language = locale.getLanguage();
+ if (language == null) {
+ continue;
+ } else if (language.equals(japanese)) {
+ japaneseLocale = locale;
+ } else if (language.equals(english)) {
+ englishLocale = locale;
+ }
+ }
+
+ if (japaneseLocale != null && englishLocale != null) {
+ break;
+ }
+ }
+
+ if (japaneseLocale == null || englishLocale == null) {
+ Log.d(TAG, testName + "n is silently skipped since " +
+ (englishLocale == null ?
+ (japaneseLocale == null ?
+ "Both English and Japanese locales do not exist." :
+ "English locale does not exist.") :
+ (japaneseLocale == null ?
+ "Japanese locale does not exist." :
+ "...why?")));
+ return;
+ }
+
+ Locale originalLocale = Locale.getDefault();
+ try {
+
+ final String dbName = "collate_localized_test";
+ mDatabase.execSQL("CREATE TABLE " + dbName + " (" +
+ "_id INTEGER PRIMARY KEY, " +
+ "s TEXT COLLATE LOCALIZED) ");
+ DatabaseUtils.InsertHelper ih =
+ new DatabaseUtils.InsertHelper(mDatabase, dbName);
+ ContentValues cv = new ContentValues();
+
+ cv = new ContentValues(); //
+ cv.put("s", "\uFF75\uFF77\uFF85\uFF9C"); // O-ki-na-wa in half-width Katakana
+ ih.insert(cv);
+
+ cv = new ContentValues(); //
+ cv.put("s", "\u306B\u307B\u3093"); // Ni-ho-n in Hiragana
+ ih.insert(cv);
+
+ cv = new ContentValues(); //
+ cv.put("s", "\u30A2\u30E1\u30EA\u30AB"); // A-me-ri-ca in hull-width Katakana
+ ih.insert(cv);
+
+ // Assume setLocale() does REINDEX and an English locale does not consider
+ // Japanese-specific LOCALIZED order.
+ Locale.setDefault(englishLocale);
+ Locale.setDefault(japaneseLocale);
+
+ Cursor cur = mDatabase.rawQuery(
+ "SELECT * FROM " + dbName + " ORDER BY s", null);
+ assertTrue(cur.moveToFirst());
+ assertEquals("\u30A2\u30E1\u30EA\u30AB", cur.getString(1));
+ assertTrue(cur.moveToNext());
+ assertEquals("\uFF75\uFF77\uFF85\uFF9C", cur.getString(1));
+ assertTrue(cur.moveToNext());
+ assertEquals("\u306B\u307B\u3093", cur.getString(1));
+ } finally {
+ if (originalLocale != null) {
+ try {
+ Locale.setDefault(originalLocale);
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/os/MemoryFileTest.java b/core/tests/coretests/src/android/os/MemoryFileTest.java
index 1f7ee26..009a0e2 100644
--- a/core/tests/coretests/src/android/os/MemoryFileTest.java
+++ b/core/tests/coretests/src/android/os/MemoryFileTest.java
@@ -42,7 +42,8 @@
/**
* Keep allocating new files till the system purges them.
*/
- @LargeTest
+ // Flaky test - temporarily suppress from large suite for now
+ // @LargeTest
public void testPurge() throws Exception {
List<MemoryFile> files = new ArrayList<MemoryFile>();
try {
diff --git a/docs/html/guide/topics/graphics/index.jd b/docs/html/guide/topics/graphics/index.jd
index e1158be..92771a8 100644
--- a/docs/html/guide/topics/graphics/index.jd
+++ b/docs/html/guide/topics/graphics/index.jd
@@ -56,7 +56,7 @@
draw your graphics into a View when you want to display a static graphic or predefined animation, within
an otherwise static application. Read <a href="#draw-to-view">Simple Graphics Inside a View</a>.</li>
-<p>Option "b," drawing to a Canvas, is better when you're application needs to regularly re-draw itself.
+<p>Option "b," drawing to a Canvas, is better when your application needs to regularly re-draw itself.
Basically, any video game should be drawing to the Canvas on its own. However, there's more than
one way to do this: </p>
<ul>
@@ -117,7 +117,7 @@
<h3 id="on-view">On a View</h3>
-<p>If you're application does not require a significant amount of processing or
+<p>If your application does not require a significant amount of processing or
frame-rate speed (perhaps for a chess game, a snake game,
or another slowly-animated application), then you should consider creating a custom View component
and drawing with a Canvas in <code>{@link android.view.View#onDraw(Canvas) View.onDraw()}</code>.
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 24c2f46..d58c711 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -167,7 +167,7 @@
status_t setupMPEG4EncoderParameters();
status_t setupAVCEncoderParameters();
- void setVideoOutputFormat(
+ status_t setVideoOutputFormat(
const char *mime, OMX_U32 width, OMX_U32 height);
void setImageOutputFormat(
@@ -220,6 +220,8 @@
void dumpPortStatus(OMX_U32 portIndex);
+ status_t configureCodec(const sp<MetaData> &meta);
+
static uint32_t getComponentQuirks(const char *componentName);
static void findMatchingCodecs(
diff --git a/libs/rs/scriptc/rs_math.rsh b/libs/rs/scriptc/rs_math.rsh
new file mode 100644
index 0000000..613c7ca
--- /dev/null
+++ b/libs/rs/scriptc/rs_math.rsh
@@ -0,0 +1,287 @@
+// Float ops
+
+extern float __attribute__((overloadable)) abs(float);
+extern float2 __attribute__((overloadable)) abs(float2);
+extern float3 __attribute__((overloadable)) abs(float3);
+extern float4 __attribute__((overloadable)) abs(float4);
+extern float8 __attribute__((overloadable)) abs(float8);
+extern float16 __attribute__((overloadable)) abs(float16);
+
+extern float __attribute__((overloadable)) acos(float);
+extern float2 __attribute__((overloadable)) acos(float2);
+extern float3 __attribute__((overloadable)) acos(float3);
+extern float4 __attribute__((overloadable)) acos(float4);
+extern float8 __attribute__((overloadable)) acos(float8);
+extern float16 __attribute__((overloadable)) acos(float16);
+
+extern float __attribute__((overloadable)) asin(float);
+extern float2 __attribute__((overloadable)) asin(float2);
+extern float3 __attribute__((overloadable)) asin(float3);
+extern float4 __attribute__((overloadable)) asin(float4);
+extern float8 __attribute__((overloadable)) asin(float8);
+extern float16 __attribute__((overloadable)) asin(float16);
+
+extern float __attribute__((overloadable)) atan(float);
+extern float2 __attribute__((overloadable)) atan(float2);
+extern float3 __attribute__((overloadable)) atan(float3);
+extern float4 __attribute__((overloadable)) atan(float4);
+extern float8 __attribute__((overloadable)) atan(float8);
+extern float16 __attribute__((overloadable)) atan(float16);
+
+extern float __attribute__((overloadable)) atan2(float, float);
+extern float2 __attribute__((overloadable)) atan2(float2, float2);
+extern float3 __attribute__((overloadable)) atan2(float3, float3);
+extern float4 __attribute__((overloadable)) atan2(float4, float4);
+extern float8 __attribute__((overloadable)) atan2(float8, float8);
+extern float16 __attribute__((overloadable)) atan2(float16, float16);
+
+extern float __attribute__((overloadable)) ceil(float);
+extern float2 __attribute__((overloadable)) ceil(float2);
+extern float3 __attribute__((overloadable)) ceil(float3);
+extern float4 __attribute__((overloadable)) ceil(float4);
+extern float8 __attribute__((overloadable)) ceil(float8);
+extern float16 __attribute__((overloadable)) ceil(float16);
+
+extern float __attribute__((overloadable)) clamp(float, float, float);
+extern float2 __attribute__((overloadable)) clamp(float2, float2, float2);
+extern float3 __attribute__((overloadable)) clamp(float3, float3, float3);
+extern float4 __attribute__((overloadable)) clamp(float4, float4, float4);
+extern float8 __attribute__((overloadable)) clamp(float8, float8, float8);
+extern float16 __attribute__((overloadable)) clamp(float16, float16, float16);
+extern float __attribute__((overloadable)) clamp(float, float, float);
+extern float2 __attribute__((overloadable)) clamp(float2, float, float);
+extern float3 __attribute__((overloadable)) clamp(float3, float, float);
+extern float4 __attribute__((overloadable)) clamp(float4, float, float);
+extern float8 __attribute__((overloadable)) clamp(float8, float, float);
+extern float16 __attribute__((overloadable)) clamp(float16, float, float);
+
+extern float __attribute__((overloadable)) copysign(float, float);
+extern float2 __attribute__((overloadable)) copysign(float2, float2);
+extern float3 __attribute__((overloadable)) copysign(float3, float3);
+extern float4 __attribute__((overloadable)) copysign(float4, float4);
+extern float8 __attribute__((overloadable)) copysign(float8, float8);
+extern float16 __attribute__((overloadable)) copysign(float16, float16);
+
+extern float __attribute__((overloadable)) cos(float);
+extern float2 __attribute__((overloadable)) cos(float2);
+extern float3 __attribute__((overloadable)) cos(float3);
+extern float4 __attribute__((overloadable)) cos(float4);
+extern float8 __attribute__((overloadable)) cos(float8);
+extern float16 __attribute__((overloadable)) cos(float16);
+
+extern float __attribute__((overloadable)) degrees(float);
+extern float2 __attribute__((overloadable)) degrees(float2);
+extern float3 __attribute__((overloadable)) degrees(float3);
+extern float4 __attribute__((overloadable)) degrees(float4);
+extern float8 __attribute__((overloadable)) degrees(float8);
+extern float16 __attribute__((overloadable)) degrees(float16);
+
+extern float __attribute__((overloadable)) exp(float);
+extern float2 __attribute__((overloadable)) exp(float2);
+extern float3 __attribute__((overloadable)) exp(float3);
+extern float4 __attribute__((overloadable)) exp(float4);
+extern float8 __attribute__((overloadable)) exp(float8);
+extern float16 __attribute__((overloadable)) exp(float16);
+
+extern float __attribute__((overloadable)) exp2(float);
+extern float2 __attribute__((overloadable)) exp2(float2);
+extern float3 __attribute__((overloadable)) exp2(float3);
+extern float4 __attribute__((overloadable)) exp2(float4);
+extern float8 __attribute__((overloadable)) exp2(float8);
+extern float16 __attribute__((overloadable)) exp2(float16);
+
+extern float __attribute__((overloadable)) exp10(float);
+extern float2 __attribute__((overloadable)) exp10(float2);
+extern float3 __attribute__((overloadable)) exp10(float3);
+extern float4 __attribute__((overloadable)) exp10(float4);
+extern float8 __attribute__((overloadable)) exp10(float8);
+extern float16 __attribute__((overloadable)) exp10(float16);
+
+extern float __attribute__((overloadable)) fabs(float);
+extern float2 __attribute__((overloadable)) fabs(float2);
+extern float3 __attribute__((overloadable)) fabs(float3);
+extern float4 __attribute__((overloadable)) fabs(float4);
+extern float8 __attribute__((overloadable)) fabs(float8);
+extern float16 __attribute__((overloadable)) fabs(float16);
+
+extern float __attribute__((overloadable)) floor(float);
+extern float2 __attribute__((overloadable)) floor(float2);
+extern float3 __attribute__((overloadable)) floor(float3);
+extern float4 __attribute__((overloadable)) floor(float4);
+extern float8 __attribute__((overloadable)) floor(float8);
+extern float16 __attribute__((overloadable)) floor(float16);
+
+extern float __attribute__((overloadable)) fmax(float, float);
+extern float2 __attribute__((overloadable)) fmax(float2, float2);
+extern float3 __attribute__((overloadable)) fmax(float3, float3);
+extern float4 __attribute__((overloadable)) fmax(float4, float4);
+extern float8 __attribute__((overloadable)) fmax(float8, float8);
+extern float16 __attribute__((overloadable)) fmax(float16, float16);
+extern float2 __attribute__((overloadable)) fmax(float2, float);
+extern float3 __attribute__((overloadable)) fmax(float3, float);
+extern float4 __attribute__((overloadable)) fmax(float4, float);
+extern float8 __attribute__((overloadable)) fmax(float8, float);
+extern float16 __attribute__((overloadable)) fmax(float16, float);
+
+extern float __attribute__((overloadable)) fmin(float, float);
+extern float2 __attribute__((overloadable)) fmin(float2, float2);
+extern float3 __attribute__((overloadable)) fmin(float3, float3);
+extern float4 __attribute__((overloadable)) fmin(float4, float4);
+extern float8 __attribute__((overloadable)) fmin(float8, float8);
+extern float16 __attribute__((overloadable)) fmin(float16, float16);
+extern float2 __attribute__((overloadable)) fmin(float2, float);
+extern float3 __attribute__((overloadable)) fmin(float3, float);
+extern float4 __attribute__((overloadable)) fmin(float4, float);
+extern float8 __attribute__((overloadable)) fmin(float8, float);
+extern float16 __attribute__((overloadable)) fmin(float16, float);
+
+extern float __attribute__((overloadable)) fmod(float, float);
+extern float2 __attribute__((overloadable)) fmod(float2, float2);
+extern float3 __attribute__((overloadable)) fmod(float3, float3);
+extern float4 __attribute__((overloadable)) fmod(float4, float4);
+extern float8 __attribute__((overloadable)) fmod(float8, float8);
+extern float16 __attribute__((overloadable)) fmod(float16, float16);
+
+extern float __attribute__((overloadable)) log(float);
+extern float2 __attribute__((overloadable)) log(float2);
+extern float3 __attribute__((overloadable)) log(float3);
+extern float4 __attribute__((overloadable)) log(float4);
+extern float8 __attribute__((overloadable)) log(float8);
+extern float16 __attribute__((overloadable)) log(float16);
+
+extern float __attribute__((overloadable)) log2(float);
+extern float2 __attribute__((overloadable)) log2(float2);
+extern float3 __attribute__((overloadable)) log2(float3);
+extern float4 __attribute__((overloadable)) log2(float4);
+extern float8 __attribute__((overloadable)) log2(float8);
+extern float16 __attribute__((overloadable)) log2(float16);
+
+extern float __attribute__((overloadable)) log10(float);
+extern float2 __attribute__((overloadable)) log10(float2);
+extern float3 __attribute__((overloadable)) log10(float3);
+extern float4 __attribute__((overloadable)) log10(float4);
+extern float8 __attribute__((overloadable)) log10(float8);
+extern float16 __attribute__((overloadable)) log10(float16);
+
+extern float __attribute__((overloadable)) max(float, float);
+extern float2 __attribute__((overloadable)) max(float2, float2);
+extern float3 __attribute__((overloadable)) max(float3, float3);
+extern float4 __attribute__((overloadable)) max(float4, float4);
+extern float8 __attribute__((overloadable)) max(float8, float8);
+extern float16 __attribute__((overloadable)) max(float16, float16);
+
+extern float __attribute__((overloadable)) min(float, float);
+extern float2 __attribute__((overloadable)) min(float2, float2);
+extern float3 __attribute__((overloadable)) min(float3, float3);
+extern float4 __attribute__((overloadable)) min(float4, float4);
+extern float8 __attribute__((overloadable)) min(float8, float8);
+extern float16 __attribute__((overloadable)) min(float16, float16);
+
+extern float __attribute__((overloadable)) mix(float, float, float);
+extern float2 __attribute__((overloadable)) mix(float2, float2, float2);
+extern float3 __attribute__((overloadable)) mix(float3, float3, float3);
+extern float4 __attribute__((overloadable)) mix(float4, float4, float4);
+extern float8 __attribute__((overloadable)) mix(float8, float8, float8);
+extern float16 __attribute__((overloadable)) mix(float16, float16, float16);
+extern float __attribute__((overloadable)) mix(float, float, float);
+extern float2 __attribute__((overloadable)) mix(float2, float2, float);
+extern float3 __attribute__((overloadable)) mix(float3, float3, float);
+extern float4 __attribute__((overloadable)) mix(float4, float4, float);
+extern float8 __attribute__((overloadable)) mix(float8, float8, float);
+extern float16 __attribute__((overloadable)) mix(float16, float16, float);
+
+extern float __attribute__((overloadable)) pow(float, float);
+extern float2 __attribute__((overloadable)) pow(float2, float2);
+extern float3 __attribute__((overloadable)) pow(float3, float3);
+extern float4 __attribute__((overloadable)) pow(float4, float4);
+extern float8 __attribute__((overloadable)) pow(float8, float8);
+extern float16 __attribute__((overloadable)) pow(float16, float16);
+
+extern float __attribute__((overloadable)) radians(float);
+extern float2 __attribute__((overloadable)) radians(float2);
+extern float3 __attribute__((overloadable)) radians(float3);
+extern float4 __attribute__((overloadable)) radians(float4);
+extern float8 __attribute__((overloadable)) radians(float8);
+extern float16 __attribute__((overloadable)) radians(float16);
+
+extern float __attribute__((overloadable)) rint(float);
+extern float2 __attribute__((overloadable)) rint(float2);
+extern float3 __attribute__((overloadable)) rint(float3);
+extern float4 __attribute__((overloadable)) rint(float4);
+extern float8 __attribute__((overloadable)) rint(float8);
+extern float16 __attribute__((overloadable)) rint(float16);
+
+extern float __attribute__((overloadable)) round(float);
+extern float2 __attribute__((overloadable)) round(float2);
+extern float3 __attribute__((overloadable)) round(float3);
+extern float4 __attribute__((overloadable)) round(float4);
+extern float8 __attribute__((overloadable)) round(float8);
+extern float16 __attribute__((overloadable)) round(float16);
+
+extern float __attribute__((overloadable)) rsqrt(float);
+extern float2 __attribute__((overloadable)) rsqrt(float2);
+extern float3 __attribute__((overloadable)) rsqrt(float3);
+extern float4 __attribute__((overloadable)) rsqrt(float4);
+extern float8 __attribute__((overloadable)) rsqrt(float8);
+extern float16 __attribute__((overloadable)) rsqrt(float16);
+
+extern float __attribute__((overloadable)) sign(float);
+extern float2 __attribute__((overloadable)) sign(float2);
+extern float3 __attribute__((overloadable)) sign(float3);
+extern float4 __attribute__((overloadable)) sign(float4);
+extern float8 __attribute__((overloadable)) sign(float8);
+extern float16 __attribute__((overloadable)) sign(float16);
+
+extern float __attribute__((overloadable)) sin(float);
+extern float2 __attribute__((overloadable)) sin(float2);
+extern float3 __attribute__((overloadable)) sin(float3);
+extern float4 __attribute__((overloadable)) sin(float4);
+extern float8 __attribute__((overloadable)) sin(float8);
+extern float16 __attribute__((overloadable)) sin(float16);
+
+extern float __attribute__((overloadable)) sqrt(float);
+extern float2 __attribute__((overloadable)) sqrt(float2);
+extern float3 __attribute__((overloadable)) sqrt(float3);
+extern float4 __attribute__((overloadable)) sqrt(float4);
+extern float8 __attribute__((overloadable)) sqrt(float8);
+extern float16 __attribute__((overloadable)) sqrt(float16);
+
+extern float __attribute__((overloadable)) tan(float);
+extern float2 __attribute__((overloadable)) tan(float2);
+extern float3 __attribute__((overloadable)) tan(float3);
+extern float4 __attribute__((overloadable)) tan(float4);
+extern float8 __attribute__((overloadable)) tan(float8);
+extern float16 __attribute__((overloadable)) tan(float16);
+
+extern float __attribute__((overloadable)) trunc(float);
+extern float2 __attribute__((overloadable)) trunc(float2);
+extern float3 __attribute__((overloadable)) trunc(float3);
+extern float4 __attribute__((overloadable)) trunc(float4);
+extern float8 __attribute__((overloadable)) trunc(float8);
+extern float16 __attribute__((overloadable)) trunc(float16);
+
+
+
+
+
+
+// Int ops
+
+extern int __attribute__((overloadable)) abs(int);
+extern int2 __attribute__((overloadable)) abs(int2);
+extern int3 __attribute__((overloadable)) abs(int3);
+extern int4 __attribute__((overloadable)) abs(int4);
+extern int8 __attribute__((overloadable)) abs(int8);
+extern int16 __attribute__((overloadable)) abs(int16);
+
+
+
+/*
+extern float modf(float, float);
+extern float randf(float);
+extern float randf2(float, float);
+extern float fracf(float);
+extern float lerpf(float, float, float);
+extern float mapf(float, float, float, float, float);
+*/
+
diff --git a/libs/rs/scriptc/rs_types.rsh b/libs/rs/scriptc/rs_types.rsh
new file mode 100644
index 0000000..ae1acdb
--- /dev/null
+++ b/libs/rs/scriptc/rs_types.rsh
@@ -0,0 +1,71 @@
+
+typedef char int8_t;
+typedef short int16_t;
+typedef int int32_t;
+//typedef long int64_t;
+
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+//typedef long uint64_t;
+
+typedef uint8_t uchar;
+typedef uint16_t ushort;
+typedef uint32_t uint;
+//typedef uint64_t ulong;
+
+typedef void * rs_element;
+typedef void * rs_type;
+typedef void * rs_allocation;
+typedef void * rs_sampler;
+typedef void * rs_script;
+typedef void * rs_mesh;
+typedef void * rs_program_fragment;
+typedef void * rs_program_vertex;
+typedef void * rs_program_raster;
+typedef void * rs_program_store;
+
+typedef float float2 __attribute__((ext_vector_type(2)));
+typedef float float3 __attribute__((ext_vector_type(3)));
+typedef float float4 __attribute__((ext_vector_type(4)));
+typedef float float8 __attribute__((ext_vector_type(8)));
+typedef float float16 __attribute__((ext_vector_type(16)));
+
+typedef uchar uchar2 __attribute__((ext_vector_type(2)));
+typedef uchar uchar3 __attribute__((ext_vector_type(3)));
+typedef uchar uchar4 __attribute__((ext_vector_type(4)));
+typedef uchar uchar8 __attribute__((ext_vector_type(8)));
+typedef uchar uchar16 __attribute__((ext_vector_type(16)));
+
+typedef ushort ushort2 __attribute__((ext_vector_type(2)));
+typedef ushort ushort3 __attribute__((ext_vector_type(3)));
+typedef ushort ushort4 __attribute__((ext_vector_type(4)));
+typedef ushort ushort8 __attribute__((ext_vector_type(8)));
+typedef ushort ushort16 __attribute__((ext_vector_type(16)));
+
+typedef uint uint2 __attribute__((ext_vector_type(2)));
+typedef uint uint3 __attribute__((ext_vector_type(3)));
+typedef uint uint4 __attribute__((ext_vector_type(4)));
+typedef uint uint8 __attribute__((ext_vector_type(8)));
+typedef uint uint16 __attribute__((ext_vector_type(16)));
+
+typedef char char2 __attribute__((ext_vector_type(2)));
+typedef char char3 __attribute__((ext_vector_type(3)));
+typedef char char4 __attribute__((ext_vector_type(4)));
+typedef char char8 __attribute__((ext_vector_type(8)));
+typedef char char16 __attribute__((ext_vector_type(16)));
+
+typedef short short2 __attribute__((ext_vector_type(2)));
+typedef short short3 __attribute__((ext_vector_type(3)));
+typedef short short4 __attribute__((ext_vector_type(4)));
+typedef short short8 __attribute__((ext_vector_type(8)));
+typedef short short16 __attribute__((ext_vector_type(16)));
+
+typedef int int2 __attribute__((ext_vector_type(2)));
+typedef int int3 __attribute__((ext_vector_type(3)));
+typedef int int4 __attribute__((ext_vector_type(4)));
+typedef int int8 __attribute__((ext_vector_type(8)));
+typedef int int16 __attribute__((ext_vector_type(16)));
+
+
+
diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp
index 7ca7875..4dc4a15 100644
--- a/libs/surfaceflinger/Layer.cpp
+++ b/libs/surfaceflinger/Layer.cpp
@@ -465,44 +465,61 @@
// for composition later in the loop
return;
}
-
+
+ // ouch, this really should never happen
+ if (uint32_t(buf)>=NUM_BUFFERS) {
+ LOGE("retireAndLock() buffer index (%d) out of range", buf);
+ mPostedDirtyRegion.clear();
+ return;
+ }
+
// we retired a buffer, which becomes the new front buffer
mFrontBufferIndex = buf;
// get the dirty region
sp<GraphicBuffer> newFrontBuffer(getBuffer(buf));
- const Region dirty(lcblk->getDirtyRegion(buf));
- mPostedDirtyRegion = dirty.intersect( newFrontBuffer->getBounds() );
+ if (newFrontBuffer != NULL) {
+ // compute the posted region
+ const Region dirty(lcblk->getDirtyRegion(buf));
+ mPostedDirtyRegion = dirty.intersect( newFrontBuffer->getBounds() );
- const Layer::State& front(drawingState());
- if (newFrontBuffer->getWidth() == front.requested_w &&
- newFrontBuffer->getHeight() == front.requested_h)
- {
- if ((front.w != front.requested_w) ||
- (front.h != front.requested_h))
+ // update the layer size and release freeze-lock
+ const Layer::State& front(drawingState());
+ if (newFrontBuffer->getWidth() == front.requested_w &&
+ newFrontBuffer->getHeight() == front.requested_h)
{
- // Here we pretend the transaction happened by updating the
- // current and drawing states. Drawing state is only accessed
- // in this thread, no need to have it locked
- Layer::State& editDraw(mDrawingState);
- editDraw.w = editDraw.requested_w;
- editDraw.h = editDraw.requested_h;
+ if ((front.w != front.requested_w) ||
+ (front.h != front.requested_h))
+ {
+ // Here we pretend the transaction happened by updating the
+ // current and drawing states. Drawing state is only accessed
+ // in this thread, no need to have it locked
+ Layer::State& editDraw(mDrawingState);
+ editDraw.w = editDraw.requested_w;
+ editDraw.h = editDraw.requested_h;
- // We also need to update the current state so that we don't
- // end-up doing too much work during the next transaction.
- // NOTE: We actually don't need hold the transaction lock here
- // because State::w and State::h are only accessed from
- // this thread
- Layer::State& editTemp(currentState());
- editTemp.w = editDraw.w;
- editTemp.h = editDraw.h;
+ // We also need to update the current state so that we don't
+ // end-up doing too much work during the next transaction.
+ // NOTE: We actually don't need hold the transaction lock here
+ // because State::w and State::h are only accessed from
+ // this thread
+ Layer::State& editTemp(currentState());
+ editTemp.w = editDraw.w;
+ editTemp.h = editDraw.h;
- // recompute visible region
- recomputeVisibleRegions = true;
+ // recompute visible region
+ recomputeVisibleRegions = true;
+ }
+
+ // we now have the correct size, unfreeze the screen
+ mFreezeLock.clear();
}
-
- // we now have the correct size, unfreeze the screen
- mFreezeLock.clear();
+ } else {
+ // this should not happen unless we ran out of memory while
+ // allocating the buffer. we're hoping that things will get back
+ // to normal the next time the app tries to draw into this buffer.
+ // meanwhile, pretend the screen didn't update.
+ mPostedDirtyRegion.clear();
}
if (lcblk->getQueuedCount()) {
diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp
index 140f10c..efbc77a 100644
--- a/libs/surfaceflinger/LayerBase.cpp
+++ b/libs/surfaceflinger/LayerBase.cpp
@@ -214,7 +214,6 @@
if ((front.w != temp.w) || (front.h != temp.h)) {
// invalidate and recompute the visible regions if needed
flags |= Layer::eVisibleRegion;
- this->contentDirty = true;
}
if (temp.sequence != front.sequence) {
diff --git a/libs/surfaceflinger/LayerBase.h b/libs/surfaceflinger/LayerBase.h
index a6e5644..62ec839 100644
--- a/libs/surfaceflinger/LayerBase.h
+++ b/libs/surfaceflinger/LayerBase.h
@@ -157,11 +157,11 @@
/**
* setCoveredRegion - called when the covered region changes. The covered
- * region correspond to any area of the surface that is covered
+ * region corresponds to any area of the surface that is covered
* (transparently or not) by another surface.
*/
virtual void setCoveredRegion(const Region& coveredRegion);
-
+
/**
* validateVisibility - cache a bunch of things
*/
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp
index 26ee285..0722fda 100644
--- a/libs/surfaceflinger/SurfaceFlinger.cpp
+++ b/libs/surfaceflinger/SurfaceFlinger.cpp
@@ -674,6 +674,8 @@
{
const GraphicPlane& plane(graphicPlane(0));
const Transform& planeTransform(plane.transform());
+ const DisplayHardware& hw(plane.displayHardware());
+ const Region screenRegion(hw.bounds());
Region aboveOpaqueLayers;
Region aboveCoveredLayers;
@@ -689,31 +691,56 @@
// start with the whole surface at its current location
const Layer::State& s(layer->drawingState());
- // handle hidden surfaces by setting the visible region to empty
+ /*
+ * opaqueRegion: area of a surface that is fully opaque.
+ */
Region opaqueRegion;
+
+ /*
+ * visibleRegion: area of a surface that is visible on screen
+ * and not fully transparent. This is essentially the layer's
+ * footprint minus the opaque regions above it.
+ * Areas covered by a translucent surface are considered visible.
+ */
Region visibleRegion;
+
+ /*
+ * coveredRegion: area of a surface that is covered by all
+ * visible regions above it (which includes the translucent areas).
+ */
Region coveredRegion;
+
+
+ // handle hidden surfaces by setting the visible region to empty
if (LIKELY(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) {
const bool translucent = layer->needsBlending();
const Rect bounds(layer->visibleBounds());
visibleRegion.set(bounds);
- coveredRegion = visibleRegion;
+ visibleRegion.andSelf(screenRegion);
+ if (!visibleRegion.isEmpty()) {
+ // Remove the transparent area from the visible region
+ if (translucent) {
+ visibleRegion.subtractSelf(layer->transparentRegionScreen);
+ }
- // Remove the transparent area from the visible region
- if (translucent) {
- visibleRegion.subtractSelf(layer->transparentRegionScreen);
- }
-
- // compute the opaque region
- if (s.alpha==255 && !translucent && layer->getOrientation()>=0) {
- // the opaque region is the visible region
- opaqueRegion = visibleRegion;
+ // compute the opaque region
+ const int32_t layerOrientation = layer->getOrientation();
+ if (s.alpha==255 && !translucent &&
+ ((layerOrientation & Transform::ROT_INVALID) == false)) {
+ // the opaque region is the layer's footprint
+ opaqueRegion = visibleRegion;
+ }
}
}
+ // Clip the covered region to the visible region
+ coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
+
+ // Update aboveCoveredLayers for next (lower) layer
+ aboveCoveredLayers.orSelf(visibleRegion);
+
// subtract the opaque region covered by the layers above us
visibleRegion.subtractSelf(aboveOpaqueLayers);
- coveredRegion.andSelf(aboveCoveredLayers);
// compute this layer's dirty region
if (layer->contentDirty) {
@@ -724,19 +751,30 @@
layer->contentDirty = false;
} else {
/* compute the exposed region:
- * exposed = what's VISIBLE and NOT COVERED now
- * but was COVERED before
+ * the exposed region consists of two components:
+ * 1) what's VISIBLE now and was COVERED before
+ * 2) what's EXPOSED now less what was EXPOSED before
+ *
+ * note that (1) is conservative, we start with the whole
+ * visible region but only keep what used to be covered by
+ * something -- which mean it may have been exposed.
+ *
+ * (2) handles areas that were not covered by anything but got
+ * exposed because of a resize.
*/
- dirty = (visibleRegion - coveredRegion) & layer->coveredRegionScreen;
+ const Region newExposed = visibleRegion - coveredRegion;
+ const Region oldVisibleRegion = layer->visibleRegionScreen;
+ const Region oldCoveredRegion = layer->coveredRegionScreen;
+ const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
+ dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
}
dirty.subtractSelf(aboveOpaqueLayers);
// accumulate to the screen dirty region
dirtyRegion.orSelf(dirty);
- // Update aboveOpaqueLayers/aboveCoveredLayers for next (lower) layer
+ // Update aboveOpaqueLayers for next (lower) layer
aboveOpaqueLayers.orSelf(opaqueRegion);
- aboveCoveredLayers.orSelf(visibleRegion);
// Store the visible region is screen space
layer->setVisibleRegion(visibleRegion);
diff --git a/media/libmedia/MediaScanner.cpp b/media/libmedia/MediaScanner.cpp
index 43762e7..843a8fd 100644
--- a/media/libmedia/MediaScanner.cpp
+++ b/media/libmedia/MediaScanner.cpp
@@ -58,7 +58,7 @@
int pathRemaining = PATH_MAX - pathLength;
strcpy(pathBuffer, path);
- if (pathLength > 0 && pathBuffer[pathLength - 1]) {
+ if (pathLength > 0 && pathBuffer[pathLength - 1] != '/') {
pathBuffer[pathLength] = '/';
pathBuffer[pathLength + 1] = 0;
--pathRemaining;
diff --git a/media/libstagefright/AMRExtractor.cpp b/media/libstagefright/AMRExtractor.cpp
index 2a16d26..0fea72e 100644
--- a/media/libstagefright/AMRExtractor.cpp
+++ b/media/libstagefright/AMRExtractor.cpp
@@ -222,7 +222,7 @@
ssize_t n = mDataSource->readAt(mOffset, &header, 1);
if (n < 1) {
- return ERROR_IO;
+ return ERROR_END_OF_STREAM;
}
if (header & 0x83) {
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 10b7be3..164df72 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -624,8 +624,6 @@
}
bool AwesomePlayer::isPlaying() const {
- Mutex::Autolock autoLock(mLock);
-
return mFlags & PLAYING;
}
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 974413d2..9a092d5 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -366,7 +366,6 @@
sp<OMXCodecObserver> observer = new OMXCodecObserver;
IOMX::node_id node = 0;
- success = false;
const char *componentName;
for (size_t i = 0; i < matchingCodecs.size(); ++i) {
@@ -389,22 +388,27 @@
if (err == OK) {
LOGV("Successfully allocated OMX node '%s'", componentName);
- success = true;
- break;
+ sp<OMXCodec> codec = new OMXCodec(
+ omx, node, getComponentQuirks(componentName),
+ createEncoder, mime, componentName,
+ source);
+
+ observer->setCodec(codec);
+
+ err = codec->configureCodec(meta);
+
+ if (err == OK) {
+ return codec;
+ }
+
+ LOGV("Failed to configure codec '%s'", componentName);
}
}
- if (!success) {
- return NULL;
- }
+ return NULL;
+}
- sp<OMXCodec> codec = new OMXCodec(
- omx, node, getComponentQuirks(componentName),
- createEncoder, mime, componentName,
- source);
-
- observer->setCodec(codec);
-
+status_t OMXCodec::configureCodec(const sp<MetaData> &meta) {
uint32_t type;
const void *data;
size_t size;
@@ -417,7 +421,7 @@
esds.getCodecSpecificInfo(
&codec_specific_data, &codec_specific_data_size);
- codec->addCodecSpecificData(
+ addCodecSpecificData(
codec_specific_data, codec_specific_data_size);
} else if (meta->findData(kKeyAVCC, &type, &data, &size)) {
// Parse the AVCDecoderConfigurationRecord
@@ -453,7 +457,7 @@
CHECK(size >= length);
- codec->addCodecSpecificData(ptr, length);
+ addCodecSpecificData(ptr, length);
ptr += length;
size -= length;
@@ -473,7 +477,7 @@
CHECK(size >= length);
- codec->addCodecSpecificData(ptr, length);
+ addCodecSpecificData(ptr, length);
ptr += length;
size -= length;
@@ -482,44 +486,49 @@
LOGV("AVC profile = %d (%s), level = %d",
(int)profile, AVCProfileToString(profile), (int)level / 10);
- if (!strcmp(componentName, "OMX.TI.Video.Decoder")
+ if (!strcmp(mComponentName, "OMX.TI.Video.Decoder")
&& (profile != kAVCProfileBaseline || level > 39)) {
// This stream exceeds the decoder's capabilities. The decoder
// does not handle this gracefully and would clobber the heap
// and wreak havoc instead...
LOGE("Profile and/or level exceed the decoder's capabilities.");
- return NULL;
+ return ERROR_UNSUPPORTED;
}
}
- if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, mime)) {
- codec->setAMRFormat(false /* isWAMR */);
+ if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_NB, mMIME)) {
+ setAMRFormat(false /* isWAMR */);
}
- if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, mime)) {
- codec->setAMRFormat(true /* isWAMR */);
+ if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AMR_WB, mMIME)) {
+ setAMRFormat(true /* isWAMR */);
}
- if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mime)) {
+ if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_AAC, mMIME)) {
int32_t numChannels, sampleRate;
CHECK(meta->findInt32(kKeyChannelCount, &numChannels));
CHECK(meta->findInt32(kKeySampleRate, &sampleRate));
- codec->setAACFormat(numChannels, sampleRate);
+ setAACFormat(numChannels, sampleRate);
}
- if (!strncasecmp(mime, "video/", 6)) {
+ if (!strncasecmp(mMIME, "video/", 6)) {
int32_t width, height;
bool success = meta->findInt32(kKeyWidth, &width);
success = success && meta->findInt32(kKeyHeight, &height);
CHECK(success);
- if (createEncoder) {
- codec->setVideoInputFormat(mime, width, height);
+ if (mIsEncoder) {
+ setVideoInputFormat(mMIME, width, height);
} else {
- codec->setVideoOutputFormat(mime, width, height);
+ status_t err = setVideoOutputFormat(
+ mMIME, width, height);
+
+ if (err != OK) {
+ return err;
+ }
}
}
- if (!strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_JPEG)
- && !strcmp(componentName, "OMX.TI.JPEG.decode")) {
+ if (!strcasecmp(mMIME, MEDIA_MIMETYPE_IMAGE_JPEG)
+ && !strcmp(mComponentName, "OMX.TI.JPEG.decode")) {
OMX_COLOR_FORMATTYPE format =
OMX_COLOR_Format32bitARGB8888;
// OMX_COLOR_FormatYUV420PackedPlanar;
@@ -537,23 +546,23 @@
CHECK(success);
CHECK(compressedSize > 0);
- codec->setImageOutputFormat(format, width, height);
- codec->setJPEGInputFormat(width, height, (OMX_U32)compressedSize);
+ setImageOutputFormat(format, width, height);
+ setJPEGInputFormat(width, height, (OMX_U32)compressedSize);
}
int32_t maxInputSize;
if (meta->findInt32(kKeyMaxInputSize, &maxInputSize)) {
- codec->setMinBufferSize(kPortIndexInput, (OMX_U32)maxInputSize);
+ setMinBufferSize(kPortIndexInput, (OMX_U32)maxInputSize);
}
- if (!strcmp(componentName, "OMX.TI.AMR.encode")
- || !strcmp(componentName, "OMX.TI.WBAMR.encode")) {
- codec->setMinBufferSize(kPortIndexOutput, 8192); // XXX
+ if (!strcmp(mComponentName, "OMX.TI.AMR.encode")
+ || !strcmp(mComponentName, "OMX.TI.WBAMR.encode")) {
+ setMinBufferSize(kPortIndexOutput, 8192); // XXX
}
- codec->initOutputFormat(meta);
+ initOutputFormat(meta);
- return codec;
+ return OK;
}
void OMXCodec::setMinBufferSize(OMX_U32 portIndex, OMX_U32 size) {
@@ -902,7 +911,7 @@
return OK;
}
-void OMXCodec::setVideoOutputFormat(
+status_t OMXCodec::setVideoOutputFormat(
const char *mime, OMX_U32 width, OMX_U32 height) {
CODEC_LOGV("setVideoOutputFormat width=%ld, height=%ld", width, height);
@@ -918,9 +927,13 @@
CHECK(!"Should not be here. Not a supported video mime type.");
}
- setVideoPortFormatType(
+ status_t err = setVideoPortFormatType(
kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused);
+ if (err != OK) {
+ return err;
+ }
+
#if 1
{
OMX_VIDEO_PARAM_PORTFORMATTYPE format;
@@ -944,7 +957,10 @@
err = mOMX->setParameter(
mNode, OMX_IndexParamVideoPortFormat,
&format, sizeof(format));
- CHECK_EQ(err, OK);
+
+ if (err != OK) {
+ return err;
+ }
}
#endif
@@ -954,7 +970,7 @@
OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video;
- status_t err = mOMX->getParameter(
+ err = mOMX->getParameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
CHECK_EQ(err, OK);
@@ -977,7 +993,10 @@
err = mOMX->setParameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
- CHECK_EQ(err, OK);
+
+ if (err != OK) {
+ return err;
+ }
////////////////////////////////////////////////////////////////////////////
@@ -999,7 +1018,8 @@
err = mOMX->setParameter(
mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
- CHECK_EQ(err, OK);
+
+ return err;
}
OMXCodec::OMXCodec(
diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp
index 16a2a10..b263238 100644
--- a/media/libstagefright/id3/ID3.cpp
+++ b/media/libstagefright/id3/ID3.cpp
@@ -275,6 +275,7 @@
size_t utf8len = 0;
for (size_t i = 0; i < size; ++i) {
if (data[i] == '\0') {
+ size = i;
break;
} else if (data[i] < 0x80) {
++utf8len;
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 2458d2a..c1a010c 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -25,6 +25,7 @@
#include <binder/IMemory.h>
#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaErrors.h>
namespace android {
@@ -105,7 +106,14 @@
}
static status_t StatusFromOMXError(OMX_ERRORTYPE err) {
- return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
+ switch (err) {
+ case OMX_ErrorNone:
+ return OK;
+ case OMX_ErrorUnsupportedSetting:
+ return ERROR_UNSUPPORTED;
+ default:
+ return UNKNOWN_ERROR;
+ }
}
status_t OMXNodeInstance::freeNode(OMXMaster *master) {
diff --git a/obex/javax/obex/ServerRequestHandler.java b/obex/javax/obex/ServerRequestHandler.java
index d93e5b6..0882572 100644
--- a/obex/javax/obex/ServerRequestHandler.java
+++ b/obex/javax/obex/ServerRequestHandler.java
@@ -197,6 +197,13 @@
}
/**
+ * Called when a ABORT request is received.
+ */
+ public int onAbort(HeaderSet request, HeaderSet reply) {
+ return ResponseCodes.OBEX_HTTP_NOT_IMPLEMENTED;
+ }
+
+ /**
* Called when a PUT request is received.
* <P>
* If this method is not implemented by the class that extends this class,
diff --git a/obex/javax/obex/ServerSession.java b/obex/javax/obex/ServerSession.java
index 503d440..a4b9759 100644
--- a/obex/javax/obex/ServerSession.java
+++ b/obex/javax/obex/ServerSession.java
@@ -115,6 +115,9 @@
case ObexHelper.OBEX_OPCODE_SETPATH:
handleSetPathRequest();
break;
+ case ObexHelper.OBEX_OPCODE_ABORT:
+ handleAbortRequest();
+ break;
case -1:
done = true;
@@ -145,6 +148,35 @@
}
/**
+ * Handles a ABORT request from a client. This method will read the rest of
+ * the request from the client. Assuming the request is valid, it will
+ * create a <code>HeaderSet</code> object to pass to the
+ * <code>ServerRequestHandler</code> object. After the handler processes the
+ * request, this method will create a reply message to send to the server.
+ *
+ * @throws IOException if an error occurred at the transport layer
+ */
+ private void handleAbortRequest() throws IOException {
+ int code = ResponseCodes.OBEX_HTTP_OK;
+ HeaderSet request = new HeaderSet();
+ HeaderSet reply = new HeaderSet();
+
+ int length = mInput.read();
+ length = (length << 8) + mInput.read();
+ if (length > ObexHelper.MAX_PACKET_SIZE_INT) {
+ code = ResponseCodes.OBEX_HTTP_REQ_TOO_LARGE;
+ } else {
+ for (int i = 3; i < length; i++) {
+ mInput.read();
+ }
+ code = mListener.onAbort(request, reply);
+ Log.v(TAG, "onAbort request handler return value- " + code);
+ code = validateResponseCode(code);
+ }
+ sendResponse(code, null);
+ }
+
+ /**
* Handles a PUT request from a client. This method will provide a
* <code>ServerOperation</code> object to the request handler. The
* <code>ServerOperation</code> object will handle the rest of the request.
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 882cbc5..3f029a6 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -977,15 +977,22 @@
* @return false if the context has been lost.
*/
public boolean swap() {
- mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
+ if (! mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)) {
- /*
- * Always check for EGL_CONTEXT_LOST, which means the context
- * and all associated data were lost (For instance because
- * the device went to sleep). We need to sleep until we
- * get a new surface.
- */
- return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
+ /*
+ * Check for EGL_CONTEXT_LOST, which means the context
+ * and all associated data were lost (For instance because
+ * the device went to sleep). We need to sleep until we
+ * get a new surface.
+ */
+ int error = mEgl.eglGetError();
+ if (error == EGL11.EGL_CONTEXT_LOST) {
+ return false;
+ } else {
+ throwEglException("eglSwapBuffers", error);
+ }
+ }
+ return true;
}
public void destroySurface() {
@@ -1010,7 +1017,11 @@
}
private void throwEglException(String function) {
- throw new RuntimeException(function + " failed: " + mEgl.eglGetError());
+ throwEglException(function, mEgl.eglGetError());
+ }
+
+ private void throwEglException(String function, int error) {
+ throw new RuntimeException(function + " failed: " + error);
}
EGL10 mEgl;
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index 145e25e..89b3e1f 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -650,6 +650,7 @@
if (dp->refs > 0) {
if (major != NULL) *major = VERSION_MAJOR;
if (minor != NULL) *minor = VERSION_MINOR;
+ dp->refs++;
return EGL_TRUE;
}
@@ -755,8 +756,10 @@
}
// this is specific to Android, display termination is ref-counted.
- if (dp->refs > 1)
+ if (dp->refs > 1) {
+ dp->refs--;
return EGL_TRUE;
+ }
EGLBoolean res = EGL_FALSE;
for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) {
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index c6b617d..77d11cc 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -24,7 +24,6 @@
import android.content.pm.PackageInfoLite;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
-import android.content.pm.PackageParser.Package;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
@@ -45,7 +44,6 @@
import java.io.InputStream;
import android.os.FileUtils;
-import android.os.storage.IMountService;
import android.provider.Settings;
/*
@@ -130,26 +128,21 @@
ret.packageName = pkg.packageName;
ret.installLocation = pkg.installLocation;
// Nuke the parser reference right away and force a gc
- Runtime.getRuntime().gc();
packageParser = null;
+ Runtime.getRuntime().gc();
if (pkg == null) {
Log.w(TAG, "Failed to parse package");
ret.recommendedInstallLocation = PackageHelper.RECOMMEND_FAILED_INVALID_APK;
return ret;
}
ret.packageName = pkg.packageName;
- int loc = recommendAppInstallLocation(pkg.installLocation, archiveFilePath);
- if (loc == PackageManager.INSTALL_EXTERNAL) {
- ret.recommendedInstallLocation = PackageHelper.RECOMMEND_INSTALL_EXTERNAL;
- } else if (loc == ERR_LOC) {
- Log.i(TAG, "Failed to install insufficient storage");
- ret.recommendedInstallLocation = PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE;
- } else {
- // Implies install on internal storage.
- ret.recommendedInstallLocation = PackageHelper.RECOMMEND_INSTALL_INTERNAL;
- }
+ ret.recommendedInstallLocation = recommendAppInstallLocation(pkg.installLocation, archiveFilePath);
return ret;
}
+
+ public boolean checkFreeStorage(boolean external, Uri fileUri) {
+ return checkFreeStorageInner(external, fileUri);
+ }
};
public DefaultContainerService() {
@@ -190,6 +183,12 @@
}
private String copyResourceInner(Uri packageURI, String newCid, String key, String resFileName) {
+ // Make sure the sdcard is mounted.
+ String status = Environment.getExternalStorageState();
+ if (!status.equals(Environment.MEDIA_MOUNTED)) {
+ Log.w(TAG, "Make sure sdcard is mounted.");
+ return null;
+ }
// Create new container at newCachePath
String codePath = packageURI.getPath();
File codeFile = new File(codePath);
@@ -313,11 +312,13 @@
// Else install on internal NAND flash, unless space on NAND is less than 10%
String status = Environment.getExternalStorageState();
long availSDSize = -1;
+ boolean mediaAvailable = false;
if (status.equals(Environment.MEDIA_MOUNTED)) {
StatFs sdStats = new StatFs(
Environment.getExternalStorageDirectory().getPath());
availSDSize = (long)sdStats.getAvailableBlocks() *
(long)sdStats.getBlockSize();
+ mediaAvailable = true;
}
StatFs internalStats = new StatFs(Environment.getDataDirectory().getPath());
long totalInternalSize = (long)internalStats.getBlockCount() *
@@ -337,7 +338,8 @@
long reqInternalSize = 0;
boolean intThresholdOk = (pctNandFree >= LOW_NAND_FLASH_TRESHOLD);
boolean intAvailOk = ((reqInstallSize + reqInternalSize) < availInternalSize);
- boolean fitsOnSd = (reqInstallSize < availSDSize) && intThresholdOk &&
+ boolean fitsOnSd = mediaAvailable && (reqInstallSize < availSDSize)
+ && intThresholdOk &&
(reqInternalSize < availInternalSize);
boolean fitsOnInt = intThresholdOk && intAvailOk;
@@ -377,21 +379,58 @@
}
if (!auto) {
if (installOnlyOnSd) {
- return fitsOnSd ? PackageManager.INSTALL_EXTERNAL : ERR_LOC;
+ if (fitsOnSd) {
+ return PackageHelper.RECOMMEND_INSTALL_EXTERNAL;
+ }
+ if (!mediaAvailable) {
+ return PackageHelper.RECOMMEND_MEDIA_UNAVAILABLE;
+ }
+ return PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE;
} else if (installOnlyInternal){
// Check on internal flash
- return fitsOnInt ? 0 : ERR_LOC;
+ return fitsOnInt ? PackageHelper.RECOMMEND_INSTALL_INTERNAL :
+ PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE;
}
}
// Try to install internally
if (fitsOnInt) {
- return 0;
+ return PackageHelper.RECOMMEND_INSTALL_INTERNAL;
}
// Try the sdcard now.
if (fitsOnSd) {
- return PackageManager.INSTALL_EXTERNAL;
+ return PackageHelper.RECOMMEND_INSTALL_EXTERNAL;
}
// Return error code
- return ERR_LOC;
+ return PackageHelper.RECOMMEND_FAILED_INSUFFICIENT_STORAGE;
+ }
+
+ private boolean checkFreeStorageInner(boolean external, Uri packageURI) {
+ File apkFile = new File(packageURI.getPath());
+ long size = apkFile.length();
+ if (external) {
+ String status = Environment.getExternalStorageState();
+ long availSDSize = -1;
+ if (status.equals(Environment.MEDIA_MOUNTED)) {
+ StatFs sdStats = new StatFs(
+ Environment.getExternalStorageDirectory().getPath());
+ availSDSize = (long)sdStats.getAvailableBlocks() *
+ (long)sdStats.getBlockSize();
+ }
+ return availSDSize > size;
+ }
+ StatFs internalStats = new StatFs(Environment.getDataDirectory().getPath());
+ long totalInternalSize = (long)internalStats.getBlockCount() *
+ (long)internalStats.getBlockSize();
+ long availInternalSize = (long)internalStats.getAvailableBlocks() *
+ (long)internalStats.getBlockSize();
+
+ double pctNandFree = (double)availInternalSize / (double)totalInternalSize;
+ // To make final copy
+ long reqInstallSize = size;
+ // For dex files. Just ignore and fail when extracting. Max limit of 2Gig for now.
+ long reqInternalSize = 0;
+ boolean intThresholdOk = (pctNandFree >= LOW_NAND_FLASH_TRESHOLD);
+ boolean intAvailOk = ((reqInstallSize + reqInternalSize) < availInternalSize);
+ return intThresholdOk && intAvailOk;
}
}
diff --git a/packages/TtsService/src/android/tts/SynthProxy.java b/packages/TtsService/src/android/tts/SynthProxy.java
index cd46c05..cece94e 100755
--- a/packages/TtsService/src/android/tts/SynthProxy.java
+++ b/packages/TtsService/src/android/tts/SynthProxy.java
@@ -36,9 +36,9 @@
// Such a huge filter gain is justified by how much energy in the low frequencies is "wasted" at
// the output of the synthesis. The low shelving filter removes it, leaving room for
// amplification.
- private final static float PICO_FILTER_GAIN = 4.0f; // linear gain
- private final static float PICO_FILTER_LOWSHELF_ATTENUATION = -16.0f; // in dB
- private final static float PICO_FILTER_TRANSITION_FREQ = 1000.0f; // in Hz
+ private final static float PICO_FILTER_GAIN = 5.0f; // linear gain
+ private final static float PICO_FILTER_LOWSHELF_ATTENUATION = -18.0f; // in dB
+ private final static float PICO_FILTER_TRANSITION_FREQ = 1100.0f; // in Hz
private final static float PICO_FILTER_SHELF_SLOPE = 1.0f; // Q
//
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index d4d5336..d50f5910 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -29,6 +29,8 @@
import android.os.storage.IMountShutdownObserver;
import android.os.storage.StorageResultCode;
import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.os.IBinder;
@@ -49,6 +51,8 @@
class MountService extends IMountService.Stub
implements INativeDaemonConnectorCallbacks {
private static final boolean LOCAL_LOGD = false;
+ private static final boolean DEBUG_UNMOUNT = false;
+ private static final boolean DEBUG_EVENTS = false;
private static final String TAG = "MountService";
@@ -154,6 +158,7 @@
}
void handleFinished() {
+ if (DEBUG_UNMOUNT) Log.i(TAG, "Unmounting " + path);
doUnmountVolume(path, true);
}
}
@@ -193,28 +198,37 @@
}
}
- final private Handler mHandler = new Handler() {
+ class MountServiceHandler extends Handler {
ArrayList<UnmountCallBack> mForceUnmounts = new ArrayList<UnmountCallBack>();
boolean mRegistered = false;
+ MountServiceHandler(Looper l) {
+ super(l);
+ }
+
void registerReceiver() {
mRegistered = true;
+ if (DEBUG_UNMOUNT) Log.i(TAG, "Registering receiver");
mContext.registerReceiver(mPmReceiver, mPmFilter);
}
void unregisterReceiver() {
mRegistered = false;
+ if (DEBUG_UNMOUNT) Log.i(TAG, "Unregistering receiver");
mContext.unregisterReceiver(mPmReceiver);
}
public void handleMessage(Message msg) {
switch (msg.what) {
case H_UNMOUNT_PM_UPDATE: {
+ if (DEBUG_UNMOUNT) Log.i(TAG, "H_UNMOUNT_PM_UPDATE");
UnmountCallBack ucb = (UnmountCallBack) msg.obj;
mForceUnmounts.add(ucb);
+ if (DEBUG_UNMOUNT) Log.i(TAG, " registered = " + mRegistered);
// Register only if needed.
if (!mRegistered) {
registerReceiver();
+ if (DEBUG_UNMOUNT) Log.i(TAG, "Updating external media status");
boolean hasExtPkgs = mPms.updateExternalMediaStatus(false);
if (!hasExtPkgs) {
// Unregister right away
@@ -224,6 +238,7 @@
break;
}
case H_UNMOUNT_PM_DONE: {
+ if (DEBUG_UNMOUNT) Log.i(TAG, "H_UNMOUNT_PM_DONE");
// Unregister now.
if (mRegistered) {
unregisterReceiver();
@@ -280,6 +295,7 @@
break;
}
case H_UNMOUNT_MS : {
+ if (DEBUG_UNMOUNT) Log.i(TAG, "H_UNMOUNT_MS");
UnmountCallBack ucb = (UnmountCallBack) msg.obj;
ucb.handleFinished();
break;
@@ -287,6 +303,8 @@
}
}
};
+ final private HandlerThread mHandlerThread;
+ final private Handler mHandler;
private void waitForReady() {
while (mReady == false) {
@@ -385,7 +403,12 @@
Log.w(TAG, String.format("Duplicate state transition (%s -> %s)", mLegacyState, state));
return;
}
-
+ // Update state on PackageManager
+ if (Environment.MEDIA_UNMOUNTED.equals(state)) {
+ mPms.updateExternalMediaStatus(false);
+ } else if (Environment.MEDIA_MOUNTED.equals(state)) {
+ mPms.updateExternalMediaStatus(true);
+ }
String oldState = mLegacyState;
mLegacyState = state;
@@ -448,6 +471,7 @@
}
}
if (state != null) {
+ if (DEBUG_EVENTS) Log.i(TAG, "Updating valid state " + state);
updatePublicVolumeState(path, state);
}
} catch (Exception e) {
@@ -476,6 +500,18 @@
public boolean onEvent(int code, String raw, String[] cooked) {
Intent in = null;
+ if (DEBUG_EVENTS) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("onEvent::");
+ builder.append(" raw= " + raw);
+ if (cooked != null) {
+ builder.append(" cooked = " );
+ for (String str : cooked) {
+ builder.append(" " + str);
+ }
+ }
+ Log.i(TAG, builder.toString());
+ }
if (code == VoldResponseCode.VolumeStateChange) {
/*
* One of the volumes we're managing has changed state.
@@ -533,18 +569,22 @@
return true;
}
/* Send the media unmounted event first */
+ if (DEBUG_EVENTS) Log.i(TAG, "Sending unmounted event first");
updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
mContext.sendBroadcast(in);
+ if (DEBUG_EVENTS) Log.i(TAG, "Sending media removed");
updatePublicVolumeState(path, Environment.MEDIA_REMOVED);
in = new Intent(Intent.ACTION_MEDIA_REMOVED, Uri.parse("file://" + path));
} else if (code == VoldResponseCode.VolumeBadRemoval) {
+ if (DEBUG_EVENTS) Log.i(TAG, "Sending unmounted event first");
/* Send the media unmounted event first */
updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
mContext.sendBroadcast(in);
+ if (DEBUG_EVENTS) Log.i(TAG, "Sending media bad removal");
updatePublicVolumeState(path, Environment.MEDIA_BAD_REMOVAL);
in = new Intent(Intent.ACTION_MEDIA_BAD_REMOVAL, Uri.parse("file://" + path));
} else {
@@ -556,12 +596,13 @@
if (in != null) {
mContext.sendBroadcast(in);
- }
- return true;
+ }
+ return true;
}
private void notifyVolumeStateChange(String label, String path, int oldState, int newState) {
String vs = getVolumeState(path);
+ if (DEBUG_EVENTS) Log.i(TAG, "notifyVolumeStateChanged::" + vs);
Intent in = null;
@@ -583,29 +624,31 @@
Environment.MEDIA_BAD_REMOVAL) && !vs.equals(
Environment.MEDIA_NOFS) && !vs.equals(
Environment.MEDIA_UNMOUNTABLE) && !getUmsEnabling()) {
+ if (DEBUG_EVENTS) Log.i(TAG, "updating volume state for media bad removal nofs and unmountable");
updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
}
} else if (newState == VolumeState.Pending) {
} else if (newState == VolumeState.Checking) {
+ if (DEBUG_EVENTS) Log.i(TAG, "updating volume state checking");
updatePublicVolumeState(path, Environment.MEDIA_CHECKING);
in = new Intent(Intent.ACTION_MEDIA_CHECKING, Uri.parse("file://" + path));
} else if (newState == VolumeState.Mounted) {
+ if (DEBUG_EVENTS) Log.i(TAG, "updating volume state mounted");
updatePublicVolumeState(path, Environment.MEDIA_MOUNTED);
- // Update media status on PackageManagerService to mount packages on sdcard
- mPms.updateExternalMediaStatus(true);
in = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + path));
in.putExtra("read-only", false);
} else if (newState == VolumeState.Unmounting) {
- mPms.updateExternalMediaStatus(false);
in = new Intent(Intent.ACTION_MEDIA_EJECT, Uri.parse("file://" + path));
} else if (newState == VolumeState.Formatting) {
} else if (newState == VolumeState.Shared) {
+ if (DEBUG_EVENTS) Log.i(TAG, "Updating volume state media mounted");
/* Send the media unmounted event first */
updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
mContext.sendBroadcast(in);
+ if (DEBUG_EVENTS) Log.i(TAG, "Updating media shared");
updatePublicVolumeState(path, Environment.MEDIA_SHARED);
in = new Intent(Intent.ACTION_MEDIA_SHARED, Uri.parse("file://" + path));
if (LOCAL_LOGD) Log.d(TAG, "Sending ACTION_MEDIA_SHARED intent");
@@ -649,6 +692,7 @@
private int doMountVolume(String path) {
int rc = StorageResultCode.OperationSucceeded;
+ if (DEBUG_EVENTS) Log.i(TAG, "doMountVolume: Mouting " + path);
try {
mConnector.doCommand(String.format("volume mount %s", path));
} catch (NativeDaemonConnectorException e) {
@@ -663,6 +707,7 @@
*/
rc = StorageResultCode.OperationFailedNoMedia;
} else if (code == VoldResponseCode.OpFailedMediaBlank) {
+ if (DEBUG_EVENTS) Log.i(TAG, " updating volume state :: media nofs");
/*
* Media is blank or does not contain a supported filesystem
*/
@@ -670,6 +715,7 @@
in = new Intent(Intent.ACTION_MEDIA_NOFS, Uri.parse("file://" + path));
rc = StorageResultCode.OperationFailedMediaBlank;
} else if (code == VoldResponseCode.OpFailedMediaCorrupt) {
+ if (DEBUG_EVENTS) Log.i(TAG, "updating volume state media corrupt");
/*
* Volume consistency check failed
*/
@@ -850,6 +896,10 @@
mContext.registerReceiver(mBroadcastReceiver,
new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, null);
+ mHandlerThread = new HandlerThread("MountService");
+ mHandlerThread.start();
+ mHandler = new MountServiceHandler(mHandlerThread.getLooper());
+
/*
* Vold does not run in the simulator, so pretend the connector thread
* ran and did its thing.
@@ -1028,6 +1078,16 @@
validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
waitForReady();
+ String volState = getVolumeState(path);
+ if (DEBUG_UNMOUNT) Log.i(TAG, "Unmounting " + path + " force = " + force);
+ if (Environment.MEDIA_UNMOUNTED.equals(volState) ||
+ Environment.MEDIA_REMOVED.equals(volState) ||
+ Environment.MEDIA_SHARED.equals(volState) ||
+ Environment.MEDIA_UNMOUNTABLE.equals(volState)) {
+ // Media already unmounted or cannot be unmounted.
+ // TODO return valid return code when adding observer call back.
+ return;
+ }
UnmountCallBack ucb = new UnmountCallBack(path, force);
mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_PM_UPDATE, ucb));
}
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index aa9ced8..b114ca2 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -26,10 +26,13 @@
import android.net.Uri;
import android.net.InterfaceConfiguration;
import android.net.INetworkManagementEventObserver;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.os.INetworkManagementService;
import android.os.Handler;
import android.os.SystemProperties;
import android.text.TextUtils;
+import android.util.Log;
import android.util.Slog;
import java.util.ArrayList;
import java.util.StringTokenizer;
@@ -457,14 +460,38 @@
throw new IllegalStateException("Got an empty response");
}
- public void startAccessPoint()
+ public void startAccessPoint(WifiConfiguration wifiConfig, String intf)
throws IllegalStateException {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
- mConnector.doCommand(String.format("softap set"));
- mConnector.doCommand(String.format("softap start"));
+ mConnector.doCommand(String.format("softap stop " + intf));
+ mConnector.doCommand(String.format("softap fwreload " + intf + " AP"));
+ mConnector.doCommand(String.format("softap start " + intf));
+ if (wifiConfig == null) {
+ mConnector.doCommand(String.format("softap set " + intf + " wl0.1"));
+ } else {
+ /**
+ * softap set arg1 arg2 arg3 [arg4 arg5 arg6 arg7 arg8]
+ * argv1 - wlan interface
+ * argv2 - softap interface
+ * argv3 - SSID
+ * argv4 - Security
+ * argv5 - Key
+ * argv6 - Channel
+ * argv7 - Preamble
+ * argv8 - Max SCB
+ *
+ * TODO: get a configurable softap interface from driver
+ */
+ String str = String.format("softap set " + intf + " wl0.1 %s %s %s", wifiConfig.SSID,
+ wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ?
+ "wpa2-psk" : "open",
+ wifiConfig.preSharedKey);
+ mConnector.doCommand(str);
+ }
+ mConnector.doCommand(String.format("softap startap"));
}
public void stopAccessPoint() throws IllegalStateException {
@@ -472,7 +499,7 @@
android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
- mConnector.doCommand("softap stop");
+ mConnector.doCommand("softap stopap");
}
}
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 139c05f..818e99e 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -4613,6 +4613,12 @@
return pkgLite.recommendedInstallLocation;
}
+ /*
+ * Invoke remote method to get package information and install
+ * location values. Override install location based on default
+ * policy if needed and then create install arguments based
+ * on the install location.
+ */
public void handleStartCopy() throws RemoteException {
int ret = PackageManager.INSTALL_SUCCEEDED;
boolean fwdLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
@@ -4624,9 +4630,7 @@
} else {
// Remote call to find out default install location
PackageInfoLite pkgLite = mContainerService.getMinimalPackageInfo(packageURI);
- int loc = installLocationPolicy(pkgLite, flags);
- // Use install location to create InstallArgs and temporary
- // install location
+ int loc = pkgLite.recommendedInstallLocation;
if (loc == PackageHelper.RECOMMEND_FAILED_INVALID_LOCATION){
ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
} else if (loc == PackageHelper.RECOMMEND_FAILED_ALREADY_EXISTS){
@@ -4635,7 +4639,11 @@
ret = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
} else if (loc == PackageHelper.RECOMMEND_FAILED_INVALID_APK) {
ret = PackageManager.INSTALL_FAILED_INVALID_APK;
+ } else if (loc == PackageHelper.RECOMMEND_MEDIA_UNAVAILABLE) {
+ ret = PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE;
} else {
+ // Override with defaults if needed.
+ loc = installLocationPolicy(pkgLite, flags);
// Override install location with flags
if ((flags & PackageManager.INSTALL_EXTERNAL) == 0){
if (loc == PackageHelper.RECOMMEND_INSTALL_EXTERNAL) {
@@ -4701,6 +4709,12 @@
}
public void handleStartCopy() throws RemoteException {
+ mRet = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
+ // Check for storage space on target medium
+ if (!targetArgs.checkFreeStorage(mContainerService)) {
+ Log.w(TAG, "Insufficient storage to install");
+ return;
+ }
// Create the file args now.
mRet = targetArgs.copyApk(mContainerService, false);
targetArgs.doPreInstall(mRet);
@@ -4714,15 +4728,20 @@
builder.append(" target : ");
builder.append(targetArgs.getCodePath());
}
- Log.i(TAG, "Posting move MCS_UNBIND for " + builder.toString());
+ Log.i(TAG, builder.toString());
}
}
@Override
void handleReturnCode() {
targetArgs.doPostInstall(mRet);
- // TODO invoke pending move
- processPendingMove(this, mRet);
+ int currentStatus = PackageManager.MOVE_FAILED_INTERNAL_ERROR;
+ if (mRet == PackageManager.INSTALL_SUCCEEDED) {
+ currentStatus = PackageManager.MOVE_SUCCEEDED;
+ } else if (mRet == PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE){
+ currentStatus = PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE;
+ }
+ processPendingMove(this, currentStatus);
}
@Override
@@ -4782,6 +4801,7 @@
// Need installer lock especially for dex file removal.
abstract void cleanUpResourcesLI();
abstract boolean doPostDeleteLI(boolean delete);
+ abstract boolean checkFreeStorage(IMediaContainerService imcs) throws RemoteException;
}
class FileInstallArgs extends InstallArgs {
@@ -4812,6 +4832,10 @@
resourceFileName = getResourcePathFromCodePath();
}
+ boolean checkFreeStorage(IMediaContainerService imcs) throws RemoteException {
+ return imcs.checkFreeStorage(false, packageURI);
+ }
+
String getCodePath() {
return codeFileName;
}
@@ -5013,6 +5037,10 @@
cid = getTempContainerId();
}
+ boolean checkFreeStorage(IMediaContainerService imcs) throws RemoteException {
+ return imcs.checkFreeStorage(true, packageURI);
+ }
+
int copyApk(IMediaContainerService imcs, boolean temp) throws RemoteException {
if (temp) {
createCopyFile();
@@ -9109,6 +9137,9 @@
public boolean updateExternalMediaStatus(final boolean mediaStatus) {
final boolean ret;
synchronized (mPackages) {
+ Log.i(TAG, "Updating external media status from " +
+ (mMediaMounted ? "mounted" : "unmounted") + " to " +
+ (mediaStatus ? "mounted" : "unmounted"));
if (DEBUG_SD_INSTALL) Log.i(TAG, "updateExternalMediaStatus:: mediaStatus=" +
mediaStatus+", mMediaMounted=" + mMediaMounted);
if (mediaStatus == mMediaMounted) {
@@ -9117,6 +9148,14 @@
mMediaMounted = mediaStatus;
Set<String> appList = mSettings.findPackagesWithFlag(ApplicationInfo.FLAG_EXTERNAL_STORAGE);
ret = appList != null && appList.size() > 0;
+ if (DEBUG_SD_INSTALL) {
+ if (appList != null) {
+ for (String app : appList) {
+ Log.i(TAG, "Should enable " + app + " on sdcard");
+ }
+ }
+ }
+ if (DEBUG_SD_INSTALL) Log.i(TAG, "updateExternalMediaStatus returning " + ret);
}
// Queue up an async operation since the package installation may take a little while.
mHandler.post(new Runnable() {
@@ -9134,6 +9173,7 @@
// enabled or disabled.
final String list[] = PackageHelper.getSecureContainerList();
if (list == null || list.length == 0) {
+ Log.i(TAG, "No secure containers on sdcard");
return;
}
@@ -9141,16 +9181,6 @@
int num = 0;
HashSet<String> removeCids = new HashSet<String>();
HashMap<SdInstallArgs, String> processCids = new HashMap<SdInstallArgs, String>();
- /*HashMap<String, String> cidPathMap = new HashMap<String, String>();
- // Don't hold any locks when getting cache paths
- for (String cid : list) {
- String cpath = PackageHelper.getSdDir(cid);
- if (cpath == null) {
- removeCids.add(cid);
- } else {
- cidPathMap.put(cid, cpath);
- }
- }*/
synchronized (mPackages) {
for (String cid : list) {
SdInstallArgs args = new SdInstallArgs(cid);
diff --git a/services/java/com/android/server/UiModeManagerService.java b/services/java/com/android/server/UiModeManagerService.java
index 37a3cdf..5bd23f4 100644
--- a/services/java/com/android/server/UiModeManagerService.java
+++ b/services/java/com/android/server/UiModeManagerService.java
@@ -20,7 +20,6 @@
import android.app.ActivityManagerNative;
import android.app.AlarmManager;
import android.app.IActivityManager;
-import android.app.KeyguardManager;
import android.app.IUiModeManager;
import android.app.Notification;
import android.app.NotificationManager;
@@ -103,7 +102,6 @@
private LocationManager mLocationManager;
private Location mLocation;
private StatusBarManager mStatusBarManager;
- private KeyguardManager.KeyguardLock mKeyguardLock;
private final PowerManager.WakeLock mWakeLock;
// The broadcast receiver which receives the result of the ordered broadcast sent when
@@ -347,24 +345,6 @@
void setCarModeLocked(boolean enabled) {
if (mCarModeEnabled != enabled) {
mCarModeEnabled = enabled;
-
- // Disable keyguard when in car mode
- if (mKeyguardLock == null) {
- KeyguardManager km =
- (KeyguardManager)mContext.getSystemService(Context.KEYGUARD_SERVICE);
- if (km != null) {
- mKeyguardLock = km.newKeyguardLock(TAG);
- }
- }
- if (mKeyguardLock != null) {
- long ident = Binder.clearCallingIdentity();
- if (enabled) {
- mKeyguardLock.disableKeyguard();
- } else {
- mKeyguardLock.reenableKeyguard();
- }
- Binder.restoreCallingIdentity(ident);
- }
}
}
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 97a4329..4eb529c 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -46,6 +46,7 @@
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.SupplicantState;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.ConnectivityManager;
import android.net.InterfaceConfiguration;
import android.net.NetworkStateTracker;
@@ -81,6 +82,7 @@
import com.android.internal.app.IBatteryStats;
import android.app.backup.IBackupManager;
import com.android.server.am.BatteryStatsService;
+import com.android.internal.R;
/**
* WifiService handles remote WiFi operation requests by implementing
@@ -105,6 +107,8 @@
private boolean mDeviceIdle;
private int mPluggedType;
+ private enum DriverAction {DRIVER_UNLOAD, NO_DRIVER_UNLOAD};
+
// true if the user enabled Wifi while in airplane mode
private boolean mAirplaneModeOverwridden;
@@ -271,11 +275,9 @@
*/
public void startWifi() {
boolean wifiEnabled = getPersistedWifiEnabled();
- boolean wifiAPEnabled = wifiEnabled ? false : getPersistedWifiApEnabled();
Slog.i(TAG, "WifiService starting up with Wi-Fi " +
(wifiEnabled ? "enabled" : "disabled"));
setWifiEnabledBlocking(wifiEnabled, false, Process.myUid());
- setWifiApEnabledBlocking(wifiAPEnabled, true, Process.myUid(), null);
}
private void updateTetherState(ArrayList<String> available, ArrayList<String> tethered) {
@@ -297,28 +299,22 @@
try {
ifcg = service.getInterfaceConfig(intf);
if (ifcg != null) {
- /* IP/netmask: 169.254.2.1/255.255.255.0 */
- ifcg.ipAddr = (169 << 24) + (254 << 16) + (2 << 8) + 1;
+ /* IP/netmask: 169.254.2.2/255.255.255.0 */
+ ifcg.ipAddr = (169 << 24) + (254 << 16) + (2 << 8) + 2;
ifcg.netmask = (255 << 24) + (255 << 16) + (255 << 8) + 0;
ifcg.interfaceFlags = "up";
service.setInterfaceConfig(intf, ifcg);
}
} catch (Exception e) {
- /**
- * TODO: Add broadcast to indicate tether failed
- */
Slog.e(TAG, "Error configuring interface " + intf + ", :" + e);
+ setWifiApEnabledState(WIFI_AP_STATE_FAILED, 0, DriverAction.DRIVER_UNLOAD);
return;
}
- /**
- * TODO: Add broadcast to indicate tether failed
- */
- if(mCm.tether(intf) == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
- Slog.d(TAG, "Tethered "+intf);
- } else {
+ if(mCm.tether(intf) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
Slog.e(TAG, "Error tethering "+intf);
+ setWifiApEnabledState(WIFI_AP_STATE_FAILED, 0, DriverAction.DRIVER_UNLOAD);
}
break;
}
@@ -434,7 +430,7 @@
setWifiEnabledState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING, uid);
if ((mWifiApState == WIFI_AP_STATE_ENABLED) && enable) {
- setWifiApEnabledBlocking(false, true, Process.myUid(), null);
+ setWifiApEnabledBlocking(false, Process.myUid(), null);
}
if (enable) {
@@ -581,21 +577,6 @@
return mWifiStateTracker.reassociate();
}
- private boolean getPersistedWifiApEnabled() {
- final ContentResolver cr = mContext.getContentResolver();
- try {
- return Settings.Secure.getInt(cr, Settings.Secure.WIFI_AP_ON) == 1;
- } catch (Settings.SettingNotFoundException e) {
- Settings.Secure.putInt(cr, Settings.Secure.WIFI_AP_ON, 0);
- return false;
- }
- }
-
- private void persistWifiApEnabled(boolean enabled) {
- final ContentResolver cr = mContext.getContentResolver();
- Settings.Secure.putInt(cr, Settings.Secure.WIFI_AP_ON, enabled ? 1 : 0);
- }
-
/**
* see {@link android.net.wifi.WifiManager#startAccessPoint(WifiConfiguration)}
* @param wifiConfig SSID, security and channel details as
@@ -621,46 +602,101 @@
return true;
}
+ public WifiConfiguration getWifiApConfiguration() {
+ final ContentResolver cr = mContext.getContentResolver();
+ WifiConfiguration wifiConfig = new WifiConfiguration();
+ int authType;
+ try {
+ wifiConfig.SSID = Settings.Secure.getString(cr, Settings.Secure.WIFI_AP_SSID);
+ if (wifiConfig.SSID == null)
+ return null;
+ authType = Settings.Secure.getInt(cr, Settings.Secure.WIFI_AP_SECURITY);
+ wifiConfig.allowedKeyManagement.set(authType);
+ wifiConfig.preSharedKey = Settings.Secure.getString(cr, Settings.Secure.WIFI_AP_PASSWD);
+ return wifiConfig;
+ } catch (Settings.SettingNotFoundException e) {
+ Slog.e(TAG,"AP settings not found, returning");
+ return null;
+ }
+ }
+
+ private void persistApConfiguration(WifiConfiguration wifiConfig) {
+ final ContentResolver cr = mContext.getContentResolver();
+ boolean isWpa;
+ if (wifiConfig == null)
+ return;
+ Settings.Secure.putString(cr, Settings.Secure.WIFI_AP_SSID, wifiConfig.SSID);
+ isWpa = wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK);
+ Settings.Secure.putInt(cr,
+ Settings.Secure.WIFI_AP_SECURITY,
+ isWpa ? KeyMgmt.WPA_PSK : KeyMgmt.NONE);
+ if (isWpa)
+ Settings.Secure.putString(cr, Settings.Secure.WIFI_AP_PASSWD, wifiConfig.preSharedKey);
+ }
+
/**
* Enables/disables Wi-Fi AP synchronously. The driver is loaded
* and soft access point configured as a single operation.
* @param enable {@code true} to turn Wi-Fi on, {@code false} to turn it off.
- * @param persist {@code true} if the setting should be persisted.
* @param uid The UID of the process making the request.
- * @param config The WifiConfiguration for AP
+ * @param wifiConfig The WifiConfiguration for AP
* @return {@code true} if the operation succeeds (or if the existing state
* is the same as the requested state)
*/
- /**
- * TODO: persist needs to go away in WifiService
- * This will affect all persist related functions
- * for Access Point
- */
private boolean setWifiApEnabledBlocking(boolean enable,
- boolean persist, int uid, WifiConfiguration wifiConfig) {
+ int uid, WifiConfiguration wifiConfig) {
final int eventualWifiApState = enable ? WIFI_AP_STATE_ENABLED : WIFI_AP_STATE_DISABLED;
if (mWifiApState == eventualWifiApState) {
- return true;
+ /* Configuration changed on a running access point */
+ if(enable && (wifiConfig != null)) {
+ try {
+ persistApConfiguration(wifiConfig);
+ nwService.stopAccessPoint();
+ nwService.startAccessPoint(wifiConfig, mWifiStateTracker.getInterfaceName());
+ return true;
+ } catch(Exception e) {
+ Slog.e(TAG, "Exception in nwService during AP restart");
+ setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid, DriverAction.DRIVER_UNLOAD);
+ return false;
+ }
+ } else {
+ return true;
+ }
}
- setWifiApEnabledState(enable ? WIFI_AP_STATE_ENABLING : WIFI_AP_STATE_DISABLING, uid);
-
- if (enable && (mWifiStateTracker.getWifiState() == WIFI_STATE_ENABLED)) {
- setWifiEnabledBlocking(false, true, Process.myUid());
- }
+ setWifiApEnabledState(enable ? WIFI_AP_STATE_ENABLING :
+ WIFI_AP_STATE_DISABLING, uid, DriverAction.NO_DRIVER_UNLOAD);
if (enable) {
+
+ /**
+ * Disable client mode for starting AP
+ */
+ if (mWifiStateTracker.getWifiState() == WIFI_STATE_ENABLED) {
+ setWifiEnabledBlocking(false, true, Process.myUid());
+ }
+
+ /* Use default config if there is no existing config */
+ if (wifiConfig == null && ((wifiConfig = getWifiApConfiguration()) == null)) {
+ wifiConfig = new WifiConfiguration();
+ wifiConfig.SSID = mContext.getString(R.string.wifi_tether_configure_ssid_default);
+ wifiConfig.allowedKeyManagement.set(KeyMgmt.NONE);
+ }
+ persistApConfiguration(wifiConfig);
+
if (!mWifiStateTracker.loadDriver()) {
Slog.e(TAG, "Failed to load Wi-Fi driver for AP mode");
- setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid);
+ setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid, DriverAction.NO_DRIVER_UNLOAD);
return false;
}
try {
- nwService.startAccessPoint();
+ nwService.startAccessPoint(wifiConfig, mWifiStateTracker.getInterfaceName());
} catch(Exception e) {
Slog.e(TAG, "Exception in startAccessPoint()");
+ setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid, DriverAction.DRIVER_UNLOAD);
+ return false;
}
} else {
@@ -669,20 +705,18 @@
nwService.stopAccessPoint();
} catch(Exception e) {
Slog.e(TAG, "Exception in stopAccessPoint()");
+ setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid, DriverAction.DRIVER_UNLOAD);
+ return false;
}
if (!mWifiStateTracker.unloadDriver()) {
Slog.e(TAG, "Failed to unload Wi-Fi driver for AP mode");
- setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid);
+ setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid, DriverAction.NO_DRIVER_UNLOAD);
return false;
}
}
- // Success!
- if (persist) {
- persistWifiApEnabled(enable);
- }
- setWifiApEnabledState(eventualWifiApState, uid);
+ setWifiApEnabledState(eventualWifiApState, uid, DriverAction.NO_DRIVER_UNLOAD);
return true;
}
@@ -699,9 +733,16 @@
return mWifiApState;
}
- private void setWifiApEnabledState(int wifiAPState, int uid) {
+ private void setWifiApEnabledState(int wifiAPState, int uid, DriverAction flag) {
final int previousWifiApState = mWifiApState;
+ /**
+ * Unload the driver if going to a failed state
+ */
+ if ((mWifiApState == WIFI_AP_STATE_FAILED) && (flag == DriverAction.DRIVER_UNLOAD)) {
+ mWifiStateTracker.unloadDriver();
+ }
+
long ident = Binder.clearCallingIdentity();
try {
if (wifiAPState == WIFI_AP_STATE_ENABLED) {
@@ -959,8 +1000,7 @@
*/
int netId = config.networkId;
boolean newNetwork = netId == -1;
- boolean doReconfig;
- int currentPriority;
+ boolean doReconfig = false;
// networkId of -1 means we want to create a new network
synchronized (mWifiStateTracker) {
if (newNetwork) {
@@ -972,17 +1012,6 @@
return -1;
}
doReconfig = true;
- } else {
- String priorityVal = mWifiStateTracker.getNetworkVariable(
- netId, WifiConfiguration.priorityVarName);
- currentPriority = -1;
- if (!TextUtils.isEmpty(priorityVal)) {
- try {
- currentPriority = Integer.parseInt(priorityVal);
- } catch (NumberFormatException ignore) {
- }
- }
- doReconfig = currentPriority != config.priority;
}
mNeedReconfig = mNeedReconfig || doReconfig;
}
@@ -1706,7 +1735,7 @@
private void sendAccessPointMessage(boolean enable, WifiConfiguration wifiConfig, int uid) {
Message.obtain(mWifiHandler,
(enable ? MESSAGE_START_ACCESS_POINT : MESSAGE_STOP_ACCESS_POINT),
- 0, uid, wifiConfig).sendToTarget();
+ uid, 0, wifiConfig).sendToTarget();
}
private void updateWifiState() {
@@ -1853,15 +1882,13 @@
case MESSAGE_START_ACCESS_POINT:
setWifiApEnabledBlocking(true,
- msg.arg1 == 1,
- msg.arg2,
+ msg.arg1,
(WifiConfiguration) msg.obj);
break;
case MESSAGE_STOP_ACCESS_POINT:
setWifiApEnabledBlocking(false,
- msg.arg1 == 1,
- msg.arg2,
+ msg.arg1,
(WifiConfiguration) msg.obj);
sWakeLock.release();
break;
diff --git a/services/java/com/android/server/status/StatusBarService.java b/services/java/com/android/server/status/StatusBarService.java
index d5f2c1d..e43b12e 100644
--- a/services/java/com/android/server/status/StatusBarService.java
+++ b/services/java/com/android/server/status/StatusBarService.java
@@ -1502,7 +1502,7 @@
Drawable bg;
/// ---------- Tracking View --------------
- pixelFormat = PixelFormat.TRANSLUCENT;
+ pixelFormat = PixelFormat.RGBX_8888;
bg = mTrackingView.getBackground();
if (bg != null) {
pixelFormat = bg.getOpacity();
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index a6b1d93..ae5b1de 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -389,6 +389,8 @@
public static final int NETWORK_TYPE_HSUPA = 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA = 10;
+ /** Current network is iDen */
+ public static final int NETWORK_TYPE_IDEN = 11;
/**
* Returns a constant indicating the radio technology (network type)
diff --git a/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java b/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java
index 8c8b00c..a06a13b 100755
--- a/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java
@@ -72,8 +72,8 @@
public class PackageManagerTests extends AndroidTestCase {
private static final boolean localLOGV = true;
public static final String TAG="PackageManagerTests";
- public final long MAX_WAIT_TIME=120*1000;
- public final long WAIT_TIME_INCR=20*1000;
+ public final long MAX_WAIT_TIME = 25*1000;
+ public final long WAIT_TIME_INCR = 5*1000;
private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec";
private static final int APP_INSTALL_AUTO = PackageHelper.APP_INSTALL_AUTO;
private static final int APP_INSTALL_DEVICE = PackageHelper.APP_INSTALL_INTERNAL;
@@ -378,39 +378,50 @@
private InstallParams installFromRawResource(String outFileName,
int rawResId, int flags, boolean cleanUp, boolean fail, int result,
int expInstallLocation) {
+ PackageManager pm = mContext.getPackageManager();
File filesDir = mContext.getFilesDir();
File outFile = new File(filesDir, outFileName);
Uri packageURI = getInstallablePackage(rawResId, outFile);
PackageParser.Package pkg = parsePackage(packageURI);
assertNotNull(pkg);
- InstallParams ip = null;
- // Make sure the package doesn't exist
- getPm().deletePackage(pkg.packageName, null, 0);
- // Clean up the containers as well
- clearSecureContainersForPkg(pkg.packageName);
- try {
+ if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) {
+ // Make sure the package doesn't exist
try {
- if (fail) {
- assertTrue(invokeInstallPackageFail(packageURI, flags,
- pkg.packageName, result));
- assertNotInstalled(pkg.packageName);
- } else {
- InstallReceiver receiver = new InstallReceiver(pkg.packageName);
- assertTrue(invokeInstallPackage(packageURI, flags,
- pkg.packageName, receiver));
- // Verify installed information
- assertInstall(pkg, flags, expInstallLocation);
- ip = new InstallParams(pkg, outFileName, packageURI);
- }
+ ApplicationInfo appInfo = pm.getApplicationInfo(pkg.packageName,
+ PackageManager.GET_UNINSTALLED_PACKAGES);
+ GenericReceiver receiver = new DeleteReceiver(pkg.packageName);
+ invokeDeletePackage(packageURI, 0,
+ pkg.packageName, receiver);
+ } catch (NameNotFoundException e1) {
} catch (Exception e) {
- failStr("Failed with exception : " + e);
+ failStr(e);
+ }
+ // Clean up the containers as well
+ clearSecureContainersForPkg(pkg.packageName);
+ }
+ InstallParams ip = null;
+ try {
+ if (fail) {
+ assertTrue(invokeInstallPackageFail(packageURI, flags,
+ pkg.packageName, result));
+ assertNotInstalled(pkg.packageName);
+ } else {
+ InstallReceiver receiver = new InstallReceiver(pkg.packageName);
+ assertTrue(invokeInstallPackage(packageURI, flags,
+ pkg.packageName, receiver));
+ // Verify installed information
+ assertInstall(pkg, flags, expInstallLocation);
+ ip = new InstallParams(pkg, outFileName, packageURI);
}
return ip;
+ } catch (Exception e) {
+ failStr("Failed with exception : " + e);
} finally {
if (cleanUp) {
cleanUpInstall(ip);
}
}
+ return ip;
}
@MediumTest
@@ -820,7 +831,7 @@
try {
// Wait on observer
synchronized(observer) {
- getMs().unmountVolume(path, false);
+ getMs().unmountVolume(path, true);
long waitTime = 0;
while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
observer.wait(WAIT_TIME_INCR);
@@ -949,14 +960,21 @@
PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
}
- private void replaceManifestLocation(int iFlags, int rFlags) {
+ /*
+ * Install a package on internal flash via PackageManager install flag. Replace
+ * the package via flag to install on sdcard. Make sure the new flag overrides
+ * the old install location.
+ */
+ public void testReplaceFlagInternalSdcard() {
+ int iFlags = 0;
+ int rFlags = PackageManager.INSTALL_EXTERNAL;
InstallParams ip = sampleInstallFromRawResource(iFlags, false);
GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
try {
assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags,
ip.pkg.packageName, receiver), true);
- assertInstall(ip.pkg, replaceFlags, ip.pkg.installLocation);
+ assertInstall(ip.pkg, rFlags, ip.pkg.installLocation);
} catch (Exception e) {
failStr("Failed with exception : " + e);
} finally {
@@ -964,12 +982,26 @@
}
}
- public void testReplaceFlagInternalSdcard() {
- replaceManifestLocation(0, PackageManager.INSTALL_EXTERNAL);
- }
-
+ /*
+ * Install a package on sdcard via PackageManager install flag. Replace
+ * the package with no flags or manifest option and make sure the old
+ * install location is retained.
+ */
public void testReplaceFlagSdcardInternal() {
- replaceManifestLocation(PackageManager.INSTALL_EXTERNAL, 0);
+ int iFlags = PackageManager.INSTALL_EXTERNAL;
+ int rFlags = 0;
+ InstallParams ip = sampleInstallFromRawResource(iFlags, false);
+ GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
+ int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
+ try {
+ assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags,
+ ip.pkg.packageName, receiver), true);
+ assertInstall(ip.pkg, iFlags, ip.pkg.installLocation);
+ } catch (Exception e) {
+ failStr("Failed with exception : " + e);
+ } finally {
+ cleanUpInstall(ip);
+ }
}
public void testManifestInstallLocationReplaceInternalSdcard() {
@@ -984,7 +1016,7 @@
int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
try {
InstallParams rp = installFromRawResource("install.apk", rApk,
- rFlags, false,
+ replaceFlags, false,
false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
assertInstall(rp.pkg, replaceFlags, rp.pkg.installLocation);
} catch (Exception e) {
@@ -1002,11 +1034,10 @@
InstallParams ip = installFromRawResource("install.apk", iApk,
iFlags, false,
false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
- GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
try {
InstallParams rp = installFromRawResource("install.apk", rApk,
- rFlags, false,
+ replaceFlags, false,
false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
assertInstall(rp.pkg, replaceFlags, ip.pkg.installLocation);
} catch (Exception e) {
@@ -1211,6 +1242,56 @@
moveFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.MOVE_INTERNAL,
PackageManager.MOVE_SUCCEEDED);
}
+
+ /*
+ * Test that an install error code is returned when media is unmounted
+ * and package installed on sdcard via package manager flag.
+ */
+ public void testInstallSdcardUnmount() {
+ boolean origState = getMediaState();
+ try {
+ // Unmount sdcard
+ assertTrue(unmountMedia());
+ // Try to install and make sure an error code is returned.
+ assertNull(installFromRawResource("install.apk", R.raw.install,
+ PackageManager.INSTALL_EXTERNAL, false,
+ true, PackageManager.INSTALL_FAILED_CONTAINER_ERROR,
+ PackageInfo.INSTALL_LOCATION_AUTO));
+ } finally {
+ // Restore original media state
+ if (origState) {
+ mountMedia();
+ } else {
+ unmountMedia();
+ }
+ }
+ }
+
+ /*
+ * Unmount sdcard. Try installing an app with manifest option to install
+ * on sdcard. Make sure it gets installed on internal flash.
+ */
+ public void testInstallManifestSdcardUnmount() {
+ boolean origState = getMediaState();
+ try {
+ // Unmount sdcard
+ assertTrue(unmountMedia());
+ // Try to install and make sure an error code is returned.
+ assertNotNull(installFromRawResource("install.apk", R.raw.install_loc_sdcard,
+ 0, false,
+ false, -1,
+ PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY));
+ } finally {
+ // Restore original media state
+ if (origState) {
+ mountMedia();
+ } else {
+ unmountMedia();
+ }
+ }
+ }
+
+ /*---------- Recommended install location tests ----*/
/*
* TODO's
* check version numbers for upgrades
diff --git a/tests/BrowserTestPlugin/jni/main.cpp b/tests/BrowserTestPlugin/jni/main.cpp
index 87ddbc4..402a7e2 100644
--- a/tests/BrowserTestPlugin/jni/main.cpp
+++ b/tests/BrowserTestPlugin/jni/main.cpp
@@ -142,7 +142,7 @@
if (browser->version >= 14) {
instance->pdata = browser->createobject (instance, getPluginClass());
obj = static_cast<PluginObject*>(instance->pdata);
- bzero(obj, sizeof(*obj));
+ memset(obj, 0, sizeof(*obj));
} else {
return NPERR_GENERIC_ERROR;
}
diff --git a/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java b/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java
index fd05fed..1e57bd2 100644
--- a/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java
+++ b/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java
@@ -18,6 +18,7 @@
import android.content.Context;
import com.android.internal.telephony.IccCard;
+import android.content.res.Configuration;
import android.test.AndroidTestCase;
import android.view.View;
import android.view.KeyEvent;
@@ -39,8 +40,6 @@
private static class MockUpdateMonitor extends KeyguardUpdateMonitor {
public IccCard.State simState = IccCard.State.READY;
- public boolean inPortrait = false;
- public boolean keyboardOpen = false;
private MockUpdateMonitor(Context context) {
super(context);
@@ -50,26 +49,6 @@
public IccCard.State getSimState() {
return simState;
}
-
- @Override
- public boolean isInPortrait() {
- return inPortrait;
- }
-
- @Override
- public boolean isKeyboardOpen() {
- return keyboardOpen;
- }
-
- @Override
- boolean queryInPortrait() {
- return inPortrait;
- }
-
- @Override
- boolean queryKeyboardOpen() {
- return keyboardOpen;
- }
}
private static class MockLockPatternUtils extends LockPatternUtils {
@@ -115,7 +94,7 @@
public boolean needsInput() {
return false;
}
-
+
/** {@inheritDoc} */
public void onPause() {
mOnPauseCount++;
@@ -202,7 +181,7 @@
}
public void keyguardDoneDrawing() {
-
+
}
public int getPokeWakelockCount() {
@@ -293,7 +272,7 @@
// should have poked the wakelock to turn on the screen
assertEquals(1, mKeyguardViewCallback.getPokeWakelockCount());
-
+
// shouldn't be any additional views created
assertEquals(1, mLPKV.getInjectedLockScreens().size());
assertEquals(1, mLPKV.getInjectedUnlockScreens().size());
@@ -317,7 +296,7 @@
assertEquals(1, lockScreen.getOnResumeCount());
// simulate screen asking to be recreated
- mLPKV.mKeyguardScreenCallback.recreateMe();
+ mLPKV.mKeyguardScreenCallback.recreateMe(new Configuration());
// should have been recreated
assertEquals(2, mLPKV.getInjectedLockScreens().size());
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index d833e33..5fd44b1 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -81,5 +81,7 @@
boolean setWifiApEnabled(in WifiConfiguration wifiConfig, boolean enable);
int getWifiApEnabledState();
+
+ WifiConfiguration getWifiApConfiguration();
}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 9ef8ba1..970d5fc 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -810,6 +810,20 @@
}
/**
+ * Gets the Wi-Fi AP Configuration.
+ * @return AP details in WifiConfiguration
+ *
+ * @hide Dont open yet
+ */
+ public WifiConfiguration getWifiApConfiguration() {
+ try {
+ return mService.getWifiApConfiguration();
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+
+ /**
* Allows an application to keep the Wi-Fi radio awake.
* Normally the Wi-Fi radio may turn off when the user has not used the device in a while.
* Acquiring a WifiLock will keep the radio on until the lock is released. Multiple