Merge "Revamping of the NumberPicker widget for improved usablility."
diff --git a/CleanSpec.mk b/CleanSpec.mk
index d48904c..6ae887b 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -111,6 +111,8 @@
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/media/audio/)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/fonts/Lohit_Hindi.ttf)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/media/audio/)
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/api/13.xml b/api/13.xml
index 2bfa04e..73995de 100644
--- a/api/13.xml
+++ b/api/13.xml
@@ -288451,7 +288451,7 @@
type="double"
transient="false"
volatile="false"
- value="(-1.0 / 0.0)"
+ value="(-1.0/0.0)"
static="true"
final="true"
deprecated="not deprecated"
@@ -288462,7 +288462,7 @@
type="double"
transient="false"
volatile="false"
- value="(0.0 / 0.0)"
+ value="(0.0/0.0)"
static="true"
final="true"
deprecated="not deprecated"
@@ -288473,7 +288473,7 @@
type="double"
transient="false"
volatile="false"
- value="(1.0 / 0.0)"
+ value="(1.0/0.0)"
static="true"
final="true"
deprecated="not deprecated"
@@ -289154,7 +289154,7 @@
type="float"
transient="false"
volatile="false"
- value="(-1.0f / 0.0f)"
+ value="(-1.0f/0.0f)"
static="true"
final="true"
deprecated="not deprecated"
@@ -289165,7 +289165,7 @@
type="float"
transient="false"
volatile="false"
- value="(0.0f / 0.0f)"
+ value="(0.0f/0.0f)"
static="true"
final="true"
deprecated="not deprecated"
@@ -289176,7 +289176,7 @@
type="float"
transient="false"
volatile="false"
- value="(1.0f / 0.0f)"
+ value="(1.0f/0.0f)"
static="true"
final="true"
deprecated="not deprecated"
diff --git a/cmds/stagefright/sf2.cpp b/cmds/stagefright/sf2.cpp
index 6fa66cf..f547e01 100644
--- a/cmds/stagefright/sf2.cpp
+++ b/cmds/stagefright/sf2.cpp
@@ -46,7 +46,8 @@
mDecodeAudio(decodeAudio),
mSurface(surface),
mRenderToSurface(renderToSurface),
- mCodec(new ACodec) {
+ mCodec(new ACodec),
+ mIsVorbis(false) {
CHECK(!mDecodeAudio || mSurface == NULL);
}
@@ -85,6 +86,12 @@
if (!strncasecmp(mDecodeAudio ? "audio/" : "video/",
mime, 6)) {
mSource = extractor->getTrack(i);
+
+ if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
+ mIsVorbis = true;
+ } else {
+ mIsVorbis = false;
+ }
break;
}
}
@@ -227,6 +234,7 @@
bool mRenderToSurface;
sp<ACodec> mCodec;
sp<MediaSource> mSource;
+ bool mIsVorbis;
Vector<sp<ABuffer> > mCSD;
size_t mCSDIndex;
@@ -369,6 +377,20 @@
buffer->meta()->setInt32("csd", true);
mCSD.push(buffer);
+ } else if (meta->findData(kKeyVorbisInfo, &type, &data, &size)) {
+ sp<ABuffer> buffer = new ABuffer(size);
+ memcpy(buffer->data(), data, size);
+
+ buffer->meta()->setInt32("csd", true);
+ mCSD.push(buffer);
+
+ CHECK(meta->findData(kKeyVorbisBooks, &type, &data, &size));
+
+ buffer = new ABuffer(size);
+ memcpy(buffer->data(), data, size);
+
+ buffer->meta()->setInt32("csd", true);
+ mCSD.push(buffer);
}
int32_t maxInputSize;
@@ -423,10 +445,17 @@
}
}
- if (inBuffer->range_length() > sizeLeft) {
+ size_t sizeNeeded = inBuffer->range_length();
+ if (mIsVorbis) {
+ // Vorbis data is suffixed with the number of
+ // valid samples on the page.
+ sizeNeeded += sizeof(int32_t);
+ }
+
+ if (sizeNeeded > sizeLeft) {
if (outBuffer->size() == 0) {
LOGE("Unable to fit even a single input buffer of size %d.",
- inBuffer->range_length());
+ sizeNeeded);
}
CHECK_GT(outBuffer->size(), 0u);
@@ -448,10 +477,22 @@
+ inBuffer->range_offset(),
inBuffer->range_length());
- outBuffer->setRange(
- 0, outBuffer->size() + inBuffer->range_length());
+ if (mIsVorbis) {
+ int32_t numPageSamples;
+ if (!inBuffer->meta_data()->findInt32(
+ kKeyValidSamples, &numPageSamples)) {
+ numPageSamples = -1;
+ }
- sizeLeft -= inBuffer->range_length();
+ memcpy(outBuffer->data()
+ + outBuffer->size() + inBuffer->range_length(),
+ &numPageSamples, sizeof(numPageSamples));
+ }
+
+ outBuffer->setRange(
+ 0, outBuffer->size() + sizeNeeded);
+
+ sizeLeft -= sizeNeeded;
inBuffer->release();
inBuffer = NULL;
@@ -569,12 +610,16 @@
CHECK(control->isValid());
SurfaceComposerClient::openGlobalTransaction();
- CHECK_EQ(control->setLayer(30000), (status_t)OK);
+ CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK);
CHECK_EQ(control->show(), (status_t)OK);
SurfaceComposerClient::closeGlobalTransaction();
surface = control->getSurface();
CHECK(surface != NULL);
+
+ CHECK_EQ((status_t)OK,
+ native_window_api_connect(
+ surface.get(), NATIVE_WINDOW_API_MEDIA));
}
sp<Controller> controller =
@@ -589,6 +634,10 @@
looper->unregisterHandler(controller->id());
if (!decodeAudio && useSurface) {
+ CHECK_EQ((status_t)OK,
+ native_window_api_disconnect(
+ surface.get(), NATIVE_WINDOW_API_MEDIA));
+
composerClient->dispose();
}
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index a126e83..528d197 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -917,7 +917,7 @@
CHECK(control->isValid());
SurfaceComposerClient::openGlobalTransaction();
- CHECK_EQ(control->setLayer(30000), (status_t)OK);
+ CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK);
CHECK_EQ(control->show(), (status_t)OK);
SurfaceComposerClient::closeGlobalTransaction();
@@ -929,6 +929,10 @@
sp<SurfaceTexture> texture = new SurfaceTexture(0 /* tex */);
gSurface = new SurfaceTextureClient(texture);
}
+
+ CHECK_EQ((status_t)OK,
+ native_window_api_connect(
+ gSurface.get(), NATIVE_WINDOW_API_MEDIA));
}
DataSource::RegisterDefaultSniffers();
@@ -1122,6 +1126,10 @@
}
if ((useSurfaceAlloc || useSurfaceTexAlloc) && !audioOnly) {
+ CHECK_EQ((status_t)OK,
+ native_window_api_disconnect(
+ gSurface.get(), NATIVE_WINDOW_API_MEDIA));
+
gSurface.clear();
if (useSurfaceAlloc) {
diff --git a/cmds/stagefright/stream.cpp b/cmds/stagefright/stream.cpp
index b13236a..2378345 100644
--- a/cmds/stagefright/stream.cpp
+++ b/cmds/stagefright/stream.cpp
@@ -323,7 +323,7 @@
CHECK(control->isValid());
SurfaceComposerClient::openGlobalTransaction();
- CHECK_EQ(control->setLayer(30000), (status_t)OK);
+ CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK);
CHECK_EQ(control->show(), (status_t)OK);
SurfaceComposerClient::closeGlobalTransaction();
diff --git a/core/java/android/accounts/ChooseAccountTypeActivity.java b/core/java/android/accounts/ChooseAccountTypeActivity.java
index 5239e8c5..448b2c0 100644
--- a/core/java/android/accounts/ChooseAccountTypeActivity.java
+++ b/core/java/android/accounts/ChooseAccountTypeActivity.java
@@ -33,7 +33,6 @@
import android.widget.TextView;
import com.android.internal.R;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -43,7 +42,7 @@
/**
* @hide
*/
-public class ChooseAccountTypeActivity extends Activity implements AccountManagerCallback<Bundle> {
+public class ChooseAccountTypeActivity extends Activity {
private static final String TAG = "AccountManager";
private HashMap<String, AuthInfo> mTypeToAuthenticatorInfo = new HashMap<String, AuthInfo>();
@@ -52,7 +51,6 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.choose_account_type);
// Read the validAccountTypes, if present, and add them to the setOfAllowableAccountTypes
Set<String> setOfAllowableAccountTypes = null;
@@ -90,10 +88,11 @@
}
if (mAuthenticatorInfosToDisplay.size() == 1) {
- runAddAccountForAuthenticator(mAuthenticatorInfosToDisplay.get(0));
+ setResultAndFinish(mAuthenticatorInfosToDisplay.get(0).desc.type);
return;
}
+ setContentView(R.layout.choose_account_type);
// Setup the list
ListView list = (ListView) findViewById(android.R.id.list);
// Use an existing ListAdapter that will map an array of strings to TextViews
@@ -103,11 +102,20 @@
list.setTextFilterEnabled(false);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
- runAddAccountForAuthenticator(mAuthenticatorInfosToDisplay.get(position));
+ setResultAndFinish(mAuthenticatorInfosToDisplay.get(position).desc.type);
}
});
}
+ private void setResultAndFinish(final String type) {
+ Bundle bundle = new Bundle();
+ bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, type);
+ setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
+ Log.d(TAG, "ChooseAccountTypeActivity.setResultAndFinish: "
+ + "selected account type " + type);
+ finish();
+ }
+
private void buildTypeToAuthDescriptionMap() {
for(AuthenticatorDescription desc : AccountManager.get(this).getAuthenticatorTypes()) {
String name = null;
@@ -136,42 +144,6 @@
}
}
- protected void runAddAccountForAuthenticator(AuthInfo authInfo) {
- Log.d(TAG, "selected account type " + authInfo.name);
- final Bundle options = getIntent().getBundleExtra(
- ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE);
- final String[] requiredFeatures = getIntent().getStringArrayExtra(
- ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY);
- final String authTokenType = getIntent().getStringExtra(
- ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING);
- AccountManager.get(this).addAccount(authInfo.desc.type, authTokenType, requiredFeatures,
- options, this, this, null /* Handler */);
- }
-
- public void run(final AccountManagerFuture<Bundle> accountManagerFuture) {
- try {
- Bundle accountManagerResult = accountManagerFuture.getResult();
- Bundle bundle = new Bundle();
- bundle.putString(AccountManager.KEY_ACCOUNT_NAME,
- accountManagerResult.getString(AccountManager.KEY_ACCOUNT_NAME));
- bundle.putString(AccountManager.KEY_ACCOUNT_TYPE,
- accountManagerResult.getString(AccountManager.KEY_ACCOUNT_TYPE));
- setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
- finish();
- return;
- } catch (OperationCanceledException e) {
- setResult(Activity.RESULT_CANCELED);
- finish();
- return;
- } catch (IOException e) {
- } catch (AuthenticatorException e) {
- }
- Bundle bundle = new Bundle();
- bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "error communicating with server");
- setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
- finish();
- }
-
private static class AuthInfo {
final AuthenticatorDescription desc;
final String name;
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
index 852c4dd..8cc2002 100644
--- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -36,6 +36,7 @@
import android.widget.TextView;
import com.android.internal.R;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -44,7 +45,8 @@
/**
* @hide
*/
-public class ChooseTypeAndAccountActivity extends Activity {
+public class ChooseTypeAndAccountActivity extends Activity
+ implements AccountManagerCallback<Bundle> {
private static final String TAG = "AccountManager";
/**
@@ -211,10 +213,9 @@
protected void onActivityResult(final int requestCode, final int resultCode,
final Intent data) {
if (resultCode == RESULT_OK && data != null) {
- String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
- if (accountName != null && accountType != null) {
- setResultAndFinish(accountName, accountType);
+ if (accountType != null) {
+ runAddAccountForAuthenticator(accountType);
return;
}
}
@@ -223,6 +224,43 @@
finish();
}
+ protected void runAddAccountForAuthenticator(String type) {
+ Log.d(TAG, "selected account type " + type);
+ final Bundle options = getIntent().getBundleExtra(
+ ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE);
+ final String[] requiredFeatures = getIntent().getStringArrayExtra(
+ ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY);
+ final String authTokenType = getIntent().getStringExtra(
+ ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING);
+ AccountManager.get(this).addAccount(type, authTokenType, requiredFeatures,
+ options, this, this, null /* Handler */);
+ }
+
+ public void run(final AccountManagerFuture<Bundle> accountManagerFuture) {
+ try {
+ final Bundle accountManagerResult = accountManagerFuture.getResult();
+ final String name = accountManagerResult.getString(AccountManager.KEY_ACCOUNT_NAME);
+ final String type = accountManagerResult.getString(AccountManager.KEY_ACCOUNT_TYPE);
+ if (name != null && type != null) {
+ final Bundle bundle = new Bundle();
+ bundle.putString(AccountManager.KEY_ACCOUNT_NAME, name);
+ bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, type);
+ setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
+ finish();
+ return;
+ }
+ } catch (OperationCanceledException e) {
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ return;
+ } catch (IOException e) {
+ } catch (AuthenticatorException e) {
+ }
+ Bundle bundle = new Bundle();
+ bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "error communicating with server");
+ setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
+ finish();
+ }
private Drawable getDrawableForType(
final HashMap<String, AuthenticatorDescription> typeToAuthDescription,
@@ -266,6 +304,7 @@
private void startChooseAccountTypeActivity() {
final Intent intent = new Intent(this, ChooseAccountTypeActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.putExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY,
getIntent().getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY));
intent.putExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE,
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 7799779..b4471f0 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -1550,6 +1550,13 @@
return true;
}
+ case DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ dismissKeyguardOnNextActivity();
+ reply.writeNoException();
+ return true;
+ }
+
}
return super.onTransact(code, data, reply, flags);
@@ -3504,5 +3511,15 @@
reply.recycle();
}
+ public void dismissKeyguardOnNextActivity() throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ mRemote.transact(DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
+
private IBinder mRemote;
}
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 27dd691..26813bf 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -372,6 +372,8 @@
public void showBootMessage(CharSequence msg, boolean always) throws RemoteException;
+ public void dismissKeyguardOnNextActivity() throws RemoteException;
+
/*
* Private non-Binder interfaces
*/
@@ -602,4 +604,5 @@
int UPDATE_PERSISTENT_CONFIGURATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+135;
int GET_PROCESS_PSS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+136;
int SHOW_BOOT_MESSAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+137;
+ int DISMISS_KEYGUARD_ON_NEXT_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+138;
}
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 254c98f..ea5c3db 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -781,7 +781,7 @@
* Get the current connection state of a profile.
* This function can be used to check whether the local Bluetooth adapter
* is connected to any remote device for a specific profile.
- * Profile can be one of {@link BluetoothProfile#HEADSET},
+ * Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET},
* {@link BluetoothProfile#A2DP}.
*
* <p>Requires {@link android.Manifest.permission#BLUETOOTH}.
@@ -1132,15 +1132,15 @@
/**
* Get the profile proxy object associated with the profile.
*
- * <p>Profile can be one of {@link BluetoothProfile#HEADSET} or
+ * <p>Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET} or
* {@link BluetoothProfile#A2DP}. Clients must implements
* {@link BluetoothProfile.ServiceListener} to get notified of
* the connection status and to get the proxy object.
*
* @param context Context of the application
* @param listener The service Listener for connection callbacks.
- * @param profile The Bluetooth profile; either {@link BluetoothProfile#HEADSET}
- * or {@link BluetoothProfile#A2DP}.
+ * @param profile The Bluetooth profile; either {@link BluetoothProfile#HEALTH},
+ * {@link BluetoothProfile#HEADSET} or {@link BluetoothProfile#A2DP}.
* @return true on success, false on error
*/
public boolean getProfileProxy(Context context, BluetoothProfile.ServiceListener listener,
@@ -1172,7 +1172,7 @@
*
* <p> Clients should call this when they are no longer using
* the proxy obtained from {@link #getProfileProxy}.
- * Profile can be one of {@link BluetoothProfile#HEADSET} or
+ * Profile can be one of {@link BluetoothProfile#HEALTH}, {@link BluetoothProfile#HEADSET} or
* {@link BluetoothProfile#A2DP}
*
* @param profile
diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java
index f7ccfbd..1920efa 100644
--- a/core/java/android/bluetooth/BluetoothProfile.java
+++ b/core/java/android/bluetooth/BluetoothProfile.java
@@ -161,9 +161,9 @@
/**
* Called to notify the client when the proxy object has been
* connected to the service.
- * @param profile - One of {@link #HEADSET} or
+ * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or
* {@link #A2DP}
- * @param proxy - One of {@link BluetoothHeadset} or
+ * @param proxy - One of {@link BluetoothHealth}, {@link BluetoothHeadset} or
* {@link BluetoothA2dp}
*/
public void onServiceConnected(int profile, BluetoothProfile proxy);
@@ -171,7 +171,7 @@
/**
* Called to notify the client that this proxy object has been
* disconnected from the service.
- * @param profile - One of {@link #HEADSET} or
+ * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or
* {@link #A2DP}
*/
public void onServiceDisconnected(int profile);
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 72cf26a..f44d038 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -5577,24 +5577,35 @@
@Override
public String toString() {
- StringBuilder b = new StringBuilder(128);
+ StringBuilder b = new StringBuilder(128);
b.append("Intent { ");
- toShortString(b, true, true);
+ toShortString(b, true, true, true);
b.append(" }");
return b.toString();
}
/** @hide */
- public String toShortString(boolean comp, boolean extras) {
- StringBuilder b = new StringBuilder(128);
- toShortString(b, comp, extras);
+ public String toInsecureString() {
+ StringBuilder b = new StringBuilder(128);
+
+ b.append("Intent { ");
+ toShortString(b, false, true, true);
+ b.append(" }");
+
return b.toString();
}
/** @hide */
- public void toShortString(StringBuilder b, boolean comp, boolean extras) {
+ public String toShortString(boolean secure, boolean comp, boolean extras) {
+ StringBuilder b = new StringBuilder(128);
+ toShortString(b, secure, comp, extras);
+ return b.toString();
+ }
+
+ /** @hide */
+ public void toShortString(StringBuilder b, boolean secure, boolean comp, boolean extras) {
boolean first = true;
if (mAction != null) {
b.append("act=").append(mAction);
@@ -5621,19 +5632,8 @@
}
first = false;
b.append("dat=");
- String scheme = mData.getScheme();
- if (scheme != null) {
- if (scheme.equalsIgnoreCase("tel")) {
- b.append("tel:xxx-xxx-xxxx");
- } else if (scheme.equalsIgnoreCase("sip")) {
- b.append("sip:xxxxxxxxxx");
- } else if (scheme.equalsIgnoreCase("sms")) {
- b.append("sms:xxx-xxx-xxxx");
- } else if (scheme.equalsIgnoreCase("smsto")) {
- b.append("smsto:xxx-xxx-xxxx");
- } else {
- b.append(mData);
- }
+ if (secure) {
+ b.append(mData.toSafeString());
} else {
b.append(mData);
}
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 684c4fe..127efa2 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -16,6 +16,26 @@
package android.content;
+import com.android.internal.R;
+import com.android.internal.util.ArrayUtils;
+import com.google.android.collect.Lists;
+import com.google.android.collect.Maps;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.OnAccountsUpdateListener;
+import android.app.AlarmManager;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.RegisteredServicesCache;
+import android.content.pm.RegisteredServicesCacheListener;
+import android.content.pm.ResolveInfo;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -27,27 +47,6 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemProperties;
-import com.google.android.collect.Lists;
-import com.google.android.collect.Maps;
-
-import com.android.internal.R;
-import com.android.internal.util.ArrayUtils;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.OnAccountsUpdateListener;
-import android.app.AlarmManager;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.RegisteredServicesCache;
-import android.content.pm.ProviderInfo;
-import android.content.pm.RegisteredServicesCacheListener;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
import android.os.WorkSource;
import android.provider.Settings;
import android.text.format.DateUtils;
@@ -59,12 +58,15 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
@@ -1006,9 +1008,8 @@
}
protected void dump(FileDescriptor fd, PrintWriter pw) {
- StringBuilder sb = new StringBuilder();
- dumpSyncState(pw, sb);
- dumpSyncHistory(pw, sb);
+ dumpSyncState(pw);
+ dumpSyncHistory(pw);
pw.println();
pw.println("SyncAdapters:");
@@ -1023,7 +1024,7 @@
return tobj.format("%Y-%m-%d %H:%M:%S");
}
- protected void dumpSyncState(PrintWriter pw, StringBuilder sb) {
+ protected void dumpSyncState(PrintWriter pw) {
pw.print("data connected: "); pw.println(mDataConnectionIsConnected);
pw.print("memory low: "); pw.println(mStorageIsLow);
@@ -1055,7 +1056,7 @@
}
pw.print("notification info: ");
- sb.setLength(0);
+ final StringBuilder sb = new StringBuilder();
mSyncHandler.mSyncNotificationInfo.toString(sb);
pw.println(sb.toString());
@@ -1204,7 +1205,197 @@
pw.println(")");
}
- protected void dumpSyncHistory(PrintWriter pw, StringBuilder sb) {
+ protected void dumpSyncHistory(PrintWriter pw) {
+ dumpRecentHistory(pw);
+ dumpDayStatistics(pw);
+ }
+
+ private void dumpRecentHistory(PrintWriter pw) {
+ final ArrayList<SyncStorageEngine.SyncHistoryItem> items
+ = mSyncStorageEngine.getSyncHistory();
+ if (items != null && items.size() > 0) {
+ final Map<String, AuthoritySyncStats> authorityMap = Maps.newHashMap();
+ long totalElapsedTime = 0;
+ long totalTimes = 0;
+ final int N = items.size();
+
+ int maxAuthority = 0;
+ int maxAccount = 0;
+ for (SyncStorageEngine.SyncHistoryItem item : items) {
+ SyncStorageEngine.AuthorityInfo authority
+ = mSyncStorageEngine.getAuthority(item.authorityId);
+ final String authorityName;
+ final String accountKey;
+ if (authority != null) {
+ authorityName = authority.authority;
+ accountKey = authority.account.name + "/" + authority.account.type;
+ } else {
+ authorityName = "Unknown";
+ accountKey = "Unknown";
+ }
+
+ int length = authorityName.length();
+ if (length > maxAuthority) {
+ maxAuthority = length;
+ }
+ length = accountKey.length();
+ if (length > maxAccount) {
+ maxAccount = length;
+ }
+
+ final long elapsedTime = item.elapsedTime;
+ totalElapsedTime += elapsedTime;
+ totalTimes++;
+ AuthoritySyncStats authoritySyncStats = authorityMap.get(authorityName);
+ if (authoritySyncStats == null) {
+ authoritySyncStats = new AuthoritySyncStats(authorityName);
+ authorityMap.put(authorityName, authoritySyncStats);
+ }
+ authoritySyncStats.elapsedTime += elapsedTime;
+ authoritySyncStats.times++;
+ final Map<String, AccountSyncStats> accountMap = authoritySyncStats.accountMap;
+ AccountSyncStats accountSyncStats = accountMap.get(accountKey);
+ if (accountSyncStats == null) {
+ accountSyncStats = new AccountSyncStats(accountKey);
+ accountMap.put(accountKey, accountSyncStats);
+ }
+ accountSyncStats.elapsedTime += elapsedTime;
+ accountSyncStats.times++;
+
+ }
+
+ pw.println();
+ pw.printf("Detailed Statistics (Recent history): %d (# of times) %ds (sync time)\n",
+ totalTimes, totalElapsedTime / 1000);
+
+ final List<AuthoritySyncStats> sortedAuthorities =
+ new ArrayList<AuthoritySyncStats>(authorityMap.values());
+ Collections.sort(sortedAuthorities, new Comparator<AuthoritySyncStats>() {
+ @Override
+ public int compare(AuthoritySyncStats lhs, AuthoritySyncStats rhs) {
+ // reverse order
+ int compare = Integer.compare(rhs.times, lhs.times);
+ if (compare == 0) {
+ compare = Long.compare(rhs.elapsedTime, lhs.elapsedTime);
+ }
+ return compare;
+ }
+ });
+
+ final int maxLength = Math.max(maxAuthority, maxAccount + 3);
+ final int padLength = 2 + 2 + maxLength + 2 + 10 + 11;
+ final char chars[] = new char[padLength];
+ Arrays.fill(chars, '-');
+ final String separator = new String(chars);
+
+ final String authorityFormat = String.format(" %%-%ds: %%-9s %%-11s\n", maxLength + 2);
+ final String accountFormat = String.format(" %%-%ds: %%-9s %%-11s\n", maxLength);
+
+ pw.println(separator);
+ for (AuthoritySyncStats authoritySyncStats : sortedAuthorities) {
+ String name = authoritySyncStats.name;
+ long elapsedTime;
+ int times;
+ String timeStr;
+ String timesStr;
+
+ elapsedTime = authoritySyncStats.elapsedTime;
+ times = authoritySyncStats.times;
+ timeStr = String.format("%d/%d%%",
+ elapsedTime / 1000,
+ elapsedTime * 100 / totalElapsedTime);
+ timesStr = String.format("%d/%d%%",
+ times,
+ times * 100 / totalTimes);
+ pw.printf(authorityFormat, name, timesStr, timeStr);
+
+ if (authoritySyncStats.accountMap.size() > 1) {
+ final List<AccountSyncStats> sortedAccounts =
+ new ArrayList<AccountSyncStats>(
+ authoritySyncStats.accountMap.values());
+ Collections.sort(sortedAccounts, new Comparator<AccountSyncStats>() {
+ @Override
+ public int compare(AccountSyncStats lhs, AccountSyncStats rhs) {
+ // reverse order
+ int compare = Integer.compare(rhs.times, lhs.times);
+ if (compare == 0) {
+ compare = Long.compare(rhs.elapsedTime, lhs.elapsedTime);
+ }
+ return compare;
+ }
+ });
+ for (AccountSyncStats stats: sortedAccounts) {
+ elapsedTime = stats.elapsedTime;
+ times = stats.times;
+ timeStr = String.format("%d/%d%%",
+ elapsedTime / 1000,
+ elapsedTime * 100 / totalElapsedTime);
+ timesStr = String.format("%d/%d%%",
+ times,
+ times * 100 / totalTimes);
+ pw.printf(accountFormat, stats.name, timesStr, timeStr);
+ }
+ }
+ pw.println(separator);
+ }
+
+ pw.println();
+ pw.println("Recent Sync History");
+ final String format = " %-" + maxAccount + "s %s\n";
+ String lastAuthorityName = null;
+ String lastAccountKey = null;
+ long lastEventTime = 0;
+ for (int i = 0; i < N; i++) {
+ SyncStorageEngine.SyncHistoryItem item = items.get(i);
+ SyncStorageEngine.AuthorityInfo authority
+ = mSyncStorageEngine.getAuthority(item.authorityId);
+ final String authorityName;
+ final String accountKey;
+ if (authority != null) {
+ authorityName = authority.authority;
+ accountKey = authority.account.name + "/" + authority.account.type;
+ } else {
+ authorityName = "Unknown";
+ accountKey = "Unknown";
+ }
+ final long elapsedTime = item.elapsedTime;
+ final Time time = new Time();
+ final long eventTime = item.eventTime;
+ time.set(eventTime);
+
+ pw.printf(" #%-3d: %s %8s %5.1fs",
+ i + 1,
+ formatTime(eventTime),
+ SyncStorageEngine.SOURCES[item.source],
+ ((float) elapsedTime) / 1000);
+ if (authorityName.equals(lastAuthorityName) && accountKey.equals(lastAccountKey)) {
+ final long span = (lastEventTime - eventTime) / 1000;
+ pw.printf(" %02d:%02d\n", span / 60, span % 60);
+ } else {
+ pw.printf(format, accountKey, authorityName);
+ }
+
+ lastAuthorityName = authorityName;
+ lastAccountKey = accountKey;
+ lastEventTime = eventTime;
+
+ if (item.event != SyncStorageEngine.EVENT_STOP
+ || item.upstreamActivity != 0
+ || item.downstreamActivity != 0) {
+ pw.printf(" event=%d upstreamActivity=%d downstreamActivity=%d\n",
+ item.event,
+ item.upstreamActivity,
+ item.downstreamActivity);
+ }
+ if (item.mesg != null
+ && !SyncStorageEngine.MESG_SUCCESS.equals(item.mesg)) {
+ pw.printf(" mesg=%s\n", item.mesg);
+ }
+ }
+ }
+ }
+
+ private void dumpDayStatistics(PrintWriter pw) {
SyncStorageEngine.DayStats dses[] = mSyncStorageEngine.getDayStatistics();
if (dses != null && dses[0] != null) {
pw.println();
@@ -1254,47 +1445,26 @@
}
}
}
+ }
- ArrayList<SyncStorageEngine.SyncHistoryItem> items
- = mSyncStorageEngine.getSyncHistory();
- if (items != null && items.size() > 0) {
- pw.println();
- pw.println("Recent Sync History");
- final int N = items.size();
- for (int i=0; i<N; i++) {
- SyncStorageEngine.SyncHistoryItem item = items.get(i);
- SyncStorageEngine.AuthorityInfo authority
- = mSyncStorageEngine.getAuthority(item.authorityId);
- pw.print(" #"); pw.print(i+1); pw.print(": ");
- if (authority != null) {
- pw.print(authority.account.name);
- pw.print(":");
- pw.print(authority.account.type);
- pw.print(" ");
- pw.print(authority.authority);
- } else {
- pw.print("<no account>");
- }
- Time time = new Time();
- time.set(item.eventTime);
- pw.print(" "); pw.print(SyncStorageEngine.SOURCES[item.source]);
- pw.print(" @ ");
- pw.print(formatTime(item.eventTime));
- pw.print(" for ");
- dumpTimeSec(pw, item.elapsedTime);
- pw.println();
- if (item.event != SyncStorageEngine.EVENT_STOP
- || item.upstreamActivity !=0
- || item.downstreamActivity != 0) {
- pw.print(" event="); pw.print(item.event);
- pw.print(" upstreamActivity="); pw.print(item.upstreamActivity);
- pw.print(" downstreamActivity="); pw.println(item.downstreamActivity);
- }
- if (item.mesg != null
- && !SyncStorageEngine.MESG_SUCCESS.equals(item.mesg)) {
- pw.print(" mesg="); pw.println(item.mesg);
- }
- }
+ private static class AuthoritySyncStats {
+ String name;
+ long elapsedTime;
+ int times;
+ Map<String, AccountSyncStats> accountMap = Maps.newHashMap();
+
+ private AuthoritySyncStats(String name) {
+ this.name = name;
+ }
+ }
+
+ private static class AccountSyncStats {
+ String name;
+ long elapsedTime;
+ int times;
+
+ private AccountSyncStats(String name) {
+ this.name = name;
}
}
diff --git a/core/java/android/content/pm/PackageInfoLite.java b/core/java/android/content/pm/PackageInfoLite.java
index da97fde0..9625944 100644
--- a/core/java/android/content/pm/PackageInfoLite.java
+++ b/core/java/android/content/pm/PackageInfoLite.java
@@ -41,6 +41,8 @@
public int recommendedInstallLocation;
public int installLocation;
+ public VerifierInfo[] verifiers;
+
public PackageInfoLite() {
}
@@ -58,6 +60,13 @@
dest.writeString(packageName);
dest.writeInt(recommendedInstallLocation);
dest.writeInt(installLocation);
+
+ if (verifiers == null || verifiers.length == 0) {
+ dest.writeInt(0);
+ } else {
+ dest.writeInt(verifiers.length);
+ dest.writeTypedArray(verifiers, parcelableFlags);
+ }
}
public static final Parcelable.Creator<PackageInfoLite> CREATOR
@@ -75,5 +84,13 @@
packageName = source.readString();
recommendedInstallLocation = source.readInt();
installLocation = source.readInt();
+
+ final int verifiersLength = source.readInt();
+ if (verifiersLength == 0) {
+ verifiers = new VerifierInfo[0];
+ } else {
+ verifiers = new VerifierInfo[verifiersLength];
+ source.readTypedArray(verifiers, VerifierInfo.CREATOR);
+ }
}
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index ef7e233..7a7e4f4 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -725,6 +725,16 @@
public static final int MOVE_EXTERNAL_MEDIA = 0x00000002;
/**
+ * Usable by the required verifier as the {@code verificationCode} argument
+ * for {@link PackageManager#verifyPendingInstall} to indicate that it will
+ * allow the installation to proceed without any of the optional verifiers
+ * needing to vote.
+ *
+ * @hide
+ */
+ public static final int VERIFICATION_ALLOW_WITHOUT_SUFFICIENT = 2;
+
+ /**
* Used as the {@code verificationCode} argument for
* {@link PackageManager#verifyPendingInstall} to indicate that the calling
* package verifier allows the installation to proceed.
@@ -2527,6 +2537,7 @@
* {@link #COMPONENT_ENABLED_STATE_DEFAULT}. The last one means the
* application's enabled state is based on the original information in
* the manifest as found in {@link ComponentInfo}.
+ * @throws IllegalArgumentException if the named package does not exist.
*/
public abstract int getApplicationEnabledSetting(String packageName);
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index e7b844c..c30675b 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -28,7 +28,9 @@
import android.os.Bundle;
import android.os.PatternMatcher;
import android.util.AttributeSet;
+import android.util.Base64;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.util.Slog;
import android.util.TypedValue;
import com.android.internal.util.XmlUtils;
@@ -40,11 +42,18 @@
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
+import java.security.spec.EncodedKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
+import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -150,12 +159,14 @@
* @hide
*/
public static class PackageLite {
- public String packageName;
- public int installLocation;
- public String mScanPath;
- public PackageLite(String packageName, int installLocation) {
+ public final String packageName;
+ public final int installLocation;
+ public final VerifierInfo[] verifiers;
+
+ public PackageLite(String packageName, int installLocation, List<VerifierInfo> verifiers) {
this.packageName = packageName;
this.installLocation = installLocation;
+ this.verifiers = verifiers.toArray(new VerifierInfo[verifiers.size()]);
}
}
@@ -619,8 +630,9 @@
* @return PackageLite object with package information or null on failure.
*/
public static PackageLite parsePackageLite(String packageFilePath, int flags) {
- XmlResourceParser parser = null;
AssetManager assmgr = null;
+ final XmlResourceParser parser;
+ final Resources res;
try {
assmgr = new AssetManager();
assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -631,6 +643,9 @@
return null;
}
+ final DisplayMetrics metrics = new DisplayMetrics();
+ metrics.setToDefaults();
+ res = new Resources(assmgr, metrics, null);
parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME);
} catch (Exception e) {
if (assmgr != null) assmgr.close();
@@ -638,11 +653,12 @@
+ packageFilePath, e);
return null;
}
- AttributeSet attrs = parser;
- String errors[] = new String[1];
+
+ final AttributeSet attrs = parser;
+ final String errors[] = new String[1];
PackageLite packageLite = null;
try {
- packageLite = parsePackageLite(parser, attrs, flags, errors);
+ packageLite = parsePackageLite(res, parser, attrs, flags, errors);
} catch (IOException e) {
Slog.w(TAG, packageFilePath, e);
} catch (XmlPullParserException e) {
@@ -719,9 +735,9 @@
return pkgName.intern();
}
- private static PackageLite parsePackageLite(XmlPullParser parser,
- AttributeSet attrs, int flags, String[] outError)
- throws IOException, XmlPullParserException {
+ private static PackageLite parsePackageLite(Resources res, XmlPullParser parser,
+ AttributeSet attrs, int flags, String[] outError) throws IOException,
+ XmlPullParserException {
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG
@@ -759,7 +775,26 @@
break;
}
}
- return new PackageLite(pkgName.intern(), installLocation);
+
+ // Only search the tree when the tag is directly below <manifest>
+ final int searchDepth = parser.getDepth() + 1;
+
+ final List<VerifierInfo> verifiers = new ArrayList<VerifierInfo>();
+ while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+ && (type != XmlPullParser.END_TAG || parser.getDepth() >= searchDepth)) {
+ if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+ continue;
+ }
+
+ if (parser.getDepth() == searchDepth && "package-verifier".equals(parser.getName())) {
+ final VerifierInfo verifier = parseVerifier(res, parser, attrs, flags, outError);
+ if (verifier != null) {
+ verifiers.add(verifier);
+ }
+ }
+ }
+
+ return new PackageLite(pkgName.intern(), installLocation, verifiers);
}
/**
@@ -2691,6 +2726,63 @@
return data;
}
+ private static VerifierInfo parseVerifier(Resources res, XmlPullParser parser,
+ AttributeSet attrs, int flags, String[] outError) throws XmlPullParserException,
+ IOException {
+ final TypedArray sa = res.obtainAttributes(attrs,
+ com.android.internal.R.styleable.AndroidManifestPackageVerifier);
+
+ final String packageName = sa.getNonResourceString(
+ com.android.internal.R.styleable.AndroidManifestPackageVerifier_name);
+
+ final String encodedPublicKey = sa.getNonResourceString(
+ com.android.internal.R.styleable.AndroidManifestPackageVerifier_publicKey);
+
+ sa.recycle();
+
+ if (packageName == null || packageName.length() == 0) {
+ Slog.i(TAG, "verifier package name was null; skipping");
+ return null;
+ } else if (encodedPublicKey == null) {
+ Slog.i(TAG, "verifier " + packageName + " public key was null; skipping");
+ }
+
+ EncodedKeySpec keySpec;
+ try {
+ final byte[] encoded = Base64.decode(encodedPublicKey, Base64.DEFAULT);
+ keySpec = new X509EncodedKeySpec(encoded);
+ } catch (IllegalArgumentException e) {
+ Slog.i(TAG, "Could not parse verifier " + packageName + " public key; invalid Base64");
+ return null;
+ }
+
+ /* First try the key as an RSA key. */
+ try {
+ final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+ final PublicKey publicKey = keyFactory.generatePublic(keySpec);
+ return new VerifierInfo(packageName, publicKey);
+ } catch (NoSuchAlgorithmException e) {
+ Log.wtf(TAG, "Could not parse public key because RSA isn't included in build");
+ return null;
+ } catch (InvalidKeySpecException e) {
+ // Not a RSA public key.
+ }
+
+ /* Now try it as a DSA key. */
+ try {
+ final KeyFactory keyFactory = KeyFactory.getInstance("DSA");
+ final PublicKey publicKey = keyFactory.generatePublic(keySpec);
+ return new VerifierInfo(packageName, publicKey);
+ } catch (NoSuchAlgorithmException e) {
+ Log.wtf(TAG, "Could not parse public key because DSA isn't included in build");
+ return null;
+ } catch (InvalidKeySpecException e) {
+ // Not a DSA public key.
+ }
+
+ return null;
+ }
+
private static final String ANDROID_RESOURCES
= "http://schemas.android.com/apk/res/android";
diff --git a/core/java/android/content/pm/Signature.java b/core/java/android/content/pm/Signature.java
index c6aefb8..9c9340d 100644
--- a/core/java/android/content/pm/Signature.java
+++ b/core/java/android/content/pm/Signature.java
@@ -19,7 +19,12 @@
import android.os.Parcel;
import android.os.Parcelable;
+import java.io.ByteArrayInputStream;
import java.lang.ref.SoftReference;
+import java.security.PublicKey;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
import java.util.Arrays;
/**
@@ -135,6 +140,20 @@
return bytes;
}
+ /**
+ * Returns the public key for this signature.
+ *
+ * @throws CertificateException when Signature isn't a valid X.509
+ * certificate; shouldn't happen.
+ * @hide
+ */
+ public PublicKey getPublicKey() throws CertificateException {
+ final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ final ByteArrayInputStream bais = new ByteArrayInputStream(mSignature);
+ final Certificate cert = certFactory.generateCertificate(bais);
+ return cert.getPublicKey();
+ }
+
@Override
public boolean equals(Object obj) {
try {
diff --git a/core/java/android/content/pm/VerifierInfo.aidl b/core/java/android/content/pm/VerifierInfo.aidl
new file mode 100644
index 0000000..7702d38
--- /dev/null
+++ b/core/java/android/content/pm/VerifierInfo.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2011, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+parcelable VerifierInfo;
diff --git a/core/java/android/content/pm/VerifierInfo.java b/core/java/android/content/pm/VerifierInfo.java
new file mode 100644
index 0000000..0a2b283
--- /dev/null
+++ b/core/java/android/content/pm/VerifierInfo.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.security.PublicKey;
+
+/**
+ * Contains information about a package verifier as used by
+ * {@code PackageManagerService} during package verification.
+ *
+ * @hide
+ */
+public class VerifierInfo implements Parcelable {
+ /** Package name of the verifier. */
+ public final String packageName;
+
+ /** Signatures used to sign the package verifier's package. */
+ public final PublicKey publicKey;
+
+ /**
+ * Creates an object that represents a verifier info object.
+ *
+ * @param packageName the package name in Java-style. Must not be {@code
+ * null} or empty.
+ * @param publicKey the public key for the signer encoded in Base64. Must
+ * not be {@code null} or empty.
+ * @throws IllegalArgumentException if either argument is null or empty.
+ */
+ public VerifierInfo(String packageName, PublicKey publicKey) {
+ if (packageName == null || packageName.length() == 0) {
+ throw new IllegalArgumentException("packageName must not be null or empty");
+ } else if (publicKey == null) {
+ throw new IllegalArgumentException("publicKey must not be null");
+ }
+
+ this.packageName = packageName;
+ this.publicKey = publicKey;
+ }
+
+ private VerifierInfo(Parcel source) {
+ packageName = source.readString();
+ publicKey = (PublicKey) source.readSerializable();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(packageName);
+ dest.writeSerializable(publicKey);
+ }
+
+ public static final Parcelable.Creator<VerifierInfo> CREATOR
+ = new Parcelable.Creator<VerifierInfo>() {
+ public VerifierInfo createFromParcel(Parcel source) {
+ return new VerifierInfo(source);
+ }
+
+ public VerifierInfo[] newArray(int size) {
+ return new VerifierInfo[size];
+ }
+ };
+}
\ No newline at end of file
diff --git a/core/java/android/net/DnsPinger.java b/core/java/android/net/DnsPinger.java
index 3e27b0d..3291e6b 100644
--- a/core/java/android/net/DnsPinger.java
+++ b/core/java/android/net/DnsPinger.java
@@ -53,7 +53,7 @@
public final class DnsPinger extends Handler {
private static final boolean V = true;
- private static final int RECEIVE_POLL_INTERVAL_MS = 30;
+ private static final int RECEIVE_POLL_INTERVAL_MS = 200;
private static final int DNS_PORT = 53;
/** Short socket timeout so we don't block one any 'receive' call */
@@ -70,6 +70,9 @@
private final ArrayList<InetAddress> mDefaultDns;
private String TAG;
+ //Invalidates old dns requests upon a cancel
+ private AtomicInteger mCurrentToken = new AtomicInteger();
+
private static final int BASE = Protocol.BASE_DNS_PINGER;
/**
@@ -102,6 +105,17 @@
long start = SystemClock.elapsedRealtime();
}
+ /* Message argument for ACTION_PING_DNS */
+ private class DnsArg {
+ InetAddress dns;
+ int seq;
+
+ DnsArg(InetAddress d, int s) {
+ dns = d;
+ seq = s;
+ }
+ }
+
public DnsPinger(Context context, String TAG, Looper looper,
Handler target, int connectionType) {
super(looper);
@@ -122,9 +136,13 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case ACTION_PING_DNS:
+ DnsArg dnsArg = (DnsArg) msg.obj;
+ if (dnsArg.seq != mCurrentToken.get()) {
+ break;
+ }
try {
ActivePing newActivePing = new ActivePing();
- InetAddress dnsAddress = (InetAddress) msg.obj;
+ InetAddress dnsAddress = dnsArg.dns;
newActivePing.internalId = msg.arg1;
newActivePing.timeout = msg.arg2;
newActivePing.socket = new DatagramSocket();
@@ -248,11 +266,13 @@
*/
public int pingDnsAsync(InetAddress dns, int timeout, int delay) {
int id = sCounter.incrementAndGet();
- sendMessageDelayed(obtainMessage(ACTION_PING_DNS, id, timeout, dns), delay);
+ sendMessageDelayed(obtainMessage(ACTION_PING_DNS, id, timeout,
+ new DnsArg(dns, mCurrentToken.get())), delay);
return id;
}
public void cancelPings() {
+ mCurrentToken.incrementAndGet();
obtainMessage(ACTION_CANCEL_ALL_PINGS).sendToTarget();
}
diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java
index a5cdf70..a6635be 100644
--- a/core/java/android/net/NetworkStatsHistory.java
+++ b/core/java/android/net/NetworkStatsHistory.java
@@ -270,6 +270,11 @@
|| entry.operations < 0) {
throw new IllegalArgumentException("tried recording negative data");
}
+ if (entry.rxBytes == 0 && entry.rxPackets == 0 && entry.txBytes == 0 && entry.txPackets == 0
+ && entry.operations == 0) {
+ // nothing to record; skip
+ return;
+ }
// create any buckets needed by this range
ensureBuckets(start, end);
diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java
index cd49023..418b82f 100644
--- a/core/java/android/net/NetworkTemplate.java
+++ b/core/java/android/net/NetworkTemplate.java
@@ -19,14 +19,15 @@
import static android.net.ConnectivityManager.TYPE_ETHERNET;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIMAX;
-import static android.net.ConnectivityManager.isNetworkTypeMobile;
import static android.net.NetworkIdentity.scrubSubscriberId;
import static android.telephony.TelephonyManager.NETWORK_CLASS_2_G;
import static android.telephony.TelephonyManager.NETWORK_CLASS_3_G;
import static android.telephony.TelephonyManager.NETWORK_CLASS_4_G;
import static android.telephony.TelephonyManager.NETWORK_CLASS_UNKNOWN;
import static android.telephony.TelephonyManager.getNetworkClass;
+import static com.android.internal.util.ArrayUtils.contains;
+import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
@@ -52,6 +53,16 @@
public static final int MATCH_ETHERNET = 5;
/**
+ * Set of {@link NetworkInfo#getType()} that reflect data usage.
+ */
+ private static final int[] DATA_USAGE_NETWORK_TYPES;
+
+ static {
+ DATA_USAGE_NETWORK_TYPES = Resources.getSystem().getIntArray(
+ com.android.internal.R.array.config_data_usage_network_types);
+ }
+
+ /**
* Template to combine all {@link ConnectivityManager#TYPE_MOBILE} style
* networks together. Only uses statistics for requested IMSI.
*/
@@ -151,7 +162,7 @@
}
/**
- * Test if this network matches the given template and IMSI.
+ * Test if given {@link NetworkIdentity} matches this template.
*/
public boolean matches(NetworkIdentity ident) {
switch (mMatchRule) {
@@ -171,23 +182,25 @@
}
/**
- * Check if mobile network with matching IMSI. Also matches
- * {@link #TYPE_WIMAX}.
+ * Check if mobile network with matching IMSI.
*/
private boolean matchesMobile(NetworkIdentity ident) {
- if (isNetworkTypeMobile(ident.mType) && Objects.equal(mSubscriberId, ident.mSubscriberId)) {
+ if (ident.mType == TYPE_WIMAX) {
+ // TODO: consider matching against WiMAX subscriber identity
return true;
- } else if (ident.mType == TYPE_WIMAX) {
- return true;
+ } else {
+ return (contains(DATA_USAGE_NETWORK_TYPES, ident.mType)
+ && Objects.equal(mSubscriberId, ident.mSubscriberId));
}
- return false;
}
/**
* Check if mobile network classified 3G or lower with matching IMSI.
*/
private boolean matchesMobile3gLower(NetworkIdentity ident) {
- if (isNetworkTypeMobile(ident.mType) && Objects.equal(mSubscriberId, ident.mSubscriberId)) {
+ if (ident.mType == TYPE_WIMAX) {
+ return false;
+ } else if (matchesMobile(ident)) {
switch (getNetworkClass(ident.mSubType)) {
case NETWORK_CLASS_UNKNOWN:
case NETWORK_CLASS_2_G:
@@ -199,17 +212,17 @@
}
/**
- * Check if mobile network classified 4G with matching IMSI. Also matches
- * {@link #TYPE_WIMAX}.
+ * Check if mobile network classified 4G with matching IMSI.
*/
private boolean matchesMobile4g(NetworkIdentity ident) {
- if (isNetworkTypeMobile(ident.mType) && Objects.equal(mSubscriberId, ident.mSubscriberId)) {
+ if (ident.mType == TYPE_WIMAX) {
+ // TODO: consider matching against WiMAX subscriber identity
+ return true;
+ } else if (matchesMobile(ident)) {
switch (getNetworkClass(ident.mSubType)) {
case NETWORK_CLASS_4_G:
return true;
}
- } else if (ident.mType == TYPE_WIMAX) {
- return true;
}
return false;
}
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 2c875c8..9d28eff 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -353,6 +353,48 @@
public abstract String toString();
/**
+ * Return a string representation of the URI that is safe to print
+ * to logs and other places where PII should be avoided.
+ * @hide
+ */
+ public String toSafeString() {
+ String scheme = getScheme();
+ String ssp = getSchemeSpecificPart();
+ if (scheme != null) {
+ if (scheme.equalsIgnoreCase("tel") || scheme.equalsIgnoreCase("sip")
+ || scheme.equalsIgnoreCase("sms") || scheme.equalsIgnoreCase("smsto")
+ || scheme.equalsIgnoreCase("mailto")) {
+ StringBuilder builder = new StringBuilder(64);
+ builder.append(scheme);
+ builder.append(':');
+ if (ssp != null) {
+ for (int i=0; i<ssp.length(); i++) {
+ char c = ssp.charAt(i);
+ if (c == '-' || c == '@' || c == '.') {
+ builder.append(c);
+ } else {
+ builder.append('x');
+ }
+ }
+ }
+ return builder.toString();
+ }
+ }
+ // Not a sensitive scheme, but let's still be conservative about
+ // the data we include -- only the ssp, not the query params or
+ // fragment, because those can often have sensitive info.
+ StringBuilder builder = new StringBuilder(64);
+ if (scheme != null) {
+ builder.append(scheme);
+ builder.append(':');
+ }
+ if (ssp != null) {
+ builder.append(ssp);
+ }
+ return builder.toString();
+ }
+
+ /**
* Constructs a new builder, copying the attributes from this Uri.
*/
public abstract Builder buildUpon();
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index e392bca..fe0106d 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -208,7 +208,9 @@
final NfcActivityManager mNfcActivityManager;
/**
- * @see {@link #setNdefPushMessageCallback}
+ * A callback to be invoked when the system successfully delivers your {@link NdefMessage}
+ * to another device.
+ * @see #setOnNdefPushCompleteCallback
*/
public interface OnNdefPushCompleteCallback {
/**
@@ -217,13 +219,21 @@
* <p>This callback is usually made on a binder thread (not the UI thread).
*
* @param event {@link NfcEvent} with the {@link NfcEvent#nfcAdapter} field set
- * @see {@link #setNdefPushMessageCallback}
+ * @see #setNdefPushMessageCallback
*/
public void onNdefPushComplete(NfcEvent event);
}
/**
- * @see {@link #setCeateNdefMessageCallback}
+ * A callback to be invoked when another NFC device capable of NDEF push (Android Beam)
+ * is within range.
+ * <p>Implement this interface and pass it to {@link
+ * NfcAdapter#setNdefPushMessageCallback setNdefPushMessageCallback()} in order to create an
+ * {@link NdefMessage} at the moment that another device is within range for NFC. Using this
+ * callback allows you to create a message with data that might vary based on the
+ * content currently visible to the user. Alternatively, you can call {@link
+ * #setNdefPushMessage setNdefPushMessage()} if the {@link NdefMessage} always contains the
+ * same data.
*/
public interface CreateNdefMessageCallback {
/**
@@ -507,13 +517,15 @@
* <p>Pass a null NDEF message to disable foreground NDEF push in the
* specified activities.
*
- * <p>One or more activities must be specified.
+ * <p>At least one activity must be specified, and usually only one is necessary.
*
* <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
*
* @param message NDEF message to push over NFC, or null to disable
- * @param activity an activity to enable for NDEF push (at least one is required)
- * @param activities zero or more additional activities to enable for NDEF Push
+ * @param activity an activity in which NDEF push should be enabled to share the provided
+ * NDEF message
+ * @param activities optional additional activities that should also enable NDEF push with
+ * the provided NDEF message
*/
public void setNdefPushMessage(NdefMessage message, Activity activity,
Activity ... activities) {
@@ -544,13 +556,15 @@
* <p>Pass a null callback to disable the callback in the
* specified activities.
*
- * <p>One or more activities must be specified.
+ * <p>At least one activity must be specified, and usually only one is necessary.
*
* <p class="note">Requires the {@link android.Manifest.permission#NFC} permission.
*
* @param callback callback, or null to disable
- * @param activity an activity to enable for NDEF push (at least one is required)
- * @param activities zero or more additional activities to enable for NDEF Push
+ * @param activity an activity in which NDEF push should be enabled to share an NDEF message
+ * that's retrieved from the provided callback
+ * @param activities optional additional activities that should also enable NDEF push using
+ * the provided callback
*/
public void setNdefPushMessageCallback(CreateNdefMessageCallback callback, Activity activity,
Activity ... activities) {
diff --git a/core/java/android/nfc/NfcEvent.java b/core/java/android/nfc/NfcEvent.java
index b00d8b7..860700a 100644
--- a/core/java/android/nfc/NfcEvent.java
+++ b/core/java/android/nfc/NfcEvent.java
@@ -29,8 +29,8 @@
* in the callback) because it allows new fields to be added without breaking
* API compatibility.
*
- * @see {@link NfcAdapter.OnNdefPushCompleteCallback#onNdefPushComplete}
- * @see {@link NfcAdapter.CreateNdefMessageCallback#createNdefMessage}
+ * @see NfcAdapter.OnNdefPushCompleteCallback#onNdefPushComplete
+ * @see NfcAdapter.CreateNdefMessageCallback#createNdefMessage
*/
public final class NfcEvent {
/**
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index ca1d0d9..fb119b3 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -2983,8 +2983,9 @@
* long streamItemId = ContentUris.parseId(streamItemUri);
* </pre>
* </dd>
- * <dt>Via the {@link StreamItems#CONTENT_URI} URI:</dt>
+ * <dt>Via {@link StreamItems#CONTENT_URI}:</dt>
* <dd>
+ *<pre>
* ContentValues values = new ContentValues();
* values.put(StreamItems.RAW_CONTACT_ID, rawContactId);
* values.put(StreamItems.TEXT, "Breakfasted at Tiffanys");
@@ -2992,6 +2993,7 @@
* values.put(StreamItems.COMMENTS, "3 people reshared this");
* Uri streamItemUri = getContentResolver().insert(StreamItems.CONTENT_URI, values);
* long streamItemId = ContentUris.parseId(streamItemUri);
+ *</pre>
* </dd>
* </dl>
* </dd>
@@ -3012,7 +3014,7 @@
* StreamItems.StreamItemPhotos.CONTENT_DIRECTORY), values);
* </pre>
* </dd>
- * <dt>Via {@link ContactsContract.StreamItems#CONTENT_PHOTO_URI}</dt>
+ * <dt>Via {@link ContactsContract.StreamItems#CONTENT_PHOTO_URI}:</dt>
* <dd>
* <pre>
* values.clear();
@@ -3021,7 +3023,7 @@
* values.put(StreamItemPhotos.PHOTO, photoData);
* getContentResolver().insert(StreamItems.CONTENT_PHOTO_URI, values);
* </pre>
- * Note that this latter form allows the insertion of a stream item and its
+ * <p>Note that this latter form allows the insertion of a stream item and its
* photos in a single transaction, by using {@link ContentProviderOperation} with
* back references to populate the stream item ID in the {@link ContentValues}.
* </dd>
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index 2f9852d..f82c9c4 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -275,7 +275,7 @@
}
if (reflowed == null) {
- reflowed = new StaticLayout(getText());
+ reflowed = new StaticLayout(null);
} else {
reflowed.prepare();
}
@@ -488,7 +488,7 @@
private int mTopPadding, mBottomPadding;
- private static StaticLayout sStaticLayout = null;
+ private static StaticLayout sStaticLayout = new StaticLayout(null);
private static final Object[] sLock = new Object[0];
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index 5fed775..fdbec20 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -709,8 +709,6 @@
T ret1 = null;
for (int i = 0; i < spanCount; i++) {
- if (!kind.isInstance(spans[i])) continue;
-
int spanStart = starts[i];
int spanEnd = ends[i];
@@ -735,6 +733,9 @@
continue;
}
+ // Expensive test, should be performed after the previous tests
+ if (!kind.isInstance(spans[i])) continue;
+
if (count == 0) {
// Safe conversion thanks to the isInstance test above
ret1 = (T) spans[i];
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index e8b2045..583cbe6 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -763,7 +763,8 @@
return;
}
- float ellipsisWidth = paint.measureText(HORIZONTAL_ELLIPSIS);
+ float ellipsisWidth = paint.measureText(
+ (where == TextUtils.TruncateAt.END_SMALL) ? ELLIPSIS_TWO_DOTS : ELLIPSIS_NORMAL);
int ellipsisStart = 0;
int ellipsisCount = 0;
int len = lineEnd - lineStart;
@@ -791,7 +792,8 @@
Log.w(TAG, "Start Ellipsis only supported with one line");
}
}
- } else if (where == TextUtils.TruncateAt.END || where == TextUtils.TruncateAt.MARQUEE) {
+ } else if (where == TextUtils.TruncateAt.END || where == TextUtils.TruncateAt.MARQUEE ||
+ where == TextUtils.TruncateAt.END_SMALL) {
float sum = 0;
int i;
@@ -1001,7 +1003,9 @@
private static final char CHAR_HYPHEN = '-';
private static final double EXTRA_ROUNDING = 0.5;
- private static final String HORIZONTAL_ELLIPSIS = "\u2026"; // this is "..."
+
+ private static final String ELLIPSIS_NORMAL = "\u2026"; // this is "..."
+ private static final String ELLIPSIS_TWO_DOTS = "\u2025"; // this is ".."
private static final int CHAR_FIRST_HIGH_SURROGATE = 0xD800;
private static final int CHAR_LAST_LOW_SURROGATE = 0xDFFF;
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index a52d48e..68fea19 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -30,6 +30,8 @@
import com.android.internal.util.ArrayUtils;
+import java.lang.reflect.Array;
+
/**
* Represents a line of styled text, for measuring in visual order and
* for rendering.
@@ -679,6 +681,12 @@
wp.getFontMetricsInt(fmi);
+ updateMetrics(fmi, previousTop, previousAscent, previousDescent, previousBottom,
+ previousLeading);
+ }
+
+ static void updateMetrics(FontMetricsInt fmi, int previousTop, int previousAscent,
+ int previousDescent, int previousBottom, int previousLeading) {
fmi.top = Math.min(fmi.top, previousTop);
fmi.ascent = Math.min(fmi.ascent, previousAscent);
fmi.descent = Math.max(fmi.descent, previousDescent);
@@ -809,7 +817,28 @@
int textLimit = mStart + limit;
if (needWidth || (c != null && runIsRtl)) {
+ int previousTop = 0;
+ int previousAscent = 0;
+ int previousDescent = 0;
+ int previousBottom = 0;
+ int previousLeading = 0;
+
+ boolean needUpdateMetrics = (fmi != null);
+
+ if (needUpdateMetrics) {
+ previousTop = fmi.top;
+ previousAscent = fmi.ascent;
+ previousDescent = fmi.descent;
+ previousBottom = fmi.bottom;
+ previousLeading = fmi.leading;
+ }
+
ret = replacement.getSize(wp, mText, textStart, textLimit, fmi);
+
+ if (needUpdateMetrics) {
+ updateMetrics(fmi, previousTop, previousAscent, previousDescent, previousBottom,
+ previousLeading);
+ }
}
if (c != null) {
@@ -823,6 +852,73 @@
return runIsRtl ? -ret : ret;
}
+ private static class SpanSet<E> {
+ final int numberOfSpans;
+ final E[] spans;
+ final int[] spanStarts;
+ final int[] spanEnds;
+ final int[] spanFlags;
+
+ @SuppressWarnings("unchecked")
+ SpanSet(Spanned spanned, int start, int limit, Class<? extends E> type) {
+ final E[] allSpans = spanned.getSpans(start, limit, type);
+ final int length = allSpans.length;
+ // These arrays may end up being too large because of empty spans
+ spans = (E[]) Array.newInstance(type, length);
+ spanStarts = new int[length];
+ spanEnds = new int[length];
+ spanFlags = new int[length];
+
+ int count = 0;
+ for (int i = 0; i < length; i++) {
+ final E span = allSpans[i];
+
+ final int spanStart = spanned.getSpanStart(span);
+ final int spanEnd = spanned.getSpanEnd(span);
+ if (spanStart == spanEnd) continue;
+
+ final int spanFlag = spanned.getSpanFlags(span);
+ final int priority = spanFlag & Spanned.SPAN_PRIORITY;
+ if (priority != 0 && count != 0) {
+ int j;
+
+ for (j = 0; j < count; j++) {
+ final int otherPriority = spanFlags[j] & Spanned.SPAN_PRIORITY;
+ if (priority > otherPriority) break;
+ }
+
+ System.arraycopy(spans, j, spans, j + 1, count - j);
+ System.arraycopy(spanStarts, j, spanStarts, j + 1, count - j);
+ System.arraycopy(spanEnds, j, spanEnds, j + 1, count - j);
+ System.arraycopy(spanFlags, j, spanFlags, j + 1, count - j);
+
+ spans[j] = span;
+ spanStarts[j] = spanStart;
+ spanEnds[j] = spanEnd;
+ spanFlags[j] = spanFlag;
+ } else {
+ spans[i] = span;
+ spanStarts[i] = spanStart;
+ spanEnds[i] = spanEnd;
+ spanFlags[i] = spanFlag;
+ }
+
+ count++;
+ }
+ numberOfSpans = count;
+ }
+
+ int getNextTransition(int start, int limit) {
+ for (int i = 0; i < numberOfSpans; i++) {
+ final int spanStart = spanStarts[i];
+ final int spanEnd = spanEnds[i];
+ if (spanStart > start && spanStart < limit) limit = spanStart;
+ if (spanEnd > start && spanEnd < limit) limit = spanEnd;
+ }
+ return limit;
+ }
+ }
+
/**
* Utility function for handling a unidirectional run. The run must not
* contain tabs or emoji but can contain styles.
@@ -856,66 +952,70 @@
return 0f;
}
+ if (mSpanned == null) {
+ TextPaint wp = mWorkPaint;
+ wp.set(mPaint);
+ final int mlimit = measureLimit;
+ return handleText(wp, start, mlimit, start, limit, runIsRtl, c, x, top,
+ y, bottom, fmi, needWidth || mlimit < measureLimit);
+ }
+
+ final SpanSet<MetricAffectingSpan> metricAffectingSpans = new SpanSet<MetricAffectingSpan>(
+ mSpanned, mStart + start, mStart + limit, MetricAffectingSpan.class);
+ final SpanSet<CharacterStyle> characterStyleSpans = new SpanSet<CharacterStyle>(
+ mSpanned, mStart + start, mStart + limit, CharacterStyle.class);
+
// Shaping needs to take into account context up to metric boundaries,
// but rendering needs to take into account character style boundaries.
// So we iterate through metric runs to get metric bounds,
// then within each metric run iterate through character style runs
// for the run bounds.
- float ox = x;
+ final float originalX = x;
for (int i = start, inext; i < measureLimit; i = inext) {
TextPaint wp = mWorkPaint;
wp.set(mPaint);
- int mlimit;
- if (mSpanned == null) {
- inext = limit;
- mlimit = measureLimit;
- } else {
- inext = mSpanned.nextSpanTransition(mStart + i, mStart + limit,
- MetricAffectingSpan.class) - mStart;
+ inext = metricAffectingSpans.getNextTransition(mStart + i, mStart + limit) - mStart;
+ int mlimit = Math.min(inext, measureLimit);
- mlimit = inext < measureLimit ? inext : measureLimit;
- MetricAffectingSpan[] spans = mSpanned.getSpans(mStart + i,
- mStart + mlimit, MetricAffectingSpan.class);
- spans = TextUtils.removeEmptySpans(spans, mSpanned, MetricAffectingSpan.class);
+ ReplacementSpan replacement = null;
- if (spans.length > 0) {
- ReplacementSpan replacement = null;
- for (int j = 0; j < spans.length; j++) {
- MetricAffectingSpan span = spans[j];
- if (span instanceof ReplacementSpan) {
- replacement = (ReplacementSpan)span;
- } else {
- // We might have a replacement that uses the draw
- // state, otherwise measure state would suffice.
- span.updateDrawState(wp);
- }
- }
-
- if (replacement != null) {
- x += handleReplacement(replacement, wp, i,
- mlimit, runIsRtl, c, x, top, y, bottom, fmi,
- needWidth || mlimit < measureLimit);
- continue;
- }
+ for (int j = 0; j < metricAffectingSpans.numberOfSpans; j++) {
+ // Both intervals [spanStarts..spanEnds] and [mStart + i..mStart + mlimit] are NOT
+ // empty by construction. This special case in getSpans() explains the >= & <= tests
+ if ((metricAffectingSpans.spanStarts[j] >= mStart + mlimit) ||
+ (metricAffectingSpans.spanEnds[j] <= mStart + i)) continue;
+ MetricAffectingSpan span = metricAffectingSpans.spans[j];
+ if (span instanceof ReplacementSpan) {
+ replacement = (ReplacementSpan)span;
+ } else {
+ // We might have a replacement that uses the draw
+ // state, otherwise measure state would suffice.
+ span.updateDrawState(wp);
}
}
- if (mSpanned == null || c == null) {
+ if (replacement != null) {
+ x += handleReplacement(replacement, wp, i, mlimit, runIsRtl, c, x, top, y,
+ bottom, fmi, needWidth || mlimit < measureLimit);
+ continue;
+ }
+
+ if (c == null) {
x += handleText(wp, i, mlimit, i, inext, runIsRtl, c, x, top,
y, bottom, fmi, needWidth || mlimit < measureLimit);
} else {
for (int j = i, jnext; j < mlimit; j = jnext) {
- jnext = mSpanned.nextSpanTransition(mStart + j,
- mStart + mlimit, CharacterStyle.class) - mStart;
-
- CharacterStyle[] spans = mSpanned.getSpans(mStart + j,
- mStart + jnext, CharacterStyle.class);
- spans = TextUtils.removeEmptySpans(spans, mSpanned, CharacterStyle.class);
+ jnext = characterStyleSpans.getNextTransition(mStart + j, mStart + mlimit) -
+ mStart;
wp.set(mPaint);
- for (int k = 0; k < spans.length; k++) {
- CharacterStyle span = spans[k];
+ for (int k = 0; k < characterStyleSpans.numberOfSpans; k++) {
+ // Intentionally using >= and <= as explained above
+ if ((characterStyleSpans.spanStarts[k] >= mStart + jnext) ||
+ (characterStyleSpans.spanEnds[k] <= mStart + j)) continue;
+
+ CharacterStyle span = characterStyleSpans.spans[k];
span.updateDrawState(wp);
}
@@ -925,7 +1025,7 @@
}
}
- return x - ox;
+ return x - originalX;
}
/**
@@ -970,8 +1070,7 @@
}
pos += mStart;
- MetricAffectingSpan[] spans = mSpanned.getSpans(pos, pos + 1,
- MetricAffectingSpan.class);
+ MetricAffectingSpan[] spans = mSpanned.getSpans(pos, pos + 1, MetricAffectingSpan.class);
if (spans.length == 0) {
return mPaint.ascent();
}
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 894afbd..95a3cdc 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -53,9 +53,8 @@
import java.util.regex.Pattern;
public class TextUtils {
- private TextUtils() { /* cannot be instantiated */ }
- private static String[] EMPTY_STRING_ARRAY = new String[]{};
+ private TextUtils() { /* cannot be instantiated */ }
public static void getChars(CharSequence s, int start, int end,
char[] dest, int destoff) {
@@ -1000,6 +999,10 @@
MIDDLE,
END,
MARQUEE,
+ /**
+ * @hide
+ */
+ END_SMALL
}
public interface EllipsizeCallback {
@@ -1010,8 +1013,6 @@
public void ellipsized(int start, int end);
}
- private static String sEllipsis = null;
-
/**
* Returns the original text if it fits in the specified width
* given the properties of the specified Paint,
@@ -1042,7 +1043,8 @@
boolean preserveLength,
EllipsizeCallback callback) {
return ellipsize(text, paint, avail, where, preserveLength, callback,
- TextDirectionHeuristics.FIRSTSTRONG_LTR);
+ TextDirectionHeuristics.FIRSTSTRONG_LTR,
+ (where == TruncateAt.END_SMALL) ? ELLIPSIS_TWO_DOTS : ELLIPSIS_NORMAL);
}
/**
@@ -1063,11 +1065,7 @@
float avail, TruncateAt where,
boolean preserveLength,
EllipsizeCallback callback,
- TextDirectionHeuristic textDir) {
- if (sEllipsis == null) {
- Resources r = Resources.getSystem();
- sEllipsis = r.getString(R.string.ellipsis);
- }
+ TextDirectionHeuristic textDir, String ellipsis) {
int len = text.length();
@@ -1085,7 +1083,7 @@
// XXX assumes ellipsis string does not require shaping and
// is unaffected by style
- float ellipsiswid = paint.measureText(sEllipsis);
+ float ellipsiswid = paint.measureText(ellipsis);
avail -= ellipsiswid;
int left = 0;
@@ -1094,7 +1092,7 @@
// it all goes
} else if (where == TruncateAt.START) {
right = len - mt.breakText(0, len, false, avail);
- } else if (where == TruncateAt.END) {
+ } else if (where == TruncateAt.END || where == TruncateAt.END_SMALL) {
left = mt.breakText(0, len, true, avail);
} else {
right = len - mt.breakText(0, len, false, avail / 2);
@@ -1112,10 +1110,10 @@
int remaining = len - (right - left);
if (preserveLength) {
if (remaining > 0) { // else eliminate the ellipsis too
- buf[left++] = '\u2026';
+ buf[left++] = ellipsis.charAt(0);
}
for (int i = left; i < right; i++) {
- buf[i] = '\uFEFF';
+ buf[i] = ZWNBS_CHAR;
}
String s = new String(buf, 0, len);
if (sp == null) {
@@ -1131,16 +1129,16 @@
}
if (sp == null) {
- StringBuilder sb = new StringBuilder(remaining + sEllipsis.length());
+ StringBuilder sb = new StringBuilder(remaining + ellipsis.length());
sb.append(buf, 0, left);
- sb.append(sEllipsis);
+ sb.append(ellipsis);
sb.append(buf, right, len - right);
return sb.toString();
}
SpannableStringBuilder ssb = new SpannableStringBuilder();
ssb.append(text, 0, left);
- ssb.append(sEllipsis);
+ ssb.append(ellipsis);
ssb.append(text, right, len);
return ssb;
} finally {
@@ -1664,4 +1662,13 @@
private static Object sLock = new Object();
private static char[] sTemp = null;
+
+ private static String[] EMPTY_STRING_ARRAY = new String[]{};
+
+ private static final char ZWNBS_CHAR = '\uFEFF';
+
+ private static final String ELLIPSIS_NORMAL = Resources.getSystem().getString(
+ R.string.ellipsis);
+ private static final String ELLIPSIS_TWO_DOTS = Resources.getSystem().getString(
+ R.string.ellipsis_two_dots);
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 55c821d..45f9da2 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -116,6 +116,7 @@
boolean isKeyguardLocked();
boolean isKeyguardSecure();
boolean inKeyguardRestrictedInputMode();
+ void dismissKeyguard();
void closeSystemDialogs(String reason);
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index c735d6b..c974ba1 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -93,6 +93,11 @@
* been invoked.) It is therefore highly recommended you use a listener to
* be notified when the SurfaceTexture becomes available.</p>
*
+ * <p>It is important to note that only one producer can use the TextureView.
+ * For instance, if you use a TextureView to display the camera preview, you
+ * cannot use {@link #lockCanvas()} to draw onto the TextureView at the same
+ * time.</p>
+ *
* @see SurfaceView
* @see SurfaceTexture
*/
@@ -523,6 +528,10 @@
* rectangle is specified, in which case, non-dirty pixels will be
* preserved.</p>
*
+ * <p>This method can only be used if the underlying surface is not already
+ * owned by another producer. For instance, if the TextureView is being used
+ * to render the camera's preview you cannot invoke this method.</p>
+ *
* @return A Canvas used to draw into the surface.
*
* @see #lockCanvas(android.graphics.Rect)
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 3c67521..2ebe756be 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2909,6 +2909,7 @@
initializeScrollbars(a);
}
break;
+ //noinspection deprecation
case R.styleable.View_fadingEdge:
if (context.getApplicationInfo().targetSdkVersion >= ICE_CREAM_SANDWICH) {
// Ignore the attribute starting with ICS
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index a29cf13..ddb982a 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -34,7 +34,6 @@
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
-import android.view.View.AccessibilityDelegate;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Animation;
@@ -615,9 +614,9 @@
* Called when a child has requested sending an {@link AccessibilityEvent} and
* gives an opportunity to its parent to augment the event.
* <p>
- * If an {@link AccessibilityDelegate} has been specified via calling
- * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
- * {@link AccessibilityDelegate#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)}
+ * If an {@link android.view.View.AccessibilityDelegate} has been specified via calling
+ * {@link android.view.View#setAccessibilityDelegate(android.view.View.AccessibilityDelegate)} its
+ * {@link android.view.View.AccessibilityDelegate#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)}
* is responsible for handling this call.
* </p>
*
@@ -2561,7 +2560,8 @@
final View[] children = mChildren;
for (int i = 0; i < count; i++) {
final View child = children[i];
- if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
+ if (((child.mViewFlags & VISIBILITY_MASK) == VISIBLE ||
+ child.getAnimation() != null) && child.getLayerType() == LAYER_TYPE_NONE) {
child.mRecreateDisplayList = (child.mPrivateFlags & INVALIDATED) == INVALIDATED;
child.mPrivateFlags &= ~INVALIDATED;
child.getDisplayList();
@@ -2824,6 +2824,13 @@
if (hasDisplayList) {
displayList = child.getDisplayList();
+ if (!displayList.isValid()) {
+ // Uncommon, but possible. If a view is removed from the hierarchy during the call
+ // to getDisplayList(), the display list will be marked invalid and we should not
+ // try to use it again.
+ displayList = null;
+ hasDisplayList = false;
+ }
}
if (hasNoCache) {
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 1dbb083..4f67675 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -850,6 +850,11 @@
public boolean inKeyguardRestrictedKeyInputMode();
/**
+ * Ask the policy to dismiss the keyguard, if it is currently shown.
+ */
+ public void dismissKeyguardLw();
+
+ /**
* Given an orientation constant, returns the appropriate surface rotation,
* taking into account sensors, docking mode, rotation lock, and other factors.
*
@@ -876,6 +881,13 @@
public boolean rotationHasCompatibleMetricsLw(int orientation, int rotation);
/**
+ * Called by the window manager when the rotation changes.
+ *
+ * @param rotation The new rotation.
+ */
+ public void setRotationLw(int rotation);
+
+ /**
* Called when the system is mostly done booting to determine whether
* the system should go into safe mode.
*/
diff --git a/core/java/android/view/WindowOrientationListener.java b/core/java/android/view/WindowOrientationListener.java
index 726bf4a..c3c74a7 100755
--- a/core/java/android/view/WindowOrientationListener.java
+++ b/core/java/android/view/WindowOrientationListener.java
@@ -26,7 +26,7 @@
/**
* A special helper class used by the WindowManager
- * for receiving notifications from the SensorManager when
+ * for receiving notifications from the SensorManager when
* the orientation of the device has changed.
*
* NOTE: If changing anything here, please run the API demo
@@ -54,6 +54,7 @@
private Sensor mSensor;
private SensorEventListenerImpl mSensorEventListener;
boolean mLogEnabled;
+ int mCurrentRotation = -1;
/**
* Creates a new WindowOrientationListener.
@@ -117,12 +118,25 @@
}
/**
- * Gets the current orientation.
- * @return The current rotation, or -1 if unknown.
+ * Sets the current rotation.
+ *
+ * @param rotation The current rotation.
*/
- public int getCurrentRotation() {
+ public void setCurrentRotation(int rotation) {
+ mCurrentRotation = rotation;
+ }
+
+ /**
+ * Gets the proposed rotation.
+ *
+ * This method only returns a rotation if the orientation listener is certain
+ * of its proposal. If the rotation is indeterminate, returns -1.
+ *
+ * @return The proposed rotation, or -1 if unknown.
+ */
+ public int getProposedRotation() {
if (mEnabled) {
- return mSensorEventListener.getCurrentRotation();
+ return mSensorEventListener.getProposedRotation();
}
return -1;
}
@@ -137,10 +151,14 @@
/**
* Called when the rotation view of the device has changed.
*
+ * This method is called whenever the orientation becomes certain of an orientation.
+ * It is called each time the orientation determination transitions from being
+ * uncertain to being certain again, even if it is the same orientation as before.
+ *
* @param rotation The new orientation of the device, one of the Surface.ROTATION_* constants.
* @see Surface
*/
- public abstract void onOrientationChanged(int rotation);
+ public abstract void onProposedRotationChanged(int rotation);
/**
* Enables or disables the window orientation listener logging for use with
@@ -182,23 +200,8 @@
* to the corresponding orientation. These thresholds have some hysteresis built-in
* to avoid oscillations between adjacent orientations.
*
- * - Use the magnitude to judge the confidence of the orientation.
- * Under ideal conditions, the magnitude should equal to that of gravity. When it
- * differs significantly, we know the device is under external acceleration and
- * we can't trust the data.
- *
- * - Use the tilt angle to judge the confidence of the orientation.
- * When the tilt angle is high in absolute value then the device is nearly flat
- * so small physical movements produce large changes in orientation angle.
- * This can be the case when the device is being picked up from a table.
- *
- * - Use the orientation angle to judge the confidence of the orientation.
- * The close the orientation angle is to the canonical orientation angle, the better.
- *
- * - Based on the aggregate confidence, we determine how long we want to wait for
- * the new orientation to settle. This is accomplished by integrating the confidence
- * for each orientation over time. When a threshold integration sum is reached
- * then we actually change orientations.
+ * - Wait for the device to settle for a little bit. Once that happens, issue the
+ * new orientation proposal.
*
* Details are explained inline.
*/
@@ -211,22 +214,8 @@
private static final int ACCELEROMETER_DATA_Y = 1;
private static final int ACCELEROMETER_DATA_Z = 2;
- // Rotation constants.
- // These are the same as Surface rotation constants with the addition of a 5th
- // unknown state when we are not confident about the proporsed orientation.
- // One important property of these constants is that they are equal to the
- // orientation angle itself divided by 90. We use this fact to map
- // back and forth between orientation angles and rotation values.
- private static final int ROTATION_UNKNOWN = -1;
- //private static final int ROTATION_0 = Surface.ROTATION_0; // 0
- //private static final int ROTATION_90 = Surface.ROTATION_90; // 1
- //private static final int ROTATION_180 = Surface.ROTATION_180; // 2
- //private static final int ROTATION_270 = Surface.ROTATION_270; // 3
-
private final WindowOrientationListener mOrientationListener;
- private int mRotation = ROTATION_UNKNOWN;
-
/* State for first order low-pass filtering of accelerometer data.
* See http://en.wikipedia.org/wiki/Low-pass_filter#Discrete-time_realization for
* signal processing background.
@@ -235,6 +224,24 @@
private long mLastTimestamp = Long.MAX_VALUE; // in nanoseconds
private float mLastFilteredX, mLastFilteredY, mLastFilteredZ;
+ // The current proposal. We wait for the proposal to be stable for a
+ // certain amount of time before accepting it.
+ //
+ // The basic idea is to ignore intermediate poses of the device while the
+ // user is picking up, putting down or turning the device.
+ private int mProposalRotation;
+ private long mProposalAgeMS;
+
+ // A historical trace of tilt and orientation angles. Used to determine whether
+ // the device posture has settled down.
+ private static final int HISTORY_SIZE = 20;
+ private int mHistoryIndex; // index of most recent sample
+ private int mHistoryLength; // length of historical trace
+ private final long[] mHistoryTimestampMS = new long[HISTORY_SIZE];
+ private final float[] mHistoryMagnitudes = new float[HISTORY_SIZE];
+ private final int[] mHistoryTiltAngles = new int[HISTORY_SIZE];
+ private final int[] mHistoryOrientationAngles = new int[HISTORY_SIZE];
+
// The maximum sample inter-arrival time in milliseconds.
// If the acceleration samples are further apart than this amount in time, we reset the
// state of the low-pass filter and orientation properties. This helps to handle
@@ -242,24 +249,26 @@
// a significant gap in samples.
private static final float MAX_FILTER_DELTA_TIME_MS = 1000;
- // The acceleration filter cutoff frequency.
- // This is the frequency at which signals are attenuated by 3dB (half the passband power).
+ // The acceleration filter time constant.
+ //
+ // This time constant is used to tune the acceleration filter such that
+ // impulses and vibrational noise (think car dock) is suppressed before we
+ // try to calculate the tilt and orientation angles.
+ //
+ // The filter time constant is related to the filter cutoff frequency, which is the
+ // frequency at which signals are attenuated by 3dB (half the passband power).
// Each successive octave beyond this frequency is attenuated by an additional 6dB.
//
- // We choose the cutoff frequency such that impulses and vibrational noise
- // (think car dock) is suppressed. However, this filtering does not eliminate
- // all possible sources of orientation ambiguity so we also rely on a dynamic
- // settle time for establishing a new orientation. Filtering adds latency
- // inversely proportional to the cutoff frequency so we don't want to make
- // it too small or we can lose hundreds of milliseconds of responsiveness.
- private static final float FILTER_CUTOFF_FREQUENCY_HZ = 1f;
- private static final float FILTER_TIME_CONSTANT_MS = (float)(500.0f
- / (Math.PI * FILTER_CUTOFF_FREQUENCY_HZ)); // t = 1 / (2pi * Fc) * 1000ms
-
- // The filter gain.
- // We choose a value slightly less than unity to avoid numerical instabilities due
- // to floating-point error accumulation.
- private static final float FILTER_GAIN = 0.999f;
+ // Given a time constant t in seconds, the filter cutoff frequency Fc in Hertz
+ // is given by Fc = 1 / (2pi * t).
+ //
+ // The higher the time constant, the lower the cutoff frequency, so more noise
+ // will be suppressed.
+ //
+ // Filtering adds latency proportional the time constant (inversely proportional
+ // to the cutoff frequency) so we don't want to make the time constant too
+ // large or we can lose responsiveness.
+ private static final float FILTER_TIME_CONSTANT_MS = 100.0f;
/* State for orientation detection. */
@@ -297,10 +306,10 @@
// The ideal tilt angle is 0 (when the device is vertical) so the limits establish
// how close to vertical the device must be in order to change orientation.
private static final int[][] TILT_TOLERANCE = new int[][] {
- /* ROTATION_0 */ { -20, 75 },
- /* ROTATION_90 */ { -20, 70 },
- /* ROTATION_180 */ { -20, 65 },
- /* ROTATION_270 */ { -20, 70 }
+ /* ROTATION_0 */ { -20, 70 },
+ /* ROTATION_90 */ { -20, 60 },
+ /* ROTATION_180 */ { -20, 50 },
+ /* ROTATION_270 */ { -20, 60 }
};
// The gap angle in degrees between adjacent orientation angles for hysteresis.
@@ -308,41 +317,31 @@
// adjacent orientation. No orientation proposal is made when the orientation
// angle is within the gap between the current orientation and the adjacent
// orientation.
- private static final int ADJACENT_ORIENTATION_ANGLE_GAP = 30;
+ private static final int ADJACENT_ORIENTATION_ANGLE_GAP = 45;
- // The confidence scale factors for angle, tilt and magnitude.
- // When the distance between the actual value and the ideal value is the
- // specified delta, orientation transitions will take twice as long as they would
- // in the ideal case. Increasing or decreasing the delta has an exponential effect
- // on each factor's influence over the transition time.
+ // The number of milliseconds for which the device posture must be stable
+ // before we perform an orientation change. If the device appears to be rotating
+ // (being picked up, put down) then we keep waiting until it settles.
+ private static final int SETTLE_TIME_MS = 200;
- // Transition takes 2x longer when angle is 30 degrees from ideal orientation angle.
- private static final float ORIENTATION_ANGLE_CONFIDENCE_SCALE =
- confidenceScaleFromDelta(30);
+ // The maximum change in magnitude that can occur during the settle time.
+ // Tuning this constant particularly helps to filter out situations where the
+ // device is being picked up or put down by the user.
+ private static final float SETTLE_MAGNITUDE_MAX_DELTA =
+ SensorManager.STANDARD_GRAVITY * 0.2f;
- // Transition takes 2x longer when tilt is 60 degrees from vertical.
- private static final float TILT_ANGLE_CONFIDENCE_SCALE = confidenceScaleFromDelta(60);
+ // The maximum change in tilt angle that can occur during the settle time.
+ private static final int SETTLE_TILT_ANGLE_MAX_DELTA = 5;
- // Transition takes 2x longer when acceleration is 0.5 Gs.
- private static final float MAGNITUDE_CONFIDENCE_SCALE = confidenceScaleFromDelta(
- SensorManager.STANDARD_GRAVITY * 0.5f);
-
- // The number of milliseconds for which a new orientation must be stable before
- // we perform an orientation change under ideal conditions. It will take
- // proportionally longer than this to effect an orientation change when
- // the proposed orientation confidence is low.
- private static final float ORIENTATION_SETTLE_TIME_MS = 250;
-
- // The confidence that we have abount effecting each orientation change.
- // When one of these values exceeds 1.0, we have determined our new orientation!
- private float mConfidence[] = new float[4];
+ // The maximum change in orientation angle that can occur during the settle time.
+ private static final int SETTLE_ORIENTATION_ANGLE_MAX_DELTA = 5;
public SensorEventListenerImpl(WindowOrientationListener orientationListener) {
mOrientationListener = orientationListener;
}
- public int getCurrentRotation() {
- return mRotation; // may be -1, if unknown
+ public int getProposedRotation() {
+ return mProposalAgeMS >= SETTLE_TIME_MS ? mProposalRotation : -1;
}
@Override
@@ -368,20 +367,18 @@
// Reset the orientation listener state if the samples are too far apart in time
// or when we see values of (0, 0, 0) which indicates that we polled the
// accelerometer too soon after turning it on and we don't have any data yet.
- final float timeDeltaMS = (event.timestamp - mLastTimestamp) * 0.000001f;
+ final long now = event.timestamp;
+ final float timeDeltaMS = (now - mLastTimestamp) * 0.000001f;
boolean skipSample;
if (timeDeltaMS <= 0 || timeDeltaMS > MAX_FILTER_DELTA_TIME_MS
|| (x == 0 && y == 0 && z == 0)) {
if (log) {
Slog.v(TAG, "Resetting orientation listener.");
}
- for (int i = 0; i < 4; i++) {
- mConfidence[i] = 0;
- }
+ clearProposal();
skipSample = true;
} else {
- final float alpha = timeDeltaMS
- / (FILTER_TIME_CONSTANT_MS + timeDeltaMS) * FILTER_GAIN;
+ final float alpha = timeDeltaMS / (FILTER_TIME_CONSTANT_MS + timeDeltaMS);
x = alpha * (x - mLastFilteredX) + mLastFilteredX;
y = alpha * (y - mLastFilteredY) + mLastFilteredY;
z = alpha * (z - mLastFilteredZ) + mLastFilteredZ;
@@ -391,17 +388,13 @@
}
skipSample = false;
}
- mLastTimestamp = event.timestamp;
+ mLastTimestamp = now;
mLastFilteredX = x;
mLastFilteredY = y;
mLastFilteredZ = z;
- boolean orientationChanged = false;
+ final int oldProposedRotation = getProposedRotation();
if (!skipSample) {
- // Determine a proposed orientation based on the currently available data.
- int proposedOrientation = ROTATION_UNKNOWN;
- float combinedConfidence = 1.0f;
-
// Calculate the magnitude of the acceleration vector.
final float magnitude = (float) Math.sqrt(x * x + y * y + z * z);
if (magnitude < MIN_ACCELERATION_MAGNITUDE
@@ -410,6 +403,7 @@
Slog.v(TAG, "Ignoring sensor data, magnitude out of range: "
+ "magnitude=" + magnitude);
}
+ clearProposal();
} else {
// Calculate the tilt angle.
// This is the angle between the up vector and the x-y plane (the plane of
@@ -417,123 +411,82 @@
// -90 degrees: screen horizontal and facing the ground (overhead)
// 0 degrees: screen vertical
// 90 degrees: screen horizontal and facing the sky (on table)
- final int tiltAngle = (int) Math.round(
- Math.asin(z / magnitude) * RADIANS_TO_DEGREES);
+ final int tiltAngle = (int) Math.round(
+ Math.asin(z / magnitude) * RADIANS_TO_DEGREES);
- // If the tilt angle is too close to horizontal then we cannot determine
- // the orientation angle of the screen.
- if (Math.abs(tiltAngle) > MAX_TILT) {
- if (log) {
- Slog.v(TAG, "Ignoring sensor data, tilt angle too high: "
- + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle);
- }
- } else {
- // Calculate the orientation angle.
- // This is the angle between the x-y projection of the up vector onto
- // the +y-axis, increasing clockwise in a range of [0, 360] degrees.
- int orientationAngle = (int) Math.round(
- -Math.atan2(-x, y) * RADIANS_TO_DEGREES);
- if (orientationAngle < 0) {
- // atan2 returns [-180, 180]; normalize to [0, 360]
- orientationAngle += 360;
- }
-
- // Find the nearest orientation.
- // An orientation of 0 can have a nearest angle of 0 or 360 depending
- // on which is closer to the measured orientation angle. We leave the
- // nearest angle at 360 in that case since it makes the delta calculation
- // for orientation angle confidence easier below.
- int nearestOrientation = (orientationAngle + 45) / 90;
- int nearestOrientationAngle = nearestOrientation * 90;
- if (nearestOrientation == 4) {
- nearestOrientation = 0;
- }
-
- // Determine the proposed orientation.
- // The confidence of the proposal is 1.0 when it is ideal and it
- // decays exponentially as the proposal moves further from the ideal
- // angle, tilt and magnitude of the proposed orientation.
- if (isTiltAngleAcceptable(nearestOrientation, tiltAngle)
- && isOrientationAngleAcceptable(nearestOrientation,
- orientationAngle)) {
- proposedOrientation = nearestOrientation;
-
- final float idealOrientationAngle = nearestOrientationAngle;
- final float orientationConfidence = confidence(orientationAngle,
- idealOrientationAngle, ORIENTATION_ANGLE_CONFIDENCE_SCALE);
-
- final float idealTiltAngle = 0;
- final float tiltConfidence = confidence(tiltAngle,
- idealTiltAngle, TILT_ANGLE_CONFIDENCE_SCALE);
-
- final float idealMagnitude = SensorManager.STANDARD_GRAVITY;
- final float magnitudeConfidence = confidence(magnitude,
- idealMagnitude, MAGNITUDE_CONFIDENCE_SCALE);
-
- combinedConfidence = orientationConfidence
- * tiltConfidence * magnitudeConfidence;
-
- if (log) {
- Slog.v(TAG, "Proposal: "
- + "magnitude=" + magnitude
- + ", tiltAngle=" + tiltAngle
- + ", orientationAngle=" + orientationAngle
- + ", proposedOrientation=" + proposedOrientation
- + ", combinedConfidence=" + combinedConfidence
- + ", orientationConfidence=" + orientationConfidence
- + ", tiltConfidence=" + tiltConfidence
- + ", magnitudeConfidence=" + magnitudeConfidence);
- }
- } else {
- if (log) {
- Slog.v(TAG, "Ignoring sensor data, no proposal: "
- + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle
- + ", orientationAngle=" + orientationAngle);
- }
- }
- }
- }
-
- // Sum up the orientation confidence weights.
- // Detect an orientation change when the sum reaches 1.0.
- final float confidenceAmount = combinedConfidence * timeDeltaMS
- / ORIENTATION_SETTLE_TIME_MS;
- for (int i = 0; i < 4; i++) {
- if (i == proposedOrientation) {
- mConfidence[i] += confidenceAmount;
- if (mConfidence[i] >= 1.0f) {
- mConfidence[i] = 1.0f;
-
- if (i != mRotation) {
- if (log) {
- Slog.v(TAG, "Orientation changed! rotation=" + i);
- }
- mRotation = i;
- orientationChanged = true;
- }
+ // If the tilt angle is too close to horizontal then we cannot determine
+ // the orientation angle of the screen.
+ if (Math.abs(tiltAngle) > MAX_TILT) {
+ if (log) {
+ Slog.v(TAG, "Ignoring sensor data, tilt angle too high: "
+ + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle);
}
+ clearProposal();
} else {
- mConfidence[i] -= confidenceAmount;
- if (mConfidence[i] < 0.0f) {
- mConfidence[i] = 0.0f;
+ // Calculate the orientation angle.
+ // This is the angle between the x-y projection of the up vector onto
+ // the +y-axis, increasing clockwise in a range of [0, 360] degrees.
+ int orientationAngle = (int) Math.round(
+ -Math.atan2(-x, y) * RADIANS_TO_DEGREES);
+ if (orientationAngle < 0) {
+ // atan2 returns [-180, 180]; normalize to [0, 360]
+ orientationAngle += 360;
+ }
+
+ // Find the nearest rotation.
+ int nearestRotation = (orientationAngle + 45) / 90;
+ if (nearestRotation == 4) {
+ nearestRotation = 0;
+ }
+
+ // Determine the proposed orientation.
+ // The confidence of the proposal is 1.0 when it is ideal and it
+ // decays exponentially as the proposal moves further from the ideal
+ // angle, tilt and magnitude of the proposed orientation.
+ if (!isTiltAngleAcceptable(nearestRotation, tiltAngle)
+ || !isOrientationAngleAcceptable(nearestRotation,
+ orientationAngle)) {
+ if (log) {
+ Slog.v(TAG, "Ignoring sensor data, no proposal: "
+ + "magnitude=" + magnitude + ", tiltAngle=" + tiltAngle
+ + ", orientationAngle=" + orientationAngle);
+ }
+ clearProposal();
+ } else {
+ if (log) {
+ Slog.v(TAG, "Proposal: "
+ + "magnitude=" + magnitude
+ + ", tiltAngle=" + tiltAngle
+ + ", orientationAngle=" + orientationAngle
+ + ", proposalRotation=" + mProposalRotation);
+ }
+ updateProposal(nearestRotation, now / 1000000L,
+ magnitude, tiltAngle, orientationAngle);
}
}
}
}
// Write final statistics about where we are in the orientation detection process.
+ final int proposedRotation = getProposedRotation();
if (log) {
- Slog.v(TAG, "Result: rotation=" + mRotation
- + ", confidence=["
- + mConfidence[0] + ", "
- + mConfidence[1] + ", "
- + mConfidence[2] + ", "
- + mConfidence[3] + "], timeDeltaMS=" + timeDeltaMS);
+ final float proposalConfidence = Math.min(
+ mProposalAgeMS * 1.0f / SETTLE_TIME_MS, 1.0f);
+ Slog.v(TAG, "Result: currentRotation=" + mOrientationListener.mCurrentRotation
+ + ", proposedRotation=" + proposedRotation
+ + ", timeDeltaMS=" + timeDeltaMS
+ + ", proposalRotation=" + mProposalRotation
+ + ", proposalAgeMS=" + mProposalAgeMS
+ + ", proposalConfidence=" + proposalConfidence);
}
// Tell the listener.
- if (orientationChanged) {
- mOrientationListener.onOrientationChanged(mRotation);
+ if (proposedRotation != oldProposedRotation && proposedRotation >= 0) {
+ if (log) {
+ Slog.v(TAG, "Proposed rotation changed! proposedRotation=" + proposedRotation
+ + ", oldProposedRotation=" + oldProposedRotation);
+ }
+ mOrientationListener.onProposedRotationChanged(proposedRotation);
}
}
@@ -541,33 +494,34 @@
* Returns true if the tilt angle is acceptable for a proposed
* orientation transition.
*/
- private boolean isTiltAngleAcceptable(int proposedOrientation,
+ private boolean isTiltAngleAcceptable(int proposedRotation,
int tiltAngle) {
- return tiltAngle >= TILT_TOLERANCE[proposedOrientation][0]
- && tiltAngle <= TILT_TOLERANCE[proposedOrientation][1];
+ return tiltAngle >= TILT_TOLERANCE[proposedRotation][0]
+ && tiltAngle <= TILT_TOLERANCE[proposedRotation][1];
}
/**
* Returns true if the orientation angle is acceptable for a proposed
* orientation transition.
+ *
* This function takes into account the gap between adjacent orientations
* for hysteresis.
*/
- private boolean isOrientationAngleAcceptable(int proposedOrientation,
- int orientationAngle) {
- final int currentOrientation = mRotation;
-
+ private boolean isOrientationAngleAcceptable(int proposedRotation, int orientationAngle) {
// If there is no current rotation, then there is no gap.
- if (currentOrientation != ROTATION_UNKNOWN) {
- // If the proposed orientation is the same or is counter-clockwise adjacent,
+ // The gap is used only to introduce hysteresis among advertised orientation
+ // changes to avoid flapping.
+ final int currentRotation = mOrientationListener.mCurrentRotation;
+ if (currentRotation >= 0) {
+ // If the proposed rotation is the same or is counter-clockwise adjacent,
// then we set a lower bound on the orientation angle.
- // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_90,
+ // For example, if currentRotation is ROTATION_0 and proposed is ROTATION_90,
// then we want to check orientationAngle > 45 + GAP / 2.
- if (proposedOrientation == currentOrientation
- || proposedOrientation == (currentOrientation + 1) % 4) {
- int lowerBound = proposedOrientation * 90 - 45
+ if (proposedRotation == currentRotation
+ || proposedRotation == (currentRotation + 1) % 4) {
+ int lowerBound = proposedRotation * 90 - 45
+ ADJACENT_ORIENTATION_ANGLE_GAP / 2;
- if (proposedOrientation == 0) {
+ if (proposedRotation == 0) {
if (orientationAngle >= 315 && orientationAngle < lowerBound + 360) {
return false;
}
@@ -578,15 +532,15 @@
}
}
- // If the proposed orientation is the same or is clockwise adjacent,
+ // If the proposed rotation is the same or is clockwise adjacent,
// then we set an upper bound on the orientation angle.
- // For example, if currentOrientation is ROTATION_0 and proposed is ROTATION_270,
+ // For example, if currentRotation is ROTATION_0 and proposed is ROTATION_270,
// then we want to check orientationAngle < 315 - GAP / 2.
- if (proposedOrientation == currentOrientation
- || proposedOrientation == (currentOrientation + 3) % 4) {
- int upperBound = proposedOrientation * 90 + 45
+ if (proposedRotation == currentRotation
+ || proposedRotation == (currentRotation + 3) % 4) {
+ int upperBound = proposedRotation * 90 + 45
- ADJACENT_ORIENTATION_ANGLE_GAP / 2;
- if (proposedOrientation == 0) {
+ if (proposedRotation == 0) {
if (orientationAngle <= 45 && orientationAngle > upperBound) {
return false;
}
@@ -600,21 +554,58 @@
return true;
}
- /**
- * Calculate an exponentially weighted confidence value in the range [0.0, 1.0].
- * The further the value is from the target, the more the confidence trends to 0.
- */
- private static float confidence(float value, float target, float scale) {
- return (float) Math.exp(-Math.abs(value - target) * scale);
+ private void clearProposal() {
+ mProposalRotation = -1;
+ mProposalAgeMS = 0;
}
- /**
- * Calculate a scale factor for the confidence weight exponent.
- * The scale value is chosen such that confidence(value, target, scale) == 0.5
- * whenever abs(value - target) == cutoffDelta.
- */
- private static float confidenceScaleFromDelta(float cutoffDelta) {
- return (float) -Math.log(0.5) / cutoffDelta;
+ private void updateProposal(int rotation, long timestampMS,
+ float magnitude, int tiltAngle, int orientationAngle) {
+ if (mProposalRotation != rotation) {
+ mProposalRotation = rotation;
+ mHistoryIndex = 0;
+ mHistoryLength = 0;
+ }
+
+ final int index = mHistoryIndex;
+ mHistoryTimestampMS[index] = timestampMS;
+ mHistoryMagnitudes[index] = magnitude;
+ mHistoryTiltAngles[index] = tiltAngle;
+ mHistoryOrientationAngles[index] = orientationAngle;
+ mHistoryIndex = (index + 1) % HISTORY_SIZE;
+ if (mHistoryLength < HISTORY_SIZE) {
+ mHistoryLength += 1;
+ }
+
+ long age = 0;
+ for (int i = 1; i < mHistoryLength; i++) {
+ final int olderIndex = (index + HISTORY_SIZE - i) % HISTORY_SIZE;
+ if (Math.abs(mHistoryMagnitudes[olderIndex] - magnitude)
+ > SETTLE_MAGNITUDE_MAX_DELTA) {
+ break;
+ }
+ if (angleAbsoluteDelta(mHistoryTiltAngles[olderIndex],
+ tiltAngle) > SETTLE_TILT_ANGLE_MAX_DELTA) {
+ break;
+ }
+ if (angleAbsoluteDelta(mHistoryOrientationAngles[olderIndex],
+ orientationAngle) > SETTLE_ORIENTATION_ANGLE_MAX_DELTA) {
+ break;
+ }
+ age = timestampMS - mHistoryTimestampMS[olderIndex];
+ if (age >= SETTLE_TIME_MS) {
+ break;
+ }
+ }
+ mProposalAgeMS = age;
+ }
+
+ private static int angleAbsoluteDelta(int a, int b) {
+ int delta = Math.abs(a - b);
+ if (delta > 180) {
+ delta = 360 - delta;
+ }
+ return delta;
}
}
}
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 309857d..28f54aa 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -1159,51 +1159,49 @@
}
/**
- * Called by JNI when the native HTTPS stack gets an invalid cert chain.
+ * Called by JNI when the Chromium HTTP stack gets an invalid certificate chain.
*
* We delegate the request to CallbackProxy, and route its response to
* {@link #nativeSslCertErrorProceed(int)} or
* {@link #nativeSslCertErrorCancel(int, int)}.
*/
- private void reportSslCertError(
- final int handle, final int cert_error, byte cert_der[], String url) {
- final SslError ssl_error;
+ private void reportSslCertError(final int handle, final int certError, byte certDER[],
+ String url) {
+ final SslError sslError;
try {
- X509Certificate cert = new X509CertImpl(cert_der);
+ X509Certificate cert = new X509CertImpl(certDER);
SslCertificate sslCert = new SslCertificate(cert);
if (JniUtil.useChromiumHttpStack()) {
- ssl_error = SslError.SslErrorFromChromiumErrorCode(cert_error, sslCert,
+ sslError = SslError.SslErrorFromChromiumErrorCode(certError, sslCert,
new URL(url).getHost());
} else {
- ssl_error = new SslError(cert_error, cert, url);
+ sslError = new SslError(certError, cert, url);
}
} catch (IOException e) {
// Can't get the certificate, not much to do.
Log.e(LOGTAG, "Can't get the certificate from WebKit, canceling");
- nativeSslCertErrorCancel(handle, cert_error);
+ nativeSslCertErrorCancel(handle, certError);
+ return;
+ }
+
+ if (SslCertLookupTable.getInstance().isAllowed(sslError)) {
+ nativeSslCertErrorProceed(handle);
return;
}
SslErrorHandler handler = new SslErrorHandler() {
-
@Override
public void proceed() {
- SslCertLookupTable.getInstance().Allow(ssl_error);
+ SslCertLookupTable.getInstance().setIsAllowed(sslError, true);
nativeSslCertErrorProceed(handle);
}
-
@Override
public void cancel() {
- SslCertLookupTable.getInstance().Deny(ssl_error);
- nativeSslCertErrorCancel(handle, cert_error);
+ SslCertLookupTable.getInstance().setIsAllowed(sslError, false);
+ nativeSslCertErrorCancel(handle, certError);
}
};
-
- if (SslCertLookupTable.getInstance().IsAllowed(ssl_error)) {
- nativeSslCertErrorProceed(handle);
- } else {
- mCallbackProxy.onReceivedSslError(handler, ssl_error);
- }
+ mCallbackProxy.onReceivedSslError(handler, sslError);
}
/**
@@ -1416,7 +1414,7 @@
private native void nativeAuthenticationCancel(int handle);
private native void nativeSslCertErrorProceed(int handle);
- private native void nativeSslCertErrorCancel(int handle, int cert_error);
+ private native void nativeSslCertErrorCancel(int handle, int certError);
native void nativeSslClientCert(int handle,
byte[] pkcs8EncodedPrivateKey,
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 88583df..5ee90a4 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -165,8 +165,6 @@
/**
* Get the WebViewClient.
* @return the current WebViewClient instance.
- *
- *@hide pending API council approval.
*/
public WebViewClient getWebViewClient() {
return mWebViewClient;
@@ -907,11 +905,9 @@
*/
public void onPageStarted(String url, Bitmap favicon) {
- // Do an unsynchronized quick check to avoid posting if no callback has
- // been set.
- if (mWebViewClient == null) {
- return;
- }
+ // We need to send the message even if no WebViewClient is set, because we need to call
+ // WebView.onPageStarted().
+
// Performance probe
if (PERF_PROBE) {
mWebCoreThreadTime = SystemClock.currentThreadTimeMillis();
@@ -1013,10 +1009,6 @@
sendMessage(msg);
}
- /**
- * @hide - hide this because it contains a parameter of type SslError.
- * SslError is located in a hidden package.
- */
public void onReceivedSslError(SslErrorHandler handler, SslError error) {
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
@@ -1031,9 +1023,7 @@
msg.obj = map;
sendMessage(msg);
}
- /**
- * @hide
- */
+
public void onReceivedClientCertRequest(ClientCertRequestHandler handler, String host_and_port) {
// Do an unsynchronized quick check to avoid posting if no callback has
// been set.
@@ -1048,17 +1038,8 @@
msg.obj = map;
sendMessage(msg);
}
- /**
- * @hide - hide this because it contains a parameter of type SslCertificate,
- * which is located in a hidden package.
- */
public void onReceivedCertificate(SslCertificate certificate) {
- // Do an unsynchronized quick check to avoid posting if no callback has
- // been set.
- if (mWebViewClient == null) {
- return;
- }
// here, certificate can be null (if the site is not secure)
sendMessage(obtainMessage(RECEIVED_CERTIFICATE, certificate));
}
diff --git a/core/java/android/webkit/HTML5VideoInline.java b/core/java/android/webkit/HTML5VideoInline.java
index 97dc291..42581c2 100644
--- a/core/java/android/webkit/HTML5VideoInline.java
+++ b/core/java/android/webkit/HTML5VideoInline.java
@@ -1,6 +1,8 @@
package android.webkit;
+import android.Manifest.permission;
+import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.webkit.HTML5VideoView;
@@ -52,7 +54,12 @@
public void prepareDataAndDisplayMode(HTML5VideoViewProxy proxy) {
super.prepareDataAndDisplayMode(proxy);
setFrameAvailableListener(proxy);
- mPlayer.setWakeMode(proxy.getContext(), PowerManager.FULL_WAKE_LOCK);
+ // TODO: This is a workaround, after b/5375681 fixed, we should switch
+ // to the better way.
+ if (mProxy.getContext().checkCallingOrSelfPermission(permission.WAKE_LOCK)
+ == PackageManager.PERMISSION_GRANTED) {
+ mPlayer.setWakeMode(proxy.getContext(), PowerManager.FULL_WAKE_LOCK);
+ }
}
// Pause the play and update the play/pause button
diff --git a/core/java/android/webkit/SslCertLookupTable.java b/core/java/android/webkit/SslCertLookupTable.java
index faff110..052244f 100644
--- a/core/java/android/webkit/SslCertLookupTable.java
+++ b/core/java/android/webkit/SslCertLookupTable.java
@@ -20,14 +20,15 @@
import android.net.http.SslError;
/**
- * A simple class to store the wrong certificates that user is aware but
- * chose to proceed.
+ * Stores the user's decision of whether to allow or deny an invalid certificate.
+ *
+ * This class is not threadsafe. It is used only on the WebCore thread.
*/
final class SslCertLookupTable {
private static SslCertLookupTable sTable;
private final Bundle table;
- public static synchronized SslCertLookupTable getInstance() {
+ public static SslCertLookupTable getInstance() {
if (sTable == null) {
sTable = new SslCertLookupTable();
}
@@ -38,15 +39,15 @@
table = new Bundle();
}
- public void Allow(SslError ssl_error) {
- table.putBoolean(ssl_error.toString(), true);
+ public void setIsAllowed(SslError sslError, boolean allow) {
+ table.putBoolean(sslError.toString(), allow);
}
- public void Deny(SslError ssl_error) {
- table.putBoolean(ssl_error.toString(), false);
+ public boolean isAllowed(SslError sslError) {
+ return table.getBoolean(sslError.toString());
}
- public boolean IsAllowed(SslError ssl_error) {
- return table.getBoolean(ssl_error.toString());
+ public void clear() {
+ table.clear();
}
}
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 47629c4..530b230 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -1808,6 +1808,8 @@
/**
* Restore the display data that was save in {@link #savePicture}. Used in
* conjunction with {@link #restoreState}.
+ *
+ * Note that this will not work if the WebView is hardware accelerated.
* @param b A Bundle containing the saved display data.
* @param src The file where the picture data was stored.
* @return True if the picture was successfully restored.
@@ -2390,6 +2392,12 @@
return mZoomManager.getScale();
}
+ // Called by JNI. Returns the scale to apply to the text selection handles
+ /* package */ float getTextHandleScale() {
+ float density = mContext.getResources().getDisplayMetrics().density;
+ return density / getScale();
+ }
+
/**
* Return the reading level scale of the WebView
* @return The reading level scale.
@@ -4300,6 +4308,7 @@
selectionDone();
}
mOrientation = newConfig.orientation;
+ contentInvalidateAll();
}
/**
@@ -9280,13 +9289,13 @@
private static void checkThread() {
if (Looper.myLooper() != Looper.getMainLooper()) {
- RuntimeException exception = new RuntimeException(
- "A WebView method was called on thread '" +
+ Throwable throwable = new Throwable(
+ "Warning: A WebView method was called on thread '" +
Thread.currentThread().getName() + "'. " +
"All WebView methods must be called on the UI thread. " +
"Future versions of WebView may not support use on other threads.");
- Log.e(LOGTAG, Log.getStackTraceString(exception));
- StrictMode.onWebViewMethodCalledOnWrongThread(exception);
+ Log.w(LOGTAG, Log.getStackTraceString(throwable));
+ StrictMode.onWebViewMethodCalledOnWrongThread(throwable);
}
}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 470e843..deaf0f2 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1349,8 +1349,14 @@
}
case CLEAR_SSL_PREF_TABLE:
- Network.getInstance(mContext)
- .clearUserSslPrefTable();
+ if (JniUtil.useChromiumHttpStack()) {
+ // FIXME: This will not work for connections currently in use, as
+ // they cache the certificate responses. See http://b/5324235.
+ SslCertLookupTable.getInstance().clear();
+ nativeCloseIdleConnections();
+ } else {
+ Network.getInstance(mContext).clearUserSslPrefTable();
+ }
break;
case TOUCH_UP:
diff --git a/core/java/android/widget/BaseAdapter.java b/core/java/android/widget/BaseAdapter.java
index 532fd76..401fcb8 100644
--- a/core/java/android/widget/BaseAdapter.java
+++ b/core/java/android/widget/BaseAdapter.java
@@ -43,13 +43,18 @@
}
/**
- * Notifies the attached View that the underlying data has been changed
- * and it should refresh itself.
+ * Notifies the attached observers that the underlying data has been changed
+ * and any View reflecting the data set should refresh itself.
*/
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
-
+
+ /**
+ * Notifies the attached observers that the underlying data is no longer valid
+ * or available. Once invoked this adapter is no longer valid and should
+ * not report further data set changes.
+ */
public void notifyDataSetInvalidated() {
mDataSetObservable.notifyInvalidated();
}
diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java
index a63b8c8..90ece5d 100644
--- a/core/java/android/widget/MediaController.java
+++ b/core/java/android/widget/MediaController.java
@@ -75,6 +75,7 @@
private WindowManager mWindowManager;
private Window mWindow;
private View mDecor;
+ private WindowManager.LayoutParams mDecorLayoutParams;
private ProgressBar mProgress;
private TextView mEndTime, mCurrentTime;
private boolean mShowing;
@@ -120,6 +121,7 @@
mContext = context;
mUseFastForward = true;
initFloatingWindow();
+ initFloatingWindowLayout();
}
private void initFloatingWindow() {
@@ -142,6 +144,48 @@
requestFocus();
}
+ // Allocate and initialize the static parts of mDecorLayoutParams. Must
+ // also call updateFloatingWindowLayout() to fill in the dynamic parts
+ // (y and width) before mDecorLayoutParams can be used.
+ private void initFloatingWindowLayout() {
+ mDecorLayoutParams = new WindowManager.LayoutParams();
+ WindowManager.LayoutParams p = mDecorLayoutParams;
+ p.gravity = Gravity.TOP;
+ p.height = LayoutParams.WRAP_CONTENT;
+ p.x = 0;
+ p.format = PixelFormat.TRANSLUCENT;
+ p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
+ p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
+ p.token = null;
+ p.windowAnimations = 0; // android.R.style.DropDownAnimationDown;
+ }
+
+ // Update the dynamic parts of mDecorLayoutParams
+ // Must be called with mAnchor != NULL.
+ private void updateFloatingWindowLayout() {
+ int [] anchorPos = new int[2];
+ mAnchor.getLocationOnScreen(anchorPos);
+
+ WindowManager.LayoutParams p = mDecorLayoutParams;
+ p.width = mAnchor.getWidth();
+ p.y = anchorPos[1] + mAnchor.getHeight();
+ }
+
+ // This is called whenever mAnchor's layout bound changes
+ private OnLayoutChangeListener mLayoutChangeListener =
+ new OnLayoutChangeListener() {
+ public void onLayoutChange(View v, int left, int top, int right,
+ int bottom, int oldLeft, int oldTop, int oldRight,
+ int oldBottom) {
+ updateFloatingWindowLayout();
+ if (mShowing) {
+ mWindowManager.updateViewLayout(mDecor, mDecorLayoutParams);
+ }
+ }
+ };
+
private OnTouchListener mTouchListener = new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
@@ -164,7 +208,13 @@
* @param view The view to which to anchor the controller when it is visible.
*/
public void setAnchorView(View view) {
+ if (mAnchor != null) {
+ mAnchor.removeOnLayoutChangeListener(mLayoutChangeListener);
+ }
mAnchor = view;
+ if (mAnchor != null) {
+ mAnchor.addOnLayoutChangeListener(mLayoutChangeListener);
+ }
FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
@@ -279,31 +329,14 @@
* the controller until hide() is called.
*/
public void show(int timeout) {
-
if (!mShowing && mAnchor != null) {
setProgress();
if (mPauseButton != null) {
mPauseButton.requestFocus();
}
disableUnsupportedButtons();
-
- int [] anchorpos = new int[2];
- mAnchor.getLocationOnScreen(anchorpos);
-
- WindowManager.LayoutParams p = new WindowManager.LayoutParams();
- p.gravity = Gravity.TOP;
- p.width = mAnchor.getWidth();
- p.height = LayoutParams.WRAP_CONTENT;
- p.x = 0;
- p.y = anchorpos[1] + mAnchor.getHeight() - p.height;
- p.format = PixelFormat.TRANSLUCENT;
- p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
- p.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
- p.token = null;
- p.windowAnimations = 0; // android.R.style.DropDownAnimationDown;
- mWindowManager.addView(mDecor, p);
+ updateFloatingWindowLayout();
+ mWindowManager.addView(mDecor, mDecorLayoutParams);
mShowing = true;
}
updatePausePlay();
diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java
index f230031..adf2b7b 100644
--- a/core/java/android/widget/SearchView.java
+++ b/core/java/android/widget/SearchView.java
@@ -120,6 +120,7 @@
private CharSequence mOldQueryText;
private CharSequence mUserQuery;
private boolean mExpandedInActionView;
+ private int mCollapsedImeOptions;
private SearchableInfo mSearchable;
private Bundle mAppSearchData;
@@ -1166,6 +1167,7 @@
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setText("");
+ mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
@@ -1175,6 +1177,8 @@
@Override
public void onActionViewExpanded() {
mExpandedInActionView = true;
+ mCollapsedImeOptions = mQueryTextView.getImeOptions();
+ mQueryTextView.setImeOptions(mCollapsedImeOptions | EditorInfo.IME_FLAG_NO_FULLSCREEN);
setIconified(false);
}
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index 14cbf6f..6b2f3e4 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -75,6 +75,20 @@
mLength = 0;
}
+ /**
+ * @return true if a spell checker session has successfully been created. Returns false if not,
+ * for instance when spell checking has been disabled in settings.
+ */
+ public boolean isSessionActive() {
+ return mSpellCheckerSession != null;
+ }
+
+ public void closeSession() {
+ if (mSpellCheckerSession != null) {
+ mSpellCheckerSession.close();
+ }
+ }
+
public void addSpellCheckSpan(SpellCheckSpan spellCheckSpan) {
int length = mIds.length;
if (mLength >= length) {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 8db6592..8ea55c6 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -3250,7 +3250,8 @@
sendOnTextChanged(text, 0, oldlen, textLength);
onTextChanged(text, 0, oldlen, textLength);
- if (startSpellCheck) {
+ if (startSpellCheck && mSpellChecker != null) {
+ // This view has to have been previously attached for mSpellChecker to exist
updateSpellCheckSpans(0, textLength);
}
@@ -4412,6 +4413,8 @@
// Resolve drawables as the layout direction has been resolved
resolveDrawables();
+
+ updateSpellCheckSpans(0, mText.length());
}
@Override
@@ -4443,6 +4446,14 @@
hideControllers();
resetResolvedDrawables();
+
+ if (mSpellChecker != null) {
+ mSpellChecker.closeSession();
+ removeMisspelledSpans();
+ // Forces the creation of a new SpellChecker next time this window is created.
+ // Will handle the cases where the settings has been changed in the meantime.
+ mSpellChecker = null;
+ }
}
@Override
@@ -6130,7 +6141,7 @@
TruncateAt effectiveEllipsize = mEllipsize;
if (mEllipsize == TruncateAt.MARQUEE &&
mMarqueeFadeMode == MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS) {
- effectiveEllipsize = TruncateAt.END;
+ effectiveEllipsize = TruncateAt.END_SMALL;
}
if (mTextDir == null) {
@@ -7595,7 +7606,7 @@
}
ims.mChangedDelta += after-before;
}
-
+
sendOnTextChanged(buffer, start, before, after);
onTextChanged(buffer, start, before, after);
@@ -7737,7 +7748,8 @@
* Create new SpellCheckSpans on the modified region.
*/
private void updateSpellCheckSpans(int start, int end) {
- if (!(mText instanceof Editable) || !isSuggestionsEnabled()) return;
+ if (!isTextEditable() || !isSuggestionsEnabled() || !getSpellChecker().isSessionActive())
+ return;
Editable text = (Editable) mText;
WordIterator wordIterator = getWordIterator();
@@ -8427,13 +8439,31 @@
int flags = suggestionSpans[i].getFlags();
if ((flags & SuggestionSpan.FLAG_EASY_CORRECT) != 0
&& (flags & SuggestionSpan.FLAG_MISSPELLED) == 0) {
- flags = flags & ~SuggestionSpan.FLAG_EASY_CORRECT;
+ flags &= ~SuggestionSpan.FLAG_EASY_CORRECT;
suggestionSpans[i].setFlags(flags);
}
}
}
}
+ /**
+ * Removes the suggestion spans for misspelled words.
+ */
+ private void removeMisspelledSpans() {
+ if (mText instanceof Spannable) {
+ Spannable spannable = (Spannable) mText;
+ SuggestionSpan[] suggestionSpans = spannable.getSpans(0,
+ spannable.length(), SuggestionSpan.class);
+ for (int i = 0; i < suggestionSpans.length; i++) {
+ int flags = suggestionSpans[i].getFlags();
+ if ((flags & SuggestionSpan.FLAG_EASY_CORRECT) != 0
+ && (flags & SuggestionSpan.FLAG_MISSPELLED) != 0) {
+ spannable.removeSpan(suggestionSpans[i]);
+ }
+ }
+ }
+ }
+
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
if (mMovement != null && mText instanceof Spannable && mLayout != null) {
@@ -9573,7 +9603,6 @@
private final Comparator<SuggestionSpan> mSuggestionSpanComparator;
private final HashMap<SuggestionSpan, Integer> mSpansLengths;
-
private class CustomPopupWindow extends PopupWindow {
public CustomPopupWindow(Context context, int defStyle) {
super(context, null, defStyle);
@@ -9585,9 +9614,8 @@
TextView.this.getPositionListener().removeSubscriber(SuggestionsPopupWindow.this);
- if ((mText instanceof Spannable)) {
- ((Spannable) mText).removeSpan(mSuggestionRangeSpan);
- }
+ // Safe cast since show() checks that mText is an Editable
+ ((Spannable) mText).removeSpan(mSuggestionRangeSpan);
setCursorVisible(mCursorWasVisibleBeforeSuggestions);
if (hasInsertionController()) {
@@ -9637,8 +9665,8 @@
void removeMisspelledFlag() {
int suggestionSpanFlags = suggestionSpan.getFlags();
if ((suggestionSpanFlags & SuggestionSpan.FLAG_MISSPELLED) > 0) {
- suggestionSpanFlags &= ~(SuggestionSpan.FLAG_MISSPELLED);
- suggestionSpanFlags &= ~(SuggestionSpan.FLAG_EASY_CORRECT);
+ suggestionSpanFlags &= ~SuggestionSpan.FLAG_MISSPELLED;
+ suggestionSpanFlags &= ~SuggestionSpan.FLAG_EASY_CORRECT;
suggestionSpan.setFlags(suggestionSpanFlags);
}
}
@@ -9887,6 +9915,8 @@
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ hide();
+
if (view instanceof TextView) {
TextView textView = (TextView) view;
Editable editable = (Editable) mText;
@@ -9894,6 +9924,7 @@
SuggestionInfo suggestionInfo = mSuggestionInfos[position];
final int spanStart = editable.getSpanStart(suggestionInfo.suggestionSpan);
final int spanEnd = editable.getSpanEnd(suggestionInfo.suggestionSpan);
+ if (spanStart < 0 || spanEnd < 0) return; // Span has been removed
final String originalText = mText.subSequence(spanStart, spanEnd).toString();
if (suggestionInfo.suggestionIndex < 0) {
@@ -9955,7 +9986,6 @@
Selection.setSelection(editable, spanEnd + lengthDifference);
}
}
- hide();
}
}
@@ -10520,9 +10550,7 @@
public abstract int getCurrentCursorOffset();
- protected void updateSelection(int offset) {
- updateDrawable();
- }
+ protected abstract void updateSelection(int offset);
public abstract void updatePosition(float x, float y);
@@ -10796,8 +10824,8 @@
@Override
public void updateSelection(int offset) {
- super.updateSelection(offset);
Selection.setSelection((Spannable) mText, offset, getSelectionEnd());
+ updateDrawable();
}
@Override
@@ -10838,8 +10866,8 @@
@Override
public void updateSelection(int offset) {
- super.updateSelection(offset);
Selection.setSelection((Spannable) mText, getSelectionStart(), offset);
+ updateDrawable();
}
@Override
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index 88a0e01..8e438ff 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -456,13 +456,6 @@
seekTo(mSeekWhenPrepared);
}
start();
- if (mMediaController != null) {
- if (mMediaController.isShowing()) {
- // ensure the controller will get repositioned later
- mMediaController.hide();
- }
- mMediaController.show();
- }
}
}
diff --git a/core/java/com/android/internal/policy/IFaceLockCallback.aidl b/core/java/com/android/internal/policy/IFaceLockCallback.aidl
index 1eadc41..4f76c71 100644
--- a/core/java/com/android/internal/policy/IFaceLockCallback.aidl
+++ b/core/java/com/android/internal/policy/IFaceLockCallback.aidl
@@ -21,5 +21,4 @@
oneway interface IFaceLockCallback {
void unlock();
void cancel();
- void sleepDevice();
}
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index 159929b..3d22929 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -133,4 +133,13 @@
}
return false;
}
+
+ public static boolean contains(int[] array, int value) {
+ for (int element : array) {
+ if (element == value) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
index 0db1ccc..aabea2c 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
@@ -200,8 +200,19 @@
}
}
- final boolean hasOverflow = mReserveOverflow && mMenu != null &&
- mMenu.getNonActionItems().size() > 0;
+ final ArrayList<MenuItemImpl> nonActionItems = mMenu != null ?
+ mMenu.getNonActionItems() : null;
+
+ boolean hasOverflow = false;
+ if (mReserveOverflow && nonActionItems != null) {
+ final int count = nonActionItems.size();
+ if (count == 1) {
+ hasOverflow = !nonActionItems.get(0).isActionViewExpanded();
+ } else {
+ hasOverflow = count > 0;
+ }
+ }
+
if (hasOverflow) {
if (mOverflowButton == null) {
mOverflowButton = new OverflowMenuButton(mContext);
diff --git a/core/java/com/android/internal/view/menu/ListMenuPresenter.java b/core/java/com/android/internal/view/menu/ListMenuPresenter.java
index 0141427..a331bec 100644
--- a/core/java/com/android/internal/view/menu/ListMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ListMenuPresenter.java
@@ -17,6 +17,7 @@
package com.android.internal.view.menu;
import android.content.Context;
+import android.database.DataSetObserver;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -47,7 +48,7 @@
int mItemLayoutRes;
private Callback mCallback;
- private MenuAdapter mAdapter;
+ MenuAdapter mAdapter;
private int mId;
@@ -216,14 +217,29 @@
}
private class MenuAdapter extends BaseAdapter {
+ private int mExpandedIndex = -1;
+
+ public MenuAdapter() {
+ registerDataSetObserver(new ExpandedIndexObserver());
+ findExpandedIndex();
+ }
+
public int getCount() {
ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
- return items.size() - mItemIndexOffset;
+ int count = items.size() - mItemIndexOffset;
+ if (mExpandedIndex < 0) {
+ return count;
+ }
+ return count - 1;
}
public MenuItemImpl getItem(int position) {
ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
- return items.get(position + mItemIndexOffset);
+ position += mItemIndexOffset;
+ if (mExpandedIndex >= 0 && position >= mExpandedIndex) {
+ position++;
+ }
+ return items.get(position);
}
public long getItemId(int position) {
@@ -241,5 +257,28 @@
itemView.initialize(getItem(position), 0);
return convertView;
}
+
+ void findExpandedIndex() {
+ final MenuItemImpl expandedItem = mMenu.getExpandedItem();
+ if (expandedItem != null) {
+ final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
+ final int count = items.size();
+ for (int i = 0; i < count; i++) {
+ final MenuItemImpl item = items.get(i);
+ if (item == expandedItem) {
+ mExpandedIndex = i;
+ return;
+ }
+ }
+ }
+ mExpandedIndex = -1;
+ }
+ }
+
+ private class ExpandedIndexObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ mAdapter.findExpandedIndex();
+ }
}
}
diff --git a/core/java/com/android/internal/view/menu/MenuBuilder.java b/core/java/com/android/internal/view/menu/MenuBuilder.java
index c30e83b..9fbca82 100644
--- a/core/java/com/android/internal/view/menu/MenuBuilder.java
+++ b/core/java/com/android/internal/view/menu/MenuBuilder.java
@@ -1258,4 +1258,8 @@
}
return collapsed;
}
+
+ public MenuItemImpl getExpandedItem() {
+ return mExpandedItem;
+ }
}
diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
index 6265618..329b457 100644
--- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java
+++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.res.Resources;
+import android.database.DataSetObserver;
import android.os.Parcelable;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -286,22 +287,45 @@
return false;
}
+ @Override
+ public int getId() {
+ return 0;
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ return null;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ }
+
private class MenuAdapter extends BaseAdapter {
private MenuBuilder mAdapterMenu;
+ private int mExpandedIndex = -1;
public MenuAdapter(MenuBuilder menu) {
mAdapterMenu = menu;
+ registerDataSetObserver(new ExpandedIndexObserver());
+ findExpandedIndex();
}
public int getCount() {
ArrayList<MenuItemImpl> items = mOverflowOnly ?
mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
- return items.size();
+ if (mExpandedIndex < 0) {
+ return items.size();
+ }
+ return items.size() - 1;
}
public MenuItemImpl getItem(int position) {
ArrayList<MenuItemImpl> items = mOverflowOnly ?
mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
+ if (mExpandedIndex >= 0 && position >= mExpandedIndex) {
+ position++;
+ }
return items.get(position);
}
@@ -323,19 +347,28 @@
itemView.initialize(getItem(position), 0);
return convertView;
}
+
+ void findExpandedIndex() {
+ final MenuItemImpl expandedItem = mMenu.getExpandedItem();
+ if (expandedItem != null) {
+ final ArrayList<MenuItemImpl> items = mMenu.getNonActionItems();
+ final int count = items.size();
+ for (int i = 0; i < count; i++) {
+ final MenuItemImpl item = items.get(i);
+ if (item == expandedItem) {
+ mExpandedIndex = i;
+ return;
+ }
+ }
+ }
+ mExpandedIndex = -1;
+ }
}
- @Override
- public int getId() {
- return 0;
- }
-
- @Override
- public Parcelable onSaveInstanceState() {
- return null;
- }
-
- @Override
- public void onRestoreInstanceState(Parcelable state) {
+ private class ExpandedIndexObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ mAdapter.findExpandedIndex();
+ }
}
}
diff --git a/core/java/com/android/internal/widget/AbsActionBarView.java b/core/java/com/android/internal/widget/AbsActionBarView.java
index 6c11288..06f5158 100644
--- a/core/java/com/android/internal/widget/AbsActionBarView.java
+++ b/core/java/com/android/internal/widget/AbsActionBarView.java
@@ -35,6 +35,8 @@
protected ActionMenuView mMenuView;
protected ActionMenuPresenter mActionMenuPresenter;
protected ActionBarContainer mSplitView;
+ protected boolean mSplitActionBar;
+ protected boolean mSplitWhenNarrow;
protected int mContentHeight;
protected Animator mVisibilityAnim;
@@ -66,11 +68,31 @@
com.android.internal.R.attr.actionBarStyle, 0);
setContentHeight(a.getLayoutDimension(R.styleable.ActionBar_height, 0));
a.recycle();
+ if (mSplitWhenNarrow) {
+ setSplitActionBar(getContext().getResources().getBoolean(
+ com.android.internal.R.bool.split_action_bar_is_narrow));
+ }
if (mActionMenuPresenter != null) {
mActionMenuPresenter.onConfigurationChanged(newConfig);
}
}
+ /**
+ * Sets whether the bar should be split right now, no questions asked.
+ * @param split true if the bar should split
+ */
+ public void setSplitActionBar(boolean split) {
+ mSplitActionBar = split;
+ }
+
+ /**
+ * Sets whether the bar should split if we enter a narrow screen configuration.
+ * @param splitWhenNarrow true if the bar should check to split after a config change
+ */
+ public void setSplitWhenNarrow(boolean splitWhenNarrow) {
+ mSplitWhenNarrow = splitWhenNarrow;
+ }
+
public void setContentHeight(int height) {
mContentHeight = height;
requestLayout();
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index 7bc33c7..acffa5c 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -93,6 +93,39 @@
a.recycle();
}
+ @Override
+ public void setSplitActionBar(boolean split) {
+ if (mSplitActionBar != split) {
+ if (mActionMenuPresenter != null) {
+ // Mode is already active; move everything over and adjust the menu itself.
+ final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
+ LayoutParams.MATCH_PARENT);
+ if (!split) {
+ mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+ mMenuView.setBackgroundDrawable(null);
+ final ViewGroup oldParent = (ViewGroup) mMenuView.getParent();
+ if (oldParent != null) oldParent.removeView(mMenuView);
+ addView(mMenuView, layoutParams);
+ } else {
+ // Allow full screen width in split mode.
+ mActionMenuPresenter.setWidthLimit(
+ getContext().getResources().getDisplayMetrics().widthPixels, true);
+ // No limit to the item count; use whatever will fit.
+ mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE);
+ // Span the whole width
+ layoutParams.width = LayoutParams.MATCH_PARENT;
+ layoutParams.height = mContentHeight;
+ mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
+ mMenuView.setBackgroundDrawable(mSplitBackground);
+ final ViewGroup oldParent = (ViewGroup) mMenuView.getParent();
+ if (oldParent != null) oldParent.removeView(mMenuView);
+ mSplitView.addView(mMenuView, layoutParams);
+ }
+ }
+ super.setSplitActionBar(split);
+ }
+ }
+
public void setContentHeight(int height) {
mContentHeight = height;
}
@@ -179,7 +212,7 @@
final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.MATCH_PARENT);
- if (mSplitView == null) {
+ if (!mSplitActionBar) {
menu.addMenuPresenter(mActionMenuPresenter);
mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this);
mMenuView.setBackgroundDrawable(null);
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index bbecb6c..6d2e823 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -113,7 +113,6 @@
private int mProgressStyle;
private int mIndeterminateProgressStyle;
- private boolean mSplitActionBar;
private boolean mUserTitle;
private boolean mIncludeTabs;
private boolean mIsCollapsable;
@@ -133,6 +132,8 @@
private ExpandedActionViewMenuPresenter mExpandedMenuPresenter;
View mExpandedActionView;
+ Window.Callback mWindowCallback;
+
private final AdapterView.OnItemSelectedListener mNavItemSelectedListener =
new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView parent, View view, int position, long id) {
@@ -157,11 +158,7 @@
private final OnClickListener mUpClickListener = new OnClickListener() {
public void onClick(View v) {
- Context context = getContext();
- if (context instanceof Activity) {
- Activity activity = (Activity) context;
- activity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem);
- }
+ mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem);
}
};
@@ -276,6 +273,14 @@
}
}
+ /**
+ * Set the window callback used to invoke menu items; used for dispatching home button presses.
+ * @param cb Window callback to dispatch to
+ */
+ public void setWindowCallback(Window.Callback cb) {
+ mWindowCallback = cb;
+ }
+
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
@@ -301,6 +306,7 @@
addView(mIndeterminateProgressView);
}
+ @Override
public void setSplitActionBar(boolean splitActionBar) {
if (mSplitActionBar != splitActionBar) {
if (mMenuView != null) {
@@ -316,7 +322,10 @@
addView(mMenuView);
}
}
- mSplitActionBar = splitActionBar;
+ if (mSplitView != null) {
+ mSplitView.setVisibility(splitActionBar ? VISIBLE : GONE);
+ }
+ super.setSplitActionBar(splitActionBar);
}
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 19dc42b..81e7c34 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -947,10 +947,15 @@
*
* If there's currently a call in progress, the button will take them to the call
* @param button the button to update
+ * @param the phone state:
+ * {@link TelephonyManager#CALL_STATE_IDLE}
+ * {@link TelephonyManager#CALL_STATE_RINGING}
+ * {@link TelephonyManager#CALL_STATE_OFFHOOK}
* @param showIfCapable indicates whether the button should be shown if emergency calls are
* possible on the device
*/
- public void updateEmergencyCallButtonState(Button button, boolean showIfCapable) {
+ public void updateEmergencyCallButtonState(Button button, int phoneState,
+ boolean showIfCapable) {
if (isEmergencyCallCapable() && showIfCapable) {
button.setVisibility(View.VISIBLE);
} else {
@@ -958,9 +963,8 @@
return;
}
- int newState = TelephonyManager.getDefault().getCallState();
int textId;
- if (newState == TelephonyManager.CALL_STATE_OFFHOOK) {
+ if (phoneState == TelephonyManager.CALL_STATE_OFFHOOK) {
// show "return to call" text and show phone icon
textId = R.string.lockscreen_return_to_call;
int phoneCallIcon = R.drawable.stat_sys_phone_call;
@@ -990,22 +994,4 @@
}
return false;
}
-
- /**
- * Performs concentenation of PLMN/SPN
- * @param plmn
- * @param spn
- * @return
- */
- public static CharSequence getCarrierString(CharSequence plmn, CharSequence spn) {
- if (plmn != null && spn == null) {
- return plmn;
- } else if (plmn != null && spn != null) {
- return plmn + "|" + spn;
- } else if (plmn == null && spn != null) {
- return spn;
- } else {
- return "";
- }
- }
}
diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
index 1b5112f..ebd355a 100644
--- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
+++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
@@ -428,7 +428,7 @@
"x", mWaveCenterX,
"y", mWaveCenterY,
"onUpdate", mUpdateListener,
- "onComplete", mResetListenerWithPing);
+ "onComplete", mDragging ? mResetListenerWithPing : mResetListener);
}
setGrabbedState(OnTriggerListener.NO_HANDLE);
diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp
index c045c07..86ae7d2a 100644
--- a/core/jni/android/graphics/TextLayoutCache.cpp
+++ b/core/jni/android/graphics/TextLayoutCache.cpp
@@ -551,8 +551,7 @@
// Get LogClusters
if (outLogClusters) {
size_t countLogClusters = outLogClusters->size();
- size_t countGlyphs = shaperItem.num_glyphs;
- for (size_t i = 0; i < countGlyphs; i++) {
+ for (size_t i = 0; i < count; i++) {
// As there may be successive runs, we need to shift the log clusters
unsigned short logCluster = shaperItem.log_clusters[i] + countLogClusters;
#if DEBUG_GLYPHS
@@ -620,25 +619,15 @@
*outGlyphsCount = 0;
return;
}
- size_t endIndex = 0;
- for(size_t i = 0; i < mGlyphs.size(); i++) {
- if (mLogClusters[i] <= start) {
- *outStartIndex = i;
- endIndex = i;
- continue;
- }
- if (mLogClusters[i] <= start + count) {
- endIndex = i;
- }
- }
- *outGlyphsCount = endIndex - *outStartIndex + 1;
+ *outStartIndex = mLogClusters[start];
+ *outGlyphsCount = mLogClusters[start + count - 1] - mLogClusters[start] + 1;
#if DEBUG_GLYPHS
LOGD("getGlyphsIndexes - start=%d count=%d - startIndex=%d count=%d", start, count,
*outStartIndex, *outGlyphsCount);
for(size_t i = 0; i < mGlyphs.size(); i++) {
LOGD("getGlyphs - all - glyph[%d] = %d", i, mGlyphs[i]);
}
- for(size_t i = 0; i < mGlyphs.size(); i++) {
+ for(size_t i = 0; i < mAdvances.size(); i++) {
LOGD("getGlyphs - all - logcl[%d] = %d", i, mLogClusters[i]);
}
#endif
diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp
index 84a50f0..84c636b 100644
--- a/core/jni/android_net_wifi_Wifi.cpp
+++ b/core/jni/android_net_wifi_Wifi.cpp
@@ -402,30 +402,6 @@
return (jint)rssi;
}
-static jint android_net_wifi_getRssiCommand(JNIEnv* env, jobject)
-{
- return android_net_wifi_getRssiHelper("DRIVER RSSI");
-}
-
-static jint android_net_wifi_getRssiApproxCommand(JNIEnv* env, jobject)
-{
- return android_net_wifi_getRssiHelper("DRIVER RSSI-APPROX");
-}
-
-static jint android_net_wifi_getLinkSpeedCommand(JNIEnv* env, jobject)
-{
- char reply[BUF_SIZE];
- int linkspeed;
-
- if (doCommand("DRIVER LINKSPEED", reply, sizeof(reply)) != 0) {
- return (jint)-1;
- }
- // reply comes back in the form "LinkSpeed XX" where XX is the
- // number we're interested in.
- sscanf(reply, "%*s %u", &linkspeed);
- return (jint)linkspeed;
-}
-
static jstring android_net_wifi_getMacAddressCommand(JNIEnv* env, jobject)
{
char reply[BUF_SIZE];
@@ -625,10 +601,6 @@
(void*) android_net_wifi_setBluetoothCoexistenceModeCommand },
{ "setBluetoothCoexistenceScanModeCommand", "(Z)Z",
(void*) android_net_wifi_setBluetoothCoexistenceScanModeCommand },
- { "getRssiCommand", "()I", (void*) android_net_wifi_getRssiCommand },
- { "getRssiApproxCommand", "()I",
- (void*) android_net_wifi_getRssiApproxCommand},
- { "getLinkSpeedCommand", "()I", (void*) android_net_wifi_getLinkSpeedCommand },
{ "getMacAddressCommand", "()Ljava/lang/String;", (void*) android_net_wifi_getMacAddressCommand },
{ "saveConfigCommand", "()Z", (void*) android_net_wifi_saveConfigCommand },
{ "reloadConfigCommand", "()Z", (void*) android_net_wifi_reloadConfigCommand },
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png
index 671ca31..52a9800 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png
index b024da4..49a2aeb 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png
index cba1ff5..e6ebb43 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png
index 62537b0..7069fc5 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
index 5d559e1..ec2a7e3 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png
index 5041ff9..486334f 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_holo.png b/core/res/res/drawable-hdpi/btn_check_on_holo.png
index 4c1bfbc..1f11a78 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_holo.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png
index 3492b8a..a17100c 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_holo_light.png
index 49e837c..130ab4f 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
index 0d4e8b3..96abcda 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
index c4283b6..0a22f02 100644
--- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png b/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png
index 9409890..28b2578 100644
--- a/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png
+++ b/core/res/res/drawable-hdpi/btn_code_lock_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png b/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png
index 55acc9a..66cb1ec 100644
--- a/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png
+++ b/core/res/res/drawable-hdpi/btn_code_lock_touched_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png
index 34762f8..824b45a 100644
--- a/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png b/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png
index 34762f8..824b45a 100644
--- a/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png
index 0d2eb4b..34ec825 100644
--- a/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png
index 7de8d9b..f7680ab 100644
--- a/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/btn_group_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png
index 3c10014..8906c4d 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png
index 9317776..2bcb98e 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png
index 8e92f71..2e36821 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png
index 54ec8ee..6a50bd8 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png
index cdb1f71..8595dd0 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png
index ff7848d..1dda090 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
index 98705f7..942722e 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png
index 0d3147f..e46f035 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png
index 01c54e6..5cfe146 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png
index fe3225f..20d0eb3 100644
--- a/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_off_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png
index c25fe90..3b478d6 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png
index 4185d71..52a9f44 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png
index e95f4ab9..9810029 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png
index 7ed0fab..445af7b 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png
index c9e99e8..d3884f6 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png
index f8a36b3..eea174a 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
index 8bfd65a..fecb1af 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png
index ba94294..58b2b09 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png
index 9112ed6..a39a620 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png
index a29f69e..1ffe7fe 100644
--- a/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/btn_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png b/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png
index a529487..3dfe6c2 100644
--- a/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/divider_horizontal_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png b/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png
index e3641b5..ea38ebb 100644
--- a/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/divider_horizontal_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_angel.png b/core/res/res/drawable-hdpi/emo_im_angel.png
index e9d4983..2cbb7da 100644
--- a/core/res/res/drawable-hdpi/emo_im_angel.png
+++ b/core/res/res/drawable-hdpi/emo_im_angel.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_cool.png b/core/res/res/drawable-hdpi/emo_im_cool.png
index c8464b5..3813bc6 100644
--- a/core/res/res/drawable-hdpi/emo_im_cool.png
+++ b/core/res/res/drawable-hdpi/emo_im_cool.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_crying.png b/core/res/res/drawable-hdpi/emo_im_crying.png
index 94a2b9a..3982d70 100644
--- a/core/res/res/drawable-hdpi/emo_im_crying.png
+++ b/core/res/res/drawable-hdpi/emo_im_crying.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_embarrassed.png b/core/res/res/drawable-hdpi/emo_im_embarrassed.png
index fe9138d..982f0ae 100644
--- a/core/res/res/drawable-hdpi/emo_im_embarrassed.png
+++ b/core/res/res/drawable-hdpi/emo_im_embarrassed.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png b/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png
index 9847177..d40fb90 100644
--- a/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png
+++ b/core/res/res/drawable-hdpi/emo_im_foot_in_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_happy.png b/core/res/res/drawable-hdpi/emo_im_happy.png
index eba9deb..f1e4723 100644
--- a/core/res/res/drawable-hdpi/emo_im_happy.png
+++ b/core/res/res/drawable-hdpi/emo_im_happy.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_kissing.png b/core/res/res/drawable-hdpi/emo_im_kissing.png
index ff19711..21e5d30 100644
--- a/core/res/res/drawable-hdpi/emo_im_kissing.png
+++ b/core/res/res/drawable-hdpi/emo_im_kissing.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_laughing.png b/core/res/res/drawable-hdpi/emo_im_laughing.png
index b1d4d6a..03aa60a 100644
--- a/core/res/res/drawable-hdpi/emo_im_laughing.png
+++ b/core/res/res/drawable-hdpi/emo_im_laughing.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png b/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png
index e47cf2a..14edaeb 100644
--- a/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png
+++ b/core/res/res/drawable-hdpi/emo_im_lips_are_sealed.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_money_mouth.png b/core/res/res/drawable-hdpi/emo_im_money_mouth.png
index 82f80f2..957bc90 100644
--- a/core/res/res/drawable-hdpi/emo_im_money_mouth.png
+++ b/core/res/res/drawable-hdpi/emo_im_money_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_sad.png b/core/res/res/drawable-hdpi/emo_im_sad.png
index b5959ec..bcfe71b4 100644
--- a/core/res/res/drawable-hdpi/emo_im_sad.png
+++ b/core/res/res/drawable-hdpi/emo_im_sad.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_surprised.png b/core/res/res/drawable-hdpi/emo_im_surprised.png
index dbe1c38..961a9bb 100644
--- a/core/res/res/drawable-hdpi/emo_im_surprised.png
+++ b/core/res/res/drawable-hdpi/emo_im_surprised.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png b/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png
index fb5f9ad..7a1235c 100644
--- a/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png
+++ b/core/res/res/drawable-hdpi/emo_im_tongue_sticking_out.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_undecided.png b/core/res/res/drawable-hdpi/emo_im_undecided.png
index b7edef7..72bf2f2 100644
--- a/core/res/res/drawable-hdpi/emo_im_undecided.png
+++ b/core/res/res/drawable-hdpi/emo_im_undecided.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_winking.png b/core/res/res/drawable-hdpi/emo_im_winking.png
index 6fe1027..b8fd6d9 100644
--- a/core/res/res/drawable-hdpi/emo_im_winking.png
+++ b/core/res/res/drawable-hdpi/emo_im_winking.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_wtf.png b/core/res/res/drawable-hdpi/emo_im_wtf.png
index 1d4a99b..b221795 100644
--- a/core/res/res/drawable-hdpi/emo_im_wtf.png
+++ b/core/res/res/drawable-hdpi/emo_im_wtf.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/emo_im_yelling.png b/core/res/res/drawable-hdpi/emo_im_yelling.png
index 99d694b..59798cb 100644
--- a/core/res/res/drawable-hdpi/emo_im_yelling.png
+++ b/core/res/res/drawable-hdpi/emo_im_yelling.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png b/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png
index 6bb4d1e..73ff79f 100644
--- a/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/expander_close_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_close_holo_light.9.png b/core/res/res/drawable-hdpi/expander_close_holo_light.9.png
index 3fb3eb1..290c24d 100644
--- a/core/res/res/drawable-hdpi/expander_close_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/expander_close_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png b/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png
index a679da5..754032e 100644
--- a/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/expander_open_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/expander_open_holo_light.9.png b/core/res/res/drawable-hdpi/expander_open_holo_light.9.png
index 175ce17..e32c7c7 100644
--- a/core/res/res/drawable-hdpi/expander_open_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/expander_open_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png
index 0a1bca8..769cb12 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png
index fd5b18d..c5372a8 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png
index 97d61f4..1dee51b 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png
index 9afd6ab..3c1e25a 100644
--- a/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_label_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png
index 5cd1ac7b..707414d 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png
index 5cd1ac7b..707414d 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png
index 9a7e5ae..4d810dd 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png
index 9a7e5ae..64fa147 100644
--- a/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/fastscroll_track_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_audio_ring_notif.png b/core/res/res/drawable-hdpi/ic_audio_ring_notif.png
index 1df6858..a89f45f 100644
--- a/core/res/res/drawable-hdpi/ic_audio_ring_notif.png
+++ b/core/res/res/drawable-hdpi/ic_audio_ring_notif.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png b/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png
index fae02f9..d03bade 100644
--- a/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png
+++ b/core/res/res/drawable-hdpi/ic_audio_ring_notif_mute.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_input_delete.png b/core/res/res/drawable-hdpi/ic_input_delete.png
index f35f89f..5d638bd 100644
--- a/core/res/res/drawable-hdpi/ic_input_delete.png
+++ b/core/res/res/drawable-hdpi/ic_input_delete.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png b/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png
index 6395294..683a575 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_answer_active.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png
index 74fda0f..bdece9f 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_answer_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png
index 1558a0a..6a8ab24 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_answer_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png
index 0ccf361..f2fceaa 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_decline_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png
index 14a684e..e005ffc 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_decline_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.png
deleted file mode 100644
index 1b7f499..0000000
--- a/core/res/res/drawable-hdpi/ic_lockscreen_handle_normal.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png b/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
index 399aa1c..98ab6e9 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png
index b79dbbaa..651b837 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_silent_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png
index 8632545..babab1d 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_silent_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
index e25c7a0..d000866 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
index 701fa42..82133d0 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png b/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png
index c8de3a3..26df6b2 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_text_focusde.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
index e300943..9e36918 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_focused.png b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_focused.png
deleted file mode 100644
index da77340..0000000
--- a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_focused.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
index 7db46c1..3960893 100644
--- a/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
+++ b/core/res/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_media_embed_play.png b/core/res/res/drawable-hdpi/ic_media_embed_play.png
index 23ac7e4..05778c1 100644
--- a/core/res/res/drawable-hdpi/ic_media_embed_play.png
+++ b/core/res/res/drawable-hdpi/ic_media_embed_play.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_dark.png b/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_dark.png
index 5f2f604..2abc458 100644
--- a/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_light.png b/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_light.png
index 7f3459c..bb6aef1 100644
--- a/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/ic_menu_moreoverflow_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_notification_ime_default.png b/core/res/res/drawable-hdpi/ic_notification_ime_default.png
index ac59819..369c88d 100644
--- a/core/res/res/drawable-hdpi/ic_notification_ime_default.png
+++ b/core/res/res/drawable-hdpi/ic_notification_ime_default.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-hdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 6560696..0000000
--- a/core/res/res/drawable-hdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
index 237011c..28b2578 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
index 2418017..545cc09 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
index 2120bad..9176b33 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png
index 30b3a4d..fb34a6d 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png
index 0e8ac15..87b2ad67 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png
index 762e4b0..1655fea 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png
index 4d3dc68..61cfe7a 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png
index fcf3565..43e2e89 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png
index 12fb970..7d80ff6 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png
index a82fd17..cc21a1c 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png
index a82fd17..cc21a1c 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png
index 3284506..3c9c192 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png
index 6afc2d0..6511cd2 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png
index e414e33..7b135ea 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png
index e414e33..7b135ea 100644
--- a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png
index 828c079..b6a85a2 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png
index e7e22c3..50d979e 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png
index a2a773b8..608dd52 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png
index 0b1b1893..96ff781 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png
index ca12894..a48bf2e 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png
index 52f8b38..b69589b 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png
index 5f9411a..5adfb04 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png
index 5f9411a..5adfb04 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png
index cdc1775..ff34463 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png
index b4981d4..0bcfd67 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png
index e124a18..00092cc 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png
index e124a18..00092cc 100644
--- a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png b/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png
index 416b456..1b4fed8 100644
--- a/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/panel_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png b/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png
index ddd242b..c8b3177 100644
--- a/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/panel_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/presence_away.png b/core/res/res/drawable-hdpi/presence_away.png
index b25b821..fe5b880 100644
--- a/core/res/res/drawable-hdpi/presence_away.png
+++ b/core/res/res/drawable-hdpi/presence_away.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png
index 64eee93..e3131b1 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png b/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png
index 8817efe..cdc94a1 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png
index 5a44788..d83522a 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png b/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png
index d47f63a..2af7814 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png
index 947ac17..e4b766d 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png b/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png
index 6b2588d..edd264a 100644
--- a/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_big_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png
index 4a02a23..65f673d 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png b/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png
index e73bdcc..3ff3bbd 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png
index e96936c..b8bca18 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png b/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png
index 76b9c18..ce9fc25 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png
index cfcf629..1b7fe77 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png b/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png
index a7d5af8..a6fdcff 100644
--- a/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_med_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png
index 946cdfd..4fb14f9 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png b/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png
index d046838..667b8e2 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png
index 6f1ffe8..e19cf7a 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png b/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png
index 6286fcd..8886006 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png b/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png
index a53b627..bc5d3db 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png b/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png
index dc102a9..1041008 100644
--- a/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png
+++ b/core/res/res/drawable-hdpi/rate_star_small_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
index e0f55bf..d4b3209 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
index 7b264f1..ec7303e 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
index c3a5f7d..19526fe 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
index 6fa4e00..e8f9eef 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_16_inner_holo.png b/core/res/res/drawable-hdpi/spinner_16_inner_holo.png
index b59b492..0166938 100644
--- a/core/res/res/drawable-hdpi/spinner_16_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_16_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_16_outer_holo.png b/core/res/res/drawable-hdpi/spinner_16_outer_holo.png
index 57b8b31..ffdb78a 100644
--- a/core/res/res/drawable-hdpi/spinner_16_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_16_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_20_inner_holo.png b/core/res/res/drawable-hdpi/spinner_20_inner_holo.png
index 14d26a5..ffad720 100644
--- a/core/res/res/drawable-hdpi/spinner_20_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_20_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_20_outer_holo.png b/core/res/res/drawable-hdpi/spinner_20_outer_holo.png
index e457a66..f2523f4 100644
--- a/core/res/res/drawable-hdpi/spinner_20_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_20_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_48_inner_holo.png b/core/res/res/drawable-hdpi/spinner_48_inner_holo.png
index 86c036d..f8e3fef 100644
--- a/core/res/res/drawable-hdpi/spinner_48_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_48_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_48_outer_holo.png b/core/res/res/drawable-hdpi/spinner_48_outer_holo.png
index ddd3e74..04c5fb5 100644
--- a/core/res/res/drawable-hdpi/spinner_48_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_48_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_76_inner_holo.png b/core/res/res/drawable-hdpi/spinner_76_inner_holo.png
index 74e7e2e..a28a6d1 100644
--- a/core/res/res/drawable-hdpi/spinner_76_inner_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_76_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_76_outer_holo.png b/core/res/res/drawable-hdpi/spinner_76_outer_holo.png
index 989a18c..3d5aa46 100644
--- a/core/res/res/drawable-hdpi/spinner_76_outer_holo.png
+++ b/core/res/res/drawable-hdpi/spinner_76_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png
index 3128fd9..51a5226 100644
--- a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png
index 924a93b..a24da91 100644
--- a/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/spinner_ab_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_notify_error.png b/core/res/res/drawable-hdpi/stat_notify_error.png
index dbaf944..deb3872 100644
--- a/core/res/res/drawable-hdpi/stat_notify_error.png
+++ b/core/res/res/drawable-hdpi/stat_notify_error.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
index 716ba9d..f3aaa27 100644
--- a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
+++ b/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_adb.png b/core/res/res/drawable-hdpi/stat_sys_adb.png
index 8e15aba2..ddb8a71 100644
--- a/core/res/res/drawable-hdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-hdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png
index e65f21a..e886812 100644
--- a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png
index 76c5484..3e92cf0 100644
--- a/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png
index 80a7ef1..962cefb 100644
--- a/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png
index bd11555..e05b345 100644
--- a/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png
index 1fba7ee..933d99b 100644
--- a/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png b/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png
index 5a484dfc..7abe99a 100644
--- a/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png
index 152c338..0bce767 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png
index 9c44d4b..3b9c048 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_activated_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png
index cb45648..a4bd074 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png
index 13dd09a..587bf4e 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png
index e72f428..a86be03 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png
index 84504eb..e3b0729 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png
index 44a4baa..4b56420 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png
index 5c5ee81..741674d 100644
--- a/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/switch_thumb_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_bottom_holo.9.png b/core/res/res/drawable-hdpi/tab_bottom_holo.9.png
index 9286c7a..8abf2ba 100644
--- a/core/res/res/drawable-hdpi/tab_bottom_holo.9.png
+++ b/core/res/res/drawable-hdpi/tab_bottom_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus.9.png b/core/res/res/drawable-hdpi/tab_focus.9.png
index 89a1c0b..8862fc7 100644
--- a/core/res/res/drawable-hdpi/tab_focus.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png b/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
index e879e37..7f40d36 100644
--- a/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png b/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
index e879e37..7f40d36 100644
--- a/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_focus_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press.9.png b/core/res/res/drawable-hdpi/tab_press.9.png
index 4c34188..4650d68 100644
--- a/core/res/res/drawable-hdpi/tab_press.9.png
+++ b/core/res/res/drawable-hdpi/tab_press.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press_bar_left.9.png b/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
index c5f44f3..b43c592 100644
--- a/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_press_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_press_bar_right.9.png b/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
index c5f44f3..b43c592 100644
--- a/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_press_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_pressed_holo.9.png b/core/res/res/drawable-hdpi/tab_pressed_holo.9.png
index 2adb22c..6d05735 100644
--- a/core/res/res/drawable-hdpi/tab_pressed_holo.9.png
+++ b/core/res/res/drawable-hdpi/tab_pressed_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected.9.png b/core/res/res/drawable-hdpi/tab_selected.9.png
index 46a331f..d5d3cee 100644
--- a/core/res/res/drawable-hdpi/tab_selected.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png b/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
index 53efbb4..c1f950c 100644
--- a/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected_bar_left.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png b/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
index 53efbb4..c1f950c 100644
--- a/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
+++ b/core/res/res/drawable-hdpi/tab_selected_bar_right.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/tab_unselected.9.png b/core/res/res/drawable-hdpi/tab_unselected.9.png
index 74181af..cdc7a4a 100644
--- a/core/res/res/drawable-hdpi/tab_unselected.9.png
+++ b/core/res/res/drawable-hdpi/tab_unselected.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/text_select_handle_left.png b/core/res/res/drawable-hdpi/text_select_handle_left.png
index e980857..5adc2e1 100644
--- a/core/res/res/drawable-hdpi/text_select_handle_left.png
+++ b/core/res/res/drawable-hdpi/text_select_handle_left.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/text_select_handle_middle.png b/core/res/res/drawable-hdpi/text_select_handle_middle.png
index 603f497..b7a472a 100644
--- a/core/res/res/drawable-hdpi/text_select_handle_middle.png
+++ b/core/res/res/drawable-hdpi/text_select_handle_middle.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/text_select_handle_right.png b/core/res/res/drawable-hdpi/text_select_handle_right.png
index a5efe30..cf94179 100644
--- a/core/res/res/drawable-hdpi/text_select_handle_right.png
+++ b/core/res/res/drawable-hdpi/text_select_handle_right.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/vpn_connected.png b/core/res/res/drawable-hdpi/vpn_connected.png
index 65fc6db..c3547e8 100644
--- a/core/res/res/drawable-hdpi/vpn_connected.png
+++ b/core/res/res/drawable-hdpi/vpn_connected.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/vpn_disconnected.png b/core/res/res/drawable-hdpi/vpn_disconnected.png
index 2440c69..10a9065 100644
--- a/core/res/res/drawable-hdpi/vpn_disconnected.png
+++ b/core/res/res/drawable-hdpi/vpn_disconnected.png
Binary files differ
diff --git a/core/res/res/drawable-large-mdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-large-mdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 0bc86c3..0000000
--- a/core/res/res/drawable-large-mdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-ldpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 9c8610f..0000000
--- a/core/res/res/drawable-ldpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_adb.png b/core/res/res/drawable-ldpi/stat_sys_adb.png
index aec8d90..86b945b 100644
--- a/core/res/res/drawable-ldpi/stat_sys_adb.png
+++ b/core/res/res/drawable-ldpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png
index 5435438..ac83494 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png
index b350144..6c247a8 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png
index 5010bff..7710165 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png
index 20f8d3d..15d0c803 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
index 96a9548..f1d8aec 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png
index 8871519..0d95a00 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_holo.png b/core/res/res/drawable-mdpi/btn_check_on_holo.png
index 38ab51a..2737d8c 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_holo.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png
index 4738e5a..4dd9452 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_holo_light.png
index db93b6d..38abce6 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
index b47b5dd..b70db89 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
index ad6947a..21d54a6 100644
--- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_default.png b/core/res/res/drawable-mdpi/btn_code_lock_default.png
old mode 100755
new mode 100644
index f524317..206f9b3
--- a/core/res/res/drawable-mdpi/btn_code_lock_default.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png b/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png
index 82fc3b2..4c4adf2 100644
--- a/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_touched.png b/core/res/res/drawable-mdpi/btn_code_lock_touched.png
old mode 100755
new mode 100644
index 5cd436c..98a3b6d
--- a/core/res/res/drawable-mdpi/btn_code_lock_touched.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_touched.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png b/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png
index d1fe1ad..ef701ed 100644
--- a/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png
+++ b/core/res/res/drawable-mdpi/btn_code_lock_touched_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png
index 290b977..db2eae1 100644
--- a/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png b/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png
index 290b977..db2eae1 100644
--- a/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png
index ffc11b7..67b5e4e 100644
--- a/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png
index 8b5d036..1547267 100644
--- a/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/btn_group_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png
index ebea1db..816e146 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png
index 761c936..4f4eff2 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png
index c505d3d..afaa8ca 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png
index 99a71ef..b7d9079 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png
index 3c48fa1..994eb0c 100644
--- a/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_rating_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png
index c1923e4..f4a1cbc3 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png
index 08f4ca7..79ca527 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png
index 5696511..33d1308 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png
index b090127..9672415 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png
index 9f46b75..94d3784 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png
index b4bf9c9..9f3ce4e 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
index 98c176c..05563bff 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png
index 16708fd4..ee166bc 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png
index 9e946db..4bc4a30 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png
index 875ec01..dd14aec 100644
--- a/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_off_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png
index a72fe32..becc091 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png
index 545899a..e49dbab4 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png
index aca83b0..61837f84 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png
index 2ff492e..19f139f 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png
index 816af01..9fed6b5 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png
index 66ea0c7..d52dbb7 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
index 3ffc6ca..c0c6b49 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png
index e580075..237f7e7 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png
index 20d4ab4..2f1f004 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png
index b314495..4bea36b 100644
--- a/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/btn_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_angel.png b/core/res/res/drawable-mdpi/emo_im_angel.png
index 297fcf0..3efea42 100644
--- a/core/res/res/drawable-mdpi/emo_im_angel.png
+++ b/core/res/res/drawable-mdpi/emo_im_angel.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_cool.png b/core/res/res/drawable-mdpi/emo_im_cool.png
index 9ee1d5d..650ed8f 100644
--- a/core/res/res/drawable-mdpi/emo_im_cool.png
+++ b/core/res/res/drawable-mdpi/emo_im_cool.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_crying.png b/core/res/res/drawable-mdpi/emo_im_crying.png
index 42ec8db..ad1e50f 100644
--- a/core/res/res/drawable-mdpi/emo_im_crying.png
+++ b/core/res/res/drawable-mdpi/emo_im_crying.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_embarrassed.png b/core/res/res/drawable-mdpi/emo_im_embarrassed.png
index 048f4b1..8a34321 100644
--- a/core/res/res/drawable-mdpi/emo_im_embarrassed.png
+++ b/core/res/res/drawable-mdpi/emo_im_embarrassed.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png b/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png
index db5c801..9607ff7 100644
--- a/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png
+++ b/core/res/res/drawable-mdpi/emo_im_foot_in_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_happy.png b/core/res/res/drawable-mdpi/emo_im_happy.png
index e85af7d..a324720 100644
--- a/core/res/res/drawable-mdpi/emo_im_happy.png
+++ b/core/res/res/drawable-mdpi/emo_im_happy.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_kissing.png b/core/res/res/drawable-mdpi/emo_im_kissing.png
index 6c2458c..f18a391 100644
--- a/core/res/res/drawable-mdpi/emo_im_kissing.png
+++ b/core/res/res/drawable-mdpi/emo_im_kissing.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_laughing.png b/core/res/res/drawable-mdpi/emo_im_laughing.png
index 268c864..963a4ba 100644
--- a/core/res/res/drawable-mdpi/emo_im_laughing.png
+++ b/core/res/res/drawable-mdpi/emo_im_laughing.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png b/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png
index a838158..58bd138 100644
--- a/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png
+++ b/core/res/res/drawable-mdpi/emo_im_lips_are_sealed.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_money_mouth.png b/core/res/res/drawable-mdpi/emo_im_money_mouth.png
index 56fcce4..718c7e3 100644
--- a/core/res/res/drawable-mdpi/emo_im_money_mouth.png
+++ b/core/res/res/drawable-mdpi/emo_im_money_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_sad.png b/core/res/res/drawable-mdpi/emo_im_sad.png
index c5245cc..7daac6c 100644
--- a/core/res/res/drawable-mdpi/emo_im_sad.png
+++ b/core/res/res/drawable-mdpi/emo_im_sad.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_surprised.png b/core/res/res/drawable-mdpi/emo_im_surprised.png
index 231ccb1..b4b614d 100644
--- a/core/res/res/drawable-mdpi/emo_im_surprised.png
+++ b/core/res/res/drawable-mdpi/emo_im_surprised.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png b/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png
index 9384718..9fa6534 100644
--- a/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png
+++ b/core/res/res/drawable-mdpi/emo_im_tongue_sticking_out.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_undecided.png b/core/res/res/drawable-mdpi/emo_im_undecided.png
index 9927af9..8b2577a 100644
--- a/core/res/res/drawable-mdpi/emo_im_undecided.png
+++ b/core/res/res/drawable-mdpi/emo_im_undecided.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_winking.png b/core/res/res/drawable-mdpi/emo_im_winking.png
index a9b39bd..069e9e3 100644
--- a/core/res/res/drawable-mdpi/emo_im_winking.png
+++ b/core/res/res/drawable-mdpi/emo_im_winking.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_wtf.png b/core/res/res/drawable-mdpi/emo_im_wtf.png
index 1780652..0d963ec 100644
--- a/core/res/res/drawable-mdpi/emo_im_wtf.png
+++ b/core/res/res/drawable-mdpi/emo_im_wtf.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/emo_im_yelling.png b/core/res/res/drawable-mdpi/emo_im_yelling.png
index 18e4715..836f60f 100644
--- a/core/res/res/drawable-mdpi/emo_im_yelling.png
+++ b/core/res/res/drawable-mdpi/emo_im_yelling.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png b/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png
index 6fa069f..036ffb7 100644
--- a/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/expander_close_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_close_holo_light.9.png b/core/res/res/drawable-mdpi/expander_close_holo_light.9.png
index b9067933..9f9dd70 100644
--- a/core/res/res/drawable-mdpi/expander_close_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/expander_close_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png b/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png
index 5c7fa38..867f36d 100644
--- a/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/expander_open_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/expander_open_holo_light.9.png b/core/res/res/drawable-mdpi/expander_open_holo_light.9.png
index c392ecb..7f5ca48 100644
--- a/core/res/res/drawable-mdpi/expander_open_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/expander_open_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png
index b3fd908..94b944d 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png
index a64d4d1..987c097 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png
index 6469fca..8d87032 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png
index fca2e25..b29042a 100644
--- a/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_label_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png
index 55f17c2..eb2b8bd 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png
index 55f17c2..eb2b8bd 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png
index 34e126b..6fb59b6 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png
index 34e126b..1a63f5d 100644
--- a/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/fastscroll_track_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_ring_notif.png b/core/res/res/drawable-mdpi/ic_audio_ring_notif.png
index b9b7c7b..1ce4f52 100644
--- a/core/res/res/drawable-mdpi/ic_audio_ring_notif.png
+++ b/core/res/res/drawable-mdpi/ic_audio_ring_notif.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png b/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png
index cbe5021..cb17415 100644
--- a/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png
+++ b/core/res/res/drawable-mdpi/ic_audio_ring_notif_mute.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_input_delete.png b/core/res/res/drawable-mdpi/ic_input_delete.png
index ee4c911..47c8708 100644
--- a/core/res/res/drawable-mdpi/ic_input_delete.png
+++ b/core/res/res/drawable-mdpi/ic_input_delete.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png b/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png
index 754d7bc..1d547e1 100644
--- a/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png
+++ b/core/res/res/drawable-mdpi/ic_lockscreen_handle_normal.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
index 0d3f756..68409c5 100644
--- a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
+++ b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_focused.png b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_focused.png
deleted file mode 100644
index 6f51447..0000000
--- a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_focused.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
index dd255f5..52866f2 100644
--- a/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
+++ b/core/res/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_embed_play.png b/core/res/res/drawable-mdpi/ic_media_embed_play.png
index fc5d8c6..3576ce5 100644
--- a/core/res/res/drawable-mdpi/ic_media_embed_play.png
+++ b/core/res/res/drawable-mdpi/ic_media_embed_play.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_ff.png b/core/res/res/drawable-mdpi/ic_media_ff.png
index 892772e..170dd2d 100644
--- a/core/res/res/drawable-mdpi/ic_media_ff.png
+++ b/core/res/res/drawable-mdpi/ic_media_ff.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_fullscreen.png b/core/res/res/drawable-mdpi/ic_media_fullscreen.png
index 1c60e15..960aa85 100644
--- a/core/res/res/drawable-mdpi/ic_media_fullscreen.png
+++ b/core/res/res/drawable-mdpi/ic_media_fullscreen.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_next.png b/core/res/res/drawable-mdpi/ic_media_next.png
index bbe311b..a6feed0 100644
--- a/core/res/res/drawable-mdpi/ic_media_next.png
+++ b/core/res/res/drawable-mdpi/ic_media_next.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_pause.png b/core/res/res/drawable-mdpi/ic_media_pause.png
index e4e8d86..548ba02 100644
--- a/core/res/res/drawable-mdpi/ic_media_pause.png
+++ b/core/res/res/drawable-mdpi/ic_media_pause.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_play.png b/core/res/res/drawable-mdpi/ic_media_play.png
index 8eaf962..0fe6806 100644
--- a/core/res/res/drawable-mdpi/ic_media_play.png
+++ b/core/res/res/drawable-mdpi/ic_media_play.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_previous.png b/core/res/res/drawable-mdpi/ic_media_previous.png
index e9abc7f..0163d0945 100644
--- a/core/res/res/drawable-mdpi/ic_media_previous.png
+++ b/core/res/res/drawable-mdpi/ic_media_previous.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_media_rew.png b/core/res/res/drawable-mdpi/ic_media_rew.png
index a5eb94a..5489180 100644
--- a/core/res/res/drawable-mdpi/ic_media_rew.png
+++ b/core/res/res/drawable-mdpi/ic_media_rew.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png b/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png
index 1d2592a..ba704b6 100644
--- a/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_light.png b/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_light.png
index 4060afe..01d6816 100644
--- a/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/ic_menu_moreoverflow_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_notification_ime_default.png b/core/res/res/drawable-mdpi/ic_notification_ime_default.png
index 67269e8..7d97eb5 100644
--- a/core/res/res/drawable-mdpi/ic_notification_ime_default.png
+++ b/core/res/res/drawable-mdpi/ic_notification_ime_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index 7ddeba5..0000000
--- a/core/res/res/drawable-mdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
index f6d9f1b..05c194b 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
index a627cda..4c4adf2 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
index b7262d1..8f24832 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
index 308624b..cb5b31a 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
index 6c451ec..8434741 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png
index 0329d58..1f29da2 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png
index d17ca1c..a27f5aa 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png
index c41e4b8..34268af 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png
index 846c2e8..304f800 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png
index 5543ac6..583542b 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png
index 65e7c87..d15bd16 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png
index 50a4167..9a5d79f 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png
index 50a4167..9a5d79f 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png
index 025b27e..8051d64 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png
index 7dd30e98..bcd34e9 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png
index 25c22b6..cf4bdb6 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png
index 25c22b6..cf4bdb6 100644
--- a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png
index c32596c..0535ff7 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png
index 4b862657..360284d 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png
index e47ff9c..1e0e92c 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png
index b5e32d8..14bcce9 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png
index 543d3e3..6ed2cf0 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png
index 6b395dd..015a8cf 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png
index f0cd69f..8bb44f2 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png
index f0cd69f..8bb44f2 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png
index bf8136c..6ab5f23 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png
index 2c2bef3..65ec302 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png
index 394f063..34d3228 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png
index 394f063..34d3228 100644
--- a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png b/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png
index c64da8d..8c51b01 100644
--- a/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/panel_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/popup_inline_error.9.png b/core/res/res/drawable-mdpi/popup_inline_error.9.png
index 2d62071..17fbe4a 100644
--- a/core/res/res/drawable-mdpi/popup_inline_error.9.png
+++ b/core/res/res/drawable-mdpi/popup_inline_error.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/popup_inline_error_above.9.png b/core/res/res/drawable-mdpi/popup_inline_error_above.9.png
index a318891..1d93817 100644
--- a/core/res/res/drawable-mdpi/popup_inline_error_above.9.png
+++ b/core/res/res/drawable-mdpi/popup_inline_error_above.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png
index 593af6e..dac51dfd 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png b/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png
index 3dc3aed..441dbf7 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png
index 3650f00..cde1fb9 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png b/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png
index 107e0fb..8ecf0f9 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png
index 2b9d79d..0674db3 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png b/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png
index c119683..0117919 100644
--- a/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_big_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png
index 7dc749d..f2ce7ab 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png b/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png
index 22e2a66..48bcf85 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png
index 24adc5b..d2e7ab6 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png b/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png
index d309d27..69824eb 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png
index af8c474..b3b8016 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png b/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png
index 9f03076..84ca715 100644
--- a/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_med_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png
index 6b5f41c..56a62d2 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png b/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png
index db84cc7..83b7c1c 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png
index 6819f81..b70244b 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png b/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png
index 8b45582..bb5c08c 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png b/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png
index 25f6df8..444e882 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png b/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png
index 0d34be9..7dba529 100644
--- a/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png
+++ b/core/res/res/drawable-mdpi/rate_star_small_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
index a035f6f..6f58ef0 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
index 5c9720f..3d8f134 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
index 2497716..d480c55 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
index 5fc3ca2..6a414fa 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_16_inner_holo.png b/core/res/res/drawable-mdpi/spinner_16_inner_holo.png
index c0f1b20..eeef0c8 100644
--- a/core/res/res/drawable-mdpi/spinner_16_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_16_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_16_outer_holo.png b/core/res/res/drawable-mdpi/spinner_16_outer_holo.png
index 0492a62..7cc2b54 100644
--- a/core/res/res/drawable-mdpi/spinner_16_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_16_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_20_inner_holo.png b/core/res/res/drawable-mdpi/spinner_20_inner_holo.png
index 5e141d8..4569fae 100644
--- a/core/res/res/drawable-mdpi/spinner_20_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_20_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_20_outer_holo.png b/core/res/res/drawable-mdpi/spinner_20_outer_holo.png
index 07ba3f3..9287dd7 100644
--- a/core/res/res/drawable-mdpi/spinner_20_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_20_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_48_inner_holo.png b/core/res/res/drawable-mdpi/spinner_48_inner_holo.png
index 8c27069..9458668 100644
--- a/core/res/res/drawable-mdpi/spinner_48_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_48_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_48_outer_holo.png b/core/res/res/drawable-mdpi/spinner_48_outer_holo.png
index d5f0490..4ce73ed 100644
--- a/core/res/res/drawable-mdpi/spinner_48_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_48_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_76_inner_holo.png b/core/res/res/drawable-mdpi/spinner_76_inner_holo.png
index 3e263e8..cba1300d 100644
--- a/core/res/res/drawable-mdpi/spinner_76_inner_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_76_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_76_outer_holo.png b/core/res/res/drawable-mdpi/spinner_76_outer_holo.png
index 6eb6d10..99a5ebb 100644
--- a/core/res/res/drawable-mdpi/spinner_76_outer_holo.png
+++ b/core/res/res/drawable-mdpi/spinner_76_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png
index dda2998..6255e2e 100644
--- a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png
index 951301d..1085248 100644
--- a/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/spinner_ab_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_notify_error.png b/core/res/res/drawable-mdpi/stat_notify_error.png
index 168f8f6..78d59aa 100644
--- a/core/res/res/drawable-mdpi/stat_notify_error.png
+++ b/core/res/res/drawable-mdpi/stat_notify_error.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
index 3bf0d35..747cb97 100644
--- a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
+++ b/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_adb.png b/core/res/res/drawable-mdpi/stat_sys_adb.png
index ebedfa3..730d96f 100644
--- a/core/res/res/drawable-mdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-mdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png
index b8dd545..a161b03 100644
--- a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png
index 11b8426..c637dd1 100644
--- a/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png
index c9481fa..680d1a0 100644
--- a/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_focused_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png
index eb08c87..70da7b3 100644
--- a/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_focused_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png
index 429d73d..b5582b5 100644
--- a/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png b/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png
index 693ee33..a2af2b5 100644
--- a/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png
index bf4b161..3d786c0 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png
index 4535993..2bad2b8f2 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_activated_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png
index c56f49d..f6ed0bf 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png
index 5272f08..a430b77 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png
index 9b738046..6312c59 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png
index bcd503f..2086722 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png
index 9c948a5..e44b1d81 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png
index b035f42..ee7e37b 100644
--- a/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/switch_thumb_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/tab_selected_v4.9.png b/core/res/res/drawable-mdpi/tab_selected_v4.9.png
index 3c1c4eb..e8e112a 100644
--- a/core/res/res/drawable-mdpi/tab_selected_v4.9.png
+++ b/core/res/res/drawable-mdpi/tab_selected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/tab_unselected_v4.9.png b/core/res/res/drawable-mdpi/tab_unselected_v4.9.png
index bb38337..229f503 100644
--- a/core/res/res/drawable-mdpi/tab_unselected_v4.9.png
+++ b/core/res/res/drawable-mdpi/tab_unselected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/text_select_handle_left.png b/core/res/res/drawable-mdpi/text_select_handle_left.png
index 0c3a0cc..750cdea 100644
--- a/core/res/res/drawable-mdpi/text_select_handle_left.png
+++ b/core/res/res/drawable-mdpi/text_select_handle_left.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/text_select_handle_middle.png b/core/res/res/drawable-mdpi/text_select_handle_middle.png
index f488bdd..3cdca90 100644
--- a/core/res/res/drawable-mdpi/text_select_handle_middle.png
+++ b/core/res/res/drawable-mdpi/text_select_handle_middle.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/text_select_handle_right.png b/core/res/res/drawable-mdpi/text_select_handle_right.png
index d3880c6..fc3d144 100644
--- a/core/res/res/drawable-mdpi/text_select_handle_right.png
+++ b/core/res/res/drawable-mdpi/text_select_handle_right.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/vpn_connected.png b/core/res/res/drawable-mdpi/vpn_connected.png
index 0d1a026..7e167f8 100644
--- a/core/res/res/drawable-mdpi/vpn_connected.png
+++ b/core/res/res/drawable-mdpi/vpn_connected.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/vpn_disconnected.png b/core/res/res/drawable-mdpi/vpn_disconnected.png
index d16d7fb..a08c42a 100644
--- a/core/res/res/drawable-mdpi/vpn_disconnected.png
+++ b/core/res/res/drawable-mdpi/vpn_disconnected.png
Binary files differ
diff --git a/core/res/res/drawable-nodpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-nodpi/indicator_code_lock_drag_direction_green_up.png
new file mode 100644
index 0000000..cc46f19
--- /dev/null
+++ b/core/res/res/drawable-nodpi/indicator_code_lock_drag_direction_green_up.png
Binary files differ
diff --git a/core/res/res/drawable-nodpi/platlogo.png b/core/res/res/drawable-nodpi/platlogo.png
index faabda1..e619ed5 100644
--- a/core/res/res/drawable-nodpi/platlogo.png
+++ b/core/res/res/drawable-nodpi/platlogo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disable.png b/core/res/res/drawable-xhdpi/btn_check_on_disable.png
index 179f191..11917b5 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disable.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disable.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png
index 02e4254..041663a 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png
index 7e61802..ca0dadb 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png
index cc6326e..4960b57 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png
index f468781..ce1dd23 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
index 1e25364..0a31fbc 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
index fc1af9f..62f6336 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_holo.png b/core/res/res/drawable-xhdpi/btn_check_on_holo.png
index 75f66521..65dd58d 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_holo.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png
index c327f56..dc2379c 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png
index 74a2ea3..cbb26fd 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed.png
index f84a5b0..995775e 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
index 48a6431..9c160af 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
index 5defddf..eb85218 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_check_on_selected.png b/core/res/res/drawable-xhdpi/btn_check_on_selected.png
index 963c68e..a46f2f4 100644
--- a/core/res/res/drawable-xhdpi/btn_check_on_selected.png
+++ b/core/res/res/drawable-xhdpi/btn_check_on_selected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_default.png b/core/res/res/drawable-xhdpi/btn_code_lock_default.png
index a644014..c1358a2 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_default.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_default.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png b/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png
index f607251..db1cbe6 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_touched.png b/core/res/res/drawable-xhdpi/btn_code_lock_touched.png
index 67faad2..0fafc3e 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_touched.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_touched.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png b/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png
index e057cdd..073c3ac 100644
--- a/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png
+++ b/core/res/res/drawable-xhdpi/btn_code_lock_touched_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_normal.9.png b/core/res/res/drawable-xhdpi/btn_default_normal.9.png
index 4ca0b374..7080905 100644
--- a/core/res/res/drawable-xhdpi/btn_default_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png b/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png
index f7af2a4..704bb55 100644
--- a/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_normal_disable.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png b/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png
index ab7084e..7f64c75 100644
--- a/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_normal_disable_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_pressed.9.png b/core/res/res/drawable-xhdpi/btn_default_pressed.9.png
index 02f5bb8..849cd48 100644
--- a/core/res/res/drawable-xhdpi/btn_default_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_selected.9.png b/core/res/res/drawable-xhdpi/btn_default_selected.9.png
index 0375a18..2be8da6 100644
--- a/core/res/res/drawable-xhdpi/btn_default_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png b/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png
index d368073..5b7a3bd 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
index 6d1eb48..36cbd3e 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
index f4783d4..3ce0038 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_normal_disable_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png b/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png
index 0df43d7..5874b8c 100644
--- a/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_small_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png b/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png
index 4412346..fb2fbf5 100644
--- a/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_default_transparent_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png
index 0e0e0d1..1e4cec3 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_disabled_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png
index a47ad5a..aab7658 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png
index a3851a8..4a1ddf3 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png b/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png
index 80e4d04..cdae834 100644
--- a/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_dropdown_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png
index ef9262f..981cad9 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png
index 6715afd..2252293 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png
index 8ffddcf..4db7078 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_normal_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png
index 5a52bbc..04e7ea1 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
index 77c6d78..95e91e8 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
index ed73f09..cdd47d5 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_fulltrans_pressed_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
index 08021f9..1f3a6b3 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
index 41c8ccb..2a9b6f4 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
index 546ccbc..096d6e9 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_normal_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
index 802b22e..20852d6 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
index d317f94..271c6b4 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
index 80b50a1..e72ec79 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_pressed_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png
index 76202a4..e08dcc5 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png
index e9b2d7e..fd512d9c 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_normal_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png
index 8db4f8e..b18642d 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_off.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png
index b835a07..134c4a9 100644
--- a/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png
+++ b/core/res/res/drawable-xhdpi/btn_keyboard_key_trans_pressed_on.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png
index 07cb53c..0a12dc9 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png
index d3ccef8..35ad67c 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png
index c553c58..2f9af47 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png
index f478c46..d3c7709 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png
index ea5e509..0c4f0da 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png
index a46f0ed..2e2f587 100644
--- a/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png
+++ b/core/res/res/drawable-xhdpi/btn_search_dialog_voice_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off.png b/core/res/res/drawable-xhdpi/btn_star_big_off.png
index 4ed5142..f60eb48 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png b/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png
index cc52dec..8e0858d 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_disable.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png b/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png
index fea7717..f77e08c 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_disable_focused.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png b/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png
index 503a5b2..3f9695e 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png b/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png
index 8470723..b2e82da 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_off_selected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on.png b/core/res/res/drawable-xhdpi/btn_star_big_on.png
index a094406..7cda089 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png b/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png
index bbf7d17..da50266 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_disable.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png b/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png
index a46ea69..df07003 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_disable_focused.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png b/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png
index 7e45f2a..d56f46d 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_pressed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png b/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png
index 0607b78..5a62f47 100644
--- a/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png
+++ b/core/res/res/drawable-xhdpi/btn_star_big_on_selected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png
index 7b47940..f31cf27 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png
index 6a81990..9b28db8 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png
index 5f6ff35..bec293c 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png
index 3a0f83d..eec89df 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png
index 6fb25b5..757908e 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png
index 44e87c4..c58bd5c 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
index 01d4a9a..c591cae 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
index 967ca90..b3e981a 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png
index ebb80ee..85253f7 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png
index 9f32c30..efd26b0 100644
--- a/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_off_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png
index ffe47de..25fd6bb 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png
index ed36707..fcd06af 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png
index fd9da6c..641f79b 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png
index f5908da..9e47d8b 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png
index 7e76adf..8f14270 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png
index b64a8d5..1d55670 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
index 48d89f0..032e89f 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
index ae4f9394..ef59ce2 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png
index 4f052cf..e2305cb 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png
index ea92177..6643deb 100644
--- a/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/btn_star_on_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/code_lock_top.9.png b/core/res/res/drawable-xhdpi/code_lock_top.9.png
index 6f5cf62..31517e4 100644
--- a/core/res/res/drawable-xhdpi/code_lock_top.9.png
+++ b/core/res/res/drawable-xhdpi/code_lock_top.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/contact_header_bg.9.png b/core/res/res/drawable-xhdpi/contact_header_bg.9.png
index aee15b8..bde1d56 100644
--- a/core/res/res/drawable-xhdpi/contact_header_bg.9.png
+++ b/core/res/res/drawable-xhdpi/contact_header_bg.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png b/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png
index 9350789..9666f73 100644
--- a/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/divider_vertical_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png b/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png
index e0f6e0a..026017b 100644
--- a/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/divider_vertical_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_angel.png b/core/res/res/drawable-xhdpi/emo_im_angel.png
index b4123ff..8853cbe 100644
--- a/core/res/res/drawable-xhdpi/emo_im_angel.png
+++ b/core/res/res/drawable-xhdpi/emo_im_angel.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_cool.png b/core/res/res/drawable-xhdpi/emo_im_cool.png
index 0efacf8..82cbd55d 100644
--- a/core/res/res/drawable-xhdpi/emo_im_cool.png
+++ b/core/res/res/drawable-xhdpi/emo_im_cool.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_crying.png b/core/res/res/drawable-xhdpi/emo_im_crying.png
index 7de7bf0..3151125 100644
--- a/core/res/res/drawable-xhdpi/emo_im_crying.png
+++ b/core/res/res/drawable-xhdpi/emo_im_crying.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_embarrassed.png b/core/res/res/drawable-xhdpi/emo_im_embarrassed.png
index baa0765..ef2fded 100644
--- a/core/res/res/drawable-xhdpi/emo_im_embarrassed.png
+++ b/core/res/res/drawable-xhdpi/emo_im_embarrassed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png b/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png
index afb22bb..c41b19d 100644
--- a/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png
+++ b/core/res/res/drawable-xhdpi/emo_im_foot_in_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_happy.png b/core/res/res/drawable-xhdpi/emo_im_happy.png
index 08a242d..a2702b2 100644
--- a/core/res/res/drawable-xhdpi/emo_im_happy.png
+++ b/core/res/res/drawable-xhdpi/emo_im_happy.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_kissing.png b/core/res/res/drawable-xhdpi/emo_im_kissing.png
index c643a3c..7afd2f6 100644
--- a/core/res/res/drawable-xhdpi/emo_im_kissing.png
+++ b/core/res/res/drawable-xhdpi/emo_im_kissing.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_laughing.png b/core/res/res/drawable-xhdpi/emo_im_laughing.png
index 0301f80..abc3700 100644
--- a/core/res/res/drawable-xhdpi/emo_im_laughing.png
+++ b/core/res/res/drawable-xhdpi/emo_im_laughing.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png b/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png
index 594e5e7..60592fb 100644
--- a/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png
+++ b/core/res/res/drawable-xhdpi/emo_im_lips_are_sealed.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_money_mouth.png b/core/res/res/drawable-xhdpi/emo_im_money_mouth.png
index df9283a..8efcf0b 100644
--- a/core/res/res/drawable-xhdpi/emo_im_money_mouth.png
+++ b/core/res/res/drawable-xhdpi/emo_im_money_mouth.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_sad.png b/core/res/res/drawable-xhdpi/emo_im_sad.png
index f42f0a9..81e94b1 100644
--- a/core/res/res/drawable-xhdpi/emo_im_sad.png
+++ b/core/res/res/drawable-xhdpi/emo_im_sad.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_surprised.png b/core/res/res/drawable-xhdpi/emo_im_surprised.png
index 6b057fa..7b7aabf 100644
--- a/core/res/res/drawable-xhdpi/emo_im_surprised.png
+++ b/core/res/res/drawable-xhdpi/emo_im_surprised.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png b/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png
index ef128c5..1b6a985 100644
--- a/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png
+++ b/core/res/res/drawable-xhdpi/emo_im_tongue_sticking_out.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_undecided.png b/core/res/res/drawable-xhdpi/emo_im_undecided.png
index fcc0f42..2c2cfa6 100644
--- a/core/res/res/drawable-xhdpi/emo_im_undecided.png
+++ b/core/res/res/drawable-xhdpi/emo_im_undecided.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_winking.png b/core/res/res/drawable-xhdpi/emo_im_winking.png
index 687b62b..6c9cb0e 100644
--- a/core/res/res/drawable-xhdpi/emo_im_winking.png
+++ b/core/res/res/drawable-xhdpi/emo_im_winking.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_wtf.png b/core/res/res/drawable-xhdpi/emo_im_wtf.png
index cb75a18..34861e4 100644
--- a/core/res/res/drawable-xhdpi/emo_im_wtf.png
+++ b/core/res/res/drawable-xhdpi/emo_im_wtf.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/emo_im_yelling.png b/core/res/res/drawable-xhdpi/emo_im_yelling.png
index 32a7028..0583178 100644
--- a/core/res/res/drawable-xhdpi/emo_im_yelling.png
+++ b/core/res/res/drawable-xhdpi/emo_im_yelling.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png b/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png
index 8005de7..f56ef31 100644
--- a/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/expander_close_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png b/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png
index 333dd24d..e157024 100644
--- a/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/expander_close_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png b/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png
index 6eed88a..598b75b 100644
--- a/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png
+++ b/core/res/res/drawable-xhdpi/expander_ic_maximized.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png b/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png
index 0683be6..396f4138 100644
--- a/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png
+++ b/core/res/res/drawable-xhdpi/expander_ic_minimized.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png b/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png
index 4a56a80..d2e8ae8 100644
--- a/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/expander_open_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png b/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png
index 67ed4c0..35fb75a 100644
--- a/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/expander_open_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png
index dfc5e6b..6e0244f 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png
index eab0cb9..6478a11 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png
index e3e0cde..0330b17 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png
index b2bd5ca..57539e4 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_label_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png
index c727bd4..751e0d5 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png
index c727bd4..751e0d5 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_default_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png
index f2c6b42..c9427a9 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png
index f2c6b42..b495fbd 100644
--- a/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/fastscroll_track_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png b/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png
index 915fbed..a6bb25a 100644
--- a/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png
+++ b/core/res/res/drawable-xhdpi/frame_gallery_thumb.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png b/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png
index 13ea006..85d65faa71 100644
--- a/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/frame_gallery_thumb_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png b/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png
index f9471444..1dadee6 100644
--- a/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png
+++ b/core/res/res/drawable-xhdpi/frame_gallery_thumb_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png b/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png
index 3fa4197..0df1934 100644
--- a/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png
+++ b/core/res/res/drawable-xhdpi/ic_audio_ring_notif.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png b/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png
index e8e7fcc..85acb93 100644
--- a/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png
+++ b/core/res/res/drawable-xhdpi/ic_audio_ring_notif_mute.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_input_delete.png b/core/res/res/drawable-xhdpi/ic_input_delete.png
index 34c5f39..8b822d9 100644
--- a/core/res/res/drawable-xhdpi/ic_input_delete.png
+++ b/core/res/res/drawable-xhdpi/ic_input_delete.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png b/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
index 544924e..b09071b 100644
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
+++ b/core/res/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
index 73d7af3..8a0331d 100644
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
+++ b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_focused.png b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_focused.png
deleted file mode 100644
index d067ab8..0000000
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_focused.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
index 1a53c63..0422117 100644
--- a/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
+++ b/core/res/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_dark.png b/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_dark.png
index 1ce25e2..a92fb1d 100644
--- a/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_light.png b/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_light.png
index dcd6514..930ca8d 100644
--- a/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/ic_menu_moreoverflow_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_notification_ime_default.png b/core/res/res/drawable-xhdpi/ic_notification_ime_default.png
index 4d0f074..900801a 100644
--- a/core/res/res/drawable-xhdpi/ic_notification_ime_default.png
+++ b/core/res/res/drawable-xhdpi/ic_notification_ime_default.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png b/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png
index 010852f..a7a8bb3 100644
--- a/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png
+++ b/core/res/res/drawable-xhdpi/ic_notification_overlay.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png b/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png
index b26180d..cdc37f1 100644
--- a/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png
+++ b/core/res/res/drawable-xhdpi/icon_highlight_rectangle.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/icon_highlight_square.9.png b/core/res/res/drawable-xhdpi/icon_highlight_square.9.png
index f45f1c5..cc2ab8c 100644
--- a/core/res/res/drawable-xhdpi/icon_highlight_square.9.png
+++ b/core/res/res/drawable-xhdpi/icon_highlight_square.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-xhdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index a89b8d5..0000000
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png
index 997d6a5..0812cb5 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
index d98a126..db1cbe6 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png
index 2eb69f6..3ab2e99 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
index 4491f02..de4ca91 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
index 6e91fbc..853b0f0 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png b/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png
index 4412331..6cb42c1 100644
--- a/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/list_section_header_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png b/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png
index d0cba8d..f646a41 100644
--- a/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/list_section_header_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_background.9.png b/core/res/res/drawable-xhdpi/menu_background.9.png
index b784f71..3aa8ccb 100644
--- a/core/res/res/drawable-xhdpi/menu_background.9.png
+++ b/core/res/res/drawable-xhdpi/menu_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png b/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png
index ab43013..af08de2 100644
--- a/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png
+++ b/core/res/res/drawable-xhdpi/menu_background_fill_parent_width.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_separator.9.png b/core/res/res/drawable-xhdpi/menu_separator.9.png
index 3251f95..3c3722cb 100644
--- a/core/res/res/drawable-xhdpi/menu_separator.9.png
+++ b/core/res/res/drawable-xhdpi/menu_separator.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/menu_submenu_background.9.png b/core/res/res/drawable-xhdpi/menu_submenu_background.9.png
index 54b2be6..4a8b2ad 100644
--- a/core/res/res/drawable-xhdpi/menu_submenu_background.9.png
+++ b/core/res/res/drawable-xhdpi/menu_submenu_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png
index b8220ce..62b267e 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png
index 7f4f093..5f38c35 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png
index beae86d..1c2f33e 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png
index 1f5b745..4e688bc 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png
index cee62f8..dc422f2 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png
index 367dad4..afc02db 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png
index 66b4807..3604013 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png
index b99572c..a16cd38 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png
index 37cd3ce..b975b63 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png
index 37cd3ce..b975b63 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png
index c10b671..b1d3e7b 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png
index 18e7c8e..39cdb93 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png
index 5ddece8..2a14ac5 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png
index bfae684..e61c469 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png
index 7459f47..4827377 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png
index 7459f47..4827377 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png b/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png
index 9451630..ed0c016 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_down_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png
index 01cc01a9..279087c 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png
index b4d9c7f..1b3467a 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png
index 5f3d982..930415e 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png b/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png
index 434f05f..5240d08 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_input_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png
index 0c32994..4b79112 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png
index cba1e76..6c2f397 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png
index b13f8e8..97ea0b5 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png
index b71cc03..e59e2a7 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png
index 982f625..3b8fa7f 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png
index fd3fa74..77a1dd4 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png
index 57dcf27..24c2d84 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png
index eff8c22..b2566dc3 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png
index 15bed2c..7075af7 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png
index 15bed2c..7075af7 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png
index ee270b4..699a9f5 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png
index 74bc6df..11b60a9 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png
index 8fe2159..074fae5 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png
index 297f77c..5504fee 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png
index 97cdcb1..2310f83 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png
index 97cdcb1..2310f83 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png b/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png
index e5d5126..585cf30 100644
--- a/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png
+++ b/core/res/res/drawable-xhdpi/numberpicker_up_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/panel_background.9.png b/core/res/res/drawable-xhdpi/panel_background.9.png
index 2ceae60..f3a3a9d 100644
--- a/core/res/res/drawable-xhdpi/panel_background.9.png
+++ b/core/res/res/drawable-xhdpi/panel_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png b/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png
index c171b7c..9bdf3f1 100644
--- a/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/panel_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/password_field_default.9.png b/core/res/res/drawable-xhdpi/password_field_default.9.png
index cf8329e..9aa6776 100644
--- a/core/res/res/drawable-xhdpi/password_field_default.9.png
+++ b/core/res/res/drawable-xhdpi/password_field_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png b/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png
index 65ea61bc..7f95130 100644
--- a/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png
+++ b/core/res/res/drawable-xhdpi/password_keyboard_background_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_center_bright.9.png b/core/res/res/drawable-xhdpi/popup_center_bright.9.png
index b1a8e3e..97614e3 100644
--- a/core/res/res/drawable-xhdpi/popup_center_bright.9.png
+++ b/core/res/res/drawable-xhdpi/popup_center_bright.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_full_bright.9.png b/core/res/res/drawable-xhdpi/popup_full_bright.9.png
index 114faa0..f10dd85 100644
--- a/core/res/res/drawable-xhdpi/popup_full_bright.9.png
+++ b/core/res/res/drawable-xhdpi/popup_full_bright.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_full_dark.9.png b/core/res/res/drawable-xhdpi/popup_full_dark.9.png
index 996beaa..7de3e9d 100644
--- a/core/res/res/drawable-xhdpi/popup_full_dark.9.png
+++ b/core/res/res/drawable-xhdpi/popup_full_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_inline_error.9.png b/core/res/res/drawable-xhdpi/popup_inline_error.9.png
index 2784c30..a24e607 100644
--- a/core/res/res/drawable-xhdpi/popup_inline_error.9.png
+++ b/core/res/res/drawable-xhdpi/popup_inline_error.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png b/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png
index f26be8c..e382712 100644
--- a/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png
+++ b/core/res/res/drawable-xhdpi/popup_inline_error_above.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png
index 622095b..3f23144 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
index bf8cf4c..41848dd 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png
index 3e155de..b2a1d8c 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
index 1c1974a..27218f2 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowdown_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png
index 52d95af..49d1ed5 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
index 2613e0d..8be8ac8 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png
index b7986e7..3f9e4aa 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_left_right_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png b/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
index e964b39..46f3640 100644
--- a/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/quickactions_arrowup_right_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_half.png b/core/res/res/drawable-xhdpi/rate_star_big_half.png
index 68c77a8..2ecb3b5 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_half.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_half.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png
index 637c727..f9d3cec 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png
index 50f06dd..bbdc70d3 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_off.png b/core/res/res/drawable-xhdpi/rate_star_big_off.png
index 2389fff..8dae714 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_off.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png
index 96c96fb..34b94db 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png
index 9e8cd54..34cb926 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_on.png b/core/res/res/drawable-xhdpi/rate_star_big_on.png
index 39467dd..43633e15 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_on.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png
index 1e42698..273fd16 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png
index 538e1a8..dbd11bd 100644
--- a/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_big_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_half.png b/core/res/res/drawable-xhdpi/rate_star_med_half.png
index 6c60114..44178c9 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_half.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_half.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png
index c35d9a49..013543e 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png
index f74ea46..801703f 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_off.png b/core/res/res/drawable-xhdpi/rate_star_med_off.png
index 3428a3b..101692d 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_off.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png
index be30970..d411e25 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png
index 1d19a88..39f0fa2 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_on.png b/core/res/res/drawable-xhdpi/rate_star_med_on.png
index 0acddec..a650d0d 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_on.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png
index d9122b4..fdfe932 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png
index 106ae77..ca88d28 100644
--- a/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_med_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_half.png b/core/res/res/drawable-xhdpi/rate_star_small_half.png
index b7a5709..a7e97a5 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_half.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_half.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png
index fc09cd69..3d2a774 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png
index 663332f..9221829f7 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_half_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_off.png b/core/res/res/drawable-xhdpi/rate_star_small_off.png
index 2516ccc..71140ac 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_off.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_off.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png
index 8fc525f..346daa3 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png
index 59b5060..4c2b62c 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_off_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_on.png b/core/res/res/drawable-xhdpi/rate_star_small_on.png
index 327fd1f..ddfb876 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_on.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_on.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png
index 09bb66b0..9bf2466 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_dark.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png
index b1ee6eb..187eede 100644
--- a/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png
+++ b/core/res/res/drawable-xhdpi/rate_star_small_on_holo_light.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png b/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
index fdbf4dd..3cf84a5 100644
--- a/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
+++ b/core/res/res/drawable-xhdpi/scrollbar_handle_accelerated_anim2.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png b/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png
index 4f6391f..24789a5c 100644
--- a/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png
+++ b/core/res/res/drawable-xhdpi/scrollbar_handle_vertical.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
index d70151a..4715cfb 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
index 017688f..d41d5a3 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
index 727fcf1..4f0e06d 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
index 6d03e42..5d9f860 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/search_plate.9.png b/core/res/res/drawable-xhdpi/search_plate.9.png
index 2ad7615d..f917cb6 100644
--- a/core/res/res/drawable-xhdpi/search_plate.9.png
+++ b/core/res/res/drawable-xhdpi/search_plate.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/settings_header_raw.9.png b/core/res/res/drawable-xhdpi/settings_header_raw.9.png
index 41e6c31..c248237 100644
--- a/core/res/res/drawable-xhdpi/settings_header_raw.9.png
+++ b/core/res/res/drawable-xhdpi/settings_header_raw.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png
index 7294519..9afd52f 100644
--- a/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_16_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png
index d43da4e..afd4bb9 100644
--- a/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_16_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png
index eecac27..76e9428 100644
--- a/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_20_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png
index eb91b2c..6f693d6 100644
--- a/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_20_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png
index b1b8232..19517c4 100644
--- a/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_48_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png
index 0c15e12..14143c5 100644
--- a/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_48_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png b/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png
index 6215e95..4c92e956 100644
--- a/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_76_inner_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png b/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png
index 0a67fff..fe1d615 100644
--- a/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png
+++ b/core/res/res/drawable-xhdpi/spinner_76_outer_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png
index 9ee1f8c..5253673 100644
--- a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png
index e3e8656..cfb4a9c 100644
--- a/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_ab_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png b/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png
index b435218..7814354 100644
--- a/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_dropdown_background_down.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png b/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png
index a45c761..17ee05c 100644
--- a/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_dropdown_background_up.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_normal.9.png b/core/res/res/drawable-xhdpi/spinner_normal.9.png
index 71b65dd..1ecf897 100644
--- a/core/res/res/drawable-xhdpi/spinner_normal.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_press.9.png b/core/res/res/drawable-xhdpi/spinner_press.9.png
index d7233ba..87af85c 100644
--- a/core/res/res/drawable-xhdpi/spinner_press.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_press.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_select.9.png b/core/res/res/drawable-xhdpi/spinner_select.9.png
index a1b11e0..15b7a90 100644
--- a/core/res/res/drawable-xhdpi/spinner_select.9.png
+++ b/core/res/res/drawable-xhdpi/spinner_select.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_notify_error.png b/core/res/res/drawable-xhdpi/stat_notify_error.png
index c7ac11f..2d0283e 100644
--- a/core/res/res/drawable-xhdpi/stat_notify_error.png
+++ b/core/res/res/drawable-xhdpi/stat_notify_error.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
index 1909183..6bb7512 100644
--- a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
+++ b/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_adb.png b/core/res/res/drawable-xhdpi/stat_sys_adb.png
index 92f8dd4..01eb61d 100644
--- a/core/res/res/drawable-xhdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-xhdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/status_bar_header_background.9.png b/core/res/res/drawable-xhdpi/status_bar_header_background.9.png
index d03720f..efd3e97 100644
--- a/core/res/res/drawable-xhdpi/status_bar_header_background.9.png
+++ b/core/res/res/drawable-xhdpi/status_bar_header_background.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png
index cf10fb9..ea53b5f 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png
index fe7a441..8a4b61a 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_activated_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png
index 54ae979..6a280dc 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png
index 305cc35..34a9304 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_disabled_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png
index 05dfede..757fdd4 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png
index 63bbc41..8873ccc 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png
index d830a99..d22226e 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png
index 17802601..c94248c 100644
--- a/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/switch_thumb_pressed_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/tab_selected_v4.9.png b/core/res/res/drawable-xhdpi/tab_selected_v4.9.png
index e867f90..f1f4ec6 100644
--- a/core/res/res/drawable-xhdpi/tab_selected_v4.9.png
+++ b/core/res/res/drawable-xhdpi/tab_selected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png b/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png
index 60b98073..1df8c3a 100644
--- a/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png
+++ b/core/res/res/drawable-xhdpi/tab_unselected_v4.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/text_select_handle_left.png b/core/res/res/drawable-xhdpi/text_select_handle_left.png
index 5fcbc52..98d10c9 100644
--- a/core/res/res/drawable-xhdpi/text_select_handle_left.png
+++ b/core/res/res/drawable-xhdpi/text_select_handle_left.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/text_select_handle_middle.png b/core/res/res/drawable-xhdpi/text_select_handle_middle.png
index 05c2ca7..058b30b 100644
--- a/core/res/res/drawable-xhdpi/text_select_handle_middle.png
+++ b/core/res/res/drawable-xhdpi/text_select_handle_middle.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/text_select_handle_right.png b/core/res/res/drawable-xhdpi/text_select_handle_right.png
index ebf97c4..b3a0c9f 100644
--- a/core/res/res/drawable-xhdpi/text_select_handle_right.png
+++ b/core/res/res/drawable-xhdpi/text_select_handle_right.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_default.9.png b/core/res/res/drawable-xhdpi/textfield_default.9.png
index 20b1a09..f084f47 100644
--- a/core/res/res/drawable-xhdpi/textfield_default.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_disabled.9.png b/core/res/res/drawable-xhdpi/textfield_disabled.9.png
index 794dce8..1940051 100644
--- a/core/res/res/drawable-xhdpi/textfield_disabled.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_disabled.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png b/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png
index b708d82..335bee6 100644
--- a/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_disabled_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_default.9.png b/core/res/res/drawable-xhdpi/textfield_search_default.9.png
index 0ed71f7..ad4b935 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_default.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png b/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png
index 290dd38..0c60f9e 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_empty_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png b/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png
index bf20153..741bed9 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_empty_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png b/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png
index 18406a3..24ea6cf 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_empty_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png b/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png
index 0913c23..815785c 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_search_selected.9.png b/core/res/res/drawable-xhdpi/textfield_search_selected.9.png
index 7ba4d61..f009cdb 100644
--- a/core/res/res/drawable-xhdpi/textfield_search_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_search_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/textfield_selected.9.png b/core/res/res/drawable-xhdpi/textfield_selected.9.png
index 275d628..963efde 100644
--- a/core/res/res/drawable-xhdpi/textfield_selected.9.png
+++ b/core/res/res/drawable-xhdpi/textfield_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/title_bar_medium.9.png b/core/res/res/drawable-xhdpi/title_bar_medium.9.png
index 4ef531c..109c017 100644
--- a/core/res/res/drawable-xhdpi/title_bar_medium.9.png
+++ b/core/res/res/drawable-xhdpi/title_bar_medium.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/title_bar_portrait.9.png b/core/res/res/drawable-xhdpi/title_bar_portrait.9.png
index eb607c7..3c91a4a 100644
--- a/core/res/res/drawable-xhdpi/title_bar_portrait.9.png
+++ b/core/res/res/drawable-xhdpi/title_bar_portrait.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/title_bar_tall.9.png b/core/res/res/drawable-xhdpi/title_bar_tall.9.png
index 4beb1d7..e986db1 100644
--- a/core/res/res/drawable-xhdpi/title_bar_tall.9.png
+++ b/core/res/res/drawable-xhdpi/title_bar_tall.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/vpn_connected.png b/core/res/res/drawable-xhdpi/vpn_connected.png
index 5d37ffc..1f46be2 100644
--- a/core/res/res/drawable-xhdpi/vpn_connected.png
+++ b/core/res/res/drawable-xhdpi/vpn_connected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/vpn_disconnected.png b/core/res/res/drawable-xhdpi/vpn_disconnected.png
index dd9ba92..847d3f5 100644
--- a/core/res/res/drawable-xhdpi/vpn_disconnected.png
+++ b/core/res/res/drawable-xhdpi/vpn_disconnected.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/zoom_plate.9.png b/core/res/res/drawable-xhdpi/zoom_plate.9.png
index 5229b5f..797215b 100644
--- a/core/res/res/drawable-xhdpi/zoom_plate.9.png
+++ b/core/res/res/drawable-xhdpi/zoom_plate.9.png
Binary files differ
diff --git a/core/res/res/drawable-xlarge-hdpi/indicator_code_lock_drag_direction_green_up.png b/core/res/res/drawable-xlarge-hdpi/indicator_code_lock_drag_direction_green_up.png
deleted file mode 100644
index c605607..0000000
--- a/core/res/res/drawable-xlarge-hdpi/indicator_code_lock_drag_direction_green_up.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/layout/keyguard_screen_password_landscape.xml b/core/res/res/layout/keyguard_screen_password_landscape.xml
index 3343d8b..8bc5f34 100644
--- a/core/res/res/layout/keyguard_screen_password_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_password_landscape.xml
@@ -191,4 +191,17 @@
android:layout_height="0dip"
/>
+ <!-- Area to overlay FaceLock -->
+ <TextView android:id="@+id/faceLockAreaView"
+ android:visibility="gone"
+ android:layout_row="0"
+ android:layout_column="2"
+ android:layout_rowSpan="8"
+ android:layout_columnSpan="1"
+ android:layout_gravity="fill"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@color/facelock_color_background"
+ />
+
</GridLayout>
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index d71dbff..2778f4e 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -160,4 +160,18 @@
android:layout_height="0dip"
/>
+ <!-- Area to overlay FaceLock -->
+ <TextView android:id="@+id/faceLockAreaView"
+ android:visibility="gone"
+ android:layout_row="0"
+ android:layout_column="1"
+ android:layout_rowSpan="7"
+ android:layout_columnSpan="1"
+ android:layout_gravity="fill"
+ android:layout_marginLeft="8dip"
+ android:layout_width="0dip"
+ android:layout_height="0dip"
+ android:background="@color/facelock_color_background"
+ />
+
</GridLayout>
diff --git a/core/res/res/values-mcc204/strings.xml b/core/res/res/values-mcc204/strings.xml
index c3fff3d..134e9d2 100644
--- a/core/res/res/values-mcc204/strings.xml
+++ b/core/res/res/values-mcc204/strings.xml
@@ -20,6 +20,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- A string used to replace %s in a URL to fill in the locale for countries -->
- <!-- whose locale we don't natively support. A 0 length string triggers no replacement -->
+ <!-- whose locale we don't natively support. A 0 length string triggers no replacement. Do not translate -->
<string name="locale_replacement">nl_nl</string>
</resources>
diff --git a/core/res/res/values-mcc230/strings.xml b/core/res/res/values-mcc230/strings.xml
index 559b858..3078bf8 100644
--- a/core/res/res/values-mcc230/strings.xml
+++ b/core/res/res/values-mcc230/strings.xml
@@ -20,6 +20,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- A string used to replace %s in a URL to fill in the locale for countries -->
- <!-- whose locale we don't natively support. A 0 length string triggers no replacement -->
+ <!-- whose locale we don't natively support. A 0 length string triggers no replacement. Do not translate -->
<string name="locale_replacement">cs_cz</string>
</resources>
diff --git a/core/res/res/values-mcc232/strings.xml b/core/res/res/values-mcc232/strings.xml
index 494770f..809e4a0 100644
--- a/core/res/res/values-mcc232/strings.xml
+++ b/core/res/res/values-mcc232/strings.xml
@@ -20,6 +20,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- A string used to replace %s in a URL to fill in the locale for countries -->
- <!-- whose locale we don't natively support. A 0 length string triggers no replacement -->
+ <!-- whose locale we don't natively support. A 0 length string triggers no replacement. Do not translate -->
<string name="locale_replacement">de_at</string>
</resources>
diff --git a/core/res/res/values-mcc234/strings.xml b/core/res/res/values-mcc234/strings.xml
index 2e6a3f3..676defe 100644
--- a/core/res/res/values-mcc234/strings.xml
+++ b/core/res/res/values-mcc234/strings.xml
@@ -20,6 +20,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- A string used to replace %s in a URL to fill in the locale for countries -->
- <!-- whose locale we don't natively support. A 0 length string triggers no replacement -->
+ <!-- whose locale we don't natively support. A 0 length string triggers no replacement. Do not translate -->
<string name="locale_replacement">en_gb</string>
</resources>
diff --git a/core/res/res/values-mcc260/strings.xml b/core/res/res/values-mcc260/strings.xml
index 20c19dd..90f2521 100644
--- a/core/res/res/values-mcc260/strings.xml
+++ b/core/res/res/values-mcc260/strings.xml
@@ -20,6 +20,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- A string used to replace %s in a URL to fill in the locale for countries -->
- <!-- whose locale we don't natively support. A 0 length string triggers no replacement -->
+ <!-- whose locale we don't natively support. A 0 length string triggers no replacement. Do not translate -->
<string name="locale_replacement">pl_pl</string>
</resources>
diff --git a/core/res/res/values-mcc262/strings.xml b/core/res/res/values-mcc262/strings.xml
index 8ca0e31..ae323b8 100644
--- a/core/res/res/values-mcc262/strings.xml
+++ b/core/res/res/values-mcc262/strings.xml
@@ -20,6 +20,6 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- A string used to replace %s in a URL to fill in the locale for countries -->
- <!-- whose locale we don't natively support. A 0 length string triggers no replacement -->
+ <!-- whose locale we don't natively support. A 0 length string triggers no replacement. Do not translate -->
<string name="locale_replacement">de_de</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/donottranslate-cldr.xml b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
index 06c9bcc..a43f857 100644
--- a/core/res/res/values-zh-rTW/donottranslate-cldr.xml
+++ b/core/res/res/values-zh-rTW/donottranslate-cldr.xml
@@ -61,21 +61,21 @@
<string name="day_of_week_long_friday">星期五</string>
<string name="day_of_week_long_saturday">星期å…</string>
- <string name="day_of_week_medium_sunday">周日</string>
- <string name="day_of_week_medium_monday">周一</string>
- <string name="day_of_week_medium_tuesday">周二</string>
- <string name="day_of_week_medium_wednesday">周三</string>
- <string name="day_of_week_medium_thursday">周四</string>
- <string name="day_of_week_medium_friday">周五</string>
- <string name="day_of_week_medium_saturday">周å…</string>
+ <string name="day_of_week_medium_sunday">週日</string>
+ <string name="day_of_week_medium_monday">週一</string>
+ <string name="day_of_week_medium_tuesday">週二</string>
+ <string name="day_of_week_medium_wednesday">週三</string>
+ <string name="day_of_week_medium_thursday">週四</string>
+ <string name="day_of_week_medium_friday">週五</string>
+ <string name="day_of_week_medium_saturday">週å…</string>
- <string name="day_of_week_short_sunday">周日</string>
- <string name="day_of_week_short_monday">周一</string>
- <string name="day_of_week_short_tuesday">周二</string>
- <string name="day_of_week_short_wednesday">周三</string>
- <string name="day_of_week_short_thursday">周四</string>
- <string name="day_of_week_short_friday">周五</string>
- <string name="day_of_week_short_saturday">周å…</string>
+ <string name="day_of_week_short_sunday">週日</string>
+ <string name="day_of_week_short_monday">週一</string>
+ <string name="day_of_week_short_tuesday">週二</string>
+ <string name="day_of_week_short_wednesday">週三</string>
+ <string name="day_of_week_short_thursday">週四</string>
+ <string name="day_of_week_short_friday">週五</string>
+ <string name="day_of_week_short_saturday">週å…</string>
<string name="day_of_week_shortest_sunday">æ—¥</string>
<string name="day_of_week_shortest_monday">一</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 5eb3e5a..ae39760 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -138,6 +138,18 @@
<item>"0,1"</item>
</string-array>
+ <!-- Set of NetworkInfo.getType() that reflect data usage. -->
+ <integer-array translatable="false" name="config_data_usage_network_types">
+ <item>0</item> <!-- TYPE_MOBILE -->
+ <item>2</item> <!-- TYPE_MOBILE_MMS -->
+ <item>3</item> <!-- TYPE_MOBILE_SUPL -->
+ <item>4</item> <!-- TYPE_MOBILE_DUN -->
+ <item>5</item> <!-- TYPE_MOBILE_HIPRI -->
+ <item>10</item> <!-- TYPE_MOBILE_FOTA -->
+ <item>11</item> <!-- TYPE_MOBILE_IMS -->
+ <item>12</item> <!-- TYPE_MOBILE_CBS -->
+ </integer-array>
+
<!-- The maximum duration (in milliseconds) we expect a network transition to take -->
<integer name="config_networkTransitionTimeout">60000</integer>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index e093fa9..2d5d4cc 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -41,9 +41,13 @@
<string name="untitled"><untitled></string>
<!-- Used to replace a range of characters in text that is too wide
- for the space allocated to it. -->
+ for the space allocated to it (three dots). -->
<string name="ellipsis">\u2026</string>
+ <!-- Used to replace a range of characters in text that is too wide
+ for the space allocated to it (two dots). -->
+ <string name="ellipsis_two_dots">\u2025</string>
+
<!-- How to display the lack of a phone number -->
<string name="emptyPhoneNumber">(No phone number)</string>
diff --git a/core/tests/coretests/apks/install_verifier_bad/Android.mk b/core/tests/coretests/apks/install_verifier_bad/Android.mk
new file mode 100644
index 0000000..b50cfd04
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_bad/Android.mk
@@ -0,0 +1,11 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := FrameworkCoreTests_install_verifier_bad
+
+include $(BUILD_PACKAGE)
+
diff --git a/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml b/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml
new file mode 100644
index 0000000..0170cdd
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_bad/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworks.coretests.install_verifier_bad">
+
+ <package-verifier android:name="com.android.frameworks.coretests.nonexistent" android:publicKey="Zm9vYmFy" />
+
+ <application android:hasCode="false">
+ </application>
+</manifest>
diff --git a/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml b/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml
new file mode 100644
index 0000000..3b8b3b1
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_bad/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Just need this dummy file to have something to build. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dummy">dummy</string>
+</resources>
diff --git a/core/tests/coretests/apks/install_verifier_good/Android.mk b/core/tests/coretests/apks/install_verifier_good/Android.mk
new file mode 100644
index 0000000..a48a80e
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_good/Android.mk
@@ -0,0 +1,10 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := FrameworkCoreTests_install_verifier_good
+
+include $(BUILD_PACKAGE)
diff --git a/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml b/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml
new file mode 100644
index 0000000..90135a5
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_good/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.frameworks.coretests.install_verifier_bad">
+
+ <package-verifier android:name="com.android.frameworks.coretests" android:publicKey="MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAnHgFkqwNXTgc3qpl7MimAG42SAxtcgexIBG+UIY6q+K1XQCa33FG1vIgIoDHzU172yYkO4qAbCazSxN1I6SSaCJJBNwBST58Cs8aBch09psDe2AwnZB00kKA4WutKoc0NhlR6vcqSC0JsgSxh14SrJjBqnc9aAC56v3lbVi+2OjaFvmjYAmcN6g0pt/tt7a0SgSeB6Jp/M8sVJbyzzbWTfkKO42PNKO6q0z1M3GrJ3GbO6WHVK0MU/wU4dtF1R4jT7vpPJuk7fnOVCYTUOxTVge/aaL/SqB9tffqIA0JpsG0niFAL4ntEZCJOqtakYDxUugvhaRXU89fwZBxxe7IJwIBAw==" />
+
+ <application android:hasCode="false">
+ </application>
+</manifest>
diff --git a/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml b/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml
new file mode 100644
index 0000000..3b8b3b1
--- /dev/null
+++ b/core/tests/coretests/apks/install_verifier_good/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Just need this dummy file to have something to build. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dummy">dummy</string>
+</resources>
diff --git a/core/tests/coretests/src/android/net/http/AbstractProxyTest.java b/core/tests/coretests/src/android/net/http/AbstractProxyTest.java
index ee4ce95..4891232 100644
--- a/core/tests/coretests/src/android/net/http/AbstractProxyTest.java
+++ b/core/tests/coretests/src/android/net/http/AbstractProxyTest.java
@@ -219,6 +219,23 @@
assertEquals("GET /bar HTTP/1.1", recordedRequest.getRequestLine());
}
+ // http://b/5372438
+ public void testRetryWithProxy() throws Exception {
+ server.enqueue(new MockResponse()
+ .setSocketPolicy(SocketPolicy.DISCONNECT_AT_START));
+ server.play();
+
+ HttpClient httpProxyClient = newHttpClient();
+ HttpGet request = new HttpGet("http://android.com/foo");
+ ProxyConfig.REQUEST_PARAMETER.configure(server, httpProxyClient, request);
+
+ try {
+ httpProxyClient.execute(request);
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
enum ProxyConfig {
PROXY_SYSTEM_PROPERTY() {
@Override void configure(MockWebServer server, HttpClient client, HttpRequest request) {
diff --git a/data/fonts/Lohit_Hindi.ttf b/data/fonts/Lohit_Hindi.ttf
deleted file mode 100644
index 73caae3..0000000
--- a/data/fonts/Lohit_Hindi.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/fallback_fonts.xml b/data/fonts/fallback_fonts.xml
index e468558..881233a 100644
--- a/data/fonts/fallback_fonts.xml
+++ b/data/fonts/fallback_fonts.xml
@@ -56,7 +56,7 @@
</family>
<family>
<fileset>
- <file>Lohit_Hindi.ttf</file>
+ <file>Lohit-Devanagari.ttf</file>
</fileset>
</family>
<family>
diff --git a/data/fonts/fonts.mk b/data/fonts/fonts.mk
index 5bac8f0..67d04c9 100644
--- a/data/fonts/fonts.mk
+++ b/data/fonts/fonts.mk
@@ -30,7 +30,6 @@
frameworks/base/data/fonts/DroidSerif-Italic.ttf:system/fonts/DroidSerif-Italic.ttf \
frameworks/base/data/fonts/DroidSerif-BoldItalic.ttf:system/fonts/DroidSerif-BoldItalic.ttf \
frameworks/base/data/fonts/DroidSansMono.ttf:system/fonts/DroidSansMono.ttf \
- frameworks/base/data/fonts/Lohit_Hindi.ttf:system/fonts/Lohit_Hindi.ttf \
frameworks/base/data/fonts/DroidSansArmenian.ttf:system/fonts/DroidSansArmenian.ttf \
frameworks/base/data/fonts/DroidSansGeorgian.ttf:system/fonts/DroidSansGeorgian.ttf \
frameworks/base/data/fonts/Clockopia.ttf:system/fonts/Clockopia.ttf \
diff --git a/data/sounds/effects/ogg/Effect_Tick.ogg b/data/sounds/effects/ogg/Effect_Tick.ogg
index b379019..c8a5c36 100644
--- a/data/sounds/effects/ogg/Effect_Tick.ogg
+++ b/data/sounds/effects/ogg/Effect_Tick.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressDelete_14.ogg b/data/sounds/effects/ogg/KeypressDelete_14.ogg
index aa4349d..0baea25 100644
--- a/data/sounds/effects/ogg/KeypressDelete_14.ogg
+++ b/data/sounds/effects/ogg/KeypressDelete_14.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressDelete_49.ogg b/data/sounds/effects/ogg/KeypressDelete_49.ogg
index aa4349d..f5e9deb 100644
--- a/data/sounds/effects/ogg/KeypressDelete_49.ogg
+++ b/data/sounds/effects/ogg/KeypressDelete_49.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressReturn_14.ogg b/data/sounds/effects/ogg/KeypressReturn_14.ogg
index 2244a42..86a5a0e 100644
--- a/data/sounds/effects/ogg/KeypressReturn_14.ogg
+++ b/data/sounds/effects/ogg/KeypressReturn_14.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressReturn_49.ogg b/data/sounds/effects/ogg/KeypressReturn_49.ogg
index 2244a42..b0ddee5 100644
--- a/data/sounds/effects/ogg/KeypressReturn_49.ogg
+++ b/data/sounds/effects/ogg/KeypressReturn_49.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressSpacebar_14.ogg b/data/sounds/effects/ogg/KeypressSpacebar_14.ogg
index 56ea15e..058534a 100644
--- a/data/sounds/effects/ogg/KeypressSpacebar_14.ogg
+++ b/data/sounds/effects/ogg/KeypressSpacebar_14.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressSpacebar_49.ogg b/data/sounds/effects/ogg/KeypressSpacebar_49.ogg
index 56ea15e..3866e0e9 100644
--- a/data/sounds/effects/ogg/KeypressSpacebar_49.ogg
+++ b/data/sounds/effects/ogg/KeypressSpacebar_49.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressStandard_14.ogg b/data/sounds/effects/ogg/KeypressStandard_14.ogg
index 8df7214..317c8f3 100644
--- a/data/sounds/effects/ogg/KeypressStandard_14.ogg
+++ b/data/sounds/effects/ogg/KeypressStandard_14.ogg
Binary files differ
diff --git a/data/sounds/effects/ogg/KeypressStandard_49.ogg b/data/sounds/effects/ogg/KeypressStandard_49.ogg
index 8df7214..893bb52 100644
--- a/data/sounds/effects/ogg/KeypressStandard_49.ogg
+++ b/data/sounds/effects/ogg/KeypressStandard_49.ogg
Binary files differ
diff --git a/docs/html/guide/appendix/media-formats.jd b/docs/html/guide/appendix/media-formats.jd
index e128a1c..ccc63a2 100644
--- a/docs/html/guide/appendix/media-formats.jd
+++ b/docs/html/guide/appendix/media-formats.jd
@@ -37,11 +37,16 @@
<ul>
<li>RTSP (RTP, SDP)</li>
- <li>HTTP progressive streaming</li>
- <li>HTTP live streaming <a href="http://tools.ietf.org/html/draft-pantos-http-live-streaming-05">draft protocol</a> (Android 3.0 and above)</li>
+ <li>HTTP/HTTPS progressive streaming</li>
+ <li>HTTP/HTTPS live streaming <a href="http://tools.ietf.org/html/draft-pantos-http-live-streaming">draft protocol</a>: <ul>
+ <li>MPEG-2 TS media files only</li>
+ <li>Protocol version 3 (Android 4.0 and above)</li>
+ <li>Protocol version 2 (Android 3.x)</li>
+ <li>Not supported before Android 3.0</li>
+ </ul></li>
</ul>
-<p class="note"><strong>Note:</strong> HTTPS is not supported at this time.</p>
+<p class="note"><strong>Note:</strong> HTTPS is not supported before Android 3.1.</p>
<h2 id="core">Core Media Formats</h2>
@@ -71,7 +76,11 @@
<td style="text-align: center;"><big>•</big></td>
<td rowspan="3">Mono/Stereo content in any combination of standard bit
rates up to 160 kbps and sampling rates from 8 to 48kHz</td>
-<td rowspan="3">3GPP (.3gp), and MPEG-4 (.mp4, .m4a). ADTS raw AAC (.aac, decode only, ADIF not supported, Android 3.1+). </td>
+<td rowspan="3">
+ • 3GPP (.3gp)<br>
+ • MPEG-4 (.mp4, .m4a)<br>
+ • ADTS raw AAC (.aac, decode in Android 3.1+, encode in Android 4.0+, ADIF not supported)<br>
+ • MPEG-TS (.ts, not seekable, Android 3.0+)</td>
</tr>
<tr>
@@ -91,8 +100,8 @@
<td style="text-align: center;"><big>•</big></td>
<td style="text-align: center;"><big>•</big></td>
<td>4.75 to 12.2 kbps sampled @ 8kHz</td>
-<td>3GPP (.3gp)
-</td>
+<td>
+ 3GPP (.3gp)</td>
</tr>
<tr>
@@ -100,19 +109,21 @@
<td style="text-align: center;"><big>•</big></td>
<td style="text-align: center;"><big>•</big></td>
<td>9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16kHz</td>
-<td>3GPP (.3gp)</td>
+<td>
+ 3GPP (.3gp)</td>
</tr>
<tr>
<td>FLAC</td>
<td> </td>
-<td style="text-align: center;"><big>•</big><br><small>(Android 3.1+)</small></td>
+<td style="text-align: center;" nowrap><big>•</big><br><small>(Android 3.1+)</small></td>
<td>Mono/Stereo (no multichannel). Sample rates up to 48 kHz (but up to 44.1
kHz is recommended on devices with 44.1 kHz output, as the 48 to 44.1 kHz
downsampler does not include a low-pass filter). 16-bit recommended;
no dither applied for 24-bit.
</td>
-<td>FLAC (.flac) only</td>
+<td>
+ FLAC (.flac) only</td>
</tr>
<tr>
@@ -121,7 +132,8 @@
<td style="text-align: center;"><big>•</big></td>
<td>Mono/Stereo 8-320Kbps constant (CBR) or variable bit-rate (VBR)
</td>
-<td>MP3 (.mp3)</td>
+<td>
+ MP3 (.mp3)</td>
</tr>
<tr>
@@ -129,15 +141,21 @@
<td> </td>
<td style="text-align: center;"><big>•</big></td>
<td>MIDI Type 0 and 1. DLS Version 1 and 2. XMF and Mobile XMF. Support for ringtone formats RTTTL/RTX, OTA, and iMelody </td>
-<td>Type 0 and 1 (.mid, .xmf, .mxmf). Also RTTTL/RTX (.rtttl, .rtx), OTA (.ota), and iMelody (.imy)</td>
+<td>
+ • Type 0 and 1 (.mid, .xmf, .mxmf)<br>
+ • RTTTL/RTX (.rtttl, .rtx)<br>
+ • OTA (.ota)<br>
+ • iMelody (.imy)</td>
</tr>
<tr>
-<td>Ogg Vorbis</td>
+<td>Vorbis</td>
<td> </td>
<td style="text-align: center;"><big>•</big></td>
<td> </td>
-<td>Ogg (.ogg)</td>
+<td>
+ • Ogg (.ogg)<br>
+ • Matroska (.mkv, Android 4.0+)</td>
</tr>
<tr>
@@ -145,16 +163,18 @@
<td> </td>
<td style="text-align: center;"><big>•</big></td>
<td>8- and 16-bit linear PCM (rates up to limit of hardware)</td>
-<td>WAVE (.wav)</td>
+<td>
+ WAVE (.wav)</td>
</tr>
<tr>
-<td rowspan="4">Image</td>
+<td rowspan="5">Image</td>
<td>JPEG</td>
<td style="text-align: center;"><big>•</big></td>
<td style="text-align: center;"><big>•</big></td>
<td>Base+progressive</td>
-<td>JPEG (.jpg)</td>
+<td>
+ JPEG (.jpg)</td>
</tr>
<tr>
@@ -162,7 +182,8 @@
<td> </td>
<td style="text-align: center;"><big>•</big></td>
<td> </td>
-<td>GIF (.gif)</td>
+<td>
+ GIF (.gif)</td>
</tr>
<tr>
@@ -170,7 +191,8 @@
<td style="text-align: center;"><big>•</big></td>
<td style="text-align: center;"><big>•</big></td>
<td> </td>
-<td>PNG (.png)</td>
+<td>
+ PNG (.png)</td>
</tr>
<tr>
@@ -178,7 +200,17 @@
<td> </td>
<td style="text-align: center;"><big>•</big></td>
<td> </td>
-<td>BMP (.bmp)</td>
+<td>
+ BMP (.bmp)</td>
+</tr>
+
+<tr>
+<td>WEBP</td>
+<td style="text-align: center;" nowrap><big>•</big><br><small>(Android 4.0+)</small></td>
+<td style="text-align: center;" nowrap><big>•</big><br><small>(Android 4.0+)</small></td>
+<td> </td>
+<td>
+ WebP (.webp)</td>
</tr>
@@ -188,15 +220,20 @@
<td style="text-align: center;"><big>•</big></td>
<td style="text-align: center;"><big>•</big></td>
<td> </td>
-<td>3GPP (.3gp) and MPEG-4 (.mp4)</td>
+<td>
+ • 3GPP (.3gp)<br>
+ • MPEG-4 (.mp4)</td>
</tr>
<tr>
<td>H.264 AVC</td>
<td style="text-align: center;" nowrap><big>•</big><br><small>(Android 3.0+)</small></td>
-<td style="text-align: center;"><big>•</big></td>
+<td style="text-align: center;" nowrap><big>•</big></td>
<td>Baseline Profile (BP)</td>
-<td>3GPP (.3gp) and MPEG-4 (.mp4). MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)</td>
+<td>
+ • 3GPP (.3gp)<br>
+ • MPEG-4 (.mp4)<br>
+ • MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)</td>
</tr>
<tr>
@@ -204,15 +241,18 @@
<td> </td>
<td style="text-align: center;"><big>•</big></td>
<td> </td>
-<td>3GPP (.3gp)</td>
+<td>
+ 3GPP (.3gp)</td>
</tr>
<tr>
<td>VP8</td>
<td> </td>
-<td style="text-align: center;"><big>•</big><br><small>(Android 2.3.3+)</small></td>
-<td> </td>
-<td><a href="http://www.webmproject.org/">WebM</a> (.webm)</td>
+<td style="text-align: center;" nowrap><big>•</big><br><small>(Android 2.3.3+)</small></td>
+<td>Streamable only in Android 4.0 and above</td>
+<td>
+ • <a href="http://www.webmproject.org/">WebM</a> (.webm)<br>
+ • Matroska (.mkv, Android 4.0+)</td>
</tr>
</tbody></table>
@@ -220,7 +260,7 @@
<h2 id="recommendations">Video Encoding Recommendations</h2>
-<p>Table 2, below, lists examples of video encoding profiles and parameters that the Android media framework supports for playback. In addition to these encoding parameter recommendations, a device's available video recording profiles can be used as a proxy for media playback capabilities. These profiles can be inspected using the {@link android.media.CamcorderProfile CamcorderProfile} class, which is available since API level 8.</p>
+<p>Table 2, below, lists examples of video encoding profiles and parameters that the Android media framework supports for playback. In addition to these encoding parameter recommendations, a device's available <em>video recording</em> profiles can be used as a proxy for media playback capabilities. These profiles can be inspected using the {@link android.media.CamcorderProfile CamcorderProfile} class, which is available since API level 8.</p>
<p class="table-caption" id="encoding-recommendations-table"><strong>Table 2.</strong> Examples of supported video encoding parameters.</p>
@@ -228,45 +268,53 @@
<thead>
<tr>
<th> </th>
- <th style="background-color:#f3f3f3;font-weight:normal">Lower quality</th>
- <th style="background-color:#f3f3f3;font-weight:normal">Higher quality</th>
+ <th style="background-color:#f3f3f3;font-weight:normal"><acronym title="Standard definition">SD</a> (Low quality)</th>
+ <th style="background-color:#f3f3f3;font-weight:normal"><acronym title="Standard definition">SD</a> (High quality)</th>
+ <th style="background-color:#f3f3f3;font-weight:normal"><acronym title="High definition">HD</a> (Not available on all devices)</th>
</tr>
</thead>
<tbody>
<tr>
<th>Video codec</th>
- <td>H.264 Baseline Profile</th>
- <td>H.264 Baseline Profile</th>
+ <td>H.264 Baseline Profile</td>
+ <td>H.264 Baseline Profile</td>
+ <td>H.264 Baseline Profile</td>
</tr>
<tr>
<th>Video resolution</th>
- <td>176 x 144 px</th>
- <td>480 x 360 px</th>
+ <td>176 x 144 px</td>
+ <td>480 x 360 px</td>
+ <td>1280 x 720 px</td>
</tr>
<tr>
<th>Video frame rate</th>
- <td>12 fps</th>
- <td>30 fps</th>
+ <td>12 fps</td>
+ <td>30 fps</td>
+ <td>30 fps</td>
</tr>
<tr>
<th>Video bitrate</th>
- <td>56 Kbps</th>
- <td>500 Kbps</th>
+ <td>56 Kbps</td>
+ <td>500 Kbps</td>
+ <td>2 Mbps</td>
</tr>
<tr>
<th>Audio codec</th>
- <td>AAC-LC</th>
- <td>AAC-LC</th>
+ <td>AAC-LC</td>
+ <td>AAC-LC</td>
+ <td>AAC-LC</td>
</tr>
<tr>
<th>Audio channels</th>
- <td>1 (mono)</th>
- <td>2 (stereo)</th>
+ <td>1 (mono)</td>
+ <td>2 (stereo)</td>
+ <td>2 (stereo)</td>
</tr>
<tr>
<th>Audio bitrate</th>
- <td>24 Kbps</th>
- <td>128 Kbps</th>
+ <td>24 Kbps</td>
+ <td>128 Kbps</td>
+ <td>192 Kbps</td>
</tr>
</tbody>
</table>
@@ -274,7 +322,8 @@
<p style="margin-top: 2em">For video content that is streamed over HTTP or RTSP, there are additional requirements:</p>
<ul>
- <li>For 3GPP and MPEG-4 containers, the <code>moov</code> atom must precede any <code>mdat</code> atoms.</li>
+ <li>For 3GPP and MPEG-4 containers, the <code>moov</code> atom must precede any <code>mdat</code> atoms, but must succeed the
+ <code>ftyp</code> atom.</li>
<li>For 3GPP, MPEG-4, and WebM containers, audio and video samples corresponding to the same time offset may be no more than 500 KB apart.
To minimize this audio/video drift, consider interleaving audio and video in smaller chunk sizes.</li>
</ul>
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index 3716583..5f74e50 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -717,7 +717,7 @@
</ul>
</li>
<li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/widget_design.html">
- <span class="en">App Widget Design</span>
+ <span class="en">App Widget Design <span class="new">updated</span></span>
</a></li>
<li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/activity_task_design.html">
<span class="en">Activity and Task Design</span>
diff --git a/docs/html/guide/practices/design/jni.jd b/docs/html/guide/practices/design/jni.jd
index 6e984b0..9980efd 100644
--- a/docs/html/guide/practices/design/jni.jd
+++ b/docs/html/guide/practices/design/jni.jd
@@ -26,9 +26,9 @@
</div>
</div>
-<p>JNI is the Java Native Interface. It defines a way for code written in the
-Java programming language to interact with native
-code: functions written in C/C++. It's VM-neutral, has support for loading code from
+<p>JNI is the Java Native Interface. It defines a way for managed code
+(written in the Java programming language) to interact with native
+code (written in C/C++). It's vendor-neutral, has support for loading code from
dynamic shared libraries, and while cumbersome at times is reasonably efficient.</p>
<p>You really should read through the
@@ -46,13 +46,13 @@
pointers to pointers to function tables. (In the C++ version, they're classes with a
pointer to a function table and a member function for each JNI function that indirects through
the table.) The JavaVM provides the "invocation interface" functions,
-which allow you to create and destroy the VM. In theory you can have multiple VMs per process,
-but Android's VM only allows one.</p>
+which allow you to create and destroy a JavaVM. In theory you can have multiple JavaVMs per process,
+but Android only allows one.</p>
<p>The JNIEnv provides most of the JNI functions. Your native functions all receive a JNIEnv as
the first argument.</p>
-<p>On some VMs, the JNIEnv is used for thread-local storage. For this reason, <strong>you cannot share a JNIEnv between threads</strong>.
+<p>The JNIEnv is used for thread-local storage. For this reason, <strong>you cannot share a JNIEnv between threads</strong>.
If a piece of code has no other way to get its JNIEnv, you should share
the JavaVM, and use <code>GetEnv</code> to discover the thread's JNIEnv. (Assuming it has one; see <code>AttachCurrentThread</code> below.)</p>
@@ -66,23 +66,22 @@
<a name="threads" id="threads"></a>
<h2>Threads</h2>
-<p>All VM threads are Linux threads, scheduled by the kernel. They're usually
-started using Java language features (notably <code>Thread.start</code>),
-but they can also be created elsewhere and then attached to the VM. For
+<p>All threads are Linux threads, scheduled by the kernel. They're usually
+started from managed code (using <code>Thread.start</code>),
+but they can also be created elsewhere and then attached to the JavaVM. For
example, a thread started with <code>pthread_create</code> can be attached
with the JNI <code>AttachCurrentThread</code> or
<code>AttachCurrentThreadAsDaemon</code> functions. Until a thread is
-attached to the VM, it has no JNIEnv, and
-<strong>cannot make JNI calls</strong>.</p>
+attached, it has no JNIEnv, and <strong>cannot make JNI calls</strong>.</p>
-<p>Attaching a natively-created thread causes the VM to allocate and initialize
-a <code>Thread</code> object, add it to the "main" <code>ThreadGroup</code>,
-and add the thread to the set that is visible to the debugger. Calling
-<code>AttachCurrentThread</code> on an already-attached thread is a no-op.</p>
+<p>Attaching a natively-created thread causes a <code>java.lang.Thread</code>
+object to be constructed and added to the "main" <code>ThreadGroup</code>,
+making it visible to the debugger. Calling <code>AttachCurrentThread</code>
+on an already-attached thread is a no-op.</p>
-<p>The Dalvik VM does not suspend threads executing native code. If
+<p>Android does not suspend threads executing native code. If
garbage collection is in progress, or the debugger has issued a suspend
-request, the VM will pause the thread the next time it makes a JNI call.</p>
+request, Android will pause the thread the next time it makes a JNI call.</p>
<p>Threads attached through JNI <strong>must call
<code>DetachCurrentThread</code> before they exit</strong>.
@@ -108,12 +107,12 @@
</ul>
<p>Similarly, to call a method, you'd first get a class object reference and then a method ID. The IDs are often just
-pointers to internal VM data structures. Looking them up may require several string
+pointers to internal runtime data structures. Looking them up may require several string
comparisons, but once you have them the actual call to get the field or invoke the method
is very quick.</p>
<p>If performance is important, it's useful to look the values up once and cache the results
-in your native code. Because there is a limit of one VM per process, it's reasonable
+in your native code. Because there is a limit of one JavaVM per process, it's reasonable
to store this data in a static local structure.</p>
<p>The class references, field IDs, and method IDs are guaranteed valid until the class is unloaded. Classes
@@ -145,13 +144,17 @@
<a name="local_and_global_references" id="local_and_global_references"></a>
<h2>Local and Global References</h2>
-<p>Every object that JNI returns is a "local reference". This means that it's valid for the
+<p>Every argument passed to a native method, and almost every object returned
+by a JNI function is a "local reference". This means that it's valid for the
duration of the current native method in the current thread.
-<strong>Even if the object itself continues to live on after the native method returns, the reference is not valid.</strong>
-This applies to all sub-classes of <code>jobject</code>, including
+<strong>Even if the object itself continues to live on after the native method
+returns, the reference is not valid.</strong>
+<p>This applies to all sub-classes of <code>jobject</code>, including
<code>jclass</code>, <code>jstring</code>, and <code>jarray</code>.
-(Dalvik VM will warn you about most reference mis-uses when extended JNI
+(The runtime will warn you about most reference mis-uses when extended JNI
checks are enabled.)</p>
+<p>The only way to get non-local references is via the functions
+<code>NewGlobalRef</code> and <code>NewWeakGlobalRef</code>.
<p>If you want to hold on to a reference for a longer period, you must use
a "global" reference. The <code>NewGlobalRef</code> function takes the
@@ -159,7 +162,7 @@
The global reference is guaranteed to be valid until you call
<code>DeleteGlobalRef</code>.</p>
-<p>This pattern is commonly used when caching copies of class objects obtained
+<p>This pattern is commonly used when caching a jclass returned
from <code>FindClass</code>, e.g.:</p>
<pre>jclass localClass = env->FindClass("MyClass");
jclass globalClass = reinterpret_cast<jclass>(env->NewGlobalRef(localClass));</pre>
@@ -181,22 +184,25 @@
<p>Programmers are required to "not excessively allocate" local references. In practical terms this means
that if you're creating large numbers of local references, perhaps while running through an array of
-Objects, you should free them manually with
+objects, you should free them manually with
<code>DeleteLocalRef</code> instead of letting JNI do it for you. The
-VM is only required to reserve slots for
+implementation is only required to reserve slots for
16 local references, so if you need more than that you should either delete as you go or use
-<code>EnsureLocalCapacity</code> to reserve more.</p>
+<code>EnsureLocalCapacity</code>/<code>PushLocalFrame</code> to reserve more.</p>
-<p>Note that <code>jfieldID</code>s and <code>jmethodID</code>s are just integers, not object
-references, and should not be passed to <code>NewGlobalRef</code>. The raw data
+<p>Note that <code>jfieldID</code>s and <code>jmethodID</code>s are opaque
+types, not object references, and should not be passed to
+<code>NewGlobalRef</code>. The raw data
pointers returned by functions like <code>GetStringUTFChars</code>
-and <code>GetByteArrayElements</code> are also not objects.</p>
+and <code>GetByteArrayElements</code> are also not objects. (They may be passed
+between threads, and are valid until the matching Release call.)</p>
<p>One unusual case deserves separate mention. If you attach a native
-thread to the VM with <code>AttachCurrentThread</code>, the code you are running will
-never "return" to the VM until the thread detaches from the VM. Any local
-references you create will have to be deleted manually unless you're going
-to detach the thread soon.</p>
+thread with <code>AttachCurrentThread</code>, the code you are running will
+never automatically free local references until the thread detaches. Any local
+references you create will have to be deleted manually. In general, any native
+code that creates local references in a loop probably needs to do some manual
+deletion.</p>
<a name="UTF_8_and_UTF_16_strings" id="UTF_8_and_UTF_16_strings"></a>
<h2>UTF-8 and UTF-16 Strings</h2>
@@ -205,14 +211,15 @@
modified encoding is useful for C code because it encodes \u0000 as 0xc0 0x80 instead of 0x00.
The nice thing about this is that you can count on having C-style zero-terminated strings,
suitable for use with standard libc string functions. The down side is that you cannot pass
-arbitrary UTF-8 data into the VM and expect it to work correctly.</p>
+arbitrary UTF-8 data to JNI and expect it to work correctly.</p>
-<p>It's usually best to operate with UTF-16 strings. With Android's current VMs, the
-<code>GetStringChars</code> method
-does not require a copy, whereas <code>GetStringUTFChars</code> requires a malloc and a UTF conversion. Note that
+<p>If possible, it's usually faster to operate with UTF-16 strings. Android
+currently does not require a copy in <code>GetStringChars</code>, whereas
+<code>GetStringUTFChars</code> requires an allocation and a conversion to
+UTF-8. Note that
<strong>UTF-16 strings are not zero-terminated</strong>, and \u0000 is allowed,
so you need to hang on to the string length as well as
-the string pointer.</p>
+the jchar pointer.</p>
<p><strong>Don't forget to <code>Release</code> the strings you <code>Get</code></strong>. The
string functions return <code>jchar*</code> or <code>jbyte*</code>, which
@@ -237,9 +244,8 @@
primitives can be read and written directly as if they were declared in C.</p>
<p>To make the interface as efficient as possible without constraining
-the VM implementation,
-the <code>Get<PrimitiveType>ArrayElements</code> family of calls
-allows the VM to either return a pointer to the actual elements, or
+the VM implementation, the <code>Get<PrimitiveType>ArrayElements</code>
+family of calls allows the runtime to either return a pointer to the actual elements, or
allocate some memory and make a copy. Either way, the raw pointer returned
is guaranteed to be valid until the corresponding <code>Release</code> call
is issued (which implies that, if the data wasn't copied, the array object
@@ -253,7 +259,7 @@
useful.</p>
<p>The <code>Release</code> call takes a <code>mode</code> argument that can
-have one of three values. The actions performed by the VM depend upon
+have one of three values. The actions performed by the runtime depend upon
whether it returned a pointer to the actual data or a copy of it:</p>
<ul>
@@ -312,8 +318,9 @@
}</pre>
<p>This grabs the array, copies the first <code>len</code> byte
-elements out of it, and then releases the array. Depending upon the VM
-policies the <code>Get</code> call will either pin or copy the array contents.
+elements out of it, and then releases the array. Depending upon the
+implementation, the <code>Get</code> call will either pin or copy the array
+contents.
The code copies the data (for perhaps a second time), then calls <code>Release</code>; in this case
<code>JNI_ABORT</code> ensures there's no chance of a third copy.</p>
@@ -335,7 +342,7 @@
<a name="exceptions" id="exceptions"></a>
-<h2>Exception</h2>
+<h2>Exceptions</h2>
<p><strong>You must not call most JNI functions while an exception is pending.</strong>
Your code is expected to notice the exception (via the function's return value,
@@ -369,11 +376,11 @@
you must always check for an exception, because the return value is not
going to be valid if an exception was thrown.</p>
-<p>Note that exceptions thrown by interpreted code do not "leap over" native code,
-and C++ exceptions thrown by native code are not handled by Dalvik.
+<p>Note that exceptions thrown by interpreted code do not unwind native stack
+frames, and Android does not yet support C++ exceptions.
The JNI <code>Throw</code> and <code>ThrowNew</code> instructions just
-set an exception pointer in the current thread. Upon returning to the VM from
-native code, the exception will be noted and handled appropriately.</p>
+set an exception pointer in the current thread. Upon returning to managed
+from native code, the exception will be noted and handled appropriately.</p>
<p>Native code can "catch" an exception by calling <code>ExceptionCheck</code> or
<code>ExceptionOccurred</code>, and clear it with
@@ -476,23 +483,19 @@
shared library. For Android apps, you may find it useful to get the full
path to the application's private data storage area from the context object.</p>
-<p>This is the recommended approach, but not the only approach. The VM does
-not require explicit registration, nor that you provide a
+<p>This is the recommended approach, but not the only approach. Explicit
+registration is not required, nor is it necessary that you provide a
<code>JNI_OnLoad</code> function.
You can instead use "discovery" of native methods that are named in a
-specific way (see <a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615">
- the JNI spec</a> for details), though this is less desirable.
-It requires more space in the shared object symbol table,
-loading is slower because it requires string searches through all of the
-loaded shared libraries, and if a method signature is wrong you won't know
+specific way (see <a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615">the JNI spec</a> for details), though this is less desirable because if a method signature is wrong you won't know
about it until the first time the method is actually used.</p>
<p>One other note about <code>JNI_OnLoad</code>: any <code>FindClass</code>
calls you make from there will happen in the context of the class loader
that was used to load the shared library. Normally <code>FindClass</code>
uses the loader associated with the method at the top of the interpreted
-stack, or if there isn't one (because the thread was just attached to
-the VM) it uses the "system" class loader. This makes
+stack, or if there isn't one (because the thread was just attached) it uses
+the "system" class loader. This makes
<code>JNI_OnLoad</code> a convenient place to look up and cache class
object references.</p>
@@ -515,10 +518,9 @@
<p>All JNI 1.6 features are supported, with the following exceptions:</p>
<ul>
- <li><code>DefineClass</code> is not implemented. Dalvik does not use
+ <li><code>DefineClass</code> is not implemented. Android does not use
Java bytecodes or class files, so passing in binary class data
- doesn't work. Translation facilities may be added in a future
- version of the VM.</li>
+ doesn't work.</li>
<li>"Weak global" references are implemented, but may only be passed
to <code>NewLocalRef</code>, <code>NewGlobalRef</code>, and
<code>DeleteWeakGlobalRef</code>. (The spec strongly encourages
@@ -536,12 +538,16 @@
around this requires using explicit registration or moving the
native methods out of inner classes.
<li>Until Android 2.0 (Eclair), it was not possible to use a <code>pthread_key_create</code>
- destructor function to avoid the VM's "thread must be detached before
- exit" check. (The VM also uses a pthread key destructor function,
+ destructor function to avoid the "thread must be detached before
+ exit" check. (The runtime also uses a pthread key destructor function,
so it'd be a race to see which gets called first.)
<li>Until Android 2.2 (Froyo), weak global references were not implemented.
- Older VMs will vigorously reject attempts to use them. You can use
+ Older versions will vigorously reject attempts to use them. You can use
the Android platform version constants to test for support.
+ <li>Until Android 4.0 (Ice Cream Sandwich), JNI local references were
+ actually direct pointers. Ice Cream Sandwich added the indirection
+ necessary to support better garbage collectors, but this means that lots
+ of JNI bugs are undetectable on older releases.
</ul>
@@ -572,8 +578,8 @@
<p>In logcat, you'll see:</p>
<pre>W/dalvikvm( 880): No implementation found for native LFoo;.myfunc ()V</pre>
-<p>This means that the VM tried to find a matching method but was unsuccessful.
-Some common reasons for this are:</p>
+<p>This means that the runtime tried to find a matching method but was
+unsuccessful. Some common reasons for this are:</p>
<ul>
<li>The library isn't getting loaded. Check the logcat output for
messages about library loading.
@@ -581,10 +587,15 @@
is commonly caused by:
<ul>
<li>For lazy method lookup, failing to declare C++ functions
- with <code>extern "C"</code>. You can use <code>arm-eabi-nm</code>
+ with <code>extern "C"</code> and appropriate
+ visibility (<code>JNIEXPORT</code>). Note that prior to Ice Cream
+ Sandwich, the JNIEXPORT macro was incorrect, so using a new GCC with
+ an old <code>jni.h</code> won't work.
+ You can use <code>arm-eabi-nm</code>
to see the symbols as they appear in the library; if they look
mangled (something like <code>_Z15Java_Foo_myfuncP7_JNIEnvP7_jclass</code>
- rather than <code>Java_Foo_myfunc</code>) then you need to
+ rather than <code>Java_Foo_myfunc</code>), or if the symbol type is
+ a lowercase 't' rather than an uppercase 'T', then you need to
adjust the declaration.
<li>For explicit registration, minor errors when entering the
method signature. Make sure that what you're passing to the
@@ -612,7 +623,7 @@
<p>If the class name looks right, you could be running into a class loader
issue. <code>FindClass</code> wants to start the class search in the
-class loader associated with your code. It examines the VM call stack,
+class loader associated with your code. It examines the call stack,
which will look something like:
<pre> Foo.myfunc(Native Method)
Foo.main(Foo.java:10)
@@ -623,14 +634,14 @@
class and uses that.</p>
<p>This usually does what you want. You can get into trouble if you
-create a thread outside the VM (perhaps by calling <code>pthread_create</code>
-and then attaching it to the VM with <code>AttachCurrentThread</code>).
+create a thread yourself (perhaps by calling <code>pthread_create</code>
+and then attaching it with <code>AttachCurrentThread</code>).
Now the stack trace looks like this:</p>
<pre> dalvik.system.NativeStart.run(Native Method)</pre>
<p>The topmost method is <code>NativeStart.run</code>, which isn't part of
your application. If you call <code>FindClass</code> from this thread, the
-VM will start in the "system" class loader instead of the one associated
+JavaVM will start in the "system" class loader instead of the one associated
with your application, so attempts to find app-specific classes will fail.</p>
<p>There are a few ways to work around this:</p>
@@ -656,12 +667,12 @@
<h2>FAQ: How do I share raw data with native code?</h2>
<p>You may find yourself in a situation where you need to access a large
-buffer of raw data from code written in Java and C/C++. Common examples
+buffer of raw data from both managed and native code. Common examples
include manipulation of bitmaps or sound samples. There are two
basic approaches.</p>
<p>You can store the data in a <code>byte[]</code>. This allows very fast
-access from code written in Java. On the native side, however, you're
+access from managed code. On the native side, however, you're
not guaranteed to be able to access the data without having to copy it. In
some implementations, <code>GetByteArrayElements</code> and
<code>GetPrimitiveArrayCritical</code> will return actual pointers to the
@@ -674,8 +685,8 @@
byte buffers, the storage is not allocated on the managed heap, and can
always be accessed directly from native code (get the address
with <code>GetDirectBufferAddress</code>). Depending on how direct
-byte buffer access is implemented in the VM, accessing the data from code
-written in Java can be very slow.</p>
+byte buffer access is implemented, accessing the data from managed code
+can be very slow.</p>
<p>The choice of which to use depends on two factors:</p>
<ol>
@@ -688,5 +699,4 @@
</ol>
<p>If there's no clear winner, use a direct byte buffer. Support for them
-is built directly into JNI, and access to them from code written in
-Java can be made faster with VM improvements.</p>
+is built directly into JNI, and performance should improve in future releases.</p>
diff --git a/docs/html/guide/practices/ui_guidelines/widget_design.jd b/docs/html/guide/practices/ui_guidelines/widget_design.jd
index 49aa498..f111394 100644
--- a/docs/html/guide/practices/ui_guidelines/widget_design.jd
+++ b/docs/html/guide/practices/ui_guidelines/widget_design.jd
@@ -9,268 +9,322 @@
<h2>Quickview</h2>
<ul>
-<li>Widgets have six standard sizes on the Home screen</li>
-<li>Widgets have standards for size, frames, shadows, and file format, which you can copy</li>
-<li>A few tricks make it easier to design widgets that fit graphically on the Home screen</li>
+ <li>App Widget layouts should be flexible, resizing to fit their parent container</li>
+ <li>As of Android 3.0, app widgets can depict collections of items and provide a representative
+ preview image for the widget gallery</li>
+ <li>As of Android 3.1, app widgets can be resizable horizontally and/or vertically</li>
+ <li>As of Android 4.0, app widgets have margins automatically applied</li>
</ul>
<h2>In this document</h2>
<ol>
-<li><a href="#anatomy">Standard widget anatomy</a></li>
-<li><a href="#design">Designing a widget</a></li>
-<li><a href="#sizes">Standard widget sizes</a></li>
-<li><a href="#frames">Standard widget frames</a></li>
-<li><a href="#shadows">Standard widget shadows</a></li>
-<li><a href="#tricks">Widget graphics tips and tricks</a></li>
-<li><a href="#file">Widget graphics file format</a></li>
+<li><a href="#anatomy">Standard Widget Anatomy</a></li>
+<li><a href="#design">Designing Widget Layouts and Background Graphics</a></li>
+<li><a href="#templates">Using the App Widget Templates Pack</a></li>
+</ol>
+
+<h2>Downloads</h2>
+
+<ol>
+<li><a href="{@docRoot}shareables/app_widget_templates-v4.0.zip">App Widget Templates Pack,
+ v4.0 »</a></li>
</ol>
<h2>See also</h2>
<ol>
<li><a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a></li>
-<li><a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">AppWidgets blog post</a></li>
+<li>
+ <a href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">
+ AppWidgets blog post</a></li>
</ol>
</div>
</div>
-<p>Widgets are a feature introduced in Android 1.5. A widget displays an
-application's most important or timely information at a glance, on a user's Home
-screen. The standard Android system image includes several examples of widgets,
-including widgets for Analog Clock, Music, and other applications.</p>
+<p>App widgets (sometimes just "widgets") are a feature introduced in Android 1.5 and vastly
+improved in Android 3.0 and 3.1. A widget can display an application's most timely or otherwise
+relevant information at a glance, on a user's Home screen. The standard Android system image
+includes several widgets, including a widget for the Analog Clock, Music, and other
+applications.</p>
-<p>Users pick the widgets they want to display on their Home screens by touching
-& holding an empty area of the Home screen, selecting Widgets from the menu,
-and then selecting the widget they want.</p>
-<p><img src="{@docRoot}images/widget_design/widget_examples.png" alt="Example
-Widgets"></p>
+<img src="{@docRoot}images/widget_design/widget_examples.png"
+ alt="Example app widgets in Android 4.0" id="widget_examples">
-<p>This document describes how to design a widget so it fits graphically with
-other widgets and with the other elements of the Android Home screen. It also
-describes some standards for widget artwork and some widget graphics tips and
-tricks from the Android team.<p>
+<p class="img-caption"><strong>Figure 1.</strong> Example app widgets in Android 4.0.</p>
+
+
+<p>This document describes how to design a widget so that it fits graphically with other widgets and
+with the other elements of the Android Home screen such as launcher icons and shortcuts. It also
+describes some standards for widget artwork and some widget graphics tips and tricks.<p>
<p>For information about developing widgets, see the <a
-href="{@docRoot}guide/topics/appwidgets/index.html">AppWidgets</a> section of
-the <em>Developer's Guide</em> and the <a
-href="http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html">AppWidgets</a> blog post.</p>
+href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a> section of the <em>Developer's
+Guide</em>.</p>
-<h2 id="anatomy">Standard widget anatomy</h2>
+<h2 id="anatomy">Standard Widget Anatomy</h2>
-<p>Typical Android widgets have three main components: A bounding box, a frame,
-and the widget's graphical controls and other elements. Well-designed widgets
-leave some padding between the edges of the bounding box and the frame, and
-between the inner edges of the frame and the widget's controls. Widgets designed
-to fit visually with other widgets on the Home screen take cues from the other
-elements on the Home screen for alignment; they also use standard shading
-effects. All of these details are described in this document.
-
-<p><strong>Standard Widget Sizes in Portrait Orientation</strong><br/>
-<img src="{@docRoot}images/widget_design/widget_sizes_portrait.png"
-alt="Standard Widget Sizes in Portrait Orientation"></p>
-
-<p> </p>
-
-<p><strong>Standard Widget Sizes in Landscape Orientation</strong><br/>
-<img src="{@docRoot}images/widget_design/widget_sizes_landscape.png"
-alt="Standard Widget Sizes in Landscape Orientation"></p>
-
-
-<h2 id="design">Designing a widget</h2>
-
-<ol>
-<li><strong>Select a bounding box size for your widget.</strong></li>
-
-<p>The most effective widgets display your application's most useful or timely
-data in the smallest widget size. Users will weigh the usefulness or your widget
-against the portion of the Home screen it covers, so the smaller the better.</p>
-
-<p>All widgets must fit within the bounding box of one of the six supported
-widget sizes, or better yet, within a pair of portrait and landscape orientation
-sizes, so your widget looks good when the user switches screen
-orientations.</p>
-
-<p><a href="#sizes">Standard widget sizes</a> illustrates the bounding
-dimensions of the six widget sizes (three in portrait and three in landscape
-orientation).</p>
+<p>Typical Android app widgets have three main components: A bounding box, a frame, and the widget's
+graphical controls and other elements. App widgets can contain a subset of the View widgets in
+Android; supported controls include text labels, buttons, and images. For a full list of available
+Views, see the <a href="{@docRoot}guide/topics/appwidgets/index.html#CreatingLayout">Creating the
+App Widget Layout</a> section in the <em>Developer's Guide</em>. Well-designed widgets leave some
+margins between the edges of the bounding box and the frame, and padding between the inner edges of
+the frame and the widget's controls.</p>
-<li><strong>Select a matching frame.</strong></li>
+<img src="{@docRoot}images/widget_design/widget_terms.png"
+ alt="Widgets generally have margins and padding between bounding box, frame, and controls"
+ id="widget_terms">
-<p><a href="#frames">Standard widget frames</a> illustrates the standard frames
-for the six widget sizes, with links so you can download copies for your own
-use. You don't have to use these frames for your widget, but if you do, your
-widgets are more likely to fit visually with other widgets.</p>
-
-<li><strong>Apply standard shadow effect to your graphics.</strong></li>
-
-<p>Again, you don't have to use this effect, but <a href="#shadows">Standard
-widget shadows</a> shows the Photoshop settings used for standard widgets.</p>
-
-<li><strong>If your widget includes buttons, draw them in three states
-(default, pressed, and selected).</strong></li>
-
-<p>You can <a
-href="{@docRoot}images/widget_design/Music_widget_button_states.psd">download a
-Photoshop file that contains the three states of the Play button</a>, taken from
-the Music widget, to analyze the Photoshop settings used for the three standard
-button effects.</p>
-
-<p><a href="{@docRoot}images/widget_design/Music_widget_button_states.psd"> <img
-src="{@docRoot}images/widget_design/buttons.png" alt="Click to download
-Photoshop template"></a></p>
-
-<li><strong>Finish drawing your artwork and then scale and align it to
-fit.</strong></li>
-
-<p><a href="#tricks">Widget alignment tips and tricks</a> describes some
-techniques for aligning your widget's graphics inside the standard frames, along
-with a few other widget graphics tricks.</p>
-
-<li><strong>Save your widget with the correct graphics file
-settings.</strong></li>
-
-<p><a href="#file">Windows graphics file format</a> describes the correct
-settings for your widget graphics files.</p>
-
-</ol>
+<p class="img-caption"><strong>Figure 2.</strong> Widgets generally have margins between the
+bounding box and frame, and padding between the frame and widget controls.</p>
-<h2 id="sizes">Standard widget sizes</h2>
+<p class="note"><strong>Note: </strong> As of Android 4.0, app widgets are automatically given
+margins between the widget frame and the app widget's bounding box to provide better alignment with
+other widgets and icons on the user's home screen. To take advantage of this strongly recommended
+behavior, set your application's <a
+href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a> to 14 or
+greater.</p>
-<p>There are six standard widget sizes, based on a Home screen grid of 4 x 4
-(portrait) or 4 x 4 (landscape) cells. These dimensions are the bounding boxes
-for the six standard widget sizes. The contents of typical widgets don't draw to
-the edge of these dimensions, but fit inside a frame withing the bounding box,
-as described in <a href="#design">Designing a widget</a>.</p>
+<p>Widgets designed to fit visually with other widgets on the Home screen take cues from the other
+elements on the Home screen for alignment; they also use standard shading effects. All of these
+details are described in this document.</p>
-<p>In portrait orientation, each cell is 80 pixels wide by 100 pixels tall (the
-diagram shows a cell in portrait orientation). The three supported widget sizes
-in portrait orientation are:<p>
-<table>
-<tr><th>Cells</th><th>Pixels</th></tr>
-<tr><td>4 x 1</td><td>320 x 100</td></tr>
-<tr><td>3 x 3</td><td>240 x 300</td></tr>
-<tr><td>2 x 2</td><td>160 x 200</td></tr>
+<h3 id="anatomy_determining_size">Determining a size for your widget</h3>
+
+<p>Each widget must define a <code>minWidth</code> and <code>minHeight</code>, indicating the
+minimum amount of space it should consume by default. When users add a widget to their Home screen,
+it will generally occupy more than the minimum width and height you specify. Android Home screens
+offer users a grid of available spaces into which they can place widgets and icons. This grid can
+vary by device; for example, many handsets offer a 4x4 grid, and tablets can offer a larger, 8x7
+grid. <strong>When your widget is added, it will be stretched to occupy the minimum number of cells,
+horizontally and vertically, required to satisfy its <code>minWidth</code> and
+<code>minHeight</code> constraints.</strong> As we discuss in <a href="#design">Designing Widget
+Layouts and Background Graphics</a> below, using nine-patch backgrounds and flexible layouts for app
+widgets will allow your widget to gracefully adapt to the device's Home screen grid and remain
+usable and aesthetically awesome.</p>
+
+<p>While the width and height of a cell—as well as the amount of automatic margins applied to
+widgets—may vary across devices, you can use the table below to roughly estimate your widget's
+minimum dimensions, given the desired number of occupied grid cells:</p>
+
+<table id="cellstable">
+ <thead>
+ <tr>
+ <th># of Cells<br><small style="font-weight:normal">(Columns or Rows)</small></th>
+ <th>Available Size (dp)<br><small style="font-weight:normal">(<code>minWidth</code> or
+ <code>minHeight</code>)</small></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>1</td>
+ <td>40dp</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td>110dp</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td>180dp</td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td>250dp</td>
+ </tr>
+ <tr>
+ <td>…</td>
+ <td>…</td>
+ </tr>
+ <tr>
+ <td><em>n</em></td>
+ <td>70 × <em>n</em> − 30</td>
+ </tr>
+ </tbody>
</table>
-<p><img src="{@docRoot}images/widget_design/portrait_sizes.png" alt="Widget
-dimensions in portrait orientation"></p>
-
-<p>In landscape orientation, each cell is 106 pixels wide by 74 pixels tall. The
-three supported widget sizes in landscape orientation are:</p>
-
-<table>
-<tr><th>Cells</th><th>Pixels</th></tr>
-<tr><td>4 x 1</td><td>424 x 74</td></tr>
-<tr><td>3 x 3</td><td>318 x 222</td></tr>
-<tr><td>2 x 2</td><td>212 x 148</td></tr>
-</table>
-
-<p><img src="{@docRoot}images/widget_design/landscape_sizes.png" alt="Widget
-dimensions in landscape orientation"></p>
+<p>It is a good practice to be conservative with <code>minWidth</code> and <code>minHeight</code>,
+specifying the minimum size that renders the widget in a good default state. For an example of how
+to provide a <code>minWidth</code> and <code>minHeight</code>, suppose you have a music player
+widget that shows the currently playing song artist and title (vertically stacked), a
+<strong>Play</strong> button, and a <strong>Next</strong> button:</p>
-<h2 id="frames">Standard widget frames</h2>
+<img src="{@docRoot}images/widget_design/music_example.png"
+ alt="An example music player widget" id="music_example">
-<p>For each of the six standard widget sizes there is a standard frame. You can
-click the images of the frames in this section to download a Photoshop file for
-that frame, which you can use for your own widgets.<p>
-
-<p><a href="{@docRoot}images/widget_design/4x1_Widget_Frame_Portrait.psd"> <img
-src="{@docRoot}images/widget_design/4x1_Widget_Frame_Portrait.png" alt="Click to
-download"></a><br>4x1_Widget_Frame_Portrait.psd</p>
-
-<p><a href="{@docRoot}images/widget_design/3x3_Widget_Frame_Portrait.psd"> <img
-src="{@docRoot}images/widget_design/3x3_Widget_Frame_Portrait.png" alt="Click to
-download"></a><br>3x3_Widget_Frame_Portrait.psd</p>
-
-<p><a href="{@docRoot}images/widget_design/2x2_Widget_Frame_Portrait.psd"> <img
-src="{@docRoot}images/widget_design/2x2_Widget_Frame_Portrait.png" alt="Click to
-download"></a><br>2x2_Widget_Frame_Portrait.psd</p>
-
-<p><a href="{@docRoot}images/widget_design/4x1_Widget_Frame_Landscape.psd"> <img
-src="{@docRoot}images/widget_design/4x1_Widget_Frame_Landscape.png" alt="Click
-to download"></a><br>4x1_Widget_Frame_Landscape.psd</p>
-
-<p><a href="{@docRoot}images/widget_design/3x3_Widget_Frame_Landscape.psd"> <img
-src="{@docRoot}images/widget_design/3x3_Widget_Frame_Landscape.png" alt="Click
-to download"></a><br>3x3_Widget_Frame_Landscape.psd</p>
-
-<p><a href="{@docRoot}images/widget_design/2x2_Widget_Frame_Landscape.psd"> <img
-src="{@docRoot}images/widget_design/2x2_Widget_Frame_Landscape.png" alt="Click
-to download"></a><br>2x2_Widget_Frame_Landscape.psd</p>
+<p class="img-caption"><strong>Figure 3.</strong> An example music player widget.</p>
-<h2 id="shadows">Standard widget shadows</h2>
-
-<p>You can apply a shadow effect to your widget's artwork, so it matches other
-standard Android widgets, using the following settings in the Photoshop Layer
-Style dialog box.</p>
-
-<p><img src="{@docRoot}images/widget_design/Layer_Style.png" alt="Layer Style
-settings for standard shadows"></p>
+<p>Your minimum height should be the height of your two TextViews for the artist and title, plus
+some text margins. Your minimum width should be the minimum usable widths of the
+<strong>Play</strong> and <strong>Next</strong> buttons, plus the minimum text width (say, the width
+of 10 characters), plus any horizontal text margins.</p>
-<h2 id="tricks">Widget graphics tips and tricks</h2>
+<img src="{@docRoot}images/widget_design/music_example_redline.png"
+alt="Example sizes and margins for minimum width/height calculations" id="music_example_redline">
-<p>The Android team has developed a few tricks for aligning widget artwork
-within standard widget bounding boxes and frames, so the widget aligns visually
-with other widgets and the other elements of the Home screen, as well as other
-techniques for creating widgets.
+<p class="img-caption"><strong>Figure 4.</strong> Example sizes and margins for
+<code>minWidth</code>/<code>minHeight</code> calculations. We chose 144dp as an example good minimum
+width for the text labels.</p>
+
+
+<p>Example calculations are below:</p>
<ul>
-
-<li>Use a screen shot from the Android SDK emulator to align both the shapes and
-shadows of your widget controls with the Search widget and with other elements
-on the Home screen.</li>
-
-<p>Cut the widget artwork asset" based on the full size of a cell, including any
-padding you want. (That is, for a 4 x 1 widget, cut the asset at 320 by 100
-pixels.)</p>
-
-<p><img src="{@docRoot}images/widget_design/alignment.png" alt="Aligning widget
-graphics" ></p>
-
-<li>To reduce banding when exporting a widget, apply the following Photoshop Add
-Noise setting to your graphic.</li>
-
-<p><img src="{@docRoot}images/widget_design/Add_Noise.png" alt="Add Noise
-settings for widget graphics" ></p>
-
-<li>Apply 9-patch techniques to shrink the graphic and set the padding of the
-content area. (<a href="{@docRoot}guide/developing/tools/draw9patch.html">See
-the detailed guide here.</a>)</li>
-
-<p><strong>Note:</strong> The current Android widget templates were designed
-using a custom gradient angle, which means the 9-patch techniques can't be used
-to optimize the size of the asset. However, 9-patch techniques were used to set
-the content area padding.</p>
-
-<li>In some cases, devices have low pixel depths that can cause visual banding
-and dithering issues. To solve this, application developers should pass assets
-through a "proxy" drawable defined as <code>XML:<nine-patch
-android:src="@drawable/background" android:dither="true" /></code>. This
-technique references the original artwork, in this case
-<code>"background.9.png"</code>, and instructs the device to dither it as
-needed.</li>
-
+ <li><code>minWidth</code> = 144dp + (2 × 8dp) + (2 × 56dp) =
+ <strong>272dp</strong></li>
+ <li><code>minHeight</code> = 48dp + (2 × 4dp) = <strong>56dp</strong></li>
</ul>
-<h2 id="file">Widget graphics file format</h2>
-
-<p>Save your widget artwork using the appropriate bounding box size in PNG-24
-format on a transparent background and in 8-bit color.</p>
-
-<p><img src="{@docRoot}images/widget_design/file_format.png" alt="Widget graphics file format" ></p>
+<p>If there is any inherent content padding in your widget background nine-patch, you should add to
+<code>minWidth</code> and <code>minHeight</code> accordingly.</p>
-
+<h3 id="anatomy_resizable_widgets">Resizable widgets</h3>
+<p>Widgets can be resized horizontally and/or vertically as of Android 3.1, meaning that
+<code>minWidth</code> and <code>minHeight</code> effectively become the <em>default</em> size for
+the widget. You can specify the minimum widget size using <code>minResizeWidth</code> and
+<code>minResizeHeight</code>; these values should specify the size below which the widget would be
+illegible or otherwise unusable.</p>
+
+<p>This is generally a preferred feature for collection widgets such as those based on {@link
+android.widget.ListView} or {@link android.widget.GridView}.</p>
+
+
+<h3 id="anatomy_adding_margins">Adding margins to your app widget</h3>
+
+<p>As previously mentioned, Android 4.0 will automatically add small, standard margins to each edge
+of widgets on the Home screen, for applications that specify a <code>targetSdkVersion</code> of 14
+or greater. This helps to visually balance the Home screen, and thus <strong>we recommend that you
+do not add any extra margins outside of your app widget's background shape in Android
+4.0</strong>.</p>
+
+<p>It's easy to write a single layout that has custom margins applied for earlier versions of the
+platform, and has no extra margins for Android 4.0 and greater. See <a
+href="{@docRoot}guide/topics/appwidgets/index.html#AddingMargins">Adding Margins to App Widgets</a>
+in the <em>Developer's Guide</em> for information on how to achieve this with layout XML.</p>
+
+
+<h2 id="design">Designing Widget Layouts and Background Graphics</h2>
+
+<p>Most widgets will have a solid background rectangle or rounded rectangle shape. It is a best
+practice to define this shape using nine patches; one for each screen density (see <a
+href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a> for details).
+Nine-patches can be created with the <a
+href="{@docRoot}guide/developing/tools/draw9patch.html">draw9patch</a> tool, or simply with a
+graphics editing program such as Adobe® Photoshop. This will allow the widget background shape
+to take up the entire available space. The nine-patch should be edge-to-edge with no transparent
+pixels providing extra margins, save for perhaps a few border pixels for <strong>subtle</strong>
+drop shadows or other subtle effects.</p>
+
+<p class="note"><strong>Note: </strong> Just like with controls in activities, you should ensure
+that interactive controls have distinct visual focused and pressed states using <a
+href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">state list
+drawables</a>.</p>
+
+
+<img src="{@docRoot}images/ninepatch_raw.png" alt="Nine-patch border pixels" id="ninepatch_raw">
+
+<p class="img-caption"><strong>Figure 5.</strong> Nine-patch border pixels indicating stretchable
+regions and content padding.</p>
+
+
+<p>Some app widgets, such as those using a {@link android.widget.StackView}, have a transparent
+background. For this case, each individual item in the StackView should use a nine-patch background
+that is edge-to-edge with little or no border transparent pixels for margins.</p>
+
+<p>For the contents of the widget, you should use flexible layouts such as {@link
+android.widget.RelativeLayout}, {@link android.widget.LinearLayout}, or {@link
+android.widget.FrameLayout}. Just as your activity layouts must adapt to different physical screen
+sizes, widget layouts must adapt to different Home screen grid cell sizes.</p>
+
+<p>Below is an example layout that a music widget showing text information and two buttons can use.
+It builds upon the previous discussion of adding margins depending on OS version.</p>
+
+<pre>
+<FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="@dimen/widget_margin">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:background="@drawable/my_widget_background">
+
+ <TextView
+ android:id="@+id/song_info"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1" />
+
+ <Button
+ android:id="@+id/play_button"
+ android:layout_width="@dimen/my_button_width"
+ android:layout_height="match_parent" />
+
+ <Button
+ android:id="@+id/skip_button"
+ android:layout_width="@dimen/my_button_width"
+ android:layout_height="match_parent" />
+ </LinearLayout>
+</FrameLayout>
+</pre>
+
+<p>If you now take a look at the example music widget from the previous section, you can begin to
+use flexible layouts attributes like so:</p>
+
+
+<img src="{@docRoot}images/widget_design/music_example_layouts.png"
+ alt="Excerpt flexible layouts and attributes for an example music widget"
+ id="music_example_layouts">
+
+<p class="img-caption"><strong>Figure 6.</strong> Excerpt flexible layouts and attributes.</p>
+
+
+<p>When a user adds the widget to their home screen, on an example Android 4.0 device where each
+grid cell is 80dp × 100dp in size and 16dp of margins are automatically applied on all sizes,
+the widget will be stretched, like so:</p>
+
+
+<img src="{@docRoot}images/widget_design/music_example_stretched.png"
+ alt="Music widget sitting on an example 80dp x 100dp grid with 16dp of automatic margins
+ added by the system" id="music_example_stretched">
+
+<p class="img-caption"><strong>Figure 7.</strong> Music widget sitting on an example 80dp x 100dp
+grid with 16dp of automatic margins added by the system.</p>
+
+
+<h2 id="templates">Using the App Widget Templates Pack</h2>
+
+<p>When starting to design a new widget, or updating an existing widget, it's a good idea to first
+look at the widget design templates below. The downloadable package below includes nine-patch
+background graphics, XML, and source Adobe® Photoshop files for multiple screen densities, OS
+version widget styles, and widget colors. The template package also contains graphics useful for
+making your entire widget or parts of your widget (e.g. buttons) interactive.</p>
+
+
+<img src="{@docRoot}images/widget_design/widget_template_excerpts.png"
+ alt="Widget template excerpts" id="widget_template_excerpts">
+
+<p class="img-caption"><strong>Figure 8.</strong> Excerpts from the App Widget Templates Pack
+(medium-density, dark, Android 4.0/previous styles, default/focused/pressed states).</p>
+
+
+<p>You can obtain the latest App Widget Templates Pack archive using the link below:</p>
+
+<p style="margin-left:2em"><a href="{@docRoot}shareables/app_widget_templates-v4.0.zip">
+ Download the App Widget Templates Pack for Android 4.0 »</a></p>
diff --git a/docs/html/guide/topics/appwidgets/index.jd b/docs/html/guide/topics/appwidgets/index.jd
index 78b5b51..22283cd 100644
--- a/docs/html/guide/topics/appwidgets/index.jd
+++ b/docs/html/guide/topics/appwidgets/index.jd
@@ -327,6 +327,49 @@
<p>Descendants of these classes are not supported.</p>
+<h3 id="AddingMargins">Adding margins to App Widgets</h3>
+
+<p>Widgets should not generally extend to screen edges and should not visually be flush with other widgets, so you should add margins on all sides around your widget frame.</p>
+
+<p>As of Android 4.0, app widgets are automatically given padding between the widget frame and the app widget's bounding box to provide better alignment with other widgets and icons on the user's home screen. To take advantage of this strongly recommended behavior, set your application's <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a> to 14 or greater.</p>
+
+<p>It's easy to write a single layout that has custom margins applied for earlier versions of the platform, and has no extra margins for Android 4.0 and greater:</p>
+
+<ol>
+ <li>Set your application's <code>targetSdkVersion</code> to 14 or greater.</li>
+ <li>Create a layout such as the one below, that references a <a href="{@docRoot}guide/topics/resources/more-resources.html#Dimension">dimension resource</a> for its margins:
+
+<pre>
+<FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ <strong>android:layout_margin="@dimen/widget_margin"></strong>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:background="@drawable/my_widget_background">
+ …
+ </LinearLayout>
+
+</FrameLayout>
+</pre>
+
+ </li>
+ <li>Create two dimensions resources, one in <code>res/values/</code> to provide the pre-Android 4.0 custom margins, and one in <code>res/values-v14/</code> to provide no extra padding for Android 4.0 widgets:
+
+ <p><strong>res/values/dimens.xml</strong>:<br>
+ <pre><dimen name="widget_margin">15dp</dimen></pre></p>
+
+ <p><strong>res/values-v14/dimens.xml</strong>:<br>
+ <pre><dimen name="widget_margin">0dp</dimen></pre></p>
+ </li>
+</ol>
+
+<p>Another option is to simply build extra margins into your <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">nine-patch</a> background assets by default, and provide different nine-patches with no margins for API level 14 or later.</p>
+
+
<h2 id="AppWidgetProvider">Using the AppWidgetProvider Class</h2>
<div class="sidebox-wrapper">
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png
deleted file mode 100644
index a73a09a..0000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd
deleted file mode 100644
index cd869b5..0000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Landscape.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png
deleted file mode 100644
index 95ac031..0000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd
deleted file mode 100644
index 9f0a7b0..0000000
--- a/docs/html/images/widget_design/2x2_Widget_Frame_Portrait.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png
deleted file mode 100644
index 14013dc..0000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd
deleted file mode 100644
index 50a2b8c..0000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Landscape.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png
deleted file mode 100644
index 22f99f8..0000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd
deleted file mode 100644
index 591e963..0000000
--- a/docs/html/images/widget_design/3x3_Widget_Frame_Portrait.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png
deleted file mode 100644
index c6a3f7a..0000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd b/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd
deleted file mode 100644
index ec81179..0000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Landscape.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png
deleted file mode 100644
index 5cc8665..0000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd b/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd
deleted file mode 100644
index bad7ad1..0000000
--- a/docs/html/images/widget_design/4x1_Widget_Frame_Portrait.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/Add_Noise.png b/docs/html/images/widget_design/Add_Noise.png
deleted file mode 100644
index c323bb4..0000000
--- a/docs/html/images/widget_design/Add_Noise.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/Layer_Style.png b/docs/html/images/widget_design/Layer_Style.png
deleted file mode 100644
index 7577803..0000000
--- a/docs/html/images/widget_design/Layer_Style.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/Music_widget_button_states.psd b/docs/html/images/widget_design/Music_widget_button_states.psd
deleted file mode 100644
index 17f3573..0000000
--- a/docs/html/images/widget_design/Music_widget_button_states.psd
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/alignment.png b/docs/html/images/widget_design/alignment.png
deleted file mode 100644
index 2e794dd..0000000
--- a/docs/html/images/widget_design/alignment.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/buttons.png b/docs/html/images/widget_design/buttons.png
deleted file mode 100644
index a6d1df2..0000000
--- a/docs/html/images/widget_design/buttons.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/file_format.png b/docs/html/images/widget_design/file_format.png
deleted file mode 100644
index 26f0e56..0000000
--- a/docs/html/images/widget_design/file_format.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/landscape_sizes.png b/docs/html/images/widget_design/landscape_sizes.png
deleted file mode 100644
index 798bb15..0000000
--- a/docs/html/images/widget_design/landscape_sizes.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/music_example.png b/docs/html/images/widget_design/music_example.png
new file mode 100644
index 0000000..885057e
--- /dev/null
+++ b/docs/html/images/widget_design/music_example.png
Binary files differ
diff --git a/docs/html/images/widget_design/music_example_layouts.png b/docs/html/images/widget_design/music_example_layouts.png
new file mode 100644
index 0000000..31601b9
--- /dev/null
+++ b/docs/html/images/widget_design/music_example_layouts.png
Binary files differ
diff --git a/docs/html/images/widget_design/music_example_redline.png b/docs/html/images/widget_design/music_example_redline.png
new file mode 100644
index 0000000..85794b8
--- /dev/null
+++ b/docs/html/images/widget_design/music_example_redline.png
Binary files differ
diff --git a/docs/html/images/widget_design/music_example_stretched.png b/docs/html/images/widget_design/music_example_stretched.png
new file mode 100644
index 0000000..28c2fb3
--- /dev/null
+++ b/docs/html/images/widget_design/music_example_stretched.png
Binary files differ
diff --git a/docs/html/images/widget_design/portrait_sizes.png b/docs/html/images/widget_design/portrait_sizes.png
deleted file mode 100644
index 9da252a..0000000
--- a/docs/html/images/widget_design/portrait_sizes.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/widget_examples.png b/docs/html/images/widget_design/widget_examples.png
index e27ffbb..277b69a 100644
--- a/docs/html/images/widget_design/widget_examples.png
+++ b/docs/html/images/widget_design/widget_examples.png
Binary files differ
diff --git a/docs/html/images/widget_design/widget_sizes_landscape.png b/docs/html/images/widget_design/widget_sizes_landscape.png
deleted file mode 100644
index 052e28e..0000000
--- a/docs/html/images/widget_design/widget_sizes_landscape.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/widget_sizes_portrait.png b/docs/html/images/widget_design/widget_sizes_portrait.png
deleted file mode 100644
index 31a240c..0000000
--- a/docs/html/images/widget_design/widget_sizes_portrait.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/images/widget_design/widget_template_excerpts.png b/docs/html/images/widget_design/widget_template_excerpts.png
new file mode 100644
index 0000000..aba09e2
--- /dev/null
+++ b/docs/html/images/widget_design/widget_template_excerpts.png
Binary files differ
diff --git a/docs/html/images/widget_design/widget_terms.png b/docs/html/images/widget_design/widget_terms.png
new file mode 100644
index 0000000..5c4d09d
--- /dev/null
+++ b/docs/html/images/widget_design/widget_terms.png
Binary files differ
diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js
index f799b0c..6c5d882 100644
--- a/docs/html/resources/resources-data.js
+++ b/docs/html/resources/resources-data.js
@@ -323,6 +323,16 @@
}
},
{
+ tags: ['article', 'accountsync', 'data'],
+ path: 'articles/contacts.html',
+ title: {
+ en: 'Using the Contacts API'
+ },
+ description: {
+ en: 'Android provides a Contacts API for managing and integrating contacts from multiple accounts and data sources and allows apps to read various information about individual contacts.'
+ }
+ },
+ {
tags: ['article', 'ui', 'web'],
path: 'articles/using-webviews.html',
title: {
diff --git a/docs/html/shareables/app_widget_templates-v4.0.zip b/docs/html/shareables/app_widget_templates-v4.0.zip
new file mode 100644
index 0000000..b16ef12
--- /dev/null
+++ b/docs/html/shareables/app_widget_templates-v4.0.zip
Binary files differ
diff --git a/graphics/java/android/renderscript/ProgramRaster.java b/graphics/java/android/renderscript/ProgramRaster.java
index bc0d928..60d9698 100644
--- a/graphics/java/android/renderscript/ProgramRaster.java
+++ b/graphics/java/android/renderscript/ProgramRaster.java
@@ -84,14 +84,10 @@
public static class Builder {
RenderScript mRS;
boolean mPointSprite;
- boolean mPointSmooth;
- boolean mLineSmooth;
CullMode mCullMode;
public Builder(RenderScript rs) {
mRS = rs;
- mPointSmooth = false;
- mLineSmooth = false;
mPointSprite = false;
mCullMode = CullMode.BACK;
}
@@ -108,8 +104,7 @@
public ProgramRaster create() {
mRS.validate();
- int id = mRS.nProgramRasterCreate(mPointSmooth, mLineSmooth, mPointSprite,
- 1.f, mCullMode.mID);
+ int id = mRS.nProgramRasterCreate(mPointSprite, mCullMode.mID);
return new ProgramRaster(id, mRS);
}
}
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 571b895..e2950d5e 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -522,13 +522,10 @@
dstMode, depthFunc);
}
- native int rsnProgramRasterCreate(int con, boolean pointSmooth, boolean lineSmooth,
- boolean pointSprite, float lineWidth, int cullMode);
- synchronized int nProgramRasterCreate(boolean pointSmooth, boolean lineSmooth,
- boolean pointSprite, float lineWidth, int cullMode) {
+ native int rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode);
+ synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) {
validate();
- return rsnProgramRasterCreate(mContext, pointSmooth, lineSmooth, pointSprite, lineWidth,
- cullMode);
+ return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
}
native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index d7ac5d8..ec1f8de 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -1053,12 +1053,10 @@
// ---------------------------------------------------------------------------
static jint
-nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSmooth,
- jboolean lineSmooth, jboolean pointSprite, jfloat lineWidth, jint cull)
+nProgramRasterCreate(JNIEnv *_env, jobject _this, RsContext con, jboolean pointSprite, jint cull)
{
- LOG_API("nProgramRasterCreate, con(%p), pointSmooth(%i), lineSmooth(%i), pointSprite(%i)",
- con, pointSmooth, lineSmooth, pointSprite);
- return (jint)rsProgramRasterCreate(con, pointSmooth, lineSmooth, pointSprite, lineWidth, (RsCullMode)cull);
+ LOG_API("nProgramRasterCreate, con(%p), pointSprite(%i), cull(%i)", con, pointSprite, cull);
+ return (jint)rsProgramRasterCreate(con, pointSprite, (RsCullMode)cull);
}
@@ -1295,7 +1293,7 @@
{"rsnProgramBindSampler", "(IIII)V", (void*)nProgramBindSampler },
{"rsnProgramFragmentCreate", "(ILjava/lang/String;[I)I", (void*)nProgramFragmentCreate },
-{"rsnProgramRasterCreate", "(IZZZFI)I", (void*)nProgramRasterCreate },
+{"rsnProgramRasterCreate", "(IZI)I", (void*)nProgramRasterCreate },
{"rsnProgramVertexCreate", "(ILjava/lang/String;[I)I", (void*)nProgramVertexCreate },
{"rsnContextBindRootScript", "(II)V", (void*)nContextBindRootScript },
diff --git a/include/gui/SurfaceTexture.h b/include/gui/SurfaceTexture.h
index 493993d..926eb9a 100644
--- a/include/gui/SurfaceTexture.h
+++ b/include/gui/SurfaceTexture.h
@@ -25,8 +25,9 @@
#include <ui/GraphicBuffer.h>
-#include <utils/threads.h>
+#include <utils/String8.h>
#include <utils/Vector.h>
+#include <utils/threads.h>
#define ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID "mSurfaceTexture"
@@ -202,6 +203,10 @@
// by OpenGL ES as a texture) then those buffer will remain allocated.
void abandon();
+ // set the name of the SurfaceTexture that will be used to identify it in
+ // log messages.
+ void setName(const String8& name);
+
// dump our state in a String
void dump(String8& result) const;
void dump(String8& result, const char* prefix, char* buffer, size_t SIZE) const;
@@ -444,6 +449,10 @@
// all ISurfaceTexture methods capable of returning an error.
bool mAbandoned;
+ // mName is a string used to identify the SurfaceTexture in log messages.
+ // It is set by the setName method.
+ String8 mName;
+
// mMutex is the mutex used to prevent concurrent access to the member
// variables of SurfaceTexture objects. It must be locked whenever the
// member variables are accessed.
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h
index b7286e5..5822877 100644
--- a/include/media/stagefright/ACodec.h
+++ b/include/media/stagefright/ACodec.h
@@ -113,6 +113,7 @@
Vector<BufferInfo> mBuffers[2];
bool mPortEOS[2];
+ status_t mInputEOSResult;
List<sp<AMessage> > mDeferredQueue;
@@ -150,6 +151,12 @@
OMX_VIDEO_CODINGTYPE compressionFormat);
status_t setupAACDecoder(int32_t numChannels, int32_t sampleRate);
+ status_t setupAMRDecoder(bool isWAMR);
+ status_t setupG711Decoder(int32_t numChannels);
+
+ status_t setupRawAudioFormat(
+ OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels);
+
status_t setMinBufferSize(OMX_U32 portIndex, size_t size);
status_t initNativeWindow();
diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp
index f2bc81e..dac9418 100644
--- a/libs/gui/SurfaceTexture.cpp
+++ b/libs/gui/SurfaceTexture.cpp
@@ -39,6 +39,12 @@
#define ALLOW_DEQUEUE_CURRENT_BUFFER false
+// Macros for including the SurfaceTexture name in log messages
+#define ST_LOGV(x, ...) LOGV("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGD(x, ...) LOGD("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGI(x, ...) LOGI("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGW(x, ...) LOGW("[%s] "x, mName.string(), ##__VA_ARGS__)
+#define ST_LOGE(x, ...) LOGE("[%s] "x, mName.string(), ##__VA_ARGS__)
namespace android {
@@ -82,6 +88,12 @@
static void mtxMul(float out[16], const float a[16], const float b[16]);
+// Get an ID that's unique within this process.
+static int32_t createProcessUniqueId() {
+ static volatile int32_t globalCounter = 0;
+ return android_atomic_inc(&globalCounter);
+}
+
SurfaceTexture::SurfaceTexture(GLuint tex, bool allowSynchronousMode) :
mDefaultWidth(1),
mDefaultHeight(1),
@@ -99,15 +111,19 @@
mAllowSynchronousMode(allowSynchronousMode),
mConnectedApi(NO_CONNECTED_API),
mAbandoned(false) {
- LOGV("SurfaceTexture::SurfaceTexture");
+ // Choose a name using the PID and a process-unique ID.
+ mName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId());
+
+ ST_LOGV("SurfaceTexture::SurfaceTexture");
sp<ISurfaceComposer> composer(ComposerService::getComposerService());
mGraphicBufferAlloc = composer->createGraphicBufferAlloc();
mNextCrop.makeInvalid();
- memcpy(mCurrentTransformMatrix, mtxIdentity, sizeof(mCurrentTransformMatrix));
+ memcpy(mCurrentTransformMatrix, mtxIdentity,
+ sizeof(mCurrentTransformMatrix));
}
SurfaceTexture::~SurfaceTexture() {
- LOGV("SurfaceTexture::~SurfaceTexture");
+ ST_LOGV("SurfaceTexture::~SurfaceTexture");
freeAllBuffersLocked();
}
@@ -151,22 +167,22 @@
}
status_t SurfaceTexture::setBufferCount(int bufferCount) {
- LOGV("SurfaceTexture::setBufferCount");
+ ST_LOGV("SurfaceTexture::setBufferCount");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setBufferCount: SurfaceTexture has been abandoned!");
+ ST_LOGE("setBufferCount: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (bufferCount > NUM_BUFFER_SLOTS) {
- LOGE("setBufferCount: bufferCount larger than slots available");
+ ST_LOGE("setBufferCount: bufferCount larger than slots available");
return BAD_VALUE;
}
// Error out if the user has dequeued buffers
for (int i=0 ; i<mBufferCount ; i++) {
if (mSlots[i].mBufferState == BufferSlot::DEQUEUED) {
- LOGE("setBufferCount: client owns some buffers");
+ ST_LOGE("setBufferCount: client owns some buffers");
return -EINVAL;
}
}
@@ -181,7 +197,7 @@
}
if (bufferCount < minBufferSlots) {
- LOGE("setBufferCount: requested buffer count (%d) is less than "
+ ST_LOGE("setBufferCount: requested buffer count (%d) is less than "
"minimum (%d)", bufferCount, minBufferSlots);
return BAD_VALUE;
}
@@ -200,7 +216,8 @@
status_t SurfaceTexture::setDefaultBufferSize(uint32_t w, uint32_t h)
{
if (!w || !h) {
- LOGE("setDefaultBufferSize: dimensions cannot be 0 (w=%d, h=%d)", w, h);
+ ST_LOGE("setDefaultBufferSize: dimensions cannot be 0 (w=%d, h=%d)",
+ w, h);
return BAD_VALUE;
}
@@ -211,14 +228,14 @@
}
status_t SurfaceTexture::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
- LOGV("SurfaceTexture::requestBuffer");
+ ST_LOGV("SurfaceTexture::requestBuffer");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("requestBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGE("requestBuffer: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (slot < 0 || mBufferCount <= slot) {
- LOGE("requestBuffer: slot index out of range [0, %d]: %d",
+ ST_LOGE("requestBuffer: slot index out of range [0, %d]: %d",
mBufferCount, slot);
return BAD_VALUE;
}
@@ -229,10 +246,10 @@
status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
uint32_t format, uint32_t usage) {
- LOGV("SurfaceTexture::dequeueBuffer");
+ ST_LOGV("SurfaceTexture::dequeueBuffer");
if ((w && !h) || (!w && h)) {
- LOGE("dequeueBuffer: invalid size: w=%u, h=%u", w, h);
+ ST_LOGE("dequeueBuffer: invalid size: w=%u, h=%u", w, h);
return BAD_VALUE;
}
@@ -245,7 +262,7 @@
bool tryAgain = true;
while (tryAgain) {
if (mAbandoned) {
- LOGE("dequeueBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGE("dequeueBuffer: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -334,7 +351,8 @@
// than allowed.
const int avail = mBufferCount - (dequeuedCount+1);
if (avail < (MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode))) {
- LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded (dequeued=%d)",
+ ST_LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded "
+ "(dequeued=%d)",
MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode),
dequeuedCount);
return -EBUSY;
@@ -391,7 +409,8 @@
mGraphicBufferAlloc->createGraphicBuffer(
w, h, format, usage, &error));
if (graphicBuffer == 0) {
- LOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer failed");
+ ST_LOGE("dequeueBuffer: SurfaceComposer::createGraphicBuffer "
+ "failed");
return error;
}
if (updateFormat) {
@@ -413,7 +432,7 @@
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setSynchronousMode: SurfaceTexture has been abandoned!");
+ ST_LOGE("setSynchronousMode: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -441,29 +460,29 @@
status_t SurfaceTexture::queueBuffer(int buf, int64_t timestamp,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
- LOGV("SurfaceTexture::queueBuffer");
+ ST_LOGV("SurfaceTexture::queueBuffer");
sp<FrameAvailableListener> listener;
{ // scope for the lock
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("queueBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGE("queueBuffer: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (buf < 0 || buf >= mBufferCount) {
- LOGE("queueBuffer: slot index out of range [0, %d]: %d",
+ ST_LOGE("queueBuffer: slot index out of range [0, %d]: %d",
mBufferCount, buf);
return -EINVAL;
} else if (mSlots[buf].mBufferState != BufferSlot::DEQUEUED) {
- LOGE("queueBuffer: slot %d is not owned by the client (state=%d)",
- buf, mSlots[buf].mBufferState);
+ ST_LOGE("queueBuffer: slot %d is not owned by the client "
+ "(state=%d)", buf, mSlots[buf].mBufferState);
return -EINVAL;
} else if (buf == mCurrentTexture) {
- LOGE("queueBuffer: slot %d is current!", buf);
+ ST_LOGE("queueBuffer: slot %d is current!", buf);
return -EINVAL;
} else if (!mSlots[buf].mRequestBufferCalled) {
- LOGE("queueBuffer: slot %d was enqueued without requesting a "
+ ST_LOGE("queueBuffer: slot %d was enqueued without requesting a "
"buffer", buf);
return -EINVAL;
}
@@ -513,20 +532,20 @@
}
void SurfaceTexture::cancelBuffer(int buf) {
- LOGV("SurfaceTexture::cancelBuffer");
+ ST_LOGV("SurfaceTexture::cancelBuffer");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGW("cancelBuffer: SurfaceTexture has been abandoned!");
+ ST_LOGW("cancelBuffer: SurfaceTexture has been abandoned!");
return;
}
if (buf < 0 || buf >= mBufferCount) {
- LOGE("cancelBuffer: slot index out of range [0, %d]: %d",
+ ST_LOGE("cancelBuffer: slot index out of range [0, %d]: %d",
mBufferCount, buf);
return;
} else if (mSlots[buf].mBufferState != BufferSlot::DEQUEUED) {
- LOGE("cancelBuffer: slot %d is not owned by the client (state=%d)",
+ ST_LOGE("cancelBuffer: slot %d is not owned by the client (state=%d)",
buf, mSlots[buf].mBufferState);
return;
}
@@ -535,10 +554,10 @@
}
status_t SurfaceTexture::setCrop(const Rect& crop) {
- LOGV("SurfaceTexture::setCrop");
+ ST_LOGV("SurfaceTexture::setCrop");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setCrop: SurfaceTexture has been abandoned!");
+ ST_LOGE("setCrop: SurfaceTexture has been abandoned!");
return NO_INIT;
}
mNextCrop = crop;
@@ -546,10 +565,10 @@
}
status_t SurfaceTexture::setTransform(uint32_t transform) {
- LOGV("SurfaceTexture::setTransform");
+ ST_LOGV("SurfaceTexture::setTransform");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("setTransform: SurfaceTexture has been abandoned!");
+ ST_LOGE("setTransform: SurfaceTexture has been abandoned!");
return NO_INIT;
}
mNextTransform = transform;
@@ -558,11 +577,11 @@
status_t SurfaceTexture::connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
- LOGV("SurfaceTexture::connect(this=%p, %d)", this, api);
+ ST_LOGV("SurfaceTexture::connect(this=%p, %d)", this, api);
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("connect: SurfaceTexture has been abandoned!");
+ ST_LOGE("connect: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -573,7 +592,7 @@
case NATIVE_WINDOW_API_MEDIA:
case NATIVE_WINDOW_API_CAMERA:
if (mConnectedApi != NO_CONNECTED_API) {
- LOGE("connect: already connected (cur=%d, req=%d)",
+ ST_LOGE("connect: already connected (cur=%d, req=%d)",
mConnectedApi, api);
err = -EINVAL;
} else {
@@ -591,11 +610,11 @@
}
status_t SurfaceTexture::disconnect(int api) {
- LOGV("SurfaceTexture::disconnect(this=%p, %d)", this, api);
+ ST_LOGV("SurfaceTexture::disconnect(this=%p, %d)", this, api);
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("disconnect: SurfaceTexture has been abandoned!");
+ ST_LOGE("disconnect: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -613,7 +632,7 @@
mNextTransform = 0;
mDequeueCondition.signal();
} else {
- LOGE("disconnect: connected to another api (cur=%d, req=%d)",
+ ST_LOGE("disconnect: connected to another api (cur=%d, req=%d)",
mConnectedApi, api);
err = -EINVAL;
}
@@ -626,7 +645,7 @@
}
status_t SurfaceTexture::setScalingMode(int mode) {
- LOGV("SurfaceTexture::setScalingMode(%d)", mode);
+ ST_LOGV("SurfaceTexture::setScalingMode(%d)", mode);
switch (mode) {
case NATIVE_WINDOW_SCALING_MODE_FREEZE:
@@ -642,11 +661,11 @@
}
status_t SurfaceTexture::updateTexImage() {
- LOGV("SurfaceTexture::updateTexImage");
+ ST_LOGV("SurfaceTexture::updateTexImage");
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("calling updateTexImage() on an abandoned SurfaceTexture");
+ ST_LOGE("calling updateTexImage() on an abandoned SurfaceTexture");
return NO_INIT;
}
@@ -661,7 +680,7 @@
if (image == EGL_NO_IMAGE_KHR) {
EGLDisplay dpy = eglGetCurrentDisplay();
if (mSlots[buf].mGraphicBuffer == 0) {
- LOGE("buffer at slot %d is null", buf);
+ ST_LOGE("buffer at slot %d is null", buf);
return BAD_VALUE;
}
image = createImage(dpy, mSlots[buf].mGraphicBuffer);
@@ -676,15 +695,16 @@
GLint error;
while ((error = glGetError()) != GL_NO_ERROR) {
- LOGW("updateTexImage: clearing GL error: %#04x", error);
+ ST_LOGW("updateTexImage: clearing GL error: %#04x", error);
}
glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexName);
- glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, (GLeglImageOES)image);
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES,
+ (GLeglImageOES)image);
bool failed = false;
while ((error = glGetError()) != GL_NO_ERROR) {
- LOGE("error binding external texture image %p (slot %d): %#04x",
+ ST_LOGE("error binding external texture image %p (slot %d): %#04x",
image, buf, error);
failed = true;
}
@@ -750,7 +770,7 @@
}
void SurfaceTexture::computeCurrentTransformMatrix() {
- LOGV("SurfaceTexture::computeCurrentTransformMatrix");
+ ST_LOGV("SurfaceTexture::computeCurrentTransformMatrix");
float xform[16];
for (int i = 0; i < 16; i++) {
@@ -841,14 +861,14 @@
}
nsecs_t SurfaceTexture::getTimestamp() {
- LOGV("SurfaceTexture::getTimestamp");
+ ST_LOGV("SurfaceTexture::getTimestamp");
Mutex::Autolock lock(mMutex);
return mCurrentTimestamp;
}
void SurfaceTexture::setFrameAvailableListener(
const sp<FrameAvailableListener>& listener) {
- LOGV("SurfaceTexture::setFrameAvailableListener");
+ ST_LOGV("SurfaceTexture::setFrameAvailableListener");
Mutex::Autolock lock(mMutex);
mFrameAvailableListener = listener;
}
@@ -892,11 +912,11 @@
while (mSynchronousMode && !mQueue.isEmpty()) {
mDequeueCondition.wait(mMutex);
if (mAbandoned) {
- LOGE("drainQueueLocked: SurfaceTexture has been abandoned!");
+ ST_LOGE("drainQueueLocked: SurfaceTexture has been abandoned!");
return NO_INIT;
}
if (mConnectedApi == NO_CONNECTED_API) {
- LOGE("drainQueueLocked: SurfaceTexture is not connected!");
+ ST_LOGE("drainQueueLocked: SurfaceTexture is not connected!");
return NO_INIT;
}
}
@@ -926,7 +946,7 @@
EGL_NATIVE_BUFFER_ANDROID, cbuf, attrs);
if (image == EGL_NO_IMAGE_KHR) {
EGLint error = eglGetError();
- LOGE("error creating EGLImage: %#x", error);
+ ST_LOGE("error creating EGLImage: %#x", error);
}
return image;
}
@@ -956,7 +976,7 @@
Mutex::Autolock lock(mMutex);
if (mAbandoned) {
- LOGE("query: SurfaceTexture has been abandoned!");
+ ST_LOGE("query: SurfaceTexture has been abandoned!");
return NO_INIT;
}
@@ -991,6 +1011,10 @@
mDequeueCondition.signal();
}
+void SurfaceTexture::setName(const String8& name) {
+ mName = name;
+}
+
void SurfaceTexture::dump(String8& result) const
{
char buffer[1024];
@@ -1004,8 +1028,8 @@
snprintf(buffer, SIZE,
"%smBufferCount=%d, mSynchronousMode=%d, default-size=[%dx%d], "
"mPixelFormat=%d, mTexName=%d\n",
- prefix, mBufferCount, mSynchronousMode, mDefaultWidth, mDefaultHeight,
- mPixelFormat, mTexName);
+ prefix, mBufferCount, mSynchronousMode, mDefaultWidth,
+ mDefaultHeight, mPixelFormat, mTexName);
result.append(buffer);
String8 fifo;
@@ -1024,8 +1048,8 @@
prefix, mCurrentCrop.left,
mCurrentCrop.top, mCurrentCrop.right, mCurrentCrop.bottom,
mCurrentTransform, mCurrentTexture,
- prefix, mNextCrop.left, mNextCrop.top, mNextCrop.right, mNextCrop.bottom,
- mNextTransform, fifoSize, fifo.string()
+ prefix, mNextCrop.left, mNextCrop.top, mNextCrop.right,
+ mNextCrop.bottom, mNextTransform, fifoSize, fifo.string()
);
result.append(buffer);
@@ -1048,8 +1072,8 @@
"transform=0x%02x, timestamp=%lld",
prefix, (i==mCurrentTexture)?">":" ", i,
stateName(slot.mBufferState),
- slot.mCrop.left, slot.mCrop.top, slot.mCrop.right, slot.mCrop.bottom,
- slot.mTransform, slot.mTimestamp
+ slot.mCrop.left, slot.mCrop.top, slot.mCrop.right,
+ slot.mCrop.bottom, slot.mTransform, slot.mTimestamp
);
result.append(buffer);
@@ -1057,7 +1081,8 @@
if (buf != NULL) {
snprintf(buffer, SIZE,
", %p [%4ux%4u:%4u,%3X]",
- buf->handle, buf->width, buf->height, buf->stride, buf->format);
+ buf->handle, buf->width, buf->height, buf->stride,
+ buf->format);
result.append(buffer);
}
result.append("\n");
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index f277582..20b1f52 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -329,10 +329,7 @@
ProgramRasterCreate {
direct
- param bool pointSmooth
- param bool lineSmooth
param bool pointSprite
- param float lineWidth
param RsCullMode cull
ret RsProgramRaster
}
diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp
index 945b5ec..94bfe42 100644
--- a/libs/rs/rsProgramRaster.cpp
+++ b/libs/rs/rsProgramRaster.cpp
@@ -21,19 +21,12 @@
using namespace android::renderscript;
-ProgramRaster::ProgramRaster(Context *rsc, bool pointSmooth,
- bool lineSmooth, bool pointSprite,
- float lineWidth, RsCullMode cull)
+ProgramRaster::ProgramRaster(Context *rsc, bool pointSprite, RsCullMode cull)
: ProgramBase(rsc) {
memset(&mHal, 0, sizeof(mHal));
-
- mHal.state.pointSmooth = pointSmooth;
- mHal.state.lineSmooth = lineSmooth;
mHal.state.pointSprite = pointSprite;
- mHal.state.lineWidth = lineWidth;
mHal.state.cull = cull;
-
rsc->mHal.funcs.raster.init(rsc, this);
}
@@ -74,8 +67,7 @@
}
void ProgramRasterState::init(Context *rsc) {
- mDefault.set(ProgramRaster::getProgramRaster(rsc, false, false,
- false, 1.f, RS_CULL_BACK).get());
+ mDefault.set(ProgramRaster::getProgramRaster(rsc, false, RS_CULL_BACK).get());
}
void ProgramRasterState::deinit(Context *rsc) {
@@ -84,19 +76,13 @@
}
ObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc,
- bool pointSmooth,
- bool lineSmooth,
bool pointSprite,
- float lineWidth,
RsCullMode cull) {
ObjectBaseRef<ProgramRaster> returnRef;
ObjectBase::asyncLock();
for (uint32_t ct = 0; ct < rsc->mStateRaster.mRasterPrograms.size(); ct++) {
ProgramRaster *existing = rsc->mStateRaster.mRasterPrograms[ct];
- if (existing->mHal.state.pointSmooth != pointSmooth) continue;
- if (existing->mHal.state.lineSmooth != lineSmooth) continue;
if (existing->mHal.state.pointSprite != pointSprite) continue;
- if (existing->mHal.state.lineWidth != lineWidth) continue;
if (existing->mHal.state.cull != cull) continue;
returnRef.set(existing);
ObjectBase::asyncUnlock();
@@ -104,8 +90,7 @@
}
ObjectBase::asyncUnlock();
- ProgramRaster *pr = new ProgramRaster(rsc, pointSmooth,
- lineSmooth, pointSprite, lineWidth, cull);
+ ProgramRaster *pr = new ProgramRaster(rsc, pointSprite, cull);
returnRef.set(pr);
ObjectBase::asyncLock();
@@ -118,10 +103,8 @@
namespace android {
namespace renderscript {
-RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSmooth, bool lineSmooth,
- bool pointSprite, float lineWidth, RsCullMode cull) {
- ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSmooth, lineSmooth,
- pointSprite, lineWidth, cull);
+RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSprite, RsCullMode cull) {
+ ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSprite, cull);
pr->incUserRef();
return pr.get();
}
diff --git a/libs/rs/rsProgramRaster.h b/libs/rs/rsProgramRaster.h
index 09d7d54..20af30a 100644
--- a/libs/rs/rsProgramRaster.h
+++ b/libs/rs/rsProgramRaster.h
@@ -33,19 +33,13 @@
static ProgramRaster *createFromStream(Context *rsc, IStream *stream);
static ObjectBaseRef<ProgramRaster> getProgramRaster(Context *rsc,
- bool pointSmooth,
- bool lineSmooth,
bool pointSprite,
- float lineWidth,
RsCullMode cull);
struct Hal {
mutable void *drv;
struct State {
- bool pointSmooth;
- bool lineSmooth;
bool pointSprite;
- float lineWidth;
RsCullMode cull;
};
State state;
@@ -58,10 +52,7 @@
private:
ProgramRaster(Context *rsc,
- bool pointSmooth,
- bool lineSmooth,
bool pointSprite,
- float lineWidth,
RsCullMode cull);
};
diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp
index 8dab291..5656088 100644
--- a/libs/ui/Region.cpp
+++ b/libs/ui/Region.cpp
@@ -482,6 +482,7 @@
if (!rhs.isValid()) {
LOGE("Region::boolean_operation(op=%d) invalid Rect={%d,%d,%d,%d}",
op, rhs.left, rhs.top, rhs.right, rhs.bottom);
+ return;
}
#if VALIDATE_WITH_CORECG || VALIDATE_REGIONS
diff --git a/libs/utils/Android.mk b/libs/utils/Android.mk
index e4eadbd..638f72f 100644
--- a/libs/utils/Android.mk
+++ b/libs/utils/Android.mk
@@ -100,12 +100,8 @@
LOCAL_SHARED_LIBRARIES := \
libz \
liblog \
- libcutils
-
-ifeq ($(TARGET_OS)-$(TARGET_ARCH),linux-x86)
-# This is needed on x86 to bring in dl_iterate_phdr for CallStack.cpp
-LOCAL_SHARED_LIBRARIES += libdl
-endif # linux-x86
+ libcutils \
+ libdl
LOCAL_MODULE:= libutils
include $(BUILD_SHARED_LIBRARY)
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index c270f21..f3174fe 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -651,6 +651,10 @@
android_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
{
LOGV("native_finalize");
+ sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
+ if (mp != NULL) {
+ LOGW("MediaPlayer finalized without being released");
+ }
android_media_MediaPlayer_release(env, thiz);
}
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 0386d4b..b5eef94 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -52,6 +52,7 @@
#include <media/Metadata.h>
#include <media/AudioTrack.h>
#include <media/MemoryLeakTrackUtil.h>
+#include <media/stagefright/MediaErrors.h>
#include <system/audio.h>
@@ -1132,7 +1133,11 @@
player->start();
LOGV("wait for playback complete");
- if (cache->wait() != NO_ERROR) goto Exit;
+ cache->wait();
+ // in case of error, return what was successfully decoded.
+ if (cache->size() == 0) {
+ goto Exit;
+ }
mem = new MemoryBase(cache->getHeap(), 0, cache->size());
*pSampleRate = cache->sampleRate();
@@ -1175,7 +1180,11 @@
player->start();
LOGV("wait for playback complete");
- if (cache->wait() != NO_ERROR) goto Exit;
+ cache->wait();
+ // in case of error, return what was successfully decoded.
+ if (cache->size() == 0) {
+ goto Exit;
+ }
mem = new MemoryBase(cache->getHeap(), 0, cache->size());
*pSampleRate = cache->sampleRate();
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
index 605d056..079f6fa 100644
--- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp
@@ -41,7 +41,7 @@
mUIDValid(uidValid),
mUID(uid),
mFlags(0),
- mEOS(false),
+ mFinalResult(OK),
mOffset(0) {
if (headers) {
mExtraHeaders = *headers;
@@ -95,9 +95,9 @@
return source->getFormat();
}
-bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
- if (mEOS) {
- return false;
+status_t NuPlayer::HTTPLiveSource::feedMoreTSData() {
+ if (mFinalResult != OK) {
+ return mFinalResult;
}
sp<LiveDataSource> source =
@@ -110,9 +110,13 @@
if (n == -EWOULDBLOCK) {
break;
} else if (n < 0) {
- LOGI("input data EOS reached.");
+ if (n != ERROR_END_OF_STREAM) {
+ LOGI("input data EOS reached, error %ld", n);
+ } else {
+ LOGI("input data EOS reached.");
+ }
mTSParser->signalEOS(n);
- mEOS = true;
+ mFinalResult = n;
break;
} else {
if (buffer[0] == 0x00) {
@@ -129,7 +133,7 @@
if (err != OK) {
LOGE("TS Parser returned error %d", err);
mTSParser->signalEOS(err);
- mEOS = true;
+ mFinalResult = err;
break;
}
}
@@ -138,7 +142,7 @@
}
}
- return true;
+ return OK;
}
status_t NuPlayer::HTTPLiveSource::dequeueAccessUnit(
@@ -168,7 +172,7 @@
status_t NuPlayer::HTTPLiveSource::seekTo(int64_t seekTimeUs) {
// We need to make sure we're not seeking until we have seen the very first
// PTS timestamp in the whole stream (from the beginning of the stream).
- while (!mTSParser->PTSTimeDeltaEstablished() && feedMoreTSData()) {
+ while (!mTSParser->PTSTimeDeltaEstablished() && feedMoreTSData() == OK) {
usleep(100000);
}
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
index 36c67c5..f22af5b 100644
--- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
+++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.h
@@ -35,8 +35,7 @@
virtual void start();
- // Returns true iff more data was available, false on EOS.
- virtual bool feedMoreTSData();
+ virtual status_t feedMoreTSData();
virtual sp<MetaData> getFormat(bool audio);
virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
@@ -59,7 +58,7 @@
bool mUIDValid;
uid_t mUID;
uint32_t mFlags;
- bool mEOS;
+ status_t mFinalResult;
off64_t mOffset;
sp<ALooper> mLiveLooper;
sp<LiveSession> mLiveSession;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 7218faf..6b40528 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -235,11 +235,17 @@
instantiateDecoder(true, &mAudioDecoder);
}
- if (!mSource->feedMoreTSData()) {
+ status_t err;
+ if ((err = mSource->feedMoreTSData()) != OK) {
if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
// We're not currently decoding anything (no audio or
// video tracks found) and we just ran out of input data.
- notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
+
+ if (err == ERROR_END_OF_STREAM) {
+ notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
+ } else {
+ notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
+ }
}
break;
}
@@ -267,12 +273,23 @@
audio, codecRequest);
if (err == -EWOULDBLOCK) {
- if (mSource->feedMoreTSData()) {
+ if (mSource->feedMoreTSData() == OK) {
msg->post();
}
}
} else if (what == ACodec::kWhatEOS) {
- mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
+ int32_t err;
+ CHECK(codecRequest->findInt32("err", &err));
+
+ if (err == ERROR_END_OF_STREAM) {
+ LOGV("got %s decoder EOS", audio ? "audio" : "video");
+ } else {
+ LOGV("got %s decoder EOS w/ error %d",
+ audio ? "audio" : "video",
+ err);
+ }
+
+ mRenderer->queueEOS(audio, err);
} else if (what == ACodec::kWhatFlushCompleted) {
bool needShutdown;
@@ -397,7 +414,7 @@
if (finalResult == ERROR_END_OF_STREAM) {
LOGV("reached %s EOS", audio ? "audio" : "video");
} else {
- LOGE("%s track encountered an error (0x%08x)",
+ LOGE("%s track encountered an error (%d)",
audio ? "audio" : "video", finalResult);
notifyListener(
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
index 5e55487..8a7eece 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h
@@ -29,8 +29,9 @@
virtual void start() = 0;
- // Returns true iff more data was available, false on EOS.
- virtual bool feedMoreTSData() = 0;
+ // Returns OK iff more data was available,
+ // an error or ERROR_END_OF_STREAM if not.
+ virtual status_t feedMoreTSData() = 0;
virtual sp<MetaData> getFormat(bool audio) = 0;
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
index 7319e4c..f795654 100644
--- a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
@@ -34,7 +34,7 @@
NuPlayer::StreamingSource::StreamingSource(const sp<IStreamSource> &source)
: mSource(source),
- mEOS(false) {
+ mFinalResult(OK) {
}
NuPlayer::StreamingSource::~StreamingSource() {
@@ -47,9 +47,9 @@
mStreamListener->start();
}
-bool NuPlayer::StreamingSource::feedMoreTSData() {
- if (mEOS) {
- return false;
+status_t NuPlayer::StreamingSource::feedMoreTSData() {
+ if (mFinalResult != OK) {
+ return mFinalResult;
}
for (int32_t i = 0; i < 50; ++i) {
@@ -60,7 +60,7 @@
if (n == 0) {
LOGI("input data EOS reached.");
mTSParser->signalEOS(ERROR_END_OF_STREAM);
- mEOS = true;
+ mFinalResult = ERROR_END_OF_STREAM;
break;
} else if (n == INFO_DISCONTINUITY) {
ATSParser::DiscontinuityType type = ATSParser::DISCONTINUITY_SEEK;
@@ -92,14 +92,14 @@
LOGE("TS Parser returned error %d", err);
mTSParser->signalEOS(err);
- mEOS = true;
+ mFinalResult = err;
break;
}
}
}
}
- return true;
+ return OK;
}
sp<MetaData> NuPlayer::StreamingSource::getFormat(bool audio) {
diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.h b/media/libmediaplayerservice/nuplayer/StreamingSource.h
index 7abce84..ca00ef9 100644
--- a/media/libmediaplayerservice/nuplayer/StreamingSource.h
+++ b/media/libmediaplayerservice/nuplayer/StreamingSource.h
@@ -31,8 +31,7 @@
virtual void start();
- // Returns true iff more data was available, false on EOS.
- virtual bool feedMoreTSData();
+ virtual status_t feedMoreTSData();
virtual sp<MetaData> getFormat(bool audio);
virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
@@ -42,7 +41,7 @@
private:
sp<IStreamSource> mSource;
- bool mEOS;
+ status_t mFinalResult;
sp<NuPlayerStreamListener> mStreamListener;
sp<ATSParser> mTSParser;
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index a2d9e59..9cb18de 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -323,6 +323,7 @@
mFlushingState = new FlushingState(this);
mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false;
+ mInputEOSResult = OK;
changeState(mUninitializedState);
}
@@ -686,6 +687,8 @@
"audio_decoder.amrwb", "audio_encoder.amrwb" },
{ MEDIA_MIMETYPE_AUDIO_AAC,
"audio_decoder.aac", "audio_encoder.aac" },
+ { MEDIA_MIMETYPE_AUDIO_VORBIS,
+ "audio_decoder.vorbis", "audio_encoder.vorbis" },
{ MEDIA_MIMETYPE_VIDEO_AVC,
"video_decoder.avc", "video_encoder.avc" },
{ MEDIA_MIMETYPE_VIDEO_MPEG4,
@@ -749,9 +752,19 @@
CHECK(msg->findInt32("sample-rate", &sampleRate));
CHECK_EQ(setupAACDecoder(numChannels, sampleRate), (status_t)OK);
- } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
- } else {
- TRESPASS();
+ } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
+ CHECK_EQ(setupAMRDecoder(false /* isWAMR */), (status_t)OK);
+ } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
+ CHECK_EQ(setupAMRDecoder(true /* isWAMR */), (status_t)OK);
+ } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW)
+ || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) {
+ // These are PCM-like formats with a fixed sample rate but
+ // a variable number of channels.
+
+ int32_t numChannels;
+ CHECK(msg->findInt32("channel-count", &numChannels));
+
+ CHECK_EQ(setupG711Decoder(numChannels), (status_t)OK);
}
int32_t maxInputSize;
@@ -823,6 +836,84 @@
return err;
}
+status_t ACodec::setupAMRDecoder(bool isWAMR) {
+ OMX_AUDIO_PARAM_AMRTYPE def;
+ InitOMXParams(&def);
+ def.nPortIndex = kPortIndexInput;
+
+ status_t err =
+ mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def));
+
+ if (err != OK) {
+ return err;
+ }
+
+ def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF;
+
+ def.eAMRBandMode =
+ isWAMR ? OMX_AUDIO_AMRBandModeWB0 : OMX_AUDIO_AMRBandModeNB0;
+
+ return mOMX->setParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def));
+}
+
+status_t ACodec::setupG711Decoder(int32_t numChannels) {
+ return setupRawAudioFormat(
+ kPortIndexInput, 8000 /* sampleRate */, numChannels);
+}
+
+status_t ACodec::setupRawAudioFormat(
+ OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) {
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ InitOMXParams(&def);
+ def.nPortIndex = portIndex;
+
+ status_t err = mOMX->getParameter(
+ mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
+
+ if (err != OK) {
+ return err;
+ }
+
+ def.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
+
+ err = mOMX->setParameter(
+ mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
+
+ if (err != OK) {
+ return err;
+ }
+
+ OMX_AUDIO_PARAM_PCMMODETYPE pcmParams;
+ InitOMXParams(&pcmParams);
+ pcmParams.nPortIndex = portIndex;
+
+ err = mOMX->getParameter(
+ mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+
+ if (err != OK) {
+ return err;
+ }
+
+ pcmParams.nChannels = numChannels;
+ pcmParams.eNumData = OMX_NumericalDataSigned;
+ pcmParams.bInterleaved = OMX_TRUE;
+ pcmParams.nBitPerSample = 16;
+ pcmParams.nSamplingRate = sampleRate;
+ pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear;
+
+ if (numChannels == 1) {
+ pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelCF;
+ } else {
+ CHECK_EQ(numChannels, 2);
+
+ pcmParams.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
+ pcmParams.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
+ }
+
+ return mOMX->setParameter(
+ mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams));
+}
+
status_t ACodec::setVideoPortFormatType(
OMX_U32 portIndex,
OMX_VIDEO_CODINGTYPE compressionFormat,
@@ -1347,7 +1438,10 @@
case KEEP_BUFFERS:
{
if (buffer == NULL) {
- mCodec->mPortEOS[kPortIndexInput] = true;
+ if (!mCodec->mPortEOS[kPortIndexInput]) {
+ mCodec->mPortEOS[kPortIndexInput] = true;
+ mCodec->mInputEOSResult = err;
+ }
}
break;
}
@@ -1398,8 +1492,14 @@
getMoreInputDataIfPossible();
} else if (!mCodec->mPortEOS[kPortIndexInput]) {
- LOGV("[%s] Signalling EOS on the input port",
- mCodec->mComponentName.c_str());
+ if (err != ERROR_END_OF_STREAM) {
+ LOGV("[%s] Signalling EOS on the input port "
+ "due to error %d",
+ mCodec->mComponentName.c_str(), err);
+ } else {
+ LOGV("[%s] Signalling EOS on the input port",
+ mCodec->mComponentName.c_str());
+ }
LOGV("[%s] calling emptyBuffer %p signalling EOS",
mCodec->mComponentName.c_str(), bufferID);
@@ -1416,6 +1516,7 @@
info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
mCodec->mPortEOS[kPortIndexInput] = true;
+ mCodec->mInputEOSResult = err;
}
break;
@@ -1523,6 +1624,7 @@
if (flags & OMX_BUFFERFLAG_EOS) {
sp<AMessage> notify = mCodec->mNotify->dup();
notify->setInt32("what", ACodec::kWhatEOS);
+ notify->setInt32("err", mCodec->mInputEOSResult);
notify->post();
mCodec->mPortEOS[kPortIndexOutput] = true;
@@ -1721,6 +1823,8 @@
mCodec->mPortEOS[kPortIndexInput] =
mCodec->mPortEOS[kPortIndexOutput] = false;
+ mCodec->mInputEOSResult = OK;
+
mCodec->configureCodec(mime.c_str(), msg);
sp<RefBase> obj;
@@ -2371,6 +2475,8 @@
mCodec->mPortEOS[kPortIndexInput] =
mCodec->mPortEOS[kPortIndexOutput] = false;
+ mCodec->mInputEOSResult = OK;
+
mCodec->changeState(mCodec->mExecutingState);
}
}
diff --git a/media/libstagefright/AVIExtractor.cpp b/media/libstagefright/AVIExtractor.cpp
index d47e5d1..0be2ca4 100644
--- a/media/libstagefright/AVIExtractor.cpp
+++ b/media/libstagefright/AVIExtractor.cpp
@@ -56,11 +56,36 @@
MediaBufferGroup *mBufferGroup;
size_t mSampleIndex;
+ sp<MP3Splitter> mSplitter;
+
DISALLOW_EVIL_CONSTRUCTORS(AVISource);
};
////////////////////////////////////////////////////////////////////////////////
+struct AVIExtractor::MP3Splitter : public RefBase {
+ MP3Splitter();
+
+ void clear();
+ void append(MediaBuffer *buffer);
+ status_t read(MediaBuffer **buffer);
+
+protected:
+ virtual ~MP3Splitter();
+
+private:
+ bool mFindSync;
+ int64_t mBaseTimeUs;
+ int64_t mNumSamplesRead;
+ sp<ABuffer> mBuffer;
+
+ bool resync();
+
+ DISALLOW_EVIL_CONSTRUCTORS(MP3Splitter);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
AVIExtractor::AVISource::AVISource(
const sp<AVIExtractor> &extractor, size_t trackIndex)
: mExtractor(extractor),
@@ -84,6 +109,15 @@
mBufferGroup->add_buffer(new MediaBuffer(mTrack.mMaxSampleSize));
mSampleIndex = 0;
+ const char *mime;
+ CHECK(mTrack.mMeta->findCString(kKeyMIMEType, &mime));
+
+ if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
+ mSplitter = new MP3Splitter;
+ } else {
+ mSplitter.clear();
+ }
+
return OK;
}
@@ -93,6 +127,8 @@
delete mBufferGroup;
mBufferGroup = NULL;
+ mSplitter.clear();
+
return OK;
}
@@ -116,39 +152,213 @@
if (err != OK) {
return ERROR_END_OF_STREAM;
}
+
+ if (mSplitter != NULL) {
+ mSplitter->clear();
+ }
}
- off64_t offset;
- size_t size;
- bool isKey;
- int64_t timeUs;
- status_t err = mExtractor->getSampleInfo(
- mTrackIndex, mSampleIndex, &offset, &size, &isKey, &timeUs);
+ for (;;) {
+ if (mSplitter != NULL) {
+ status_t err = mSplitter->read(buffer);
- ++mSampleIndex;
+ if (err == OK) {
+ break;
+ } else if (err != -EAGAIN) {
+ return err;
+ }
+ }
- if (err != OK) {
- return ERROR_END_OF_STREAM;
+ off64_t offset;
+ size_t size;
+ bool isKey;
+ int64_t timeUs;
+ status_t err = mExtractor->getSampleInfo(
+ mTrackIndex, mSampleIndex, &offset, &size, &isKey, &timeUs);
+
+ ++mSampleIndex;
+
+ if (err != OK) {
+ return ERROR_END_OF_STREAM;
+ }
+
+ MediaBuffer *out;
+ CHECK_EQ(mBufferGroup->acquire_buffer(&out), (status_t)OK);
+
+ ssize_t n = mExtractor->mDataSource->readAt(offset, out->data(), size);
+
+ if (n < (ssize_t)size) {
+ return n < 0 ? (status_t)n : (status_t)ERROR_MALFORMED;
+ }
+
+ out->set_range(0, size);
+
+ out->meta_data()->setInt64(kKeyTime, timeUs);
+
+ if (isKey) {
+ out->meta_data()->setInt32(kKeyIsSyncFrame, 1);
+ }
+
+ if (mSplitter == NULL) {
+ *buffer = out;
+ break;
+ }
+
+ mSplitter->append(out);
+ out->release();
+ out = NULL;
}
- MediaBuffer *out;
- CHECK_EQ(mBufferGroup->acquire_buffer(&out), (status_t)OK);
+ return OK;
+}
- ssize_t n = mExtractor->mDataSource->readAt(offset, out->data(), size);
+////////////////////////////////////////////////////////////////////////////////
- if (n < (ssize_t)size) {
- return n < 0 ? (status_t)n : (status_t)ERROR_MALFORMED;
+AVIExtractor::MP3Splitter::MP3Splitter()
+ : mFindSync(true),
+ mBaseTimeUs(-1ll),
+ mNumSamplesRead(0) {
+}
+
+AVIExtractor::MP3Splitter::~MP3Splitter() {
+}
+
+void AVIExtractor::MP3Splitter::clear() {
+ mFindSync = true;
+ mBaseTimeUs = -1ll;
+ mNumSamplesRead = 0;
+
+ if (mBuffer != NULL) {
+ mBuffer->setRange(0, 0);
+ }
+}
+
+void AVIExtractor::MP3Splitter::append(MediaBuffer *buffer) {
+ size_t prevCapacity = (mBuffer != NULL) ? mBuffer->capacity() : 0;
+
+ if (mBaseTimeUs < 0) {
+ CHECK(mBuffer == NULL || mBuffer->size() == 0);
+ CHECK(buffer->meta_data()->findInt64(kKeyTime, &mBaseTimeUs));
+ mNumSamplesRead = 0;
}
- out->set_range(0, size);
-
- out->meta_data()->setInt64(kKeyTime, timeUs);
-
- if (isKey) {
- out->meta_data()->setInt32(kKeyIsSyncFrame, 1);
+ if (mBuffer != NULL && mBuffer->offset() > 0) {
+ memmove(mBuffer->base(), mBuffer->data(), mBuffer->size());
+ mBuffer->setRange(0, mBuffer->size());
}
- *buffer = out;
+ if (mBuffer == NULL
+ || mBuffer->size() + buffer->range_length() > prevCapacity) {
+ size_t newCapacity =
+ (prevCapacity + buffer->range_length() + 1023) & ~1023;
+
+ sp<ABuffer> newBuffer = new ABuffer(newCapacity);
+ if (mBuffer != NULL) {
+ memcpy(newBuffer->data(), mBuffer->data(), mBuffer->size());
+ newBuffer->setRange(0, mBuffer->size());
+ } else {
+ newBuffer->setRange(0, 0);
+ }
+ mBuffer = newBuffer;
+ }
+
+ memcpy(mBuffer->data() + mBuffer->size(),
+ (const uint8_t *)buffer->data() + buffer->range_offset(),
+ buffer->range_length());
+
+ mBuffer->setRange(0, mBuffer->size() + buffer->range_length());
+}
+
+bool AVIExtractor::MP3Splitter::resync() {
+ if (mBuffer == NULL) {
+ return false;
+ }
+
+ bool foundSync = false;
+ for (size_t offset = 0; offset + 3 < mBuffer->size(); ++offset) {
+ uint32_t firstHeader = U32_AT(mBuffer->data() + offset);
+
+ size_t frameSize;
+ if (!GetMPEGAudioFrameSize(firstHeader, &frameSize)) {
+ continue;
+ }
+
+ size_t subsequentOffset = offset + frameSize;
+ size_t i = 3;
+ while (i > 0) {
+ if (subsequentOffset + 3 >= mBuffer->size()) {
+ break;
+ }
+
+ static const uint32_t kMask = 0xfffe0c00;
+
+ uint32_t header = U32_AT(mBuffer->data() + subsequentOffset);
+ if ((header & kMask) != (firstHeader & kMask)) {
+ break;
+ }
+
+ if (!GetMPEGAudioFrameSize(header, &frameSize)) {
+ break;
+ }
+
+ subsequentOffset += frameSize;
+ --i;
+ }
+
+ if (i == 0) {
+ foundSync = true;
+ memmove(mBuffer->data(),
+ mBuffer->data() + offset,
+ mBuffer->size() - offset);
+
+ mBuffer->setRange(0, mBuffer->size() - offset);
+ break;
+ }
+ }
+
+ return foundSync;
+}
+
+status_t AVIExtractor::MP3Splitter::read(MediaBuffer **out) {
+ *out = NULL;
+
+ if (mFindSync) {
+ if (!resync()) {
+ return -EAGAIN;
+ }
+
+ mFindSync = false;
+ }
+
+ if (mBuffer->size() < 4) {
+ return -EAGAIN;
+ }
+
+ uint32_t header = U32_AT(mBuffer->data());
+ size_t frameSize;
+ int sampleRate;
+ int numSamples;
+ if (!GetMPEGAudioFrameSize(
+ header, &frameSize, &sampleRate, NULL, NULL, &numSamples)) {
+ return ERROR_MALFORMED;
+ }
+
+ if (mBuffer->size() < frameSize) {
+ return -EAGAIN;
+ }
+
+ MediaBuffer *mbuf = new MediaBuffer(frameSize);
+ memcpy(mbuf->data(), mBuffer->data(), frameSize);
+
+ int64_t timeUs = mBaseTimeUs + (mNumSamplesRead * 1000000ll) / sampleRate;
+ mNumSamplesRead += numSamples;
+
+ mbuf->meta_data()->setInt64(kKeyTime, timeUs);
+
+ mBuffer->setRange(
+ mBuffer->offset() + frameSize, mBuffer->size() - frameSize);
+
+ *out = mbuf;
return OK;
}
@@ -449,6 +659,8 @@
track->mThumbnailSampleSize = 0;
track->mThumbnailSampleIndex = -1;
track->mMaxSampleSize = 0;
+ track->mAvgChunkSize = 1.0;
+ track->mFirstChunkSize = 0;
return OK;
}
@@ -467,8 +679,8 @@
bool isVideo = (track->mKind == Track::VIDEO);
- if ((isVideo && size < 40) || (!isVideo && size < 18)) {
- // Expected a BITMAPINFO or WAVEFORMATEX structure, respectively.
+ if ((isVideo && size < 40) || (!isVideo && size < 16)) {
+ // Expected a BITMAPINFO or WAVEFORMAT(EX) structure, respectively.
return ERROR_MALFORMED;
}
@@ -651,6 +863,47 @@
for (size_t i = 0; i < mTracks.size(); ++i) {
Track *track = &mTracks.editItemAt(i);
+ if (track->mBytesPerSample > 0) {
+ // Assume all chunks are roughly the same size for now.
+
+ // Compute the avg. size of the first 128 chunks (if there are
+ // that many), but exclude the size of the first one, since
+ // it may be an outlier.
+ size_t numSamplesToAverage = track->mSamples.size();
+ if (numSamplesToAverage > 256) {
+ numSamplesToAverage = 256;
+ }
+
+ double avgChunkSize = 0;
+ size_t j;
+ for (j = 0; j <= numSamplesToAverage; ++j) {
+ off64_t offset;
+ size_t size;
+ bool isKey;
+ int64_t dummy;
+
+ status_t err =
+ getSampleInfo(
+ i, j,
+ &offset, &size, &isKey, &dummy);
+
+ if (err != OK) {
+ return err;
+ }
+
+ if (j == 0) {
+ track->mFirstChunkSize = size;
+ continue;
+ }
+
+ avgChunkSize += size;
+ }
+
+ avgChunkSize /= numSamplesToAverage;
+
+ track->mAvgChunkSize = avgChunkSize;
+ }
+
int64_t durationUs;
CHECK_EQ((status_t)OK,
getSampleTime(i, track->mSamples.size() - 1, &durationUs));
@@ -687,21 +940,6 @@
return err;
}
}
-
- if (track->mBytesPerSample != 0) {
- // Assume all chunks are the same size for now.
-
- off64_t offset;
- size_t size;
- bool isKey;
- int64_t sampleTimeUs;
- CHECK_EQ((status_t)OK,
- getSampleInfo(
- i, 0,
- &offset, &size, &isKey, &sampleTimeUs));
-
- track->mRate *= size / track->mBytesPerSample;
- }
}
mFoundIndex = true;
@@ -904,6 +1142,18 @@
*isKey = info.mIsKey;
+ if (track.mBytesPerSample > 0) {
+ size_t sampleStartInBytes;
+ if (sampleIndex == 0) {
+ sampleStartInBytes = 0;
+ } else {
+ sampleStartInBytes =
+ track.mFirstChunkSize + track.mAvgChunkSize * (sampleIndex - 1);
+ }
+
+ sampleIndex = sampleStartInBytes / track.mBytesPerSample;
+ }
+
*sampleTimeUs = (sampleIndex * 1000000ll * track.mRate) / track.mScale;
return OK;
@@ -928,8 +1178,24 @@
const Track &track = mTracks.itemAt(trackIndex);
- ssize_t closestSampleIndex =
- timeUs / track.mRate * track.mScale / 1000000ll;
+ ssize_t closestSampleIndex;
+
+ if (track.mBytesPerSample > 0) {
+ size_t closestByteOffset =
+ (timeUs * track.mBytesPerSample)
+ / track.mRate * track.mScale / 1000000ll;
+
+ if (closestByteOffset <= track.mFirstChunkSize) {
+ closestSampleIndex = 0;
+ } else {
+ closestSampleIndex =
+ (closestByteOffset - track.mFirstChunkSize)
+ / track.mAvgChunkSize;
+ }
+ } else {
+ // Each chunk contains a single sample.
+ closestSampleIndex = timeUs / track.mRate * track.mScale / 1000000ll;
+ }
ssize_t numSamples = track.mSamples.size();
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp
index ba076f5..2581a62 100644
--- a/media/libstagefright/AudioPlayer.cpp
+++ b/media/libstagefright/AudioPlayer.cpp
@@ -508,6 +508,9 @@
mReachedEOS = false;
mSeekTimeUs = time_us;
+ // Flush resets the number of played frames
+ mNumFramesPlayed = 0;
+
if (mAudioSink != NULL) {
mAudioSink->flush();
} else {
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 07a46bd..fa9417a50 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -249,7 +249,7 @@
}
void AwesomePlayer::setUID(uid_t uid) {
- LOGI("AwesomePlayer running on behalf of uid %d", uid);
+ LOGV("AwesomePlayer running on behalf of uid %d", uid);
mUID = uid;
mUIDValid = true;
@@ -362,7 +362,7 @@
if (!meta->findInt32(kKeyBitRate, &bitrate)) {
const char *mime;
CHECK(meta->findCString(kKeyMIMEType, &mime));
- LOGW("track of type '%s' does not publish bitrate", mime);
+ LOGV("track of type '%s' does not publish bitrate", mime);
totalBitRate = -1;
break;
@@ -1192,7 +1192,7 @@
usleep(1000);
}
IPCThreadState::self()->flushCommands();
- LOGI("video decoder shutdown completed");
+ LOGV("video decoder shutdown completed");
}
status_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
@@ -1202,7 +1202,7 @@
return OK;
}
- LOGI("attempting to reconfigure to use new surface");
+ LOGV("attempting to reconfigure to use new surface");
bool wasPlaying = (mFlags & PLAYING) != 0;
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 6280f51..e94a8d7 100755
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1485,6 +1485,8 @@
"audio_decoder.amrwb", "audio_encoder.amrwb" },
{ MEDIA_MIMETYPE_AUDIO_AAC,
"audio_decoder.aac", "audio_encoder.aac" },
+ { MEDIA_MIMETYPE_AUDIO_VORBIS,
+ "audio_decoder.vorbis", "audio_encoder.vorbis" },
{ MEDIA_MIMETYPE_VIDEO_AVC,
"video_decoder.avc", "video_encoder.avc" },
{ MEDIA_MIMETYPE_VIDEO_MPEG4,
@@ -1635,7 +1637,7 @@
return err;
}
- CODEC_LOGI("allocating %lu buffers of size %lu on %s port",
+ CODEC_LOGV("allocating %lu buffers of size %lu on %s port",
def.nBufferCountActual, def.nBufferSize,
portIndex == kPortIndexInput ? "input" : "output");
@@ -1876,7 +1878,7 @@
return err;
}
- CODEC_LOGI("allocating %lu buffers from a native window of size %lu on "
+ CODEC_LOGV("allocating %lu buffers from a native window of size %lu on "
"output port", def.nBufferCountActual, def.nBufferSize);
// Dequeue buffers and send them to OMX
@@ -3654,7 +3656,7 @@
mSource->stop();
- CODEC_LOGI("stopped in state %d", mState);
+ CODEC_LOGV("stopped in state %d", mState);
return OK;
}
@@ -4219,14 +4221,14 @@
inputFormat->findInt32(kKeySampleRate, &sampleRate);
if ((OMX_U32)numChannels != params.nChannels) {
- LOGW("Codec outputs a different number of channels than "
+ LOGV("Codec outputs a different number of channels than "
"the input stream contains (contains %d channels, "
"codec outputs %ld channels).",
numChannels, params.nChannels);
}
if (sampleRate != (int32_t)params.nSamplingRate) {
- LOGW("Codec outputs at different sampling rate than "
+ LOGV("Codec outputs at different sampling rate than "
"what the input stream contains (contains data at "
"%d Hz, codec outputs %lu Hz)",
sampleRate, params.nSamplingRate);
diff --git a/media/libstagefright/include/AVIExtractor.h b/media/libstagefright/include/AVIExtractor.h
index 75ce68d..ff5dcb5 100644
--- a/media/libstagefright/include/AVIExtractor.h
+++ b/media/libstagefright/include/AVIExtractor.h
@@ -42,6 +42,7 @@
private:
struct AVISource;
+ struct MP3Splitter;
struct SampleInfo {
uint32_t mOffset;
@@ -70,6 +71,10 @@
size_t mThumbnailSampleSize;
ssize_t mThumbnailSampleIndex;
size_t mMaxSampleSize;
+
+ // If mBytesPerSample > 0:
+ double mAvgChunkSize;
+ size_t mFirstChunkSize;
};
sp<DataSource> mDataSource;
diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp
index ffa3356..20a25d7 100644
--- a/media/libstagefright/matroska/MatroskaExtractor.cpp
+++ b/media/libstagefright/matroska/MatroskaExtractor.cpp
@@ -423,75 +423,89 @@
MediaBuffer *frame = *mPendingFrames.begin();
mPendingFrames.erase(mPendingFrames.begin());
- size_t size = frame->range_length();
-
if (mType != AVC) {
*out = frame;
return OK;
}
- if (size < mNALSizeLen) {
- frame->release();
- frame = NULL;
+ // Each input frame contains one or more NAL fragments, each fragment
+ // is prefixed by mNALSizeLen bytes giving the fragment length,
+ // followed by a corresponding number of bytes containing the fragment.
+ // We output all these fragments into a single large buffer separated
+ // by startcodes (0x00 0x00 0x00 0x01).
- return ERROR_MALFORMED;
+ const uint8_t *srcPtr =
+ (const uint8_t *)frame->data() + frame->range_offset();
+
+ size_t srcSize = frame->range_length();
+
+ size_t dstSize = 0;
+ MediaBuffer *buffer = NULL;
+ uint8_t *dstPtr = NULL;
+
+ for (int32_t pass = 0; pass < 2; ++pass) {
+ size_t srcOffset = 0;
+ size_t dstOffset = 0;
+ while (srcOffset + mNALSizeLen <= srcSize) {
+ size_t NALsize;
+ switch (mNALSizeLen) {
+ case 1: NALsize = srcPtr[srcOffset]; break;
+ case 2: NALsize = U16_AT(srcPtr + srcOffset); break;
+ case 3: NALsize = U24_AT(srcPtr + srcOffset); break;
+ case 4: NALsize = U32_AT(srcPtr + srcOffset); break;
+ default:
+ TRESPASS();
+ }
+
+ if (srcOffset + mNALSizeLen + NALsize > srcSize) {
+ break;
+ }
+
+ if (pass == 1) {
+ memcpy(&dstPtr[dstOffset], "\x00\x00\x00\x01", 4);
+
+ memcpy(&dstPtr[dstOffset + 4],
+ &srcPtr[srcOffset + mNALSizeLen],
+ NALsize);
+ }
+
+ dstOffset += 4; // 0x00 00 00 01
+ dstOffset += NALsize;
+
+ srcOffset += mNALSizeLen + NALsize;
+ }
+
+ if (srcOffset < srcSize) {
+ // There were trailing bytes or not enough data to complete
+ // a fragment.
+
+ frame->release();
+ frame = NULL;
+
+ return ERROR_MALFORMED;
+ }
+
+ if (pass == 0) {
+ dstSize = dstOffset;
+
+ buffer = new MediaBuffer(dstSize);
+
+ int64_t timeUs;
+ CHECK(frame->meta_data()->findInt64(kKeyTime, &timeUs));
+ int32_t isSync;
+ CHECK(frame->meta_data()->findInt32(kKeyIsSyncFrame, &isSync));
+
+ buffer->meta_data()->setInt64(kKeyTime, timeUs);
+ buffer->meta_data()->setInt32(kKeyIsSyncFrame, isSync);
+
+ dstPtr = (uint8_t *)buffer->data();
+ }
}
- // In the case of AVC content, each NAL unit is prefixed by
- // mNALSizeLen bytes of length. We want to prefix the data with
- // a four-byte 0x00000001 startcode instead of the length prefix.
- // mNALSizeLen ranges from 1 through 4 bytes, so add an extra
- // 3 bytes of padding to the buffer start.
- static const size_t kPadding = 3;
-
- MediaBuffer *buffer = new MediaBuffer(size + kPadding);
-
- int64_t timeUs;
- CHECK(frame->meta_data()->findInt64(kKeyTime, &timeUs));
- int32_t isSync;
- CHECK(frame->meta_data()->findInt32(kKeyIsSyncFrame, &isSync));
-
- buffer->meta_data()->setInt64(kKeyTime, timeUs);
- buffer->meta_data()->setInt32(kKeyIsSyncFrame, isSync);
-
- memcpy((uint8_t *)buffer->data() + kPadding,
- (const uint8_t *)frame->data() + frame->range_offset(),
- size);
-
- buffer->set_range(kPadding, size);
-
frame->release();
frame = NULL;
- uint8_t *data = (uint8_t *)buffer->data();
-
- size_t NALsize;
- switch (mNALSizeLen) {
- case 1: NALsize = data[kPadding]; break;
- case 2: NALsize = U16_AT(&data[kPadding]); break;
- case 3: NALsize = U24_AT(&data[kPadding]); break;
- case 4: NALsize = U32_AT(&data[kPadding]); break;
- default:
- TRESPASS();
- }
-
- if (size < NALsize + mNALSizeLen) {
- buffer->release();
- buffer = NULL;
-
- return ERROR_MALFORMED;
- }
-
- if (size > NALsize + mNALSizeLen) {
- LOGW("discarding %d bytes of data.", size - NALsize - mNALSizeLen);
- }
-
- // actual data starts at &data[kPadding + mNALSizeLen]
-
- memcpy(&data[mNALSizeLen - 1], "\x00\x00\x00\x01", 4);
- buffer->set_range(mNALSizeLen - 1, NALsize + 4);
-
*out = buffer;
return OK;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java
index f3cf0f7..3fb2da0 100755
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaFrameworkTestRunner.java
@@ -17,27 +17,26 @@
package com.android.mediaframeworktest;
import com.android.mediaframeworktest.functional.CameraTest;
-import com.android.mediaframeworktest.functional.MediaAudioTrackTest;
import com.android.mediaframeworktest.functional.MediaMetadataTest;
import com.android.mediaframeworktest.functional.MediaMimeTest;
-import com.android.mediaframeworktest.functional.MediaPlayerApiTest;
-import com.android.mediaframeworktest.functional.MediaRecorderTest;
-import com.android.mediaframeworktest.functional.SimTonesTest;
import com.android.mediaframeworktest.functional.MediaPlayerInvokeTest;
-import com.android.mediaframeworktest.functional.MediaAudioManagerTest;
-import com.android.mediaframeworktest.functional.MediaAudioEffectTest;
-import com.android.mediaframeworktest.functional.MediaBassBoostTest;
-import com.android.mediaframeworktest.functional.MediaEnvReverbTest;
-import com.android.mediaframeworktest.functional.MediaEqualizerTest;
-import com.android.mediaframeworktest.functional.MediaPresetReverbTest;
-import com.android.mediaframeworktest.functional.MediaVirtualizerTest;
-import com.android.mediaframeworktest.functional.MediaVisualizerTest;
-/*import for VideoEditor Test cases*/
-import com.android.mediaframeworktest.functional.MediaItemThumbnailTest;
-import com.android.mediaframeworktest.functional.MediaPropertiesTest;
-import com.android.mediaframeworktest.functional.VideoEditorAPITest;
-import com.android.mediaframeworktest.functional.VideoEditorExportTest;
-import com.android.mediaframeworktest.functional.VideoEditorPreviewTest;
+import com.android.mediaframeworktest.functional.mediaplayback.MediaPlayerApiTest;
+import com.android.mediaframeworktest.functional.mediarecorder.MediaRecorderTest;
+import com.android.mediaframeworktest.functional.audio.SimTonesTest;
+import com.android.mediaframeworktest.functional.audio.MediaAudioTrackTest;
+import com.android.mediaframeworktest.functional.audio.MediaAudioManagerTest;
+import com.android.mediaframeworktest.functional.audio.MediaAudioEffectTest;
+import com.android.mediaframeworktest.functional.audio.MediaBassBoostTest;
+import com.android.mediaframeworktest.functional.audio.MediaEnvReverbTest;
+import com.android.mediaframeworktest.functional.audio.MediaEqualizerTest;
+import com.android.mediaframeworktest.functional.audio.MediaPresetReverbTest;
+import com.android.mediaframeworktest.functional.audio.MediaVirtualizerTest;
+import com.android.mediaframeworktest.functional.audio.MediaVisualizerTest;
+import com.android.mediaframeworktest.functional.videoeditor.MediaItemThumbnailTest;
+import com.android.mediaframeworktest.functional.videoeditor.MediaPropertiesTest;
+import com.android.mediaframeworktest.functional.videoeditor.VideoEditorAPITest;
+import com.android.mediaframeworktest.functional.videoeditor.VideoEditorExportTest;
+import com.android.mediaframeworktest.functional.videoeditor.VideoEditorPreviewTest;
import junit.framework.TestSuite;
import android.test.InstrumentationTestRunner;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioEffectTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioEffectTest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioEffectTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioEffectTest.java
index 1511cd7..ab78714 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioEffectTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioEffectTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
@@ -1529,4 +1529,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioManagerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java
similarity index 97%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioManagerTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java
index 644444a..c9087d1 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioManagerTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java
@@ -14,7 +14,7 @@
* the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import android.content.Context;
@@ -67,4 +67,4 @@
assertTrue("SetRingtoneMode : " + ringtoneMode[i], result);
}
}
- }
\ No newline at end of file
+ }
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioTrackTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioTrackTest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioTrackTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioTrackTest.java
index cea3a5a..e884aba 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaAudioTrackTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioTrackTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
@@ -1250,4 +1250,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaBassBoostTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java
similarity index 94%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaBassBoostTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java
index aa5c4d7..e3aa8cf 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaBassBoostTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaBassBoostTest.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
+import com.android.mediaframeworktest.functional.EnergyProbe;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.audiofx.AudioEffect;
@@ -46,6 +47,10 @@
private final static int MIN_ENERGY_RATIO_2 = 3;
private final static short TEST_STRENGTH = 500;
private final static int TEST_VOLUME = 4;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
private BassBoost mBassBoost = null;
private int mSession = -1;
@@ -201,14 +206,15 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
mp.setDataSource(MediaNames.SINE_200_1000);
+ mp.setLooping(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
getBassBoost(mp.getAudioSessionId());
mp.prepare();
@@ -219,7 +225,7 @@
int refEnergy1000 = probe.capture(1000);
mBassBoost.setStrength((short)1000);
mBassBoost.setEnabled(true);
- Thread.sleep(500);
+ Thread.sleep(4000);
// measure energy around 1kHz with band level at min
int energy200 = probe.capture(200);
int energy1000 = probe.capture(1000);
@@ -286,4 +292,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEnvReverbTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java
similarity index 94%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEnvReverbTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java
index ba202a7..3c8d05a 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEnvReverbTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEnvReverbTest.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
+import com.android.mediaframeworktest.functional.EnergyProbe;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.audiofx.AudioEffect;
@@ -49,6 +50,14 @@
private final static float DELAY_TOLERANCE = 1.05f;
// allow +/- 5% tolerance between set and get ratios
private final static float RATIO_TOLERANCE = 1.05f;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
+ // Implementor UUID for environmental reverb effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID ENV_REVERB_EFFECT_UUID =
+ UUID.fromString("c7a511a0-a3bb-11df-860e-0002a5d5c51b");
private EnvironmentalReverb mReverb = null;
private int mSession = -1;
@@ -354,10 +363,10 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -424,10 +433,10 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -438,7 +447,7 @@
// auxiliary reverb will be chosen by the effect framework as we are on session 0
rvb = new AudioEffect(
AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("c7a511a0-a3bb-11df-860e-0002a5d5c51b"),
+ ENV_REVERB_EFFECT_UUID,
0,
0);
@@ -520,4 +529,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEqualizerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java
similarity index 95%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEqualizerTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java
index 9146fb8..ee91bbb 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaEqualizerTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaEqualizerTest.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
+import com.android.mediaframeworktest.functional.EnergyProbe;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.audiofx.AudioEffect;
@@ -49,6 +50,11 @@
private final static int TEST_FREQUENCY_MILLIHERTZ = 1000000;
private final static int MIN_NUMBER_OF_PRESETS = 4;
private final static int TEST_VOLUME = 4;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
+
private Equalizer mEqualizer = null;
private int mSession = -1;
@@ -267,10 +273,10 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -349,4 +355,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPresetReverbTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java
similarity index 92%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPresetReverbTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java
index 242e6bb..757bbc5 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPresetReverbTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaPresetReverbTest.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
+import com.android.mediaframeworktest.functional.EnergyProbe;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.audiofx.AudioEffect;
@@ -43,6 +44,14 @@
*/
public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
private String TAG = "MediaPresetReverbTest";
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
+ // Implementor UUID for preset reverb effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID PRESET_REVERB_EFFECT_UUID =
+ UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b");
private PresetReverb mReverb = null;
private int mSession = -1;
@@ -199,10 +208,10 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -267,24 +276,21 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
mp.setDataSource(MediaNames.SINE_200_1000);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- getReverb(mp.getAudioSessionId());
- mReverb.setPreset((short)PresetReverb.PRESET_PLATE);
- mReverb.setEnabled(true);
// create reverb with UUID instead of PresetReverb constructor otherwise an auxiliary
// reverb will be chosen by the effect framework as we are on session 0
rvb = new AudioEffect(
AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b"),
+ PRESET_REVERB_EFFECT_UUID,
0,
0);
@@ -317,7 +323,6 @@
loge(msg, "sleep() interrupted");
}
finally {
- releaseReverb();
if (mp != null) {
mp.release();
}
@@ -365,4 +370,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaVirtualizerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java
similarity index 93%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaVirtualizerTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java
index 7a35429..b74e525 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaVirtualizerTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVirtualizerTest.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
+import com.android.mediaframeworktest.functional.EnergyProbe;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.audiofx.AudioEffect;
@@ -43,9 +44,13 @@
*/
public class MediaVirtualizerTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
private String TAG = "MediaVirtualizerTest";
- private final static int MIN_ENERGY_RATIO_2 = 3;
+ private final static int MIN_ENERGY_RATIO_2 = 2;
private final static short TEST_STRENGTH = 500;
private final static int TEST_VOLUME = 4;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
private Virtualizer mVirtualizer = null;
private int mSession = -1;
@@ -202,14 +207,15 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
mp.setDataSource(MediaNames.SINE_200_1000);
+ mp.setLooping(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
getVirtualizer(mp.getAudioSessionId());
mp.prepare();
@@ -220,7 +226,7 @@
int refEnergy1000 = probe.capture(1000);
mVirtualizer.setStrength((short)1000);
mVirtualizer.setEnabled(true);
- Thread.sleep(500);
+ Thread.sleep(4000);
// measure energy around 1kHz with band level at min
int energy200 = probe.capture(200);
int energy1000 = probe.capture(1000);
@@ -230,7 +236,7 @@
// audio file but is not the primary effect of the virtualizer. A better way would
// be to have a stereo PCM capture and check that a strongly paned input is centered
// when output. However, we cannot capture stereo with the visualizer.
- assertTrue(msg + ": virtiualizer has no effect",
+ assertTrue(msg + ": virtualizer has no effect",
((float)energy200/(float)energy1000) >
(MIN_ENERGY_RATIO_2 * ((float)refEnergy200/(float)refEnergy1000)));
result = true;
@@ -291,4 +297,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaVisualizerTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java
similarity index 96%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaVisualizerTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java
index 542ca8d..e0cf51d 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaVisualizerTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaVisualizerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
@@ -47,6 +47,10 @@
private final static int MAX_SAMPLING_RATE = 48000000;
private final static int MIN_CAPTURE_SIZE_MAX = 1024;
private final static int MAX_CAPTURE_SIZE_MIN = 128;
+ // Implementor UUID for volume controller effect defined in
+ // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
+ private final static UUID VOLUME_EFFECT_UUID =
+ UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
private Visualizer mVisualizer = null;
private int mSession = -1;
@@ -205,10 +209,10 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -281,10 +285,10 @@
// creating a volume controller on output mix ensures that ro.audio.silent mutes
// audio after the effects and not before
vc = new AudioEffect(
- AudioEffect.EFFECT_TYPE_NULL,
- UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"),
- 0,
- 0);
+ AudioEffect.EFFECT_TYPE_NULL,
+ VOLUME_EFFECT_UUID,
+ 0,
+ 0);
vc.setEnabled(true);
mp = new MediaPlayer();
@@ -502,4 +506,3 @@
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/SimTonesTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/SimTonesTest.java
similarity index 94%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/SimTonesTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/SimTonesTest.java
index 241f8d6..aaf992c 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/SimTonesTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/SimTonesTest.java
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.audio;
// import android.content.Resources;
import com.android.mediaframeworktest.MediaFrameworkTest;
+import com.android.mediaframeworktest.functional.TonesAutoTest;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase;
@@ -70,4 +71,3 @@
assertTrue("Stress Tones", result);
}
}
-
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediaplayback/MediaPlayerApiTest.java
similarity index 98%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediaplayback/MediaPlayerApiTest.java
index 57d5368..c501d3f 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediaplayback/MediaPlayerApiTest.java
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.mediaplayback;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
import com.android.mediaframeworktest.MediaProfileReader;
+import com.android.mediaframeworktest.functional.CodecTest;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase;
@@ -31,16 +32,15 @@
/**
* Junit / Instrumentation test case for the media player api
-
- */
-public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFrameworkTest> {
+ */
+public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFrameworkTest> {
private boolean duratoinWithinTolerence = false;
private String TAG = "MediaPlayerApiTest";
private boolean isWMAEnable = false;
private boolean isWMVEnable = false;
-
+
Context mContext;
-
+
public MediaPlayerApiTest() {
super("com.android.mediaframeworktest", MediaFrameworkTest.class);
isWMAEnable = MediaProfileReader.getWMAEnable();
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java
index 796b52c..b5c8c8c 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaRecorderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.mediarecorder;
import com.android.mediaframeworktest.MediaFrameworkTest;
import com.android.mediaframeworktest.MediaNames;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaItemThumbnailTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/MediaItemThumbnailTest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaItemThumbnailTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/MediaItemThumbnailTest.java
index d5b67aa..80a3bcd 100755
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaItemThumbnailTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/MediaItemThumbnailTest.java
@@ -15,7 +15,7 @@
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.videoeditor;
import java.io.File;
import java.io.IOException;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPropertiesTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/MediaPropertiesTest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPropertiesTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/MediaPropertiesTest.java
index 0ad6760..e2f6863 100755
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPropertiesTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/MediaPropertiesTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.videoeditor;
import java.io.File;
import java.io.IOException;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorAPITest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorAPITest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorAPITest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorAPITest.java
index 2a02b58..b32d865 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorAPITest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorAPITest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.videoeditor;
import java.io.File;
import java.util.List;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorExportTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorExportTest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorExportTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorExportTest.java
index e1b337d..57a1c75 100755
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorExportTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorExportTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.videoeditor;
import java.io.File;
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorPreviewTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorPreviewTest.java
similarity index 99%
rename from media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorPreviewTest.java
rename to media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorPreviewTest.java
index 9a7f4f2..e848f5f 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/VideoEditorPreviewTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/videoeditor/VideoEditorPreviewTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.mediaframeworktest.functional;
+package com.android.mediaframeworktest.functional.videoeditor;
import java.io.File;
import java.io.IOException;
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index 6e5f856..113f0f7 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -156,6 +156,7 @@
}
ret.packageName = pkg.packageName;
ret.installLocation = pkg.installLocation;
+ ret.verifiers = pkg.verifiers;
ret.recommendedInstallLocation = recommendAppInstallLocation(pkg.installLocation,
archiveFilePath, flags, threshold);
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
index 3137e7e..908056f 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.png
index f4e741b..58843bb 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu_land.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu_land.png
index fb45ffc..66cd57b 100644
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu_land.png
+++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_menu_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png
index ffffb2d..fc8dee1 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
index 2117705..4a5d001 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
index ba2d78a..ed31e8e 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png
index 1102846..6583878 100644
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png
+++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
index b429222..69f3543 100644
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
index 5c98614..9820a79 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu.png
index a67c02f..cc65b07 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_land.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_land.png
index 1a5cba3..d0404bf 100644
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_land.png
+++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_menu_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png
index 4931b66..4b0a74f 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
index f288d9f..53a7364 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
index 6649031..06b3913 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png
index 1b57936..4f23dae 100644
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png
+++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
index f5f2f70..fb30982 100644
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
index 7c6b8e5..0b41317 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_home.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu.png
index 50c04bf..5c9c0e5f 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu_land.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu_land.png
index d592129..4db9e9d 100644
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu_land.png
+++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_menu_land.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png
index 6abc7c8..19ad300 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_alarm.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
index 738bd21..524b31b 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
index fb691fc..fdd640c 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png
index 0c7ba35..a1a0646 100644
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png
+++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png
Binary files differ
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index 492f3c2..bf1ec25 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -26,6 +26,7 @@
import android.graphics.Rect;
import android.graphics.Region.Op;
import android.opengl.GLUtils;
+import android.os.SystemProperties;
import android.renderscript.Matrix4f;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
@@ -56,6 +57,7 @@
private static final String TAG = "ImageWallpaper";
private static final String GL_LOG_TAG = "ImageWallpaperGL";
private static final boolean DEBUG = false;
+ private static final String PROPERTY_KERNEL_QEMU = "ro.kernel.qemu";
static final boolean FIXED_SIZED_SURFACE = true;
static final boolean USE_OPENGL = true;
@@ -71,12 +73,19 @@
//noinspection PointlessBooleanExpression,ConstantConditions
if (FIXED_SIZED_SURFACE && USE_OPENGL) {
- WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
- Display display = windowManager.getDefaultDisplay();
- mIsHwAccelerated = ActivityManager.isHighEndGfx(display);
+ if (!isEmulator()) {
+ WindowManager windowManager =
+ (WindowManager) getSystemService(Context.WINDOW_SERVICE);
+ Display display = windowManager.getDefaultDisplay();
+ mIsHwAccelerated = ActivityManager.isHighEndGfx(display);
+ }
}
}
+ private static boolean isEmulator() {
+ return "1".equals(SystemProperties.get(PROPERTY_KERNEL_QEMU, "0"));
+ }
+
public Engine onCreateEngine() {
return new DrawableEngine();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
index 37c77f6..5959537 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBar.java
@@ -118,7 +118,7 @@
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
- PixelFormat.RGBX_8888);
+ PixelFormat.OPAQUE);
// the status bar should be in an overlay if possible
final Display defaultDisplay
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index a90eb3f..6997837 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -29,6 +29,7 @@
import android.util.Log;
import android.view.ViewDebug;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.ImageView;
import java.text.NumberFormat;
@@ -70,6 +71,8 @@
final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
setAlpha(alpha);
}
+
+ setScaleType(ImageView.ScaleType.CENTER);
}
private static boolean streq(String a, String b) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index ae447e3..e5d4d22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -316,12 +316,7 @@
}
// figure out which pixel-format to use for the status bar.
- mPixelFormat = PixelFormat.TRANSLUCENT;
- Drawable bg = sb.getBackground();
- if (bg != null) {
- mPixelFormat = bg.getOpacity();
- }
-
+ mPixelFormat = PixelFormat.OPAQUE;
mStatusIcons = (LinearLayout)sb.findViewById(R.id.statusIcons);
mNotificationIcons = (IconMerger)sb.findViewById(R.id.notificationIcons);
mIcons = (LinearLayout)sb.findViewById(R.id.icons);
@@ -1599,6 +1594,9 @@
// the user switches to home. We know it is safe to do at this
// point, so make sure new activity switches are now allowed.
ActivityManagerNative.getDefault().resumeAppSwitches();
+ // Also, notifications can be launched from the lock screen,
+ // so dismiss the lock screen when the activity starts.
+ ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
} catch (RemoteException e) {
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 05e171c..9bee5df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -64,6 +64,8 @@
private static final int INET_CONDITION_THRESHOLD = 50;
+ private static final boolean SHOW_SYNC_ICON = false;
+
private final Context mContext;
private final StatusBarManager mService;
private final Handler mHandler = new Handler();
@@ -195,6 +197,7 @@
}
private final void updateSyncState(Intent intent) {
+ if (!SHOW_SYNC_ICON) return;
boolean isActive = intent.getBooleanExtra("active", false);
boolean isFailing = intent.getBooleanExtra("failing", false);
mService.setIconVisibility("sync_active", isActive);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 0dfc4f7..c83c470 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -720,28 +720,19 @@
Slog.d(TAG, "updateConnectivity: connectionStatus=" + connectionStatus);
}
- int inetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);
+ mInetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);
- switch (info.getType()) {
- case ConnectivityManager.TYPE_MOBILE:
- mInetCondition = inetCondition;
- updateDataNetType();
- updateDataIcon();
- updateTelephonySignalStrength(); // apply any change in connectionStatus
- break;
- case ConnectivityManager.TYPE_WIFI:
- mInetCondition = inetCondition;
- updateWifiIcons();
- break;
- case ConnectivityManager.TYPE_BLUETOOTH:
- mInetCondition = inetCondition;
- if (info != null) {
- mBluetoothTethered = info.isConnected() ? true: false;
- } else {
- mBluetoothTethered = false;
- }
- break;
+ if (info != null && info.getType() == ConnectivityManager.TYPE_BLUETOOTH) {
+ mBluetoothTethered = info.isConnected() ? true: false;
+ } else {
+ mBluetoothTethered = false;
}
+
+ // We want to update all the icons, all at once, for any condition change
+ updateDataNetType();
+ updateDataIcon();
+ updateTelephonySignalStrength();
+ updateWifiIcons();
}
@@ -1035,8 +1026,8 @@
pw.println(mWifiLevel);
pw.print(" mWifiSsid=");
pw.println(mWifiSsid);
- pw.print(" mWifiIconId=");
- pw.println(mWifiIconId);
+ pw.print(String.format(" mWifiIconId=0x%08x/%s",
+ mWifiIconId, getResourceName(mWifiIconId)));
pw.print(" mWifiActivity=");
pw.println(mWifiActivity);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index c2f07d6..435aa8c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -1308,6 +1308,9 @@
// the user switches to home. We know it is safe to do at this
// point, so make sure new activity switches are now allowed.
ActivityManagerNative.getDefault().resumeAppSwitches();
+ // Also, notifications can be launched from the lock screen,
+ // so dismiss the lock screen when the activity starts.
+ ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
} catch (RemoteException e) {
}
diff --git a/packages/VpnDialogs/res/layout/confirm.xml b/packages/VpnDialogs/res/layout/confirm.xml
index 11a247a..fef00c220 100644
--- a/packages/VpnDialogs/res/layout/confirm.xml
+++ b/packages/VpnDialogs/res/layout/confirm.xml
@@ -15,46 +15,43 @@
limitations under the License.
-->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="3mm">
-
- <ImageView android:id="@+id/icon"
- android:layout_width="@android:dimen/app_icon_size"
- android:layout_height="@android:dimen/app_icon_size"
- android:layout_alignParentTop="true"
- android:layout_alignParentLeft="true"
- android:layout_marginRight="1mm"/>
-
- <TextView android:id="@+id/warning"
- android:layout_width="fill_parent"
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_below="@id/icon"
- android:padding="3mm"
- android:text="@string/warning"
- android:textSize="18sp"/>
+ android:orientation="vertical"
+ android:padding="3mm">
- <TextView android:id="@+id/prompt"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_toRightOf="@id/icon"
- android:layout_above="@id/warning"
- android:gravity="center_vertical"
- android:textSize="20sp"/>
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
- <CheckBox android:id="@+id/check"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true"
- android:layout_below="@id/warning"
- android:text="@string/accept"
- android:textSize="20sp"
- android:checked="false"/>
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@android:dimen/app_icon_size"
+ android:layout_height="@android:dimen/app_icon_size"
+ android:paddingRight="1mm"/>
-</RelativeLayout>
+ <TextView android:id="@+id/prompt"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textSize="18sp"/>
+ </LinearLayout>
+
+ <TextView android:id="@+id/warning"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="1mm"
+ android:paddingBottom="1mm"
+ android:text="@string/warning"
+ android:textSize="18sp"/>
+
+ <CheckBox android:id="@+id/check"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/accept"
+ android:textSize="20sp"
+ android:checked="false"/>
+ </LinearLayout>
+</ScrollView>
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
index d668e98..7fb1417 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
@@ -181,8 +181,10 @@
String line = in.readLine().trim();
if (line.startsWith(prefix)) {
String[] numbers = line.substring(prefix.length()).split(" +");
- if (numbers.length == 17) {
- return numbers;
+ for (int i = 1; i < 17; ++i) {
+ if (!numbers[i].equals("0")) {
+ return numbers;
+ }
}
break;
}
diff --git a/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java b/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java
index f7d936c..a4baeed 100644
--- a/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/AccountUnlockScreen.java
@@ -54,7 +54,7 @@
public class AccountUnlockScreen extends RelativeLayout implements KeyguardScreen,
View.OnClickListener, TextWatcher {
private static final String LOCK_PATTERN_PACKAGE = "com.android.settings";
- private static final String LOCK_PATTERN_CLASS = LOCK_PATTERN_PACKAGE + ".ChooseLockPattern";
+ private static final String LOCK_PATTERN_CLASS = LOCK_PATTERN_PACKAGE + ".ChooseLockGeneric";
/**
* The amount of millis to stay awake once this screen detects activity
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java
index 61e30bf..24dce1a 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java
@@ -58,6 +58,7 @@
private static final int CARRIER_HELP_TEXT = 12;
private static final int HELP_MESSAGE_TEXT = 13;
private static final int OWNER_INFO = 14;
+ private static final int BATTERY_INFO = 15;
private StatusMode mStatus;
private String mDateFormatString;
@@ -84,6 +85,9 @@
// last known battery level
private int mBatteryLevel = 100;
+ // last known SIM state
+ protected State mSimState;
+
private LockPatternUtils mLockPatternUtils;
private KeyguardUpdateMonitor mUpdateMonitor;
private Button mEmergencyCallButton;
@@ -98,6 +102,8 @@
private boolean mShowingStatus;
private KeyguardScreenCallback mCallback;
private final boolean mShowEmergencyButtonByDefault;
+ private CharSequence mPlmn;
+ private CharSequence mSpn;
private class TransientTextManager {
private TextView mTextView;
@@ -151,6 +157,7 @@
public KeyguardStatusViewManager(View view, KeyguardUpdateMonitor updateMonitor,
LockPatternUtils lockPatternUtils, KeyguardScreenCallback callback,
boolean showEmergencyButtonByDefault) {
+ if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()");
mContainer = view;
mDateFormatString = getContext().getString(R.string.full_wday_month_day_no_year);
mLockPatternUtils = lockPatternUtils;
@@ -165,6 +172,12 @@
mTransportView = (TransportControlView) findViewById(R.id.transport);
mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton);
mShowEmergencyButtonByDefault = showEmergencyButtonByDefault;
+
+ // Hide transport control view until we know we need to show it.
+ if (mTransportView != null) {
+ mTransportView.setVisibility(View.GONE);
+ }
+
if (mEmergencyCallButton != null) {
mEmergencyCallButton.setText(R.string.lockscreen_emergency_call);
mEmergencyCallButton.setOnClickListener(this);
@@ -173,8 +186,6 @@
mTransientTextManager = new TransientTextManager(mCarrierView);
- updateEmergencyCallButtonState();
-
resetStatusInfo();
refreshDate();
updateOwnerInfo();
@@ -187,10 +198,6 @@
v.setSelected(true);
}
}
-
- // until we get an update...
- setCarrierText(LockPatternUtils.getCarrierString(
- mUpdateMonitor.getTelephonyPlmn(), mUpdateMonitor.getTelephonySpn()));
}
private boolean inWidgetMode() {
@@ -248,6 +255,7 @@
case INSTRUCTION_TEXT:
case CARRIER_HELP_TEXT:
case HELP_MESSAGE_TEXT:
+ case BATTERY_INFO:
mTransientTextManager.post(string, 0, INSTRUCTION_RESET_DELAY);
break;
@@ -262,15 +270,16 @@
}
public void onPause() {
+ if (DEBUG) Log.v(TAG, "onPause()");
mUpdateMonitor.removeCallback(mInfoCallback);
mUpdateMonitor.removeCallback(mSimStateCallback);
}
/** {@inheritDoc} */
public void onResume() {
+ if (DEBUG) Log.v(TAG, "onResume()");
mUpdateMonitor.registerInfoCallback(mInfoCallback);
mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
- updateEmergencyCallButtonState();
resetStatusInfo();
}
@@ -399,7 +408,12 @@
* Determine the current status of the lock screen given the sim state and other stuff.
*/
public StatusMode getStatusForIccState(IccCard.State simState) {
- boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned()
+ // Since reading the SIM may take a while, we assume it is present until told otherwise.
+ if (simState == null) {
+ return StatusMode.Normal;
+ }
+
+ final boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned()
&& (simState == IccCard.State.ABSENT || simState == IccCard.State.PERM_DISABLED));
// Assume we're NETWORK_LOCKED if not provisioned
@@ -435,22 +449,21 @@
*
* @param simState
*/
- private void updateWithSimStatus(State simState) {
- // The emergency call button no longer appears on this screen.
- if (DEBUG) Log.d(TAG, "updateLayout: status=" + mStatus);
+ private void updateCarrierTextWithSimStatus(State simState) {
+ if (DEBUG) Log.d(TAG, "updateCarrierTextWithSimStatus(), simState = " + simState);
CharSequence carrierText = null;
int carrierHelpTextId = 0;
mUnlockDisabledDueToSimState = false;
mStatus = getStatusForIccState(simState);
+ mSimState = simState;
switch (mStatus) {
case Normal:
- carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
- mUpdateMonitor.getTelephonySpn());
+ carrierText = makeCarierString(mPlmn, mSpn);
break;
case NetworkLocked:
- carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
+ carrierText = makeCarierString(mPlmn,
getContext().getText(R.string.lockscreen_network_locked_message));
carrierHelpTextId = R.string.lockscreen_instructions_when_pattern_disabled;
break;
@@ -467,19 +480,19 @@
break;
case SimMissingLocked:
- carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
+ carrierText = makeCarierString(mPlmn,
getContext().getText(R.string.lockscreen_missing_sim_message_short));
carrierHelpTextId = R.string.lockscreen_missing_sim_instructions;
mUnlockDisabledDueToSimState = true;
break;
case SimLocked:
- carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
+ carrierText = makeCarierString(mPlmn,
getContext().getText(R.string.lockscreen_sim_locked_message));
break;
case SimPukLocked:
- carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
+ carrierText = makeCarierString(mPlmn,
getContext().getText(R.string.lockscreen_sim_puk_locked_message));
if (!mLockPatternUtils.isPukUnlockScreenEnable()) {
mUnlockDisabledDueToSimState = true;
@@ -489,7 +502,6 @@
setCarrierText(carrierText);
setCarrierHelpText(carrierHelpTextId);
- updateEmergencyCallButtonState();
}
private View findViewById(int id) {
@@ -552,10 +564,11 @@
}
}
- private void updateEmergencyCallButtonState() {
+ private void updateEmergencyCallButtonState(int phoneState) {
if (mEmergencyCallButton != null) {
boolean showIfCapable = mShowEmergencyButtonByDefault || mUnlockDisabledDueToSimState;
- mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton, showIfCapable);
+ mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton,
+ phoneState, showIfCapable);
}
}
@@ -567,7 +580,8 @@
mShowingBatteryInfo = showBatteryInfo;
mPluggedIn = pluggedIn;
mBatteryLevel = batteryLevel;
- updateStatusLines(true);
+ final MutableInt tmpIcon = new MutableInt(0);
+ update(BATTERY_INFO, getAltTextMessage(tmpIcon));
}
public void onTimeChanged() {
@@ -575,15 +589,17 @@
}
public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
- setCarrierText(LockPatternUtils.getCarrierString(plmn, spn));
+ mPlmn = plmn;
+ mSpn = spn;
+ updateCarrierTextWithSimStatus(mSimState);
}
public void onRingerModeChanged(int state) {
}
- public void onPhoneStateChanged(String newState) {
- updateEmergencyCallButtonState();
+ public void onPhoneStateChanged(int phoneState) {
+ updateEmergencyCallButtonState(phoneState);
}
/** {@inheritDoc} */
@@ -595,7 +611,7 @@
private SimStateCallback mSimStateCallback = new SimStateCallback() {
public void onSimStateChanged(State simState) {
- updateWithSimStatus(simState);
+ updateCarrierTextWithSimStatus(simState);
}
};
@@ -604,4 +620,22 @@
mCallback.takeEmergencyCallAction();
}
}
+
+ /**
+ * Performs concentenation of PLMN/SPN
+ * @param plmn
+ * @param spn
+ * @return
+ */
+ private static CharSequence makeCarierString(CharSequence plmn, CharSequence spn) {
+ if (plmn != null && spn == null) {
+ return plmn;
+ } else if (plmn != null && spn != null) {
+ return plmn + "|" + spn;
+ } else if (plmn == null && spn != null) {
+ return spn;
+ } else {
+ return "";
+ }
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
index 2a23709..10cf3aa 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
@@ -88,6 +88,8 @@
private ArrayList<InfoCallback> mInfoCallbacks = Lists.newArrayList();
private ArrayList<SimStateCallback> mSimStateCallbacks = Lists.newArrayList();
private ContentObserver mContentObserver;
+ private int mRingMode;
+ private int mPhoneState;
// messages for the handler
private static final int MSG_TIME_UPDATE = 301;
@@ -271,13 +273,21 @@
protected void handlePhoneStateChanged(String newState) {
if (DEBUG) Log.d(TAG, "handlePhoneStateChanged(" + newState + ")");
+ if (TelephonyManager.EXTRA_STATE_IDLE.equals(newState)) {
+ mPhoneState = TelephonyManager.CALL_STATE_IDLE;
+ } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(newState)) {
+ mPhoneState = TelephonyManager.CALL_STATE_OFFHOOK;
+ } else if (TelephonyManager.EXTRA_STATE_RINGING.equals(newState)) {
+ mPhoneState = TelephonyManager.CALL_STATE_RINGING;
+ }
for (int i = 0; i < mInfoCallbacks.size(); i++) {
- mInfoCallbacks.get(i).onPhoneStateChanged(newState);
+ mInfoCallbacks.get(i).onPhoneStateChanged(mPhoneState);
}
}
protected void handleRingerModeChange(int mode) {
if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")");
+ mRingMode = mode;
for (int i = 0; i < mInfoCallbacks.size(); i++) {
mInfoCallbacks.get(i).onRingerModeChanged(mode);
}
@@ -459,7 +469,7 @@
* {@link TelephonyManager@EXTRA_STATE_RINGING}
* {@link TelephonyManager#EXTRA_STATE_OFFHOOK
*/
- void onPhoneStateChanged(String newState);
+ void onPhoneStateChanged(int phoneState);
/**
* Called when visibility of lockscreen clock changes, such as when
@@ -484,8 +494,12 @@
public void registerInfoCallback(InfoCallback callback) {
if (!mInfoCallbacks.contains(callback)) {
mInfoCallbacks.add(callback);
- // notify the register the current state right away
- // TODO: need call other callback methods
+ // Notify listener of the current state
+ callback.onRefreshBatteryInfo(shouldShowBatteryInfo(), isPluggedIn(mBatteryStatus),
+ mBatteryLevel);
+ callback.onTimeChanged();
+ callback.onRingerModeChanged(mRingMode);
+ callback.onPhoneStateChanged(mPhoneState);
callback.onRefreshCarrierInfo(mTelephonyPlmn, mTelephonySpn);
} else {
if (DEBUG) Log.e(TAG, "Object tried to add another INFO callback",
@@ -500,9 +514,7 @@
public void registerSimStateCallback(SimStateCallback callback) {
if (!mSimStateCallbacks.contains(callback)) {
mSimStateCallbacks.add(callback);
- // notify the register the current sim state right away,
- // otherwise the register won't receive any state until
- // sim state gets changed again.
+ // Notify listener of the current state
callback.onSimStateChanged(mSimState);
} else {
if (DEBUG) Log.e(TAG, "Object tried to add another SIM callback",
@@ -581,4 +593,7 @@
return mClockVisible;
}
+ public int getPhoneState() {
+ return mPhoneState;
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
index 2fcf1dc3..59b546d 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewBase.java
@@ -99,6 +99,11 @@
abstract public void onScreenTurnedOn();
/**
+ * Called when the view needs to be shown.
+ */
+ abstract public void show();
+
+ /**
* Called when a key has woken the device to give us a chance to adjust our
* state according the the key. We are responsible for waking the device
* (by poking the wake lock) once we are ready.
@@ -127,15 +132,6 @@
*/
abstract public void cleanUp();
- /**
- * These were added to support FaceLock because the KeyguardViewManager needs to tell the
- * LockPatternKeyguardView when to bind and and unbind with FaceLock service. Although
- * implemented in LockPatternKeyguardView, these are not implemented in anything else
- * derived from KeyguardViewBase
- */
- abstract public void bindToFaceLock();
- abstract public void stopAndUnbindFromFaceLock();
-
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (shouldEventKeepScreenOnWhileKeyguardShowing(event)) {
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
index 91f1527..90972da 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java
@@ -167,7 +167,7 @@
mKeyguardHost.addView(mKeyguardView, lp);
if (mScreenOn) {
- mKeyguardView.onScreenTurnedOn();
+ mKeyguardView.show();
}
}
@@ -205,9 +205,6 @@
mScreenOn = false;
if (mKeyguardView != null) {
mKeyguardView.onScreenTurnedOff();
-
- // When screen is turned off, need to unbind from FaceLock service if using FaceLock
- mKeyguardView.stopAndUnbindFromFaceLock();
}
}
@@ -218,9 +215,6 @@
if (mKeyguardView != null) {
mKeyguardView.onScreenTurnedOn();
- // When screen is turned on, need to bind to FaceLock service if we are using FaceLock
- mKeyguardView.bindToFaceLock();
-
// Caller should wait for this window to be shown before turning
// on the screen.
if (mKeyguardHost.getVisibility() == View.VISIBLE) {
@@ -277,12 +271,6 @@
public synchronized void hide() {
if (DEBUG) Log.d(TAG, "hide()");
- if (mKeyguardView != null) {
- // When view is hidden, need to unbind from FaceLock service if we are using FaceLock
- // e.g., when device becomes unlocked
- mKeyguardView.stopAndUnbindFromFaceLock();
- }
-
if (mKeyguardHost != null) {
mKeyguardHost.setVisibility(View.GONE);
// Don't do this right away, so we can let the view continue to animate
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
index 0f1d633..3dae5ad 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
@@ -766,7 +766,7 @@
// Don't play lockscreen SFX if the screen went off due to
// timeout.
mSuppressNextLockSound = true;
-
+
doKeyguardLocked();
}
}
@@ -777,7 +777,7 @@
if (TelephonyManager.EXTRA_STATE_IDLE.equals(mPhoneState) // call ending
&& !mScreenOn // screen off
&& mExternallyEnabled) { // not disabled by any app
-
+
// note: this is a way to gracefully reenable the keyguard when the call
// ends and the screen is off without always reenabling the keyguard
// each time the screen turns off while in call (and having an occasional ugly
@@ -1270,7 +1270,7 @@
}
/** {@inheritDoc} */
- public void onPhoneStateChanged(String newState) {
+ public void onPhoneStateChanged(int phoneState) {
// ignored
}
diff --git a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
index d9bd5f2b..2c7f86d 100644
--- a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
+++ b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
@@ -114,6 +114,10 @@
private final int MSG_SHOW_FACELOCK_AREA_VIEW = 0;
private final int MSG_HIDE_FACELOCK_AREA_VIEW = 1;
+ // Long enough to stay black while dialer comes up
+ // Short enough to not be black if the user goes back immediately
+ private final int FACELOCK_VIEW_AREA_EMERGENCY_HIDE_TIMEOUT = 1000;
+
/**
* The current {@link KeyguardScreen} will use this to communicate back to us.
*/
@@ -311,6 +315,13 @@
}
public void takeEmergencyCallAction() {
+ // FaceLock must be stopped if it is running when emergency call is pressed
+ stopAndUnbindFromFaceLock();
+
+ // Delay hiding FaceLock area so unlock doesn't display while dialer is coming up
+ mHandler.sendEmptyMessageDelayed(MSG_HIDE_FACELOCK_AREA_VIEW,
+ FACELOCK_VIEW_AREA_EMERGENCY_HIDE_TIMEOUT);
+
pokeWakelock(EMERGENCY_CALL_TIMEOUT);
if (TelephonyManager.getDefault().getCallState()
== TelephonyManager.CALL_STATE_OFFHOOK) {
@@ -493,16 +504,38 @@
} else {
((KeyguardScreen) mUnlockScreen).onPause();
}
+
+ // When screen is turned off, need to unbind from FaceLock service if using FaceLock
+ stopAndUnbindFromFaceLock();
}
@Override
public void onScreenTurnedOn() {
mScreenOn = true;
+ show();
+
+ // When screen is turned on, need to bind to FaceLock service if we are using FaceLock
+ // But only if not dealing with a call
+ if (mUpdateMonitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE) {
+ bindToFaceLock();
+ } else {
+ mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
+ }
+ }
+
+ @Override
+ public void show() {
if (mMode == Mode.LockScreen) {
((KeyguardScreen) mLockScreen).onResume();
} else {
((KeyguardScreen) mUnlockScreen).onResume();
}
+
+ if (mLockPatternUtils.usingBiometricWeak()) {
+ mHandler.sendEmptyMessage(MSG_SHOW_FACELOCK_AREA_VIEW);
+ } else {
+ mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
+ }
}
private void recreateLockScreen() {
@@ -532,6 +565,11 @@
@Override
protected void onDetachedFromWindow() {
removeCallbacks(mRecreateRunnable);
+
+ // When view is hidden, need to unbind from FaceLock service if we are using FaceLock
+ // e.g., when device becomes unlocked
+ stopAndUnbindFromFaceLock();
+
super.onDetachedFromWindow();
}
@@ -941,18 +979,13 @@
// Everything below pertains to FaceLock - might want to separate this out
// Only pattern and pin unlock screens actually have a view for the FaceLock area, so it's not
- // uncommon for it to not exist. But if it does exist, we need to make sure it's showing if
- // FaceLock is enabled, and make sure it's not showing if FaceLock is disabled
+ // uncommon for it to not exist. But if it does exist, we need to make sure it's shown (hiding
+ // the fallback) if FaceLock is enabled, and make sure it's hidden (showing the unlock) if
+ // FaceLock is disabled
private void initializeFaceLockAreaView(View view) {
mFaceLockAreaView = view.findViewById(R.id.faceLockAreaView);
if (mFaceLockAreaView == null) {
if (DEBUG) Log.d(TAG, "Layout does not have faceLockAreaView");
- } else {
- if (mLockPatternUtils.usingBiometricWeak()) {
- mHandler.sendEmptyMessage(MSG_SHOW_FACELOCK_AREA_VIEW);
- } else {
- mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
- }
}
}
@@ -986,9 +1019,7 @@
if (DEBUG) Log.d(TAG, "after bind to FaceLock service");
mBoundToFaceLockService = true;
} else {
- // On startup I've seen onScreenTurnedOn() get called twice without
- // onScreenTurnedOff() being called in between, which can cause this (bcolonna)
- if (DEBUG) Log.w(TAG, "Attempt to bind to FaceLock when already bound");
+ Log.w(TAG, "Attempt to bind to FaceLock when already bound");
}
}
}
@@ -1006,7 +1037,7 @@
} else {
// This could probably happen after the session when someone activates FaceLock
// because it wasn't active when the phone was turned on
- if (DEBUG) Log.w(TAG, "Attempt to unbind from FaceLock when not bound");
+ Log.w(TAG, "Attempt to unbind from FaceLock when not bound");
}
}
}
@@ -1037,7 +1068,7 @@
mFaceLockService = null;
mFaceLockServiceRunning = false;
}
- if (DEBUG) Log.w(TAG, "Unexpected disconnect from FaceLock service");
+ Log.w(TAG, "Unexpected disconnect from FaceLock service");
}
};
@@ -1088,36 +1119,21 @@
// Stops the FaceLock UI and indicates that the phone should be unlocked
@Override
public void unlock() {
- if (DEBUG) Log.d(TAG, "FaceLock unlock");
- // Note that we don't hide the client FaceLockAreaView because we want to keep the
- // lock screen covered while the phone is unlocked
-
+ if (DEBUG) Log.d(TAG, "FaceLock unlock()");
+ mHandler.sendEmptyMessage(MSG_SHOW_FACELOCK_AREA_VIEW); // Keep fallback covered
stopFaceLock();
+
mKeyguardScreenCallback.keyguardDone(true);
mKeyguardScreenCallback.reportSuccessfulUnlockAttempt();
}
// Stops the FaceLock UI and exposes the backup method without unlocking
+ // This means either the user has cancelled out or FaceLock failed to recognize them
@Override
public void cancel() {
- // In this case, either the user has cancelled out, or FaceLock failed to recognize them
- if (DEBUG) Log.d(TAG, "FaceLock cancel");
- // Here we hide the client FaceLockViewArea to expose the underlying backup method
- mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
+ if (DEBUG) Log.d(TAG, "FaceLock cancel()");
+ mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW); // Expose fallback
stopFaceLock();
}
-
- // Stops the FaceLock UI and puts the phone to sleep
- @Override
- public void sleepDevice() {
- // In this case, it appears the phone has been turned on accidentally
- if (DEBUG) Log.d(TAG, "FaceLock accidental turn on");
- // Here we hide the client FaceLockViewArea to expose the underlying backup method
- mHandler.sendEmptyMessage(MSG_HIDE_FACELOCK_AREA_VIEW);
- stopFaceLock();
- // TODO(bcolonna): how do we put the phone back to sleep (i.e., turn off the screen)
- // TODO(bcolonna): this should be removed once the service is no longer calling it
- // because we are just going to let the lockscreen timeout
- }
};
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 53b64a6..a52a53d 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -2750,6 +2750,7 @@
} else {
mActionBar = (ActionBarView) findViewById(com.android.internal.R.id.action_bar);
if (mActionBar != null) {
+ mActionBar.setWindowCallback(getCallback());
if (mActionBar.getTitle() == null) {
mActionBar.setWindowTitle(mTitle);
}
@@ -2762,28 +2763,30 @@
}
boolean splitActionBar = false;
- if ((mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0) {
+ final boolean splitWhenNarrow =
+ (mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0;
+ if (splitWhenNarrow) {
splitActionBar = getContext().getResources().getBoolean(
com.android.internal.R.bool.split_action_bar_is_narrow);
} else {
splitActionBar = getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowSplitActionBar, false);
}
- if (splitActionBar) {
- final ActionBarContainer splitView = (ActionBarContainer) findViewById(
- com.android.internal.R.id.split_action_bar);
- if (splitView != null) {
- splitView.setVisibility(View.VISIBLE);
- mActionBar.setSplitActionBar(splitActionBar);
- mActionBar.setSplitView(splitView);
+ final ActionBarContainer splitView = (ActionBarContainer) findViewById(
+ com.android.internal.R.id.split_action_bar);
+ if (splitView != null) {
+ mActionBar.setSplitView(splitView);
+ mActionBar.setSplitActionBar(splitActionBar);
+ mActionBar.setSplitWhenNarrow(splitWhenNarrow);
- final ActionBarContextView cab = (ActionBarContextView) findViewById(
- com.android.internal.R.id.action_context_bar);
- cab.setSplitView(splitView);
- } else {
- Log.e(TAG, "Requested split action bar with " +
- "incompatible window decor! Ignoring request.");
- }
+ final ActionBarContextView cab = (ActionBarContextView) findViewById(
+ com.android.internal.R.id.action_context_bar);
+ cab.setSplitView(splitView);
+ cab.setSplitActionBar(splitActionBar);
+ cab.setSplitWhenNarrow(splitWhenNarrow);
+ } else if (splitActionBar) {
+ Log.e(TAG, "Requested split action bar with " +
+ "incompatible window decor! Ignoring request.");
}
// Post the panel invalidate for later; avoid application onCreateOptionsMenu
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index b0abd97..968180c 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -446,9 +446,8 @@
}
@Override
- public void onOrientationChanged(int rotation) {
- // Send updates based on orientation value
- if (localLOGV) Log.v(TAG, "onOrientationChanged, rotation changed to " +rotation);
+ public void onProposedRotationChanged(int rotation) {
+ if (localLOGV) Log.v(TAG, "onProposedRotationChanged, rotation=" + rotation);
updateRotation(false);
}
}
@@ -654,6 +653,9 @@
mKeyguardMediator = new KeyguardViewMediator(context, this, powerManager);
mHandler = new Handler();
mOrientationListener = new MyOrientationListener(mContext);
+ try {
+ mOrientationListener.setCurrentRotation(windowManager.getRotation());
+ } catch (RemoteException ex) { }
SettingsObserver settingsObserver = new SettingsObserver(mHandler);
settingsObserver.observe();
mShortcutManager = new ShortcutManager(context, mHandler);
@@ -2871,6 +2873,18 @@
return mKeyguardMediator.isInputRestricted();
}
+ public void dismissKeyguardLw() {
+ if (!mKeyguardMediator.isSecure()) {
+ if (mKeyguardMediator.isShowing()) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ mKeyguardMediator.keyguardDone(false, true);
+ }
+ });
+ }
+ }
+ }
+
void sendCloseSystemWindows() {
sendCloseSystemWindows(mContext, null);
}
@@ -2900,7 +2914,10 @@
}
synchronized (mLock) {
- int sensorRotation = mOrientationListener.getCurrentRotation(); // may be -1
+ int sensorRotation = mOrientationListener.getProposedRotation(); // may be -1
+ if (sensorRotation < 0) {
+ sensorRotation = lastRotation;
+ }
int preferredRotation = -1;
if (mHdmiPlugged) {
@@ -2910,20 +2927,18 @@
// Ignore sensor when lid switch is open and rotation is forced.
preferredRotation = mLidOpenRotation;
} else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR
- && ((mCarDockEnablesAccelerometer && sensorRotation >= 0)
- || mCarDockRotation >= 0)) {
+ && (mCarDockEnablesAccelerometer || mCarDockRotation >= 0)) {
// Ignore sensor when in car dock unless explicitly enabled.
// This case can override the behavior of NOSENSOR, and can also
// enable 180 degree rotation while docked.
- preferredRotation = mCarDockEnablesAccelerometer && sensorRotation >= 0
+ preferredRotation = mCarDockEnablesAccelerometer
? sensorRotation : mCarDockRotation;
} else if (mDockMode == Intent.EXTRA_DOCK_STATE_DESK
- && ((mDeskDockEnablesAccelerometer && sensorRotation >= 0)
- || mDeskDockRotation >= 0)) {
+ && (mDeskDockEnablesAccelerometer || mDeskDockRotation >= 0)) {
// Ignore sensor when in desk dock unless explicitly enabled.
// This case can override the behavior of NOSENSOR, and can also
// enable 180 degree rotation while docked.
- preferredRotation = mDeskDockEnablesAccelerometer && sensorRotation >= 0
+ preferredRotation = mDeskDockEnablesAccelerometer
? sensorRotation : mDeskDockRotation;
} else if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED) {
// Ignore sensor when user locked rotation.
@@ -3024,6 +3039,11 @@
}
}
+ @Override
+ public void setRotationLw(int rotation) {
+ mOrientationListener.setCurrentRotation(rotation);
+ }
+
private boolean isLandscapeOrSeascape(int rotation) {
return rotation == mLandscapeRotation || rotation == mSeascapeRotation;
}
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index a58f64c..01f5a6f 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -985,6 +985,10 @@
mNewParameters.clear();
// do not lock the mutex in destructor
releaseWakeLock_l();
+ if (mPowerManager != 0) {
+ sp<IBinder> binder = mPowerManager->asBinder();
+ binder->unlinkToDeath(mDeathRecipient);
+ }
}
void AudioFlinger::ThreadBase::exit()
@@ -7440,12 +7444,21 @@
}
}
+
+// The volume effect is used for automated tests only
+#ifndef OPENSL_ES_H_
+static const effect_uuid_t SL_IID_VOLUME_ = { 0x09e8ede0, 0xddde, 0x11db, 0xb4f6,
+ { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
+const effect_uuid_t * const SL_IID_VOLUME = &SL_IID_VOLUME_;
+#endif //OPENSL_ES_H_
+
bool AudioFlinger::EffectChain::isEffectEligibleForSuspend(const effect_descriptor_t& desc)
{
// auxiliary effects and visualizer are never suspended on output mix
if ((mSessionId == AUDIO_SESSION_OUTPUT_MIX) &&
(((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) ||
- (memcmp(&desc.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0))) {
+ (memcmp(&desc.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0) ||
+ (memcmp(&desc.type, SL_IID_VOLUME, sizeof(effect_uuid_t)) == 0))) {
return false;
}
return true;
diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java
index 5ffcdc50..b8c44d9 100644
--- a/services/java/com/android/server/AlarmManagerService.java
+++ b/services/java/com/android/server/AlarmManagerService.java
@@ -477,7 +477,7 @@
: bs.filterStats.entrySet()) {
pw.print(" "); pw.print(fe.getValue().count);
pw.print(" alarms: ");
- pw.println(fe.getKey().getIntent().toShortString(true, false));
+ pw.println(fe.getKey().getIntent().toShortString(false, true, false));
}
}
}
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 6ac6c98..e30ce72 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -3380,7 +3380,8 @@
Uri packageUri = Uri.fromFile(apkFile);
mInstallObserver.reset();
mPackageManager.installPackage(packageUri, mInstallObserver,
- PackageManager.INSTALL_REPLACE_EXISTING, installerPackage);
+ PackageManager.INSTALL_REPLACE_EXISTING | PackageManager.INSTALL_FROM_ADB,
+ installerPackage);
mInstallObserver.waitForCompletion();
if (mInstallObserver.getResult() != PackageManager.INSTALL_SUCCEEDED) {
@@ -4373,8 +4374,13 @@
ParcelFileDescriptor.MODE_TRUNCATE);
if (mTransport.getRestoreData(mBackupData) != BackupConstants.TRANSPORT_OK) {
+ // Transport-level failure, so we wind everything up and
+ // terminate the restore operation.
Slog.e(TAG, "Error getting restore data for " + packageName);
EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
+ mBackupData.close();
+ mBackupDataName.delete();
+ executeNextState(RestoreState.FINAL);
return;
}
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 327450a..991b7da 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -35,6 +35,7 @@
import android.net.IConnectivityManager;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
+import android.net.INetworkStatsService;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.LinkProperties.CompareResult;
@@ -306,8 +307,8 @@
// the set of network types that can only be enabled by system/sig apps
List mProtectedNetworks;
- public ConnectivityService(
- Context context, INetworkManagementService netd, INetworkPolicyManager policyManager) {
+ public ConnectivityService(Context context, INetworkManagementService netd,
+ INetworkStatsService statsService, INetworkPolicyManager policyManager) {
if (DBG) log("ConnectivityService starting up");
HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");
@@ -496,7 +497,7 @@
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
INetworkManagementService nmService = INetworkManagementService.Stub.asInterface(b);
- mTethering = new Tethering(mContext, nmService, mHandler.getLooper());
+ mTethering = new Tethering(mContext, nmService, statsService, mHandler.getLooper());
mTetheringConfigValid = ((mTethering.getTetherableUsbRegexs().length != 0 ||
mTethering.getTetherableWifiRegexs().length != 0 ||
mTethering.getTetherableBluetoothRegexs().length != 0) &&
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 977dd6f..5006de7 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -65,6 +65,7 @@
class ServerThread extends Thread {
private static final String TAG = "SystemServer";
private static final String ENCRYPTING_STATE = "trigger_restart_min_framework";
+ private static final String ENCRYPTED_STATE = "1";
ContentResolver mContentResolver;
@@ -150,10 +151,15 @@
Slog.i(TAG, "Package Manager");
// Only run "core" apps if we're encrypting the device.
String cryptState = SystemProperties.get("vold.decrypt");
- boolean onlyCore = ENCRYPTING_STATE.equals(cryptState);
- if (onlyCore) {
+ boolean onlyCore = false;
+ if (ENCRYPTING_STATE.equals(cryptState)) {
Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
+ onlyCore = true;
+ } else if (ENCRYPTED_STATE.equals(cryptState)) {
+ Slog.w(TAG, "Device encrypted - only parsing core apps");
+ onlyCore = true;
}
+
pm = PackageManagerService.main(context,
factoryTest != SystemServer.FACTORY_TEST_OFF,
onlyCore);
@@ -364,7 +370,8 @@
try {
Slog.i(TAG, "Connectivity Service");
- connectivity = new ConnectivityService(context, networkManagement, networkPolicy);
+ connectivity = new ConnectivityService(
+ context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 59ed80f..2942c28 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3784,6 +3784,12 @@
mWindowManager.showBootMessage(msg, always);
}
+ public void dismissKeyguardOnNextActivity() {
+ synchronized (this) {
+ mMainStack.dismissKeyguardOnNextActivityLocked();
+ }
+ }
+
final void finishBooting() {
IntentFilter pkgFilter = new IntentFilter();
pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
@@ -7907,6 +7913,8 @@
if (dumpAll) {
pw.println(" mLastPausedActivity: " + mMainStack.mLastPausedActivity);
pw.println(" mSleepTimeout: " + mMainStack.mSleepTimeout);
+ pw.println(" mDismissKeyguardOnNextActivity: "
+ + mMainStack.mDismissKeyguardOnNextActivity);
}
if (mRecentTasks.size() > 0) {
@@ -8547,7 +8555,7 @@
for (int i=0; i<N; i++) {
sb.setLength(0);
sb.append(" Intent: ");
- intents.get(i).toShortString(sb, true, false);
+ intents.get(i).toShortString(sb, false, true, false);
pw.println(sb.toString());
Bundle bundle = intents.get(i).getExtras();
if (bundle != null) {
@@ -8840,7 +8848,8 @@
} else if (complete) {
// Complete + brief == give a summary. Isn't that obvious?!?
if (lastTask.intent != null) {
- pw.print(prefix); pw.print(" "); pw.println(lastTask.intent);
+ pw.print(prefix); pw.print(" ");
+ pw.println(lastTask.intent.toInsecureString());
}
}
}
@@ -8851,7 +8860,7 @@
r.dump(pw, innerPrefix);
} else if (complete) {
// Complete + brief == give a summary. Isn't that obvious?!?
- pw.print(innerPrefix); pw.println(r.intent);
+ pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
if (r.app != null) {
pw.print(innerPrefix); pw.println(r.app);
}
@@ -10053,7 +10062,7 @@
boolean created = false;
try {
mStringBuilder.setLength(0);
- r.intent.getIntent().toShortString(mStringBuilder, false, true);
+ r.intent.getIntent().toShortString(mStringBuilder, true, false, true);
EventLog.writeEvent(EventLogTags.AM_CREATE_SERVICE,
System.identityHashCode(r), r.shortName,
mStringBuilder.toString(), r.app.pid);
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index 73ffafb..ce45bfb1 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -122,7 +122,7 @@
pw.print(" processName="); pw.println(processName);
pw.print(prefix); pw.print("launchedFromUid="); pw.print(launchedFromUid);
pw.print(" app="); pw.println(app);
- pw.print(prefix); pw.println(intent);
+ pw.print(prefix); pw.println(intent.toInsecureString());
pw.print(prefix); pw.print("frontOfTask="); pw.print(frontOfTask);
pw.print(" task="); pw.println(task);
pw.print(prefix); pw.print("taskAffinity="); pw.println(taskAffinity);
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 35dee3c..7bc19ab4 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -259,6 +259,11 @@
*/
boolean mSleepTimeout = false;
+ /**
+ * Dismiss the keyguard after the next activity is displayed?
+ */
+ boolean mDismissKeyguardOnNextActivity = false;
+
int mThumbnailWidth = -1;
int mThumbnailHeight = -1;
@@ -2169,7 +2174,7 @@
}
if (err == START_SUCCESS) {
- Slog.i(TAG, "Starting: " + intent + " from pid "
+ Slog.i(TAG, "START {" + intent.toShortString(true, true, true) + "} from pid "
+ (callerApp != null ? callerApp.pid : callingPid));
}
@@ -2224,6 +2229,7 @@
resultRecord, resultWho, requestCode,
Activity.RESULT_CANCELED, null);
}
+ mDismissKeyguardOnNextActivity = false;
return err;
}
@@ -2235,6 +2241,7 @@
resultRecord, resultWho, requestCode,
Activity.RESULT_CANCELED, null);
}
+ mDismissKeyguardOnNextActivity = false;
String msg;
if (!aInfo.exported) {
msg = "Permission Denial: starting " + intent.toString()
@@ -2272,6 +2279,7 @@
}
// We pretend to the caller that it was really started, but
// they will just get a cancel result.
+ mDismissKeyguardOnNextActivity = false;
return START_SUCCESS;
}
}
@@ -2295,6 +2303,7 @@
pal.grantedMode = grantedMode;
pal.onlyIfNeeded = onlyIfNeeded;
mService.mPendingActivityLaunches.add(pal);
+ mDismissKeyguardOnNextActivity = false;
return START_SWITCHES_CANCELED;
}
}
@@ -2313,8 +2322,17 @@
mService.doPendingActivityLaunchesLocked(false);
}
- return startActivityUncheckedLocked(r, sourceRecord,
+ err = startActivityUncheckedLocked(r, sourceRecord,
grantedUriPermissions, grantedMode, onlyIfNeeded, true);
+ if (mDismissKeyguardOnNextActivity && mPausingActivity == null) {
+ // Someone asked to have the keyguard dismissed on the next
+ // activity start, but we are not actually doing an activity
+ // switch... just dismiss the keyguard now, because we
+ // probably want to see whatever is behind it.
+ mDismissKeyguardOnNextActivity = false;
+ mService.mWindowManager.dismissKeyguard();
+ }
+ return err;
}
final void moveHomeToFrontFromLaunchLocked(int launchFlags) {
@@ -2983,6 +3001,11 @@
w.thisTime = w.totalTime;
}
mService.notifyAll();
+
+ if (mDismissKeyguardOnNextActivity) {
+ mDismissKeyguardOnNextActivity = false;
+ mService.mWindowManager.dismissKeyguard();
+ }
}
void sendActivityResultLocked(int callingUid, ActivityRecord r,
@@ -4126,4 +4149,8 @@
return true;
}
+
+ public void dismissKeyguardOnNextActivityLocked() {
+ mDismissKeyguardOnNextActivity = true;
+ }
}
diff --git a/services/java/com/android/server/am/IntentBindRecord.java b/services/java/com/android/server/am/IntentBindRecord.java
index 3a5ca66..2618c77 100644
--- a/services/java/com/android/server/am/IntentBindRecord.java
+++ b/services/java/com/android/server/am/IntentBindRecord.java
@@ -54,7 +54,7 @@
void dumpInService(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("intent={");
- pw.print(intent.getIntent().toShortString(true, false));
+ pw.print(intent.getIntent().toShortString(false, true, false));
pw.println('}');
pw.print(prefix); pw.print("binder="); pw.println(binder);
pw.print(prefix); pw.print("requested="); pw.print(requested);
@@ -89,7 +89,7 @@
sb.append(service.shortName);
sb.append(':');
if (intent != null) {
- intent.getIntent().toShortString(sb, false, false);
+ intent.getIntent().toShortString(sb, false, false, false);
}
sb.append('}');
return stringName = sb.toString();
diff --git a/services/java/com/android/server/am/PendingIntentRecord.java b/services/java/com/android/server/am/PendingIntentRecord.java
index 8ed0cc1..abd2a1f 100644
--- a/services/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/java/com/android/server/am/PendingIntentRecord.java
@@ -150,7 +150,8 @@
public String toString() {
return "Key{" + typeName() + " pkg=" + packageName
+ " intent="
- + (requestIntent != null ? requestIntent.toShortString(true, false) : "<null>")
+ + (requestIntent != null
+ ? requestIntent.toShortString(false, true, false) : "<null>")
+ " flags=0x" + Integer.toHexString(flags) + "}";
}
@@ -317,7 +318,7 @@
}
if (key.requestIntent != null) {
pw.print(prefix); pw.print("requestIntent=");
- pw.println(key.requestIntent.toShortString(true, true));
+ pw.println(key.requestIntent.toShortString(false, true, true));
}
if (sent || canceled) {
pw.print(prefix); pw.print("sent="); pw.print(sent);
diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java
index 004e963..257113b 100644
--- a/services/java/com/android/server/am/ServiceRecord.java
+++ b/services/java/com/android/server/am/ServiceRecord.java
@@ -192,7 +192,7 @@
void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("intent={");
- pw.print(intent.getIntent().toShortString(true, false));
+ pw.print(intent.getIntent().toShortString(false, true, false));
pw.println('}');
pw.print(prefix); pw.print("packageName="); pw.println(packageName);
pw.print(prefix); pw.print("processName="); pw.println(processName);
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index 87129ea..a860763 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -94,14 +94,14 @@
if (intent != null) {
StringBuilder sb = new StringBuilder(128);
sb.append(prefix); sb.append("intent={");
- intent.toShortString(sb, true, false);
+ intent.toShortString(sb, false, true, false);
sb.append('}');
pw.println(sb.toString());
}
if (affinityIntent != null) {
StringBuilder sb = new StringBuilder(128);
sb.append(prefix); sb.append("affinityIntent={");
- affinityIntent.toShortString(sb, true, false);
+ affinityIntent.toShortString(sb, false, true, false);
sb.append('}');
pw.println(sb.toString());
}
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 10f6d2c..6b9c088 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -29,6 +29,7 @@
import android.net.ConnectivityManager;
import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
+import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
@@ -88,7 +89,8 @@
// upstream type list and the DUN_REQUIRED secure-setting
private int mPreferredUpstreamMobileApn = ConnectivityManager.TYPE_NONE;
- private INetworkManagementService mNMService;
+ private final INetworkManagementService mNMService;
+ private final INetworkStatsService mStatsService;
private Looper mLooper;
private HandlerThread mThread;
@@ -124,9 +126,11 @@
private boolean mUsbTetherRequested; // true if USB tethering should be started
// when RNDIS is enabled
- public Tethering(Context context, INetworkManagementService nmService, Looper looper) {
+ public Tethering(Context context, INetworkManagementService nmService,
+ INetworkStatsService statsService, Looper looper) {
mContext = context;
mNMService = nmService;
+ mStatsService = statsService;
mLooper = looper;
mIfaces = new HashMap<String, TetherInterfaceSM>();
@@ -913,6 +917,9 @@
case CMD_INTERFACE_DOWN:
if (mMyUpstreamIfaceName != null) {
try {
+ // about to tear down NAT; gather remaining statistics
+ mStatsService.forceUpdate();
+
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
mMyUpstreamIfaceName = null;
} catch (Exception e) {
@@ -957,6 +964,9 @@
}
if (mMyUpstreamIfaceName != null) {
try {
+ // about to tear down NAT; gather remaining statistics
+ mStatsService.forceUpdate();
+
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
mMyUpstreamIfaceName = null;
} catch (Exception e) {
@@ -995,6 +1005,9 @@
case CMD_TETHER_MODE_DEAD:
if (mMyUpstreamIfaceName != null) {
try {
+ // about to tear down NAT; gather remaining statistics
+ mStatsService.forceUpdate();
+
mNMService.disableNat(mIfaceName, mMyUpstreamIfaceName);
mMyUpstreamIfaceName = null;
} catch (Exception e) {
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index bc65205..aa46795 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -24,8 +24,8 @@
import static android.content.Intent.ACTION_SHUTDOWN;
import static android.content.Intent.ACTION_UID_REMOVED;
import static android.content.Intent.EXTRA_UID;
-import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.SET_DEFAULT;
@@ -43,9 +43,12 @@
import static android.provider.Settings.Secure.NETSTATS_TAG_MAX_HISTORY;
import static android.provider.Settings.Secure.NETSTATS_UID_BUCKET_DURATION;
import static android.provider.Settings.Secure.NETSTATS_UID_MAX_HISTORY;
+import static android.telephony.PhoneStateListener.LISTEN_DATA_CONNECTION_STATE;
+import static android.telephony.PhoneStateListener.LISTEN_NONE;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
+import static android.text.format.DateUtils.SECOND_IN_MILLIS;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.server.NetworkManagementService.LIMIT_GLOBAL_ALERT;
import static com.android.server.NetworkManagementSocketTagger.resetKernelUidStats;
@@ -80,6 +83,7 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.Settings;
+import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.EventLog;
import android.util.Log;
@@ -121,7 +125,7 @@
*/
public class NetworkStatsService extends INetworkStatsService.Stub {
private static final String TAG = "NetworkStats";
- private static final boolean LOGD = true;
+ private static final boolean LOGD = false;
private static final boolean LOGV = false;
/** File header magic number: "ANET" */
@@ -132,7 +136,8 @@
private static final int VERSION_UID_WITH_TAG = 3;
private static final int VERSION_UID_WITH_SET = 4;
- private static final int MSG_PERFORM_POLL = 0x1;
+ private static final int MSG_PERFORM_POLL = 1;
+ private static final int MSG_UPDATE_IFACES = 2;
/** Flags to control detail level of poll event. */
private static final int FLAG_PERSIST_NETWORK = 0x10;
@@ -144,6 +149,7 @@
private final INetworkManagementService mNetworkManager;
private final IAlarmManager mAlarmManager;
private final TrustedTime mTime;
+ private final TelephonyManager mTeleManager;
private final NetworkStatsSettings mSettings;
private final PowerManager.WakeLock mWakeLock;
@@ -227,6 +233,7 @@
mNetworkManager = checkNotNull(networkManager, "missing INetworkManagementService");
mAlarmManager = checkNotNull(alarmManager, "missing IAlarmManager");
mTime = checkNotNull(time, "missing TrustedTime");
+ mTeleManager = checkNotNull(TelephonyManager.getDefault(), "missing TelephonyManager");
mSettings = checkNotNull(settings, "missing NetworkStatsSettings");
final PowerManager powerManager = (PowerManager) context.getSystemService(
@@ -279,6 +286,10 @@
// ignored; service lives in system_server
}
+ // watch for networkType changes that aren't broadcast through
+ // CONNECTIVITY_ACTION_IMMEDIATE above.
+ mTeleManager.listen(mPhoneListener, LISTEN_DATA_CONNECTION_STATE);
+
registerPollAlarmLocked();
registerGlobalAlert();
@@ -288,10 +299,13 @@
private void shutdownLocked() {
mContext.unregisterReceiver(mConnReceiver);
+ mContext.unregisterReceiver(mTetherReceiver);
mContext.unregisterReceiver(mPollReceiver);
mContext.unregisterReceiver(mRemovedReceiver);
mContext.unregisterReceiver(mShutdownReceiver);
+ mTeleManager.listen(mPhoneListener, LISTEN_NONE);
+
writeNetworkStatsLocked();
if (mUidStatsLoaded) {
writeUidStatsLocked();
@@ -535,14 +549,7 @@
public void onReceive(Context context, Intent intent) {
// on background handler thread, and verified CONNECTIVITY_INTERNAL
// permission above.
- synchronized (mStatsLock) {
- mWakeLock.acquire();
- try {
- updateIfacesLocked();
- } finally {
- mWakeLock.release();
- }
- }
+ updateIfaces();
}
};
@@ -619,6 +626,46 @@
}
};
+ private int mLastPhoneState = TelephonyManager.DATA_UNKNOWN;
+ private int mLastPhoneNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
+
+ /**
+ * Receiver that watches for {@link TelephonyManager} changes, such as
+ * transitioning between network types.
+ */
+ private PhoneStateListener mPhoneListener = new PhoneStateListener() {
+ @Override
+ public void onDataConnectionStateChanged(int state, int networkType) {
+ final boolean stateChanged = state != mLastPhoneState;
+ final boolean networkTypeChanged = networkType != mLastPhoneNetworkType;
+
+ if (networkTypeChanged && !stateChanged) {
+ // networkType changed without a state change, which means we
+ // need to roll our own update. delay long enough for
+ // ConnectivityManager to process.
+ // TODO: add direct event to ConnectivityService instead of
+ // relying on this delay.
+ if (LOGV) Slog.v(TAG, "triggering delayed updateIfaces()");
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MSG_UPDATE_IFACES), SECOND_IN_MILLIS);
+ }
+
+ mLastPhoneState = state;
+ mLastPhoneNetworkType = networkType;
+ }
+ };
+
+ private void updateIfaces() {
+ synchronized (mStatsLock) {
+ mWakeLock.acquire();
+ try {
+ updateIfacesLocked();
+ } finally {
+ mWakeLock.release();
+ }
+ }
+ }
+
/**
* Inspect all current {@link NetworkState} to derive mapping from {@code
* iface} to {@link NetworkStatsHistory}. When multiple {@link NetworkInfo}
@@ -713,19 +760,6 @@
final long threshold = mSettings.getPersistThreshold();
try {
- // record network stats
- final NetworkStats networkSnapshot = mNetworkManager.getNetworkStatsSummary();
- performNetworkPollLocked(networkSnapshot, currentTime);
-
- // persist when enough network data has occurred
- final NetworkStats persistNetworkDelta = computeStatsDelta(
- mLastPersistNetworkSnapshot, networkSnapshot, true);
- final boolean networkPastThreshold = persistNetworkDelta.getTotalBytes() > threshold;
- if (persistForce || (persistNetwork && networkPastThreshold)) {
- writeNetworkStatsLocked();
- mLastPersistNetworkSnapshot = networkSnapshot;
- }
-
// record tethering stats; persisted during normal UID cycle below
final String[] ifacePairs = mConnManager.getTetheredIfacePairs();
final NetworkStats tetherSnapshot = mNetworkManager.getNetworkStatsTethering(
@@ -744,6 +778,19 @@
writeUidStatsLocked();
mLastPersistUidSnapshot = uidSnapshot;
}
+
+ // record network stats
+ final NetworkStats networkSnapshot = mNetworkManager.getNetworkStatsSummary();
+ performNetworkPollLocked(networkSnapshot, currentTime);
+
+ // persist when enough network data has occurred
+ final NetworkStats persistNetworkDelta = computeStatsDelta(
+ mLastPersistNetworkSnapshot, networkSnapshot, true);
+ final boolean networkPastThreshold = persistNetworkDelta.getTotalBytes() > threshold;
+ if (persistForce || (persistNetwork && networkPastThreshold)) {
+ writeNetworkStatsLocked();
+ mLastPersistNetworkSnapshot = networkSnapshot;
+ }
} catch (IllegalStateException e) {
Log.wtf(TAG, "problem reading network stats", e);
} catch (RemoteException e) {
@@ -1356,6 +1403,10 @@
performPoll(flags);
return true;
}
+ case MSG_UPDATE_IFACES: {
+ updateIfaces();
+ return true;
+ }
default: {
return false;
}
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index 05f7cf0..eb135b7 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -72,6 +72,7 @@
import android.content.pm.UserInfo;
import android.content.pm.ManifestDigest;
import android.content.pm.VerifierDeviceIdentity;
+import android.content.pm.VerifierInfo;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
@@ -113,6 +114,8 @@
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.cert.CertificateException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -158,6 +161,7 @@
private static final boolean DEBUG_INTENT_MATCHING = false;
private static final boolean DEBUG_PACKAGE_SCANNING = false;
private static final boolean DEBUG_APP_DIR_OBSERVER = false;
+ private static final boolean DEBUG_VERIFY = false;
static final boolean MULTIPLE_APPLICATION_UIDS = true;
private static final int RADIO_UID = Process.PHONE_UID;
@@ -208,6 +212,8 @@
DEFAULT_CONTAINER_PACKAGE,
"com.android.defcontainer.DefaultContainerService");
+ private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
+
private static final String LIB_DIR_NAME = "lib";
static final String mTempContainerPrefix = "smdl2tmp";
@@ -349,7 +355,8 @@
final HashSet<String> mProtectedBroadcasts = new HashSet<String>();
/** List of packages waiting for verification. */
- final SparseArray<InstallArgs> mPendingVerification = new SparseArray<InstallArgs>();
+ final SparseArray<PackageVerificationState> mPendingVerification
+ = new SparseArray<PackageVerificationState>();
final ArrayList<PackageParser.Package> mDeferredDexOpt =
new ArrayList<PackageParser.Package>();
@@ -427,6 +434,8 @@
final SparseArray<PostInstallData> mRunningInstalls = new SparseArray<PostInstallData>();
int mNextInstallToken = 1; // nonzero; will be wrapped back to 1 when ++ overflows
+ private final String mRequiredVerifierPackage;
+
class PackageHandler extends Handler {
private boolean mBound = false;
final ArrayList<HandlerParams> mPendingInstalls =
@@ -740,9 +749,10 @@
} break;
case CHECK_PENDING_VERIFICATION: {
final int verificationId = msg.arg1;
- final InstallArgs args = mPendingVerification.get(verificationId);
+ final PackageVerificationState state = mPendingVerification.get(verificationId);
- if (args != null) {
+ if (state != null) {
+ final InstallArgs args = state.getInstallArgs();
Slog.i(TAG, "Validation timed out for " + args.packageURI.toString());
mPendingVerification.remove(verificationId);
@@ -756,32 +766,39 @@
}
case PACKAGE_VERIFIED: {
final int verificationId = msg.arg1;
- final boolean verified = msg.arg2 == 1 ? true : false;
- final InstallArgs args = mPendingVerification.get(verificationId);
- if (args == null) {
+ final PackageVerificationState state = mPendingVerification.get(verificationId);
+ if (state == null) {
Slog.w(TAG, "Invalid validation token " + verificationId + " received");
break;
}
- mPendingVerification.remove(verificationId);
+ final PackageVerificationResponse response = (PackageVerificationResponse) msg.obj;
- int ret;
- if (verified) {
- ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
- try {
- ret = args.copyApk(mContainerService, true);
- } catch (RemoteException e) {
- Slog.e(TAG, "Could not contact the ContainerService");
+ state.setVerifierResponse(response.callerUid, response.code);
+
+ if (state.isVerificationComplete()) {
+ mPendingVerification.remove(verificationId);
+
+ final InstallArgs args = state.getInstallArgs();
+
+ int ret;
+ if (state.isInstallAllowed()) {
+ ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
+ try {
+ ret = args.copyApk(mContainerService, true);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Could not contact the ContainerService");
+ }
+ } else {
+ ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
}
- } else {
- ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
+
+ processPendingInstall(args, ret);
+
+ mHandler.sendEmptyMessage(MCS_UNBIND);
}
- processPendingInstall(args, ret);
-
- mHandler.sendEmptyMessage(MCS_UNBIND);
-
break;
}
}
@@ -1134,10 +1151,49 @@
// are all flushed. Not really needed, but keeps things nice and
// tidy.
Runtime.getRuntime().gc();
+
+ mRequiredVerifierPackage = getRequiredVerifierLPr();
} // synchronized (mPackages)
} // synchronized (mInstallLock)
}
+ private String getRequiredVerifierLPr() {
+ final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
+ final List<ResolveInfo> receivers = queryIntentReceivers(verification, PACKAGE_MIME_TYPE,
+ PackageManager.GET_DISABLED_COMPONENTS);
+
+ String requiredVerifier = null;
+
+ final int N = receivers.size();
+ for (int i = 0; i < N; i++) {
+ final ResolveInfo info = receivers.get(i);
+
+ if (info.activityInfo == null) {
+ continue;
+ }
+
+ final String packageName = info.activityInfo.packageName;
+
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps == null) {
+ continue;
+ }
+
+ if (!ps.grantedPermissions
+ .contains(android.Manifest.permission.PACKAGE_VERIFICATION_AGENT)) {
+ continue;
+ }
+
+ if (requiredVerifier != null) {
+ throw new RuntimeException("There can be only one required verifier");
+ }
+
+ requiredVerifier = packageName;
+ }
+
+ return requiredVerifier;
+ }
+
@Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
@@ -4857,17 +4913,110 @@
}
@Override
- public void verifyPendingInstall(int id, int verificationCode)
- throws RemoteException {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, null);
-
+ public void verifyPendingInstall(int id, int verificationCode) throws RemoteException {
final Message msg = mHandler.obtainMessage(PACKAGE_VERIFIED);
+ final PackageVerificationResponse response = new PackageVerificationResponse(
+ verificationCode, Binder.getCallingUid());
msg.arg1 = id;
- msg.arg2 = verificationCode;
+ msg.obj = response;
mHandler.sendMessage(msg);
}
+ private ComponentName matchComponentForVerifier(String packageName,
+ List<ResolveInfo> receivers) {
+ ActivityInfo targetReceiver = null;
+
+ final int NR = receivers.size();
+ for (int i = 0; i < NR; i++) {
+ final ResolveInfo info = receivers.get(i);
+ if (info.activityInfo == null) {
+ continue;
+ }
+
+ if (packageName.equals(info.activityInfo.packageName)) {
+ targetReceiver = info.activityInfo;
+ break;
+ }
+ }
+
+ if (targetReceiver == null) {
+ return null;
+ }
+
+ return new ComponentName(targetReceiver.packageName, targetReceiver.name);
+ }
+
+ private List<ComponentName> matchVerifiers(PackageInfoLite pkgInfo,
+ List<ResolveInfo> receivers, final PackageVerificationState verificationState) {
+ if (pkgInfo.verifiers.length == 0) {
+ return null;
+ }
+
+ final int N = pkgInfo.verifiers.length;
+ final List<ComponentName> sufficientVerifiers = new ArrayList<ComponentName>(N + 1);
+ for (int i = 0; i < N; i++) {
+ final VerifierInfo verifierInfo = pkgInfo.verifiers[i];
+
+ final ComponentName comp = matchComponentForVerifier(verifierInfo.packageName,
+ receivers);
+ if (comp == null) {
+ continue;
+ }
+
+ final int verifierUid = getUidForVerifier(verifierInfo);
+ if (verifierUid == -1) {
+ continue;
+ }
+
+ if (DEBUG_VERIFY) {
+ Slog.d(TAG, "Added sufficient verifier " + verifierInfo.packageName
+ + " with the correct signature");
+ }
+ sufficientVerifiers.add(comp);
+ verificationState.addSufficientVerifier(verifierUid);
+ }
+
+ return sufficientVerifiers;
+ }
+
+ private int getUidForVerifier(VerifierInfo verifierInfo) {
+ synchronized (mPackages) {
+ final PackageParser.Package pkg = mPackages.get(verifierInfo.packageName);
+ if (pkg == null) {
+ return -1;
+ } else if (pkg.mSignatures.length != 1) {
+ Slog.i(TAG, "Verifier package " + verifierInfo.packageName
+ + " has more than one signature; ignoring");
+ return -1;
+ }
+
+ /*
+ * If the public key of the package's signature does not match
+ * our expected public key, then this is a different package and
+ * we should skip.
+ */
+
+ final byte[] expectedPublicKey;
+ try {
+ final Signature verifierSig = pkg.mSignatures[0];
+ final PublicKey publicKey = verifierSig.getPublicKey();
+ expectedPublicKey = publicKey.getEncoded();
+ } catch (CertificateException e) {
+ return -1;
+ }
+
+ final byte[] actualPublicKey = verifierInfo.publicKey.getEncoded();
+
+ if (!Arrays.equals(actualPublicKey, expectedPublicKey)) {
+ Slog.i(TAG, "Verifier package " + verifierInfo.packageName
+ + " does not have the expected public key; ignoring");
+ return -1;
+ }
+
+ return pkg.applicationInfo.uid;
+ }
+ }
+
public void finishPackageInstall(int token) {
enforceSystemOrRoot("Only the system is allowed to finish installs");
@@ -5237,9 +5386,11 @@
*/
public void handleStartCopy() throws RemoteException {
int ret = PackageManager.INSTALL_SUCCEEDED;
- boolean fwdLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
- boolean onSd = (flags & PackageManager.INSTALL_EXTERNAL) != 0;
- boolean onInt = (flags & PackageManager.INSTALL_INTERNAL) != 0;
+ final boolean fwdLocked = (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0;
+ final boolean onSd = (flags & PackageManager.INSTALL_EXTERNAL) != 0;
+ final boolean onInt = (flags & PackageManager.INSTALL_INTERNAL) != 0;
+ PackageInfoLite pkgLite = null;
+
if (onInt && onSd) {
// Check if both bits are set.
Slog.w(TAG, "Conflicting flags specified for installing on both internal and external");
@@ -5261,7 +5412,6 @@
}
// Remote call to find out default install location
- final PackageInfoLite pkgLite;
try {
mContext.grantUriPermission(DEFAULT_CONTAINER_PACKAGE, packageURI,
Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -5304,21 +5454,27 @@
}
final InstallArgs args = createInstallArgs(this);
+ mArgs = args;
+
if (ret == PackageManager.INSTALL_SUCCEEDED) {
/*
* Determine if we have any installed package verifiers. If we
* do, then we'll defer to them to verify the packages.
*/
- final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION,
- packageURI);
- verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ final int requiredUid = mRequiredVerifierPackage == null ? -1
+ : getPackageUid(mRequiredVerifierPackage);
+ if (requiredUid != -1 && isVerificationEnabled()) {
+ final Intent verification = new Intent(
+ Intent.ACTION_PACKAGE_NEEDS_VERIFICATION, packageURI);
+ verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- final List<ResolveInfo> receivers = queryIntentReceivers(verification, null,
- PackageManager.GET_DISABLED_COMPONENTS);
- if (isVerificationEnabled() && receivers.size() > 0) {
- if (DEBUG_INSTALL) {
+ final List<ResolveInfo> receivers = queryIntentReceivers(verification, null,
+ PackageManager.GET_DISABLED_COMPONENTS);
+
+ if (DEBUG_VERIFY) {
Slog.d(TAG, "Found " + receivers.size() + " verifiers for intent "
- + verification.toString());
+ + verification.toString() + " with " + pkgLite.verifiers.length
+ + " optional verifiers");
}
final int verificationId = mPendingVerificationToken++;
@@ -5335,35 +5491,70 @@
verificationURI);
}
- mPendingVerification.append(verificationId, args);
+ final PackageVerificationState verificationState = new PackageVerificationState(
+ requiredUid, args);
+
+ mPendingVerification.append(verificationId, verificationState);
+
+ final List<ComponentName> sufficientVerifiers = matchVerifiers(pkgLite,
+ receivers, verificationState);
/*
- * Send the intent to the registered verification agents,
- * but only start the verification timeout after the target
- * BroadcastReceivers have run.
+ * If any sufficient verifiers were listed in the package
+ * manifest, attempt to ask them.
*/
- mContext.sendOrderedBroadcast(verification,
- android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final Message msg = mHandler
- .obtainMessage(CHECK_PENDING_VERIFICATION);
- msg.arg1 = verificationId;
- mHandler.sendMessageDelayed(msg, getVerificationTimeout());
- }
- },
- null, 0, null, null);
+ if (sufficientVerifiers != null) {
+ final int N = sufficientVerifiers.size();
+ if (N == 0) {
+ Slog.i(TAG, "Additional verifiers required, but none installed.");
+ ret = PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE;
+ } else {
+ for (int i = 0; i < N; i++) {
+ final ComponentName verifierComponent = sufficientVerifiers.get(i);
+
+ final Intent sufficientIntent = new Intent(verification);
+ sufficientIntent.setComponent(verifierComponent);
+
+ mContext.sendBroadcast(sufficientIntent);
+ }
+ }
+ }
+
+ final ComponentName requiredVerifierComponent = matchComponentForVerifier(
+ mRequiredVerifierPackage, receivers);
+ if (ret == PackageManager.INSTALL_SUCCEEDED
+ && mRequiredVerifierPackage != null) {
+ /*
+ * Send the intent to the required verification agent,
+ * but only start the verification timeout after the
+ * target BroadcastReceivers have run.
+ */
+ verification.setComponent(requiredVerifierComponent);
+ mContext.sendOrderedBroadcast(verification,
+ android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final Message msg = mHandler
+ .obtainMessage(CHECK_PENDING_VERIFICATION);
+ msg.arg1 = verificationId;
+ mHandler.sendMessageDelayed(msg, getVerificationTimeout());
+ }
+ }, null, 0, null, null);
+
+ /*
+ * We don't want the copy to proceed until verification
+ * succeeds, so null out this field.
+ */
+ mArgs = null;
+ }
} else {
- // Create copy only if we are not in an erroneous state.
- // Remote call to initiate copy using temporary file
- mArgs = args;
+ /*
+ * No package verification is enabled, so immediately start
+ * the remote call to initiate copy using temporary file.
+ */
ret = args.copyApk(mContainerService, true);
}
- } else {
- // There was an error, so let the processPendingInstall() break
- // the bad news... uh, through a call in handleReturnCode()
- mArgs = args;
}
mRet = ret;
@@ -7549,6 +7740,8 @@
public static final int DUMP_PROVIDERS = 1 << 7;
+ public static final int DUMP_VERIFIERS = 1 << 8;
+
public static final int OPTION_SHOW_FILTERS = 1 << 0;
private int mTypes;
@@ -7641,6 +7834,7 @@
pw.println(" p[ackages]: dump installed packages");
pw.println(" s[hared-users]: dump shared user IDs");
pw.println(" m[essages]: print collected runtime messages");
+ pw.println(" v[erifiers]: print package verifier info");
pw.println(" <package.name>: info about given package");
return;
} else if ("-f".equals(opt)) {
@@ -7673,11 +7867,24 @@
dumpState.setDump(DumpState.DUMP_PROVIDERS);
} else if ("m".equals(cmd) || "messages".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_MESSAGES);
+ } else if ("v".equals(cmd) || "verifiers".equals(cmd)) {
+ dumpState.setDump(DumpState.DUMP_VERIFIERS);
}
}
// reader
synchronized (mPackages) {
+ if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) {
+ if (dumpState.onTitlePrinted())
+ pw.println(" ");
+ pw.println("Verifiers:");
+ pw.print(" Required: ");
+ pw.print(mRequiredVerifierPackage);
+ pw.print(" (uid=");
+ pw.print(getPackageUid(mRequiredVerifierPackage));
+ pw.println(")");
+ }
+
if (dumpState.isDumping(DumpState.DUMP_LIBS) && packageName == null) {
if (dumpState.onTitlePrinted())
pw.println(" ");
diff --git a/services/java/com/android/server/pm/PackageVerificationResponse.java b/services/java/com/android/server/pm/PackageVerificationResponse.java
new file mode 100644
index 0000000..b2ae0dd
--- /dev/null
+++ b/services/java/com/android/server/pm/PackageVerificationResponse.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+public class PackageVerificationResponse {
+ public final int code;
+
+ public final int callerUid;
+
+ public PackageVerificationResponse(int code, int callerUid) {
+ this.code = code;
+ this.callerUid = callerUid;
+ }
+}
diff --git a/services/java/com/android/server/pm/PackageVerificationState.java b/services/java/com/android/server/pm/PackageVerificationState.java
new file mode 100644
index 0000000..e5b89c1
--- /dev/null
+++ b/services/java/com/android/server/pm/PackageVerificationState.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import com.android.server.pm.PackageManagerService.InstallArgs;
+
+import android.content.pm.PackageManager;
+import android.util.SparseBooleanArray;
+
+/**
+ * Tracks the package verification state for a particular package. Each package
+ * verification has a required verifier and zero or more sufficient verifiers.
+ * Only one of the sufficient verifier list must return affirmative to allow the
+ * package to be considered verified. If there are zero sufficient verifiers,
+ * then package verification is considered complete.
+ */
+class PackageVerificationState {
+ private final InstallArgs mArgs;
+
+ private final SparseBooleanArray mSufficientVerifierUids;
+
+ private final int mRequiredVerifierUid;
+
+ private boolean mSufficientVerificationComplete;
+
+ private boolean mSufficientVerificationPassed;
+
+ private boolean mRequiredVerificationComplete;
+
+ private boolean mRequiredVerificationPassed;
+
+ /**
+ * Create a new package verification state where {@code requiredVerifierUid}
+ * is the user ID for the package that must reply affirmative before things
+ * can continue.
+ *
+ * @param requiredVerifierUid user ID of required package verifier
+ * @param args
+ */
+ public PackageVerificationState(int requiredVerifierUid, InstallArgs args) {
+ mRequiredVerifierUid = requiredVerifierUid;
+ mArgs = args;
+ mSufficientVerifierUids = new SparseBooleanArray();
+ }
+
+ public InstallArgs getInstallArgs() {
+ return mArgs;
+ }
+
+ /**
+ * Add a verifier which is added to our sufficient list.
+ *
+ * @param uid user ID of sufficient verifier
+ */
+ public void addSufficientVerifier(int uid) {
+ mSufficientVerifierUids.put(uid, true);
+ }
+
+ /**
+ * Should be called when a verification is received from an agent so the
+ * state of the package verification can be tracked.
+ *
+ * @param uid user ID of the verifying agent
+ * @return {@code true} if the verifying agent actually exists in our list
+ */
+ public boolean setVerifierResponse(int uid, int code) {
+ if (uid == mRequiredVerifierUid) {
+ mRequiredVerificationComplete = true;
+ switch (code) {
+ case PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT:
+ mSufficientVerifierUids.clear();
+ // fall through
+ case PackageManager.VERIFICATION_ALLOW:
+ mRequiredVerificationPassed = true;
+ break;
+ default:
+ mRequiredVerificationPassed = false;
+ }
+ return true;
+ } else {
+ if (mSufficientVerifierUids.get(uid)) {
+ if (code == PackageManager.VERIFICATION_ALLOW) {
+ mSufficientVerificationComplete = true;
+ mSufficientVerificationPassed = true;
+ }
+
+ mSufficientVerifierUids.delete(uid);
+ if (mSufficientVerifierUids.size() == 0) {
+ mSufficientVerificationComplete = true;
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns whether verification is considered complete. This means that the
+ * required verifier and at least one of the sufficient verifiers has
+ * returned a positive verification.
+ *
+ * @return {@code true} when verification is considered complete
+ */
+ public boolean isVerificationComplete() {
+ if (!mRequiredVerificationComplete) {
+ return false;
+ }
+
+ if (mSufficientVerifierUids.size() == 0) {
+ return true;
+ }
+
+ return mSufficientVerificationComplete;
+ }
+
+ /**
+ * Returns whether installation should be allowed. This should only be
+ * called after {@link #isVerificationComplete()} returns {@code true}.
+ *
+ * @return {@code true} if installation should be allowed
+ */
+ public boolean isInstallAllowed() {
+ if (!mRequiredVerificationPassed) {
+ return false;
+ }
+
+ if (mSufficientVerificationComplete) {
+ return mSufficientVerificationPassed;
+ }
+
+ return true;
+ }
+}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 02b246a..3ea9e81 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -4525,6 +4525,16 @@
return mPolicy.isKeyguardSecure();
}
+ public void dismissKeyguard() {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DISABLE_KEYGUARD)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires DISABLE_KEYGUARD permission");
+ }
+ synchronized(mWindowMap) {
+ mPolicy.dismissKeyguardLw();
+ }
+ }
+
public void closeSystemDialogs(String reason) {
synchronized(mWindowMap) {
for (int i=mWindows.size()-1; i>=0; i--) {
@@ -5183,6 +5193,7 @@
mRotation = rotation;
mAltOrientation = altOrientation;
+ mPolicy.setRotationLw(mRotation);
mWindowsFreezingScreen = true;
mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT);
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 455d6649..3640a15 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -636,7 +636,7 @@
final boolean isHwAccelerated = (mAttrs.flags &
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0;
final int format = isHwAccelerated ? PixelFormat.TRANSLUCENT : mAttrs.format;
- if (isHwAccelerated && mAttrs.format == PixelFormat.OPAQUE) {
+ if (!PixelFormat.formatHasAlpha(mAttrs.format)) {
flags |= Surface.OPAQUE;
}
mSurface = new Surface(
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index f85ce7f..41d7a90 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -112,6 +112,11 @@
mSurfaceTexture->abandon();
}
+void Layer::setName(const String8& name) {
+ LayerBase::setName(name);
+ mSurfaceTexture->setName(name);
+}
+
sp<ISurface> Layer::createSurface()
{
class BSurface : public BnSurface, public LayerCleaner {
@@ -371,11 +376,12 @@
Layer::State& editDraw(mDrawingState);
editDraw.requested_w = temp.requested_w;
editDraw.requested_h = temp.requested_h;
-
- // record the new size, form this point on, when the client request
- // a buffer, it'll get the new size.
- mSurfaceTexture->setDefaultBufferSize(temp.requested_w, temp.requested_h);
}
+
+ // record the new size, form this point on, when the client request
+ // a buffer, it'll get the new size.
+ mSurfaceTexture->setDefaultBufferSize(temp.requested_w,
+ temp.requested_h);
}
if (temp.sequence != front.sequence) {
@@ -578,7 +584,7 @@
uint32_t Layer::getTransformHint() const {
uint32_t orientation = 0;
if (!mFlinger->mDebugDisableTransformHint) {
- orientation = getOrientation();
+ orientation = getPlaneOrientation();
if (orientation & Transform::ROT_INVALID) {
orientation = 0;
}
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
index ff389ae..82e3521 100644
--- a/services/surfaceflinger/Layer.h
+++ b/services/surfaceflinger/Layer.h
@@ -74,6 +74,7 @@
virtual bool isProtected() const;
virtual void onRemoved();
virtual sp<Layer> getLayer() const { return const_cast<Layer*>(this); }
+ virtual void setName(const String8& name);
// LayerBaseClient interface
virtual wp<IBinder> getSurfaceTextureBinder() const;
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index e5ce814..7a47f62 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -45,6 +45,7 @@
mFlinger(flinger), mFiltering(false),
mNeedsFiltering(false), mInOverlay(false),
mOrientation(0),
+ mPlaneOrientation(0),
mTransactionFlags(0),
mPremultipliedAlpha(true), mName("unnamed"), mDebug(false),
mInvalidate(0)
@@ -256,6 +257,7 @@
// cache a few things...
mOrientation = tr.getOrientation();
+ mPlaneOrientation = planeTransform.getOrientation();
mTransform = tr;
mTransformedBounds = tr.makeBounds(w, h);
}
diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index a14b397..7f62145 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -81,7 +81,7 @@
Region transparentRegion;
};
- void setName(const String8& name);
+ virtual void setName(const String8& name);
String8 getName() const;
// modify current state
@@ -221,6 +221,7 @@
inline State& currentState() { return mCurrentState; }
int32_t getOrientation() const { return mOrientation; }
+ int32_t getPlaneOrientation() const { return mPlaneOrientation; }
protected:
const GraphicPlane& graphicPlane(int dpy) const;
@@ -254,6 +255,7 @@
protected:
// cached during validateVisibility()
int32_t mOrientation;
+ int32_t mPlaneOrientation;
Transform mTransform;
GLfloat mVertices[4][2];
Rect mTransformedBounds;
diff --git a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
index 99ae027..2ead254 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java
@@ -776,6 +776,7 @@
private void expectNetworkStatsPoll() throws Exception {
mNetManager.setGlobalAlert(anyLong());
expectLastCall().anyTimes();
+ expect(mConnManager.getTetheredIfacePairs()).andReturn(null).anyTimes();
}
private void assertStatsFilesExist(boolean exist) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java
new file mode 100644
index 0000000..ebd3633
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import android.content.pm.PackageManager;
+import com.android.server.pm.PackageVerificationState;
+
+import android.test.AndroidTestCase;
+
+public class PackageVerificationStateTest extends AndroidTestCase {
+ private static final int REQUIRED_UID = 1948;
+
+ private static final int SUFFICIENT_UID_1 = 1005;
+
+ private static final int SUFFICIENT_UID_2 = 8938;
+
+ public void testPackageVerificationState_OnlyRequiredVerifier_AllowedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_OnlyRequiredVerifier_DeniedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_REJECT);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertFalse("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndOneSufficient_RequiredDeniedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_ALLOW);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_REJECT);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertFalse("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndOneSufficient_SufficientDeniedInstall() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_REJECT);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertFalse("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndTwoSufficient_OneSufficientIsEnough() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+ state.addSufficientVerifier(SUFFICIENT_UID_2);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_ALLOW);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndTwoSufficient_SecondSufficientIsEnough() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+ state.addSufficientVerifier(SUFFICIENT_UID_2);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID, PackageManager.VERIFICATION_ALLOW);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_REJECT);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(SUFFICIENT_UID_2, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should be considered complete now",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+ }
+
+ public void testPackageVerificationState_RequiredAndTwoSufficient_RequiredOverrides() {
+ PackageVerificationState state = new PackageVerificationState(REQUIRED_UID, null);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.addSufficientVerifier(SUFFICIENT_UID_1);
+ state.addSufficientVerifier(SUFFICIENT_UID_2);
+
+ assertFalse("Verification should not be marked as complete yet",
+ state.isVerificationComplete());
+
+ state.setVerifierResponse(REQUIRED_UID,
+ PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT);
+
+ assertTrue("Verification should be marked as complete immediately",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed",
+ state.isInstallAllowed());
+
+ state.setVerifierResponse(SUFFICIENT_UID_1, PackageManager.VERIFICATION_REJECT);
+
+ assertTrue("Verification should still be marked as completed",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed still",
+ state.isInstallAllowed());
+
+ state.setVerifierResponse(SUFFICIENT_UID_2, PackageManager.VERIFICATION_ALLOW);
+
+ assertTrue("Verification should still be complete",
+ state.isVerificationComplete());
+
+ assertTrue("Installation should be marked as allowed still",
+ state.isInstallAllowed());
+ }
+}
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index ea349bf..34f8848 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -1409,6 +1409,11 @@
* @hide
*/
public static String formatNumber(String phoneNumber, String defaultCountryIso) {
+ // Do not attempt to format numbers that start with a hash or star symbol.
+ if (phoneNumber.startsWith("#") || phoneNumber.startsWith("*")) {
+ return phoneNumber;
+ }
+
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
String result = null;
try {
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 101dd55..abb4523 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -182,9 +182,4 @@
* in commercial configuration.
*/
static final String PROPERTY_TEST_CSIM = "persist.radio.test-csim";
-
- /**
- * Set to true to indicate a test ims registration required.
- */
- static final String PROPERTY_IMS_REG_REQUIRED = "persist.radio.imsregrequired";
}
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
index 849ff48..e2349af 100644
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/PhoneNumberUtilsTest.java
@@ -513,7 +513,19 @@
assertEquals("(650) 291-0000", PhoneNumberUtils.formatNumber("650 2910000", "US"));
assertEquals("123-4567", PhoneNumberUtils.formatNumber("1234567", "US"));
assertEquals("(800) 466-4114", PhoneNumberUtils.formatNumber("800-GOOG-114", "US"));
+ }
+ @SmallTest
+ public void testFormatNumber_LeadingStarAndHash() {
+ // Numbers with a leading '*' or '#' should be left unchanged.
+ assertEquals("*650 2910000", PhoneNumberUtils.formatNumber("*650 2910000", "US"));
+ assertEquals("#650 2910000", PhoneNumberUtils.formatNumber("#650 2910000", "US"));
+ assertEquals("*#650 2910000", PhoneNumberUtils.formatNumber("*#650 2910000", "US"));
+ assertEquals("#*650 2910000", PhoneNumberUtils.formatNumber("#*650 2910000", "US"));
+ assertEquals("#650*2910000", PhoneNumberUtils.formatNumber("#650*2910000", "US"));
+ assertEquals("#650*2910000", PhoneNumberUtils.formatNumber("#650*2910000", "US"));
+ assertEquals("##650 2910000", PhoneNumberUtils.formatNumber("##650 2910000", "US"));
+ assertEquals("**650 2910000", PhoneNumberUtils.formatNumber("**650 2910000", "US"));
}
@SmallTest
diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java
index 3525abe..58680ea 100644
--- a/test-runner/src/android/test/mock/MockPackageManager.java
+++ b/test-runner/src/android/test/mock/MockPackageManager.java
@@ -36,9 +36,11 @@
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
+import android.content.pm.Signature;
import android.content.pm.UserInfo;
import android.content.pm.ManifestDigest;
import android.content.pm.VerifierDeviceIdentity;
+import android.content.pm.VerifierInfo;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
diff --git a/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java b/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
index b803b98..a13c0c9 100644
--- a/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
+++ b/tests/DataIdleTest/src/com/android/tests/dataidle/DataIdleTest.java
@@ -89,18 +89,27 @@
Bundle result = new Bundle();
long rxBytes = 0;
long txBytes = 0;
+ long rxPackets = 0;
+ long txPackets = 0;
for (int i = 0; i < stats.size(); ++i) {
// Label will be iface_uid_tag_set
Entry statsEntry = stats.getValues(i, null);
+ // Debugging use.
+ /*
String labelTemplate = String.format("%s_%d_%d_%d", statsEntry.iface, statsEntry.uid,
statsEntry.tag, statsEntry.set) + "_%s";
result.putLong(String.format(labelTemplate, "rxBytes"), statsEntry.rxBytes);
result.putLong(String.format(labelTemplate, "txBytes"), statsEntry.txBytes);
+ */
+ rxPackets += statsEntry.rxPackets;
rxBytes += statsEntry.rxBytes;
+ txPackets += statsEntry.txPackets;
txBytes += statsEntry.txBytes;
}
- result.putLong("Total rxBytes", rxBytes);
- result.putLong("Total txBytes", txBytes);
+ result.putLong("Total rx Bytes", rxBytes);
+ result.putLong("Total tx Bytes", txBytes);
+ result.putLong("Total rx Packets", rxPackets);
+ result.putLong("Total tx Packets", txPackets);
getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, result);
}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index 4ba2e18..945b8f2 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -916,6 +916,9 @@
settings.setWorkersEnabled(false);
settings.setXSSAuditorEnabled(false);
settings.setPageCacheCapacity(0);
+ // this enables cpu upload path (as opposed to gpu upload path)
+ // and it's only meant to be a temporary workaround!
+ settings.setProperty("enable_cpu_upload_path", "true");
}
private WebView mWebView;
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index d74d80d..929b103 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -31,6 +31,15 @@
android:hardwareAccelerated="true">
<activity
+ android:name="DisplayListLayersActivity"
+ android:label="__DisplayListLayers">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name="TextFadeActivity"
android:label="_TextFade">
<intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DisplayListLayersActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DisplayListLayersActivity.java
new file mode 100644
index 0000000..ec91c35
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DisplayListLayersActivity.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.android.test.hwui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+import static android.view.View.LAYER_TYPE_HARDWARE;
+import static android.view.View.LAYER_TYPE_SOFTWARE;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class DisplayListLayersActivity extends Activity {
+ private static final int VERTICAL_MARGIN = 12;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ LinearLayout root = createContainer();
+ addChild(root, new LayerView(this, 0xffff0000, LAYER_TYPE_HARDWARE, "hardware"),
+ WRAP_CONTENT, WRAP_CONTENT);
+ addChild(root, new LayerView(this, 0xff0000ff, LAYER_TYPE_SOFTWARE, "software"),
+ WRAP_CONTENT, WRAP_CONTENT);
+ addChild(root, createButton(root), WRAP_CONTENT, WRAP_CONTENT);
+
+ setContentView(root);
+ }
+
+ private Button createButton(final LinearLayout root) {
+ Button button = new Button(this);
+ button.setText("Invalidate");
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ for (int i = 0; i < root.getChildCount(); i++) {
+ View child = root.getChildAt(i);
+ if (child != v) {
+ child.invalidate();
+ }
+ }
+ }
+ });
+
+ return button;
+ }
+
+ private void addChild(LinearLayout root, View child, int width, int height) {
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, height);
+ params.gravity = Gravity.CENTER_HORIZONTAL;
+ params.setMargins(0, dipToPx(VERTICAL_MARGIN), 0, 0);
+ root.addView(child, params);
+ }
+
+ private int dipToPx(int size) {
+ return (int) (getResources().getDisplayMetrics().density * size + 0.5f);
+ }
+
+ private LinearLayout createContainer() {
+ LinearLayout layout = new LinearLayout(this);
+ layout.setOrientation(LinearLayout.VERTICAL);
+ return layout;
+ }
+
+ private class LayerView extends View {
+ private static final String LOG_TAG = "LayerView";
+ private final Paint mPaint = new Paint();
+
+ private final String mTag;
+
+ LayerView(Context context, int color, int layerType, String tag) {
+ super(context);
+
+ mTag = tag;
+
+ mPaint.setColor(color);
+ setLayerType(layerType, null);
+ }
+
+ private void log(String tag) {
+ Log.d(LOG_TAG, mTag + ": " + tag);
+ }
+
+ @Override
+ public void invalidate() {
+ log("invalidate");
+ super.invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ log("draw");
+ canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec) / 3,
+ MeasureSpec.getSize(heightMeasureSpec) / 3);
+ }
+ }
+}
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 81b924a..99f74c6 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -695,7 +695,7 @@
if (isInProductList(product, String16(bundleProduct))) {
;
} else if (strcmp16(String16("default").string(), product.string()) == 0 &&
- !outTable->hasBagOrEntry(myPackage, curType, ident)) {
+ !outTable->hasBagOrEntry(myPackage, curType, ident, config)) {
;
} else {
return NO_ERROR;
@@ -1823,6 +1823,37 @@
return false;
}
+bool ResourceTable::hasBagOrEntry(const String16& package,
+ const String16& type,
+ const String16& name,
+ const ResTable_config& config) const
+{
+ // First look for this in the included resources...
+ uint32_t rid = mAssets->getIncludedResources()
+ .identifierForName(name.string(), name.size(),
+ type.string(), type.size(),
+ package.string(), package.size());
+ if (rid != 0) {
+ return true;
+ }
+
+ sp<Package> p = mPackages.valueFor(package);
+ if (p != NULL) {
+ sp<Type> t = p->getTypes().valueFor(type);
+ if (t != NULL) {
+ sp<ConfigList> c = t->getConfigs().valueFor(name);
+ if (c != NULL) {
+ sp<Entry> e = c->getEntries().valueFor(config);
+ if (e != NULL) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
bool ResourceTable::hasBagOrEntry(const String16& ref,
const String16* defType,
const String16* defPackage)
diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h
index 734c541..80f2192 100644
--- a/tools/aapt/ResourceTable.h
+++ b/tools/aapt/ResourceTable.h
@@ -124,6 +124,11 @@
const String16& type,
const String16& name) const;
+ bool hasBagOrEntry(const String16& package,
+ const String16& type,
+ const String16& name,
+ const ResTable_config& config) const;
+
bool hasBagOrEntry(const String16& ref,
const String16* defType = NULL,
const String16* defPackage = NULL);
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
index 940b290..5b57266 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
@@ -464,4 +464,7 @@
public int getPreferredOptionsPanelGravity() throws RemoteException {
return Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
}
+
+ public void dismissKeyguard() {
+ }
}
diff --git a/tools/orientationplot/orientationplot.py b/tools/orientationplot/orientationplot.py
index 07449d4..3a44cb2 100755
--- a/tools/orientationplot/orientationplot.py
+++ b/tools/orientationplot/orientationplot.py
@@ -131,42 +131,28 @@
self.orientation_angle_axes, 'orientation', 'black')
self._add_timeseries_legend(self.orientation_angle_axes)
- self.actual_orientation = self._make_timeseries()
- self.proposed_orientation = self._make_timeseries()
+ self.current_rotation = self._make_timeseries()
+ self.proposed_rotation = self._make_timeseries()
+ self.proposal_rotation = self._make_timeseries()
self.orientation_axes = self._add_timeseries_axes(
- 5, 'Actual / Proposed Orientation and Confidence', 'rotation', [-1, 4],
+ 5, 'Current / Proposed Orientation and Confidence', 'rotation', [-1, 4],
sharex=shared_axis,
yticks=range(0, 4))
- self.actual_orientation_line = self._add_timeseries_line(
- self.orientation_axes, 'actual', 'black', linewidth=2)
- self.proposed_orientation_line = self._add_timeseries_line(
- self.orientation_axes, 'proposed', 'purple', linewidth=3)
+ self.current_rotation_line = self._add_timeseries_line(
+ self.orientation_axes, 'current', 'black', linewidth=2)
+ self.proposal_rotation_line = self._add_timeseries_line(
+ self.orientation_axes, 'proposal', 'purple', linewidth=3)
+ self.proposed_rotation_line = self._add_timeseries_line(
+ self.orientation_axes, 'proposed', 'green', linewidth=3)
self._add_timeseries_legend(self.orientation_axes)
- self.confidence = [[self._make_timeseries(), self._make_timeseries()] for i in range(0, 4)]
- self.confidence_polys = []
-
- self.combined_confidence = self._make_timeseries()
- self.orientation_confidence = self._make_timeseries()
- self.tilt_confidence = self._make_timeseries()
- self.magnitude_confidence = self._make_timeseries()
- self.confidence_axes = self._add_timeseries_axes(
- 6, 'Proposed Orientation Confidence Factors', 'confidence', [-0.1, 1.1],
- sharex=shared_axis,
- yticks=[0.0, 0.2, 0.4, 0.6, 0.8, 1.0])
- self.combined_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'combined', 'purple', linewidth=2)
- self.orientation_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'orientation', 'black')
- self.tilt_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'tilt', 'brown')
- self.magnitude_confidence_line = self._add_timeseries_line(
- self.confidence_axes, 'magnitude', 'orange')
- self._add_timeseries_legend(self.confidence_axes)
+ self.proposal_confidence = [[self._make_timeseries(), self._make_timeseries()]
+ for i in range(0, 4)]
+ self.proposal_confidence_polys = []
self.sample_latency = self._make_timeseries()
self.sample_latency_axes = self._add_timeseries_axes(
- 7, 'Accelerometer Sampling Latency', 'ms', [-10, 500],
+ 6, 'Accelerometer Sampling Latency', 'ms', [-10, 500],
sharex=shared_axis,
yticks=range(0, 500, 100))
self.sample_latency_line = self._add_timeseries_line(
@@ -186,7 +172,7 @@
# Add a subplot to the figure for a time series.
def _add_timeseries_axes(self, index, title, ylabel, ylim, yticks, sharex=None):
- num_graphs = 7
+ num_graphs = 6
height = 0.9 / num_graphs
top = 0.95 - height * index
axes = self.fig.add_axes([0.1, top, 0.8, height],
@@ -234,13 +220,10 @@
self.parse_magnitude = None
self.parse_tilt_angle = None
self.parse_orientation_angle = None
- self.parse_proposed_orientation = None
- self.parse_combined_confidence = None
- self.parse_orientation_confidence = None
- self.parse_tilt_confidence = None
- self.parse_magnitude_confidence = None
- self.parse_actual_orientation = None
- self.parse_confidence = None
+ self.parse_current_rotation = None
+ self.parse_proposed_rotation = None
+ self.parse_proposal_rotation = None
+ self.parse_proposal_confidence = None
self.parse_sample_latency = None
# Update samples.
@@ -284,26 +267,13 @@
if line.find('orientationAngle=') != -1:
self.parse_orientation_angle = self._get_following_number(line, 'orientationAngle=')
- if line.find('Proposal:') != -1:
- self.parse_proposed_orientation = self._get_following_number(line, 'proposedOrientation=')
- self.parse_combined_confidence = self._get_following_number(line, 'combinedConfidence=')
- self.parse_orientation_confidence = self._get_following_number(line, 'orientationConfidence=')
- self.parse_tilt_confidence = self._get_following_number(line, 'tiltConfidence=')
- self.parse_magnitude_confidence = self._get_following_number(line, 'magnitudeConfidence=')
-
if line.find('Result:') != -1:
- self.parse_actual_orientation = self._get_following_number(line, 'rotation=')
- self.parse_confidence = self._get_following_array_of_numbers(line, 'confidence=')
+ self.parse_current_rotation = self._get_following_number(line, 'currentRotation=')
+ self.parse_proposed_rotation = self._get_following_number(line, 'proposedRotation=')
+ self.parse_proposal_rotation = self._get_following_number(line, 'proposalRotation=')
+ self.parse_proposal_confidence = self._get_following_number(line, 'proposalConfidence=')
self.parse_sample_latency = self._get_following_number(line, 'timeDeltaMS=')
- for i in range(0, 4):
- if self.parse_confidence is not None:
- self._append(self.confidence[i][0], timeindex, i)
- self._append(self.confidence[i][1], timeindex, i + self.parse_confidence[i])
- else:
- self._append(self.confidence[i][0], timeindex, None)
- self._append(self.confidence[i][1], timeindex, None)
-
self._append(self.raw_acceleration_x, timeindex, self.parse_raw_acceleration_x)
self._append(self.raw_acceleration_y, timeindex, self.parse_raw_acceleration_y)
self._append(self.raw_acceleration_z, timeindex, self.parse_raw_acceleration_z)
@@ -313,12 +283,22 @@
self._append(self.magnitude, timeindex, self.parse_magnitude)
self._append(self.tilt_angle, timeindex, self.parse_tilt_angle)
self._append(self.orientation_angle, timeindex, self.parse_orientation_angle)
- self._append(self.actual_orientation, timeindex, self.parse_actual_orientation)
- self._append(self.proposed_orientation, timeindex, self.parse_proposed_orientation)
- self._append(self.combined_confidence, timeindex, self.parse_combined_confidence)
- self._append(self.orientation_confidence, timeindex, self.parse_orientation_confidence)
- self._append(self.tilt_confidence, timeindex, self.parse_tilt_confidence)
- self._append(self.magnitude_confidence, timeindex, self.parse_magnitude_confidence)
+ self._append(self.current_rotation, timeindex, self.parse_current_rotation)
+ if self.parse_proposed_rotation >= 0:
+ self._append(self.proposed_rotation, timeindex, self.parse_proposed_rotation)
+ else:
+ self._append(self.proposed_rotation, timeindex, None)
+ if self.parse_proposal_rotation >= 0:
+ self._append(self.proposal_rotation, timeindex, self.parse_proposal_rotation)
+ else:
+ self._append(self.proposal_rotation, timeindex, None)
+ for i in range(0, 4):
+ self._append(self.proposal_confidence[i][0], timeindex, i)
+ if i == self.parse_proposal_rotation:
+ self._append(self.proposal_confidence[i][1], timeindex,
+ i + self.parse_proposal_confidence)
+ else:
+ self._append(self.proposal_confidence[i][1], timeindex, i)
self._append(self.sample_latency, timeindex, self.parse_sample_latency)
self._reset_parse_state()
@@ -335,16 +315,13 @@
self._scroll(self.magnitude, bottom)
self._scroll(self.tilt_angle, bottom)
self._scroll(self.orientation_angle, bottom)
- self._scroll(self.actual_orientation, bottom)
- self._scroll(self.proposed_orientation, bottom)
- self._scroll(self.combined_confidence, bottom)
- self._scroll(self.orientation_confidence, bottom)
- self._scroll(self.tilt_confidence, bottom)
- self._scroll(self.magnitude_confidence, bottom)
- self._scroll(self.sample_latency, bottom)
+ self._scroll(self.current_rotation, bottom)
+ self._scroll(self.proposed_rotation, bottom)
+ self._scroll(self.proposal_rotation, bottom)
for i in range(0, 4):
- self._scroll(self.confidence[i][0], bottom)
- self._scroll(self.confidence[i][1], bottom)
+ self._scroll(self.proposal_confidence[i][0], bottom)
+ self._scroll(self.proposal_confidence[i][1], bottom)
+ self._scroll(self.sample_latency, bottom)
# Redraw the plots.
self.raw_acceleration_line_x.set_data(self.raw_acceleration_x)
@@ -356,20 +333,19 @@
self.magnitude_line.set_data(self.magnitude)
self.tilt_angle_line.set_data(self.tilt_angle)
self.orientation_angle_line.set_data(self.orientation_angle)
- self.actual_orientation_line.set_data(self.actual_orientation)
- self.proposed_orientation_line.set_data(self.proposed_orientation)
- self.combined_confidence_line.set_data(self.combined_confidence)
- self.orientation_confidence_line.set_data(self.orientation_confidence)
- self.tilt_confidence_line.set_data(self.tilt_confidence)
- self.magnitude_confidence_line.set_data(self.magnitude_confidence)
+ self.current_rotation_line.set_data(self.current_rotation)
+ self.proposed_rotation_line.set_data(self.proposed_rotation)
+ self.proposal_rotation_line.set_data(self.proposal_rotation)
self.sample_latency_line.set_data(self.sample_latency)
- for poly in self.confidence_polys:
+ for poly in self.proposal_confidence_polys:
poly.remove()
- self.confidence_polys = []
+ self.proposal_confidence_polys = []
for i in range(0, 4):
- self.confidence_polys.append(self.orientation_axes.fill_between(self.confidence[i][0][0],
- self.confidence[i][0][1], self.confidence[i][1][1],
+ self.proposal_confidence_polys.append(self.orientation_axes.fill_between(
+ self.proposal_confidence[i][0][0],
+ self.proposal_confidence[i][0][1],
+ self.proposal_confidence[i][1][1],
facecolor='goldenrod', edgecolor='goldenrod'))
self.fig.canvas.draw_idle()
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index a6ea6d4..6ff1bc2 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -106,12 +106,6 @@
public native static String statusCommand();
- public native static int getRssiCommand();
-
- public native static int getRssiApproxCommand();
-
- public native static int getLinkSpeedCommand();
-
public native static String getMacAddressCommand();
public native static String scanResultsCommand();
@@ -209,6 +203,16 @@
private native static String doStringCommand(String command);
+ /** Example output:
+ * RSSI=-65
+ * LINKSPEED=48
+ * NOISE=9999
+ * FREQUENCY=0
+ */
+ public static String signalPoll() {
+ return doStringCommand("SIGNAL_POLL");
+ }
+
public static boolean wpsPbc() {
return doBooleanCommand("WPS_PBC");
}
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 052d332..41fc55d 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -1362,7 +1362,28 @@
* Fetch RSSI and linkspeed on current connection
*/
private void fetchRssiAndLinkSpeedNative() {
- int newRssi = WifiNative.getRssiCommand();
+ int newRssi = -1;
+ int newLinkSpeed = -1;
+
+ String signalPoll = WifiNative.signalPoll();
+
+ if (signalPoll != null) {
+ String[] lines = signalPoll.split("\n");
+ for (String line : lines) {
+ String[] prop = line.split("=");
+ if (prop.length < 2) continue;
+ try {
+ if (prop[0].equals("RSSI")) {
+ newRssi = Integer.parseInt(prop[1]);
+ } else if (prop[0].equals("LINKSPEED")) {
+ newLinkSpeed = Integer.parseInt(prop[1]);
+ }
+ } catch (NumberFormatException e) {
+ //Ignore, defaults on rssi and linkspeed are assigned
+ }
+ }
+ }
+
if (newRssi != -1 && MIN_RSSI < newRssi && newRssi < MAX_RSSI) { // screen out invalid values
/* some implementations avoid negative values by adding 256
* so we need to adjust for that here.
@@ -1390,7 +1411,7 @@
} else {
mWifiInfo.setRssi(MIN_RSSI);
}
- int newLinkSpeed = WifiNative.getLinkSpeedCommand();
+
if (newLinkSpeed != -1) {
mWifiInfo.setLinkSpeed(newLinkSpeed);
}
diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
index fe0e850..af8c486 100644
--- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
@@ -589,12 +589,11 @@
updateBssids();
transitionTo(mDnsCheckingState);
mNetEventCounter++;
- return HANDLED;
- case DISCONNECTED:
- case DISCONNECTING:
+ break;
+ default:
mNetEventCounter++;
transitionTo(mNotConnectedState);
- return HANDLED;
+ break;
}
return HANDLED;
case EVENT_WIFI_RADIO_STATE_CHANGE: