diff options
43 files changed, 1568 insertions, 929 deletions
diff --git a/api/current.xml b/api/current.xml index 3af1426..031506b 100644 --- a/api/current.xml +++ b/api/current.xml @@ -6785,6 +6785,17 @@ visibility="public" > </field> +<field name="restoreAnyVersion" + type="int" + transient="false" + volatile="false" + value="16843451" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="restoreNeedsApplication" type="int" transient="false" @@ -14630,7 +14641,7 @@ </parameter> <parameter name="features" type="java.lang.String[]"> </parameter> -<parameter name="activityForPrompting" type="android.app.Activity"> +<parameter name="activity" type="android.app.Activity"> </parameter> <parameter name="addAccountOptions" type="android.os.Bundle"> </parameter> diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 3161826..e2263fc 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -516,7 +516,8 @@ public class AccountManager { * <p>It is safe to call this method from the main thread. * * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#MANAGE_ACCOUNTS}. + * {@link android.Manifest.permission#MANAGE_ACCOUNTS} or + * {@link android.Manifest.permission#USE_CREDENTIALS} * * @param accountType The account type of the auth token to invalidate * @param authToken The auth token to invalidate diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index d4f4d13..2aaf5b0 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -565,7 +565,7 @@ public class AccountManagerService } public void invalidateAuthToken(String accountType, String authToken) { - checkManageAccountsPermission(); + checkManageAccountsOrUseCredentialsPermissions(); long identityToken = clearCallingIdentity(); try { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); @@ -1747,17 +1747,22 @@ public class AccountManagerService } } - private void checkBinderPermission(String permission) { + /** Succeeds if any of the specified permissions are granted. */ + private void checkBinderPermission(String... permissions) { final int uid = Binder.getCallingUid(); - if (mContext.checkCallingOrSelfPermission(permission) != - PackageManager.PERMISSION_GRANTED) { - String msg = "caller uid " + uid + " lacks " + permission; - Log.w(TAG, msg); - throw new SecurityException(msg); - } - if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "caller uid " + uid + " has " + permission); + + for (String perm : permissions) { + if (mContext.checkCallingOrSelfPermission(perm) == PackageManager.PERMISSION_GRANTED) { + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "caller uid " + uid + " has " + perm); + } + return; + } } + + String msg = "caller uid " + uid + " lacks any of " + TextUtils.join(",", permissions); + Log.w(TAG, msg); + throw new SecurityException(msg); } private boolean inSystemImage(int callerUid) { @@ -1848,6 +1853,11 @@ public class AccountManagerService checkBinderPermission(Manifest.permission.MANAGE_ACCOUNTS); } + private void checkManageAccountsOrUseCredentialsPermissions() { + checkBinderPermission(Manifest.permission.MANAGE_ACCOUNTS, + Manifest.permission.USE_CREDENTIALS); + } + /** * Allow callers with the given uid permission to get credentials for account/authTokenType. * <p> diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 2e405c1..8773f59 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -248,6 +248,19 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int FLAG_NATIVE_DEBUGGABLE = 1<<21; /** + * Value for {@link #flags}: Set to true if the application's backup + * agent claims to be able to handle restore data even "from the future," + * i.e. from versions of the application with a versionCode greater than + * the one currently installed on the device. + * + * <p>If android:allowBackup is set to false or no android:backupAgent + * is specified, this flag will be ignored. + * + * {@hide} + */ + public static final int FLAG_RESTORE_ANY_VERSION = 1<<22; + + /** * Flags associated with the application. Any combination of * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE}, * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 5823560..98aacaa 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1369,8 +1369,8 @@ public class PackageParser { if (allowBackup) { ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; - // backupAgent, killAfterRestore, and restoreNeedsApplication are only relevant - // if backup is possible for the given application. + // backupAgent, killAfterRestore, restoreNeedsApplication, and restoreAnyVersion + // are only relevant if backup is possible for the given application. String backupAgent = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestApplication_backupAgent); if (backupAgent != null) { @@ -1390,6 +1390,11 @@ public class PackageParser { false)) { ai.flags |= ApplicationInfo.FLAG_RESTORE_NEEDS_APPLICATION; } + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion, + false)) { + ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION; + } } } diff --git a/core/java/android/database/sqlite/SQLiteProgram.java b/core/java/android/database/sqlite/SQLiteProgram.java index a3a8486..7a29cb4 100644 --- a/core/java/android/database/sqlite/SQLiteProgram.java +++ b/core/java/android/database/sqlite/SQLiteProgram.java @@ -57,8 +57,10 @@ public abstract class SQLiteProgram extends SQLiteClosable { mCompiledSql = new SQLiteCompiledSql(db, sql); // add it to the cache of compiled-sqls - db.addToCompiledQueries(sql, mCompiledSql); + // but before adding it and thus making it available for anyone else to use it, + // make sure it is acquired by me. mCompiledSql.acquire(); + db.addToCompiledQueries(sql, mCompiledSql); } else { // it is already in compiled-sql cache. // try to acquire the object. diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index badb767..c76aca1 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -332,10 +332,10 @@ public class ConnectivityManager /** * Sets the value of the setting for background data usage. - * + * * @param allowBackgroundData Whether an application should use data while * it is in the background. - * + * * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING * @see #getBackgroundDataSetting() * @hide @@ -346,7 +346,35 @@ public class ConnectivityManager } catch (RemoteException e) { } } - + + /** + * Gets the value of the setting for enabling Mobile data. + * + * @return Whether mobile data is enabled. + * @hide + */ + public boolean getMobileDataEnabled() { + try { + return mService.getMobileDataEnabled(); + } catch (RemoteException e) { + return true; + } + } + + /** + * Sets the persisted value for enabling/disabling Mobile data. + * + * @param allowMobileData Whether the mobile data connection should be + * used or not. + * @hide + */ + public void setMobileDataEnabled(boolean enabled) { + try { + mService.setMobileDataEnabled(enabled); + } catch (RemoteException e) { + } + } + /** * Don't allow use of default constructor. */ diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 508e9c3..2514693 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -51,6 +51,10 @@ interface IConnectivityManager void setBackgroundDataSetting(boolean allowBackgroundData); + boolean getMobileDataEnabled(); + + void setMobileDataEnabled(boolean enabled); + boolean tether(String iface); boolean untether(String iface); diff --git a/core/java/android/os/storage/IMountService.aidl b/core/java/android/os/storage/IMountService.aidl index 79a6cfe..2b2dcf4 100644 --- a/core/java/android/os/storage/IMountService.aidl +++ b/core/java/android/os/storage/IMountService.aidl @@ -61,9 +61,12 @@ interface IMountService /** * Safely unmount external storage at given mount point. - * Returns an int consistent with MountServiceResultCode + * The unmount is an asynchronous operation. Applications + * should register StorageEventListener for storage related + * status changes. + * */ - int unmountVolume(String mountPoint, boolean force); + void unmountVolume(String mountPoint, boolean force); /** * Format external storage given a mount point. diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index acb8473..1163106 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -3176,6 +3176,56 @@ public final class ContactsContract { } /** + * Additional columns returned by the {@link Contacts#CONTENT_FILTER_URI} providing the + * explanation of why the filter matched the contact. Specifically, they contain the + * data type and element that was used for matching. + * <p> + * This is temporary API, it will need to change when we move to FTS. + * + * @hide + */ + public static class SearchSnippetColumns { + + /** + * The ID of the data row that was matched by the filter. + * + * @hide + */ + public static final String SNIPPET_DATA_ID = "snippet_data_id"; + + /** + * The type of data that was matched by the filter. + * + * @hide + */ + public static final String SNIPPET_MIMETYPE = "snippet_mimetype"; + + /** + * The {@link CommonDataKinds.CommonColumns#DATA} field of the data row + * that was matched by the filter. + * + * @hide + */ + public static final String SNIPPET_DATA = "snippet_data"; + + /** + * The {@link CommonDataKinds.CommonColumns#TYPE} field of the data row + * that was matched by the filter. + * + * @hide + */ + public static final String SNIPPET_TYPE = "snippet_type"; + + /** + * The {@link CommonDataKinds.CommonColumns#LABEL} field of the data row + * that was matched by the filter. + * + * @hide + */ + public static final String SNIPPET_LABEL = "snippet_label"; + } + + /** * Container for definitions of common data types stored in the {@link ContactsContract.Data} * table. */ diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index a020da4..b75a8cc 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2466,6 +2466,13 @@ public final class Settings { public static final String BACKGROUND_DATA = "background_data"; /** + * Whether mobile data connections are allowed by the user. See + * ConnectivityManager for more info. + * @hide + */ + public static final String MOBILE_DATA = "mobile_data"; + + /** * The CDMA roaming mode 0 = Home Networks, CDMA default * 1 = Roaming on Affiliated networks * 2 = Roaming on any networks diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 2eb633f..679206d 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3650,14 +3650,27 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** - * This is called when a container is going to temporarily detach a child - * that currently has focus, with + * @hide + */ + public void dispatchStartTemporaryDetach() { + onStartTemporaryDetach(); + } + + /** + * This is called when a container is going to temporarily detach a child, with * {@link ViewGroup#detachViewFromParent(View) ViewGroup.detachViewFromParent}. * It will either be followed by {@link #onFinishTemporaryDetach()} or - * {@link #onDetachedFromWindow()} when the container is done. Generally - * this is currently only done ListView for a view with focus. + * {@link #onDetachedFromWindow()} when the container is done. */ public void onStartTemporaryDetach() { + removeUnsetPressCallback(); + } + + /** + * @hide + */ + public void dispatchFinishTemporaryDetach() { + onFinishTemporaryDetach(); } /** @@ -4362,6 +4375,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** + * Remove the prepress detection timer. + */ + private void removeUnsetPressCallback() { + if ((mPrivateFlags & PRESSED) != 0 && mUnsetPressedState != null) { + setPressed(false); + removeCallbacks(mUnsetPressedState); + } + } + + /** * Remove the tap detection timer. */ private void removeTapCallback() { @@ -5886,6 +5909,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @see #onAttachedToWindow() */ protected void onDetachedFromWindow() { + removeUnsetPressCallback(); removeLongPressCallback(); destroyDrawingCache(); } @@ -7312,6 +7336,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * Sets the background color for this view. * @param color the color of the background */ + @RemotableViewMethod public void setBackgroundColor(int color) { setBackgroundDrawable(new ColorDrawable(color)); } @@ -7322,6 +7347,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @param resid The identifier of the resource. * @attr ref android.R.styleable#View_background */ + @RemotableViewMethod public void setBackgroundResource(int resid) { if (resid != 0 && resid == mBackgroundResource) { return; @@ -8731,7 +8757,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility boolean clampedX, boolean clampedY) { // Intentionally empty. } - + /** * A MeasureSpec encapsulates the layout requirements passed from parent to child. * Each MeasureSpec represents a requirement for either the width or the height. @@ -9182,12 +9208,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility boolean mRecomputeGlobalAttributes; /** - * Set to true when attributes (like mKeepScreenOn) need to be - * recomputed. - */ - boolean mAttributesChanged; - - /** * Set during a traveral if any views want to keep the screen on. */ boolean mKeepScreenOn; diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 0663215..d05416d 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1065,6 +1065,36 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } return false; } + + /** + * {@inheritDoc} + * + * @hide + */ + @Override + public void dispatchStartTemporaryDetach() { + super.dispatchStartTemporaryDetach(); + final int count = mChildrenCount; + final View[] children = mChildren; + for (int i = 0; i < count; i++) { + children[i].dispatchStartTemporaryDetach(); + } + } + + /** + * {@inheritDoc} + * + * @hide + */ + @Override + public void dispatchFinishTemporaryDetach() { + super.dispatchFinishTemporaryDetach(); + final int count = mChildrenCount; + final View[] children = mChildren; + for (int i = 0; i < count; i++) { + children[i].dispatchFinishTemporaryDetach(); + } + } /** * {@inheritDoc} diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 067241a..67543aa 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -375,6 +375,7 @@ public class WebView extends AbsoluteLayout private static final int PREVENT_DRAG_NO = 0; private static final int PREVENT_DRAG_MAYBE_YES = 1; private static final int PREVENT_DRAG_YES = 2; + private static final int PREVENT_DRAG_CANCEL = 3; private int mPreventDrag = PREVENT_DRAG_NO; // by default mPreventLongPress is false. If it is true, long press event @@ -4437,8 +4438,11 @@ public class WebView extends AbsoluteLayout } // pass the touch events from UI thread to WebCore thread - if (mForwardTouchEvents && (action != MotionEvent.ACTION_MOVE - || eventTime - mLastSentTouchTime > mCurrentTouchInterval)) { + if (mForwardTouchEvents + && (action != MotionEvent.ACTION_MOVE || eventTime + - mLastSentTouchTime > mCurrentTouchInterval) + && (action == MotionEvent.ACTION_DOWN + || mPreventDrag != PREVENT_DRAG_CANCEL)) { WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData(); ted.mAction = action; ted.mX = viewToContentX((int) x + mScrollX); @@ -5719,12 +5723,17 @@ public class WebView extends AbsoluteLayout break; } case SWITCH_TO_SHORTPRESS: { - // if mPreventDrag is not confirmed, treat it as no so that - // it won't block panning the page. + // if mPreventDrag is not confirmed, cancel it so that it + // won't block panning the page. if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) { - mPreventDrag = PREVENT_DRAG_NO; + mPreventDrag = PREVENT_DRAG_CANCEL; mPreventLongPress = false; mPreventDoubleTap = false; + // remove the pending TOUCH_EVENT and send a cancel + mWebViewCore.removeMessages(EventHub.TOUCH_EVENT); + WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData(); + ted.mAction = MotionEvent.ACTION_CANCEL; + mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); } if (mTouchMode == TOUCH_INIT_MODE) { mTouchMode = mFullScreenHolder == null @@ -5751,7 +5760,7 @@ public class WebView extends AbsoluteLayout // don't set it. ted.mMetaState = 0; mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); - } else if (mPreventDrag == PREVENT_DRAG_NO) { + } else if (mPreventDrag != PREVENT_DRAG_YES) { mTouchMode = TOUCH_DONE_MODE; if (mFullScreenHolder == null) { performLongClick(); @@ -5762,13 +5771,18 @@ public class WebView extends AbsoluteLayout } case RELEASE_SINGLE_TAP: { if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) { - // if mPreventDrag is not confirmed, treat it as - // no so that it won't block tap. - mPreventDrag = PREVENT_DRAG_NO; + // if mPreventDrag is not confirmed, cancel it so that + // it won't block panning the page. + mPreventDrag = PREVENT_DRAG_CANCEL; mPreventLongPress = false; mPreventDoubleTap = false; + // remove the pending TOUCH_EVENT and send a cancel + mWebViewCore.removeMessages(EventHub.TOUCH_EVENT); + WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData(); + ted.mAction = MotionEvent.ACTION_CANCEL; + mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); } - if (mPreventDrag == PREVENT_DRAG_NO) { + if (mPreventDrag != PREVENT_DRAG_YES) { mTouchMode = TOUCH_DONE_MODE; doShortPress(); } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 17d5bb7..9ddfeff 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1314,7 +1314,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te position, -1); } } else { - isScrap[0] = true; + isScrap[0] = true; + child.dispatchFinishTemporaryDetach(); } } else { child = mAdapter.getView(position, null, this); @@ -4145,8 +4146,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } if (mViewTypeCount == 1) { + scrap.dispatchStartTemporaryDetach(); mCurrentScrap.add(scrap); } else { + scrap.dispatchStartTemporaryDetach(); mScrapViews[viewType].add(scrap); } @@ -4165,7 +4168,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te ArrayList<View> scrapViews = mCurrentScrap; final int count = activeViews.length; - for (int i = 0; i < count; ++i) { + for (int i = count - 1; i >= 0; i--) { final View victim = activeViews[i]; if (victim != null) { int whichScrap = ((AbsListView.LayoutParams) victim.getLayoutParams()).viewType; @@ -4181,6 +4184,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te if (multipleScraps) { scrapViews = mScrapViews[whichScrap]; } + victim.dispatchStartTemporaryDetach(); scrapViews.add(victim); if (hasListener) { diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index 9fcb829..4bd3a82 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -658,14 +658,13 @@ public class LinearLayout extends ViewGroup { // Optimization: don't bother measuring children who are going to use // leftover space. These views will get measured again down below if // there is any leftover space. - final int totalLength = mTotalLength; - mTotalLength = Math.max(totalLength, totalLength + lp.leftMargin + lp.rightMargin); + mTotalLength += lp.leftMargin + lp.rightMargin; // Baseline alignment requires to measure widgets to obtain the - // baseline offset (in particular for TextViews). - // The following defeats the optimization mentioned above. - // Allow the child to use as much space as it wants because we - // can shrink things later (and re-measure). + // baseline offset (in particular for TextViews). The following + // defeats the optimization mentioned above. Allow the child to + // use as much space as it wants because we can shrink things + // later (and re-measure). if (baselineAligned) { final int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); child.measure(freeSpec, freeSpec); @@ -695,9 +694,8 @@ public class LinearLayout extends ViewGroup { } final int childWidth = child.getMeasuredWidth(); - final int totalLength = mTotalLength; - mTotalLength = Math.max(totalLength, totalLength + childWidth + lp.leftMargin + - lp.rightMargin + getNextLocationOffset(child)); + mTotalLength += childWidth + lp.leftMargin + lp.rightMargin + + getNextLocationOffset(child); if (useLargestChild) { largestChildWidth = Math.max(childWidth, largestChildWidth); @@ -782,9 +780,8 @@ public class LinearLayout extends ViewGroup { final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); - final int totalLength = mTotalLength; - mTotalLength = Math.max(totalLength, totalLength + largestChildWidth + - lp.leftMargin + lp.rightMargin + getNextLocationOffset(child)); + mTotalLength += largestChildWidth + lp.leftMargin + lp.rightMargin + + getNextLocationOffset(child); } } @@ -854,9 +851,8 @@ public class LinearLayout extends ViewGroup { } } - final int totalLength = mTotalLength; - mTotalLength = Math.max(totalLength, totalLength + child.getMeasuredWidth() + - lp.leftMargin + lp.rightMargin + getNextLocationOffset(child)); + mTotalLength += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin + + getNextLocationOffset(child); boolean matchHeightLocally = heightMode != MeasureSpec.EXACTLY && lp.height == LayoutParams.MATCH_PARENT; diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 2feed03..8d688a5 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -1485,7 +1485,6 @@ public class ListView extends AbsListView { } // Clear out old views - //removeAllViewsInLayout(); detachAllViewsFromParent(); switch (mLayoutMode) { diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 52ed11d..fd24058 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Rect; import android.util.AttributeSet; +import android.util.Log; import android.view.FocusFinder; import android.view.KeyEvent; import android.view.MotionEvent; @@ -51,6 +52,8 @@ import java.util.List; * <p>ScrollView only supports vertical scrolling. */ public class ScrollView extends FrameLayout { + private static final String TAG = "ScrollView"; + static final int ANIMATED_SCROLL_GAP = 250; static final float MAX_SCROLL_FACTOR = 0.5f; @@ -112,6 +115,18 @@ public class ScrollView extends FrameLayout { private int mTouchSlop; private int mMinimumVelocity; private int mMaximumVelocity; + + /** + * ID of the active pointer. This is used to retain consistency during + * drags/flings if multiple pointers are used. + */ + private int mActivePointerId = INVALID_POINTER; + + /** + * Sentinel value for no current active pointer. + * Used by {@link #mActivePointerId}. + */ + private static final int INVALID_POINTER = -1; public ScrollView(Context context) { this(context, null); @@ -360,6 +375,17 @@ public class ScrollView extends FrameLayout { return handled; } + private boolean inChild(int x, int y) { + if (getChildCount() > 0) { + final View child = getChildAt(0); + return !(y < child.getTop() + || y >= child.getBottom() + || x < child.getLeft() + || x >= child.getRight()); + } + return false; + } + @Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* @@ -378,10 +404,8 @@ public class ScrollView extends FrameLayout { return true; } - final float y = ev.getY(); - - switch (action) { - case MotionEvent.ACTION_MOVE: + switch (action & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_MOVE: { /* * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check * whether the user has moved far enough from his original down touch. @@ -391,16 +415,29 @@ public class ScrollView extends FrameLayout { * Locally do absolute value. mLastMotionY is set to the y value * of the down event. */ + final int pointerIndex = ev.findPointerIndex(mActivePointerId); + final float y = ev.getY(pointerIndex); final int yDiff = (int) Math.abs(y - mLastMotionY); if (yDiff > mTouchSlop) { mIsBeingDragged = true; mLastMotionY = y; } break; + } - case MotionEvent.ACTION_DOWN: - /* Remember location of down touch */ + case MotionEvent.ACTION_DOWN: { + final float y = ev.getY(); + if (!inChild((int)ev.getX(), (int)y)) { + mIsBeingDragged = false; + break; + } + + /* + * Remember location of down touch. + * ACTION_DOWN always refers to pointer index 0. + */ mLastMotionY = y; + mActivePointerId = ev.getPointerId(0); /* * If being flinged and user touches the screen, initiate drag; @@ -409,11 +446,16 @@ public class ScrollView extends FrameLayout { */ mIsBeingDragged = !mScroller.isFinished(); break; + } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: /* Release the drag */ mIsBeingDragged = false; + mActivePointerId = INVALID_POINTER; + break; + case MotionEvent.ACTION_POINTER_UP: + onSecondaryPointerUp(ev); break; } @@ -439,10 +481,9 @@ public class ScrollView extends FrameLayout { mVelocityTracker.addMovement(ev); final int action = ev.getAction(); - final float y = ev.getY(); - switch (action) { - case MotionEvent.ACTION_DOWN: + switch (action & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: { /* * If being flinged and user touches, stop the fling. isFinished * will be false if being flinged. @@ -451,41 +492,78 @@ public class ScrollView extends FrameLayout { mScroller.abortAnimation(); } + final float y = ev.getY(); + if (!(mIsBeingDragged = inChild((int)ev.getX(), (int)y))) { + return false; + } + // Remember where the motion event started mLastMotionY = y; + mActivePointerId = ev.getPointerId(0); break; + } case MotionEvent.ACTION_MOVE: - // Scroll to follow the motion event - final int deltaY = (int) (mLastMotionY - y); - mLastMotionY = y; + if (mIsBeingDragged) { + // Scroll to follow the motion event + final int activePointerIndex = ev.findPointerIndex(mActivePointerId); + final float y = ev.getY(activePointerIndex); + final int deltaY = (int) (mLastMotionY - y); + mLastMotionY = y; - overscrollBy(0, deltaY, 0, mScrollY, 0, getScrollRange(), - 0, getOverscrollMax()); + overscrollBy(0, deltaY, 0, mScrollY, 0, getScrollRange(), + 0, getOverscrollMax()); + } break; - case MotionEvent.ACTION_UP: - final VelocityTracker velocityTracker = mVelocityTracker; - velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); - int initialVelocity = (int) velocityTracker.getYVelocity(); - - if (getChildCount() > 0) { - if ((Math.abs(initialVelocity) > mMinimumVelocity)) { - fling(-initialVelocity); - } else { - final int bottom = getScrollRange(); - if (mScroller.springback(mScrollX, mScrollY, 0, 0, 0, bottom)) { - invalidate(); + case MotionEvent.ACTION_UP: + if (mIsBeingDragged) { + final VelocityTracker velocityTracker = mVelocityTracker; + velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); + int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId); + + if (getChildCount() > 0) { + if ((Math.abs(initialVelocity) > mMinimumVelocity)) { + fling(-initialVelocity); + } else { + final int bottom = getScrollRange(); + if (mScroller.springback(mScrollX, mScrollY, 0, 0, 0, bottom)) { + invalidate(); + } } } - } - if (mVelocityTracker != null) { - mVelocityTracker.recycle(); - mVelocityTracker = null; + mActivePointerId = INVALID_POINTER; + mIsBeingDragged = false; + + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } } + break; + case MotionEvent.ACTION_POINTER_UP: + onSecondaryPointerUp(ev); + break; } return true; } + private void onSecondaryPointerUp(MotionEvent ev) { + final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> + MotionEvent.ACTION_POINTER_INDEX_SHIFT; + final int pointerId = ev.getPointerId(pointerIndex); + if (pointerId == mActivePointerId) { + // This was our active pointer going up. Choose a new + // active pointer and adjust accordingly. + // TODO: Make this decision more intelligent. + final int newPointerIndex = pointerIndex == 0 ? 1 : 0; + mLastMotionY = ev.getY(newPointerIndex); + mActivePointerId = ev.getPointerId(newPointerIndex); + if (mVelocityTracker != null) { + mVelocityTracker.clear(); + } + } + } + @Override protected void onOverscrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index cea6d3b..951563a 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -198,6 +198,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private boolean mFreezesText; private boolean mFrozenWithFocus; private boolean mTemporaryDetach; + private boolean mDispatchTemporaryDetach; private boolean mEatTouchRelease = false; private boolean mScrolled = false; @@ -6371,14 +6372,30 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mBlink.postAtTime(mBlink, mShowCursor + BLINK); } + /** + * @hide + */ + @Override + public void dispatchFinishTemporaryDetach() { + mDispatchTemporaryDetach = true; + super.dispatchFinishTemporaryDetach(); + mDispatchTemporaryDetach = false; + } + @Override public void onStartTemporaryDetach() { - mTemporaryDetach = true; + super.onStartTemporaryDetach(); + // Only track when onStartTemporaryDetach() is called directly, + // usually because this instance is an editable field in a list + if (!mDispatchTemporaryDetach) mTemporaryDetach = true; } @Override public void onFinishTemporaryDetach() { - mTemporaryDetach = false; + super.onFinishTemporaryDetach(); + // Only track when onStartTemporaryDetach() is called directly, + // usually because this instance is an editable field in a list + if (!mDispatchTemporaryDetach) mTemporaryDetach = false; } @Override diff --git a/core/java/com/android/internal/app/TetherActivity.java b/core/java/com/android/internal/app/TetherActivity.java index a48ccf9..5d71231 100644 --- a/core/java/com/android/internal/app/TetherActivity.java +++ b/core/java/com/android/internal/app/TetherActivity.java @@ -141,7 +141,7 @@ public class TetherActivity extends AlertActivity implements } } else { for (String t : tethered) { - if (!cm.untether("ppp0")) { + if (!cm.untether(t)) { error = true; } } diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 430c4b8..d66f513 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -302,7 +302,7 @@ <!-- Specify whether an activity should be finished when a "close system windows" request has been made. This happens, for example, when the home key is pressed, when the device is locked, when a system - dialog like recent apps is displayed, etc. --> + dialog showing recent applications is displayed, etc. --> <attr name="finishOnCloseSystemDialogs" format="boolean" /> <!-- Specify whether an activity's task should be cleared when it @@ -487,7 +487,7 @@ the display will rotate based on how the user moves the device. --> <enum name="sensor" value="4" /> <!-- Always ignore orientation determined by orientation sensor: - tthe display will not rotate when the user moves the device. --> + the display will not rotate when the user moves the device. --> <enum name="nosensor" value="5" /> </attr> @@ -523,7 +523,7 @@ <flag name="keyboard" value="0x0010" /> <!-- The keyboard or navigation accessibility has changed, for example the user has slid the keyboard out to expose it. Note that - inspite of its name, this applied to any accessibility: keyboard + despite its name, this applied to any accessibility: keyboard or navigation. --> <flag name="keyboardHidden" value="0x0020" /> <!-- The navigation type has changed. Should never normally happen. --> @@ -593,12 +593,15 @@ <attr name="backupAgent" format="string" /> <!-- Whether to allow the application to participate in backup - infrastructure. - STOPSHIP: more explanation --> + infrastructure. If this attribute is set to <code>false</code>, no backup + of the application will ever be performed, even by a full-system backup that + would otherwise cause all application data to be saved via adb. The + default value of this attribute is <code>true</code>. --> <attr name="allowBackup" format="boolean" /> <!-- Whether the application in question should be terminated after its - settings have been restored. The default is to do so. --> + settings have been restored. The default is <code>true</code>, + which means to do so. --> <attr name="killAfterRestore" format="boolean" /> <!-- Whether the application needs to have its own Application subclass @@ -606,15 +609,25 @@ Application class to avoid interference with application logic. --> <attr name="restoreNeedsApplication" format="boolean" /> + <!-- Indicate that the application is prepared to attempt a restore of any + backed-up dataset, even if the backup is apparently from a newer version + of the application than is currently installed on the device. Setting + this attribute to <code>true</code> will permit the Backup Manager to + attempt restore even when a version mismatch suggests that the data are + incompatible. <em>Use with caution!</em> + + <p>The default value of this attribute is <code>false</code>. --> + <attr name="restoreAnyVersion" format="boolean" /> + <!-- The default install location defined by an application. --> <attr name="installLocation"> <!-- Let the system decide ideal install location --> <enum name="auto" value="0" /> - <!-- Explicitly request to be installed on internal phone storate + <!-- Explicitly request to be installed on internal phone storage only. --> <enum name="internalOnly" value="1" /> - <!-- Prefer to be installed on sdcard. There is no guarantee that - the system will honour this request. The application might end + <!-- Prefer to be installed on SD card. There is no guarantee that + the system will honor this request. The application might end up being installed on internal storage if external media is unavailable or too full. --> <enum name="preferExternal" value="2" /> @@ -700,6 +713,7 @@ <attr name="allowBackup" /> <attr name="killAfterRestore" /> <attr name="restoreNeedsApplication" /> + <attr name="restoreAnyVersion" /> <attr name="neverEncrypt" /> </declare-styleable> @@ -815,7 +829,7 @@ <!-- The <code>uses-feature</code> tag specifies a specific feature used by the application. For example an application might specify that it requires - specific version of open gl. Multiple such attribute + specific version of OpenGL. Multiple such attribute values can be specified by the application. <p>This appears as a child tag of the root @@ -1361,7 +1375,7 @@ {@link android.content.Intent#setData Intent.setData()}. <p><em>Note: scheme and host name matching in the Android framework is case-sensitive, unlike the formal RFC. As a result, - Uris here should always be normalized to use lower case letters + URIs here should always be normalized to use lower case letters for these elements (as well as other proper Uri normalization).</em></p> --> <attr name="data" format="string" /> <!-- The MIME type name to assign to the Intent, as per diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index b334337..5da8e85 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1231,6 +1231,7 @@ <public type="attr" name="safeMode" id="0x010102b8" /> <public type="attr" name="webTextViewStyle" id="0x010102b9" /> <public type="attr" name="overscrollMode" id="0x010102ba" /> + <public type="attr" name="restoreAnyVersion" id="0x010102bb" /> <public type="anim" name="cycle_interpolator" id="0x010a000c" /> diff --git a/libs/audioflinger/AudioPolicyManagerBase.cpp b/libs/audioflinger/AudioPolicyManagerBase.cpp index 42b6508..7b866c7 100644 --- a/libs/audioflinger/AudioPolicyManagerBase.cpp +++ b/libs/audioflinger/AudioPolicyManagerBase.cpp @@ -82,8 +82,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev // keep track of SCO device address mScoDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN); #ifdef WITH_A2DP - if ((mA2dpDeviceAddress == mScoDeviceAddress) && - (mPhoneState != AudioSystem::MODE_NORMAL)) { + if (mA2dpOutput != 0 && + mPhoneState != AudioSystem::MODE_NORMAL) { mpClientInterface->suspendOutput(mA2dpOutput); } #endif @@ -116,8 +116,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev if (AudioSystem::isBluetoothScoDevice(device)) { mScoDeviceAddress = ""; #ifdef WITH_A2DP - if ((mA2dpDeviceAddress == mScoDeviceAddress) && - (mPhoneState != AudioSystem::MODE_NORMAL)) { + if (mA2dpOutput != 0 && + mPhoneState != AudioSystem::MODE_NORMAL) { mpClientInterface->restoreOutput(mA2dpOutput); } #endif @@ -275,10 +275,8 @@ void AudioPolicyManagerBase::setPhoneState(int state) newDevice = getNewDevice(mHardwareOutput, false); #ifdef WITH_A2DP checkOutputForAllStrategies(newDevice); - // suspend A2DP output if SCO device address is the same as A2DP device address. - // no need to check that a SCO device is actually connected as mScoDeviceAddress == "" - // if none is connected and the test below will fail. - if (mA2dpDeviceAddress == mScoDeviceAddress) { + // suspend A2DP output if a SCO device is present. + if (mA2dpOutput != 0 && mScoDeviceAddress != "") { if (oldState == AudioSystem::MODE_NORMAL) { mpClientInterface->suspendOutput(mA2dpOutput); } else if (state == AudioSystem::MODE_NORMAL) { @@ -1191,7 +1189,7 @@ status_t AudioPolicyManagerBase::handleA2dpConnection(AudioSystem::audio_devices } AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput); - if (mA2dpDeviceAddress == mScoDeviceAddress) { + if (mScoDeviceAddress != "") { // It is normal to suspend twice if we are both in call, // and have the hardware audio output routed to BT SCO if (mPhoneState != AudioSystem::MODE_NORMAL) { @@ -1556,9 +1554,9 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t usleep(outputDesc->mLatency*2*1000); } #ifdef WITH_A2DP - // suspend A2D output if SCO device is selected + // suspend A2DP output if SCO device is selected if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)device)) { - if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) { + if (mA2dpOutput != 0) { mpClientInterface->suspendOutput(mA2dpOutput); } } @@ -1573,7 +1571,7 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t #ifdef WITH_A2DP // if disconnecting SCO device, restore A2DP output if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)prevDevice)) { - if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) { + if (mA2dpOutput != 0) { LOGV("restore A2DP output"); mpClientInterface->restoreOutput(mA2dpOutput); } diff --git a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp index f1f7194..6d6e408 100644 --- a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp +++ b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp @@ -160,14 +160,25 @@ status_t MP3Decoder::read( mConfig->outputFrameSize = buffer->size() / sizeof(int16_t); mConfig->pOutputBuffer = static_cast<int16_t *>(buffer->data()); - if (pvmp3_framedecoder(mConfig, mDecoderBuf) != NO_DECODING_ERROR) { - buffer->release(); - buffer = NULL; + ERROR_CODE decoderErr; + if ((decoderErr = pvmp3_framedecoder(mConfig, mDecoderBuf)) + != NO_DECODING_ERROR) { + LOGV("mp3 decoder returned error %d", decoderErr); - mInputBuffer->release(); - mInputBuffer = NULL; + if (decoderErr != NO_ENOUGH_MAIN_DATA_ERROR) { + buffer->release(); + buffer = NULL; + + mInputBuffer->release(); + mInputBuffer = NULL; + + return UNKNOWN_ERROR; + } - return UNKNOWN_ERROR; + // This is recoverable, just ignore the current frame and + // play silence instead. + memset(buffer->data(), 0, mConfig->outputFrameSize); + mConfig->inputBufferUsedLength = mInputBuffer->range_length(); } buffer->set_range( diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index a5a518b..1e9c312 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -60,14 +60,14 @@ <!-- user interface sound effects --> <integer name="def_power_sounds_enabled">1</integer> - <string name="def_low_battery_sound">/system/media/ui/LowBattery.ogg</string> + <string name="def_low_battery_sound" translatable="false">/system/media/ui/LowBattery.ogg</string> <integer name="def_dock_sounds_enabled">0</integer> - <string name="def_desk_dock_sound">/system/media/audio/ui/Dock.ogg</string> - <string name="def_desk_undock_sound">/system/media/audio/ui/Undock.ogg</string> - <string name="def_car_dock_sound">/system/media/audio/ui/Dock.ogg</string> - <string name="def_car_undock_sound">/system/media/audio/ui/Undock.ogg</string> + <string name="def_desk_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> + <string name="def_desk_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string> + <string name="def_car_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> + <string name="def_car_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string> <integer name="def_lockscreen_sounds_enabled">0</integer> - <string name="def_lock_sound">/system/media/audio/ui/Lock.ogg</string> - <string name="def_unlock_sound">/system/media/audio/ui/Unlock.ogg</string> + <string name="def_lock_sound" translatable="false">/system/media/audio/ui/Lock.ogg</string> + <string name="def_unlock_sound" translatable="false">/system/media/audio/ui/Unlock.ogg</string> </resources> diff --git a/preloaded-classes b/preloaded-classes index 092b539..aaae440 100644 --- a/preloaded-classes +++ b/preloaded-classes @@ -1,850 +1,1040 @@ # Classes which are preloaded by com.android.internal.os.ZygoteInit. +# Automatically generated by frameworks/base/tools/preload/WritePreloadedClassFile.java. +# MIN_LOAD_TIME_MICROS=1250 android.R$styleable +android.accounts.AccountManager +android.accounts.AccountManager$4 +android.accounts.AccountManager$6 +android.accounts.AccountManager$AmsTask +android.accounts.AccountManager$BaseFutureTask +android.accounts.AccountManager$Future2Task +android.accounts.AuthenticatorDescription +android.accounts.IAccountAuthenticatorResponse$Stub +android.accounts.IAccountManager$Stub +android.accounts.IAccountManagerResponse$Stub android.app.Activity android.app.ActivityGroup -android.app.ActivityManager$MemoryInfo$1 +android.app.ActivityManager$RunningAppProcessInfo +android.app.ActivityManager$RunningServiceInfo android.app.ActivityManagerNative android.app.ActivityManagerProxy android.app.ActivityThread -android.app.ActivityThread$ActivityRecord -android.app.ActivityThread$AppBindData android.app.ActivityThread$ApplicationThread -android.app.ActivityThread$ContextCleanupInfo -android.app.ActivityThread$GcIdler android.app.ActivityThread$H -android.app.ActivityThread$Idler -android.app.ActivityThread$PackageInfo -android.app.ActivityThread$PackageInfo$ReceiverDispatcher -android.app.ActivityThread$PackageInfo$ReceiverDispatcher$InnerReceiver -android.app.ActivityThread$PackageInfo$ServiceDispatcher -android.app.ActivityThread$PackageInfo$ServiceDispatcher$InnerConnection -android.app.ActivityThread$ProviderRecord -android.app.ActivityThread$ProviderRefCount android.app.AlertDialog -android.app.Application -android.app.ApplicationLoaders android.app.ApplicationThreadNative android.app.ContextImpl -android.app.ContextImpl$ApplicationContentResolver android.app.ContextImpl$ApplicationPackageManager -android.app.ContextImpl$ApplicationPackageManager$PackageRemovedReceiver -android.app.ContextImpl$ApplicationPackageManager$ResourceName -android.app.ContextImpl$SharedPreferencesImpl +android.app.DatePickerDialog android.app.Dialog android.app.ExpandableListActivity android.app.IActivityManager -android.app.IActivityManager$ContentProviderHolder$1 +android.app.IActivityManager$ContentProviderHolder android.app.IAlarmManager$Stub -android.app.IAlarmManager$Stub$Proxy -android.app.IApplicationThread -android.app.INotificationManager$Stub -android.app.INotificationManager$Stub$Proxy -android.app.ISearchManager -android.app.ISearchManager$Stub -android.app.ISearchManager$Stub$Proxy +android.app.IDevicePolicyManager$Stub +android.app.IStatusBar$Stub +android.app.ITransientNotification$Stub android.app.Instrumentation -android.app.IntentReceiverLeaked +android.app.IntentService android.app.ListActivity -android.app.ListActivity$1 -android.app.ListActivity$2 android.app.LocalActivityManager android.app.Notification -android.app.NotificationManager android.app.PendingIntent -android.app.PendingIntent$1 android.app.ProgressDialog -android.app.ReceiverRestrictedContext android.app.ResultInfo -android.app.ResultInfo$1 android.app.SearchDialog android.app.SearchDialog$SearchAutoComplete +android.app.SearchDialog$SearchBar +android.app.SearchableInfo android.app.Service -android.app.ServiceConnectionLeaked +android.app.SuggestionsAdapter +android.app.SuperNotCalledException android.app.TabActivity -android.content.BroadcastReceiver -android.content.ComponentCallbacks +android.app.TimePickerDialog +android.appwidget.AppWidgetHost +android.appwidget.AppWidgetHostView +android.appwidget.AppWidgetHostView$ParcelableSparseArray +android.appwidget.AppWidgetManager +android.appwidget.AppWidgetProvider +android.appwidget.AppWidgetProviderInfo +android.backup.BackupDataInput +android.backup.BackupDataInput$EntityHeader +android.backup.BackupDataOutput +android.backup.BackupHelperAgent +android.backup.BackupHelperDispatcher +android.backup.BackupHelperDispatcher$Header +android.backup.FileBackupHelperBase +android.backup.IBackupManager$Stub +android.backup.RestoreSet +android.bluetooth.BluetoothAdapter +android.bluetooth.BluetoothAudioGateway +android.bluetooth.BluetoothSocket +android.bluetooth.BluetoothUuid +android.bluetooth.HeadsetBase +android.bluetooth.IBluetooth +android.bluetooth.IBluetooth$Stub +android.bluetooth.IBluetoothA2dp +android.bluetooth.IBluetoothA2dp$Stub +android.bluetooth.IBluetoothHeadset$Stub +android.bluetooth.ScoSocket android.content.ComponentName -android.content.ComponentName$1 android.content.ContentProvider$Transport -android.content.ContentProviderProxy -android.content.ContentQueryMap -android.content.ContentQueryMap$1 +android.content.ContentProviderOperation +android.content.ContentProviderResult android.content.ContentResolver -android.content.ContentResolver$CursorWrapperInner android.content.ContentValues android.content.Context android.content.ContextWrapper -android.content.DialogInterface -android.content.DialogInterface$OnCancelListener -android.content.DialogInterface$OnDismissListener -android.content.IContentProvider -android.content.IContentService android.content.IContentService$Stub +android.content.ISyncContext$Stub android.content.Intent -android.content.Intent$1 android.content.IntentFilter +android.content.IntentSender android.content.SearchRecentSuggestionsProvider android.content.SyncResult android.content.SyncStats android.content.UriMatcher android.content.pm.ActivityInfo -android.content.pm.ActivityInfo$1 android.content.pm.ApplicationInfo -android.content.pm.ApplicationInfo$1 -android.content.pm.ComponentInfo -android.content.pm.IPackageManager +android.content.pm.ConfigurationInfo +android.content.pm.IPackageDataObserver$Stub android.content.pm.IPackageManager$Stub android.content.pm.IPackageManager$Stub$Proxy +android.content.pm.IPackageStatsObserver$Stub android.content.pm.InstrumentationInfo -android.content.pm.InstrumentationInfo$1 -android.content.pm.PackageItemInfo +android.content.pm.PackageInfo android.content.pm.PackageManager android.content.pm.PackageManager$NameNotFoundException +android.content.pm.PackageStats android.content.pm.PermissionInfo android.content.pm.ProviderInfo -android.content.pm.ProviderInfo$1 -android.content.pm.ResolveInfo$1 -android.content.pm.ServiceInfo$1 +android.content.pm.ResolveInfo +android.content.pm.ResolveInfo$DisplayNameComparator +android.content.pm.Signature +android.content.res.AssetFileDescriptor +android.content.res.AssetFileDescriptor$1 android.content.res.AssetManager android.content.res.AssetManager$AssetInputStream android.content.res.ColorStateList android.content.res.ColorStateList$1 +android.content.res.CompatibilityInfo +android.content.res.CompatibilityInfo$1 android.content.res.Configuration +android.content.res.Configuration$1 android.content.res.Resources -android.content.res.Resources$Theme +android.content.res.Resources$1 android.content.res.StringBlock android.content.res.TypedArray android.content.res.XmlBlock android.content.res.XmlBlock$Parser +android.content.res.XmlResourceParser android.database.AbstractCursor -android.database.AbstractCursor$SelfContentObserver android.database.AbstractWindowedCursor -android.database.BulkCursorNative -android.database.BulkCursorProxy android.database.BulkCursorToCursorAdaptor -android.database.ContentObservable -android.database.ContentObserver$Transport -android.database.Cursor +android.database.CharArrayBuffer android.database.CursorToBulkCursorAdaptor -android.database.CursorToBulkCursorAdaptor$ContentObserverProxy android.database.CursorWindow +android.database.CursorWindow$1 android.database.CursorWrapper -android.database.DataSetObservable -android.database.IContentObserver$Stub$Proxy -android.database.MergeCursor +android.database.MatrixCursor +android.database.sqlite.SQLiteClosable +android.database.sqlite.SQLiteCompiledSql +android.database.sqlite.SQLiteContentHelper android.database.sqlite.SQLiteCursor android.database.sqlite.SQLiteDatabase -android.database.sqlite.SQLiteDatabase$CursorFactory -android.database.sqlite.SQLiteDirectCursorDriver +android.database.sqlite.SQLiteDebug +android.database.sqlite.SQLiteDebug$PagerStats +android.database.sqlite.SQLiteProgram android.database.sqlite.SQLiteQuery +android.database.sqlite.SQLiteQueryBuilder android.database.sqlite.SQLiteStatement -android.ddm.DdmHandleAppName +android.database.sqlite.SqliteWrapper android.ddm.DdmHandleExit android.ddm.DdmHandleHeap android.ddm.DdmHandleHello android.ddm.DdmHandleNativeHeap +android.ddm.DdmHandleProfiling android.ddm.DdmHandleThread android.ddm.DdmRegister +android.debug.JNITest +android.emoji.EmojiFactory +android.graphics.AvoidXfermode android.graphics.Bitmap +android.graphics.Bitmap$1 +android.graphics.Bitmap$CompressFormat +android.graphics.Bitmap$Config +android.graphics.BitmapFactory +android.graphics.BitmapFactory$Options android.graphics.BitmapShader +android.graphics.BlurMaskFilter +android.graphics.Camera android.graphics.Canvas -android.graphics.Canvas$EdgeType +android.graphics.Canvas$VertexMode android.graphics.Color +android.graphics.ColorFilter +android.graphics.ColorMatrixColorFilter +android.graphics.ComposePathEffect +android.graphics.ComposeShader +android.graphics.CornerPathEffect +android.graphics.DashPathEffect +android.graphics.DiscretePathEffect +android.graphics.DrawFilter +android.graphics.EmbossMaskFilter android.graphics.Interpolator +android.graphics.LayerRasterizer +android.graphics.LightingColorFilter android.graphics.LinearGradient +android.graphics.MaskFilter android.graphics.Matrix -android.graphics.Matrix$ScaleToFit +android.graphics.Movie android.graphics.NinePatch android.graphics.Paint +android.graphics.Paint$Align +android.graphics.Paint$Cap +android.graphics.Paint$FontMetrics +android.graphics.Paint$FontMetricsInt +android.graphics.Paint$Join +android.graphics.Paint$Style android.graphics.PaintFlagsDrawFilter android.graphics.Path -android.graphics.Path$Direction +android.graphics.Path$FillType +android.graphics.PathDashPathEffect +android.graphics.PathEffect +android.graphics.PathMeasure android.graphics.Picture -android.graphics.PorterDuff +android.graphics.PixelFormat +android.graphics.PixelXorXfermode +android.graphics.Point +android.graphics.PointF android.graphics.PorterDuff$Mode +android.graphics.PorterDuffColorFilter android.graphics.PorterDuffXfermode +android.graphics.RadialGradient +android.graphics.Rasterizer android.graphics.Rect +android.graphics.Rect$1 android.graphics.RectF +android.graphics.RectF$1 android.graphics.Region +android.graphics.Region$1 android.graphics.Region$Op +android.graphics.RegionIterator android.graphics.Shader android.graphics.Shader$TileMode +android.graphics.SumPathEffect +android.graphics.SweepGradient +android.graphics.TableMaskFilter android.graphics.Typeface android.graphics.Xfermode +android.graphics.YuvImage +android.graphics.drawable.Animatable +android.graphics.drawable.AnimatedRotateDrawable +android.graphics.drawable.AnimatedRotateDrawable$AnimatedRotateState android.graphics.drawable.AnimationDrawable +android.graphics.drawable.AnimationDrawable$AnimationState android.graphics.drawable.BitmapDrawable android.graphics.drawable.BitmapDrawable$BitmapState +android.graphics.drawable.ClipDrawable +android.graphics.drawable.ClipDrawable$ClipState android.graphics.drawable.ColorDrawable android.graphics.drawable.ColorDrawable$ColorState android.graphics.drawable.Drawable +android.graphics.drawable.Drawable$Callback +android.graphics.drawable.Drawable$ConstantState android.graphics.drawable.DrawableContainer +android.graphics.drawable.DrawableContainer$DrawableContainerState android.graphics.drawable.GradientDrawable +android.graphics.drawable.GradientDrawable$GradientState +android.graphics.drawable.GradientDrawable$Orientation android.graphics.drawable.LayerDrawable android.graphics.drawable.LayerDrawable$ChildDrawable android.graphics.drawable.LayerDrawable$LayerState android.graphics.drawable.NinePatchDrawable android.graphics.drawable.NinePatchDrawable$NinePatchState -android.graphics.drawable.PaintDrawable -android.graphics.drawable.RotateDrawable -android.graphics.drawable.RotateDrawable$RotateState -android.graphics.drawable.ScaleDrawable -android.graphics.drawable.ScaleDrawable$ScaleState android.graphics.drawable.ShapeDrawable -android.graphics.drawable.ShapeDrawable$ShapeState android.graphics.drawable.StateListDrawable android.graphics.drawable.StateListDrawable$StateListState android.graphics.drawable.TransitionDrawable android.graphics.drawable.TransitionDrawable$TransitionState -android.graphics.drawable.shapes.RoundRectShape +android.graphics.utils.BoundaryPatch +android.hardware.Camera +android.hardware.Camera$Parameters +android.hardware.GeomagneticField android.hardware.SensorManager -android.inputmethodservice.KeyboardView +android.location.Address +android.location.Criteria +android.location.GeocoderParams +android.location.IGpsStatusListener$Stub android.location.ILocationManager$Stub +android.location.ILocationManager$Stub$Proxy android.location.Location +android.location.LocationManager +android.location.LocationProviderInterface +android.media.AudioFormat android.media.AudioManager +android.media.AudioRecord +android.media.AudioSystem +android.media.AudioTrack +android.media.ExifInterface android.media.IAudioService$Stub -android.media.IAudioService$Stub$Proxy +android.media.JetPlayer +android.media.MediaFile +android.media.MediaMetadataRetriever +android.media.MediaPlayer +android.media.MediaScanner +android.media.Metadata +android.media.MiniThumbFile +android.media.ThumbnailUtils +android.media.ToneGenerator +android.net.ConnectivityManager +android.net.Credentials +android.net.DhcpInfo +android.net.DhcpInfo$1 +android.net.Downloads +android.net.Downloads$ByUri +android.net.IConnectivityManager$Stub +android.net.LocalServerSocket android.net.LocalSocket -android.net.LocalSocketAddress -android.net.LocalSocketAddress$Namespace android.net.LocalSocketImpl android.net.LocalSocketImpl$SocketInputStream android.net.LocalSocketImpl$SocketOutputStream android.net.NetworkInfo android.net.NetworkInfo$DetailedState +android.net.NetworkUtils android.net.SSLCertificateSocketFactory android.net.TrafficStats android.net.Uri -android.net.Uri$1 -android.net.Uri$AbstractHierarchicalUri -android.net.Uri$AbstractPart android.net.Uri$HierarchicalUri android.net.Uri$OpaqueUri android.net.Uri$Part -android.net.Uri$Part$EmptyPart -android.net.Uri$PathPart -android.net.Uri$PathSegments -android.net.Uri$StringUri android.net.WebAddress -android.net.http.CertificateChainValidator +android.net.http.AndroidHttpClientConnection android.net.http.EventHandler +android.net.http.Headers android.net.http.HttpsConnection +android.net.http.Request android.net.http.RequestQueue +android.net.http.SslCertificate android.net.http.SslError android.net.wifi.IWifiManager$Stub +android.net.wifi.ScanResult android.net.wifi.SupplicantState android.net.wifi.WifiConfiguration android.net.wifi.WifiInfo -android.opengl.Material +android.net.wifi.WifiManager +android.net.wifi.WifiNative +android.opengl.ETC1 +android.opengl.GLES10 +android.opengl.GLES10Ext +android.opengl.GLES11 +android.opengl.GLES11Ext +android.opengl.GLES20 +android.opengl.GLSurfaceView +android.opengl.GLSurfaceView$ComponentSizeChooser +android.opengl.GLUtils +android.opengl.Matrix +android.opengl.Visibility android.os.Binder android.os.BinderProxy android.os.Build +android.os.Build$VERSION android.os.Bundle -android.os.Bundle$1 +android.os.Debug +android.os.Debug$MemoryInfo +android.os.Debug$MemoryInfo$1 +android.os.DropBoxManager$Entry android.os.Environment +android.os.FileObserver$ObserverThread android.os.FileUtils +android.os.FileUtils$FileStatus android.os.Handler -android.os.HandlerThread android.os.IBinder +android.os.IInterface android.os.IPowerManager$Stub -android.os.IPowerManager$Stub$Proxy -android.os.IServiceManager -android.os.IVibratorService$Stub -android.os.IVibratorService$Stub$Proxy android.os.Looper +android.os.MemoryFile android.os.Message -android.os.Message$1 -android.os.MessageQueue -android.os.MessageQueue$IdleHandler android.os.Parcel -android.os.PatternMatcher -android.os.PatternMatcher$1 -android.os.PowerManager -android.os.PowerManager$WakeLock -android.os.PowerManager$WakeLock$1 +android.os.Parcel$1 +android.os.ParcelFileDescriptor +android.os.ParcelFileDescriptor$1 +android.os.ParcelUuid +android.os.Parcelable +android.os.Parcelable$Creator +android.os.Power android.os.Process -android.os.ServiceManager -android.os.ServiceManagerNative -android.os.ServiceManagerProxy -android.os.Vibrator -android.preference.CheckBoxPreference +android.os.RecoverySystem +android.os.ResultReceiver +android.os.StatFs +android.os.SystemClock +android.os.SystemProperties +android.os.UEventObserver +android.os.storage.IMountService$Stub +android.os.storage.IMountService$Stub$Proxy +android.pim.EventRecurrence +android.pim.RecurrenceSet +android.preference.CheckBoxPreference$SavedState android.preference.DialogPreference -android.preference.EditTextPreference android.preference.ListPreference android.preference.Preference android.preference.PreferenceActivity android.preference.PreferenceGroup android.preference.PreferenceGroupAdapter +android.preference.PreferenceInflater android.preference.PreferenceManager android.preference.PreferenceScreen android.preference.RingtonePreference -android.sax.RootElement +android.preference.VolumePreference +android.preference.VolumePreference$SeekBarVolumizer +android.provider.Browser +android.provider.Calendar +android.provider.Calendar$Attendees +android.provider.Calendar$CalendarAlerts +android.provider.Calendar$Calendars +android.provider.Calendar$EventDays +android.provider.Calendar$Events +android.provider.Calendar$Reminders +android.provider.Contacts +android.provider.Contacts$ContactMethods +android.provider.ContactsContract +android.provider.ContactsContract$CommonDataKinds$Email +android.provider.ContactsContract$CommonDataKinds$Phone +android.provider.ContactsContract$CommonDataKinds$StructuredPostal +android.provider.ContactsContract$Contacts +android.provider.ContactsContract$Data +android.provider.ContactsContract$DataColumnsWithJoins +android.provider.ContactsContract$PhoneLookup +android.provider.ContactsContract$RawContacts +android.provider.ContactsContract$RawContacts$EntityIteratorImpl +android.provider.ContactsContract$RawContactsEntity +android.provider.Downloads +android.provider.Downloads$Impl +android.provider.MediaStore +android.provider.MediaStore$Audio$Artists +android.provider.MediaStore$Audio$Media +android.provider.MediaStore$Images$Media +android.provider.MediaStore$Images$Thumbnails +android.provider.MediaStore$Video$Media +android.provider.SearchRecentSuggestions +android.provider.Settings$Secure +android.provider.Settings$System +android.provider.UserDictionary$Words +android.security.KeyStore +android.security.Md5MessageDigest +android.security.MessageDigest +android.security.Sha1MessageDigest +android.server.BluetoothA2dpService +android.server.BluetoothEventLoop +android.server.BluetoothService +android.speech.tts.ITts$Stub +android.speech.tts.ITts$Stub$Proxy +android.speech.tts.ITtsCallback$Stub +android.speech.tts.TextToSpeech android.telephony.PhoneNumberUtils -android.telephony.PhoneStateListener android.telephony.ServiceState -android.telephony.TelephonyManager -android.telephony.SmsManager +android.telephony.SignalStrength android.telephony.SmsMessage -android.text.AutoText +android.telephony.SmsMessage$MessageClass +android.telephony.TelephonyManager +android.text.AndroidCharacter android.text.BoringLayout -android.text.BoringLayout$Metrics android.text.DynamicLayout -android.text.DynamicLayout$ChangeWatcher -android.text.Editable -android.text.Editable$Factory -android.text.GetChars -android.text.GraphicsOperations android.text.Html$HtmlParser -android.text.InputFilter +android.text.HtmlToSpannedConverter android.text.Layout -android.text.Layout$Alignment -android.text.Layout$Directions -android.text.Layout$Ellipsizer -android.text.NoCopySpan -android.text.NoCopySpan$Concrete -android.text.PackedIntVector -android.text.PackedObjectVector -android.text.ParcelableSpan android.text.Selection -android.text.Selection$END -android.text.Selection$START -android.text.SpanWatcher -android.text.Spannable -android.text.Spannable$Factory -android.text.SpannableString android.text.SpannableStringBuilder -android.text.SpannableStringInternal -android.text.Spanned android.text.SpannedString -android.text.StaticLayout -android.text.Styled -android.text.TextPaint android.text.TextUtils -android.text.TextUtils$1 -android.text.TextUtils$EllipsizeCallback -android.text.TextUtils$SimpleStringSplitter -android.text.TextUtils$TruncateAt -android.text.TextWatcher android.text.format.DateUtils +android.text.format.Formatter android.text.format.Time android.text.method.ArrowKeyMovementMethod android.text.method.BaseKeyListener -android.text.method.KeyListener +android.text.method.DigitsKeyListener +android.text.method.LinkMovementMethod android.text.method.MetaKeyKeyListener -android.text.method.MovementMethod android.text.method.QwertyKeyListener -android.text.method.ReplacementTransformationMethod android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence android.text.method.SingleLineTransformationMethod android.text.method.TextKeyListener android.text.method.TextKeyListener$Capitalize -android.text.method.TextKeyListener$SettingsObserver -android.text.method.TransformationMethod -android.text.style.AlignmentSpan -android.text.style.CharacterStyle -android.text.style.ForegroundColorSpan -android.text.style.LeadingMarginSpan -android.text.style.LineBackgroundSpan -android.text.style.LineHeightSpan -android.text.style.MetricAffectingSpan -android.text.style.ParagraphStyle -android.text.style.ReplacementSpan +android.text.style.ImageSpan +android.text.style.RelativeSizeSpan +android.text.style.ScaleXSpan android.text.style.StyleSpan -android.text.style.URLSpan -android.text.style.UpdateAppearance -android.text.style.UpdateLayout -android.text.style.WrapTogetherSpan +android.text.style.TextAppearanceSpan android.text.util.Linkify android.util.AttributeSet android.util.DisplayMetrics +android.util.EventLog +android.util.EventLog$Event android.util.FloatMath +android.util.Log +android.util.LongSparseArray +android.util.MonthDisplayHelper android.util.SparseArray +android.util.StateSet android.util.TypedValue -android.util.Xml$XmlSerializerFactory +android.util.Xml +android.util.Xml$Encoding +android.util.base64.Base64$Encoder android.view.AbsSavedState -android.view.ContextMenu -android.view.ContextMenu$ContextMenuInfo android.view.ContextThemeWrapper android.view.Display android.view.FocusFinder -android.view.FocusFinder$1 -android.view.GestureDetector$SimpleOnGestureListener -android.view.Gravity -android.view.IWindow +android.view.GestureDetector android.view.IWindow$Stub -android.view.IWindowManager android.view.IWindowManager$Stub android.view.IWindowManager$Stub$Proxy -android.view.IWindowSession android.view.IWindowSession$Stub -android.view.IWindowSession$Stub$Proxy android.view.KeyCharacterMap +android.view.KeyCharacterMap$KeyData android.view.KeyEvent -android.view.KeyEvent$1 -android.view.KeyEvent$Callback -android.view.LayoutInflater -android.view.LayoutInflater$Factory -android.view.Menu -android.view.MenuInflater -android.view.MenuItem android.view.MotionEvent -android.view.MotionEvent$1 +android.view.ScaleGestureDetector android.view.Surface -android.view.SurfaceHolder +android.view.Surface$1 +android.view.SurfaceSession android.view.SurfaceView -android.view.TouchDelegate +android.view.SurfaceView$MyWindow android.view.VelocityTracker android.view.View -android.view.View$AttachInfo android.view.View$AttachInfo$Callbacks +android.view.View$AttachInfo$InvalidateInfo android.view.View$BaseSavedState -android.view.View$BaseSavedState$1 -android.view.View$MeasureSpec -android.view.View$OnCreateContextMenuListener -android.view.View$ScrollabilityCache android.view.ViewConfiguration android.view.ViewGroup -android.view.ViewGroup$LayoutParams -android.view.ViewGroup$MarginLayoutParams -android.view.ViewManager +android.view.ViewParent android.view.ViewRoot -android.view.ViewRoot$1 -android.view.ViewRoot$InputMethodCallback -android.view.ViewRoot$RunQueue -android.view.ViewRoot$TrackballAxis android.view.ViewRoot$W android.view.ViewStub -android.view.ViewTreeObserver -android.view.ViewTreeObserver$InternalInsetsInfo -android.view.ViewTreeObserver$OnPreDrawListener android.view.Window -android.view.Window$Callback -android.view.Window$LocalWindowManager -android.view.WindowLeaked -android.view.WindowManager android.view.WindowManager$LayoutParams -android.view.WindowManager$LayoutParams$1 android.view.WindowManagerImpl -android.view.animation.AccelerateDecelerateInterpolator -android.view.animation.AlphaAnimation +android.view.accessibility.AccessibilityEvent android.view.animation.Animation android.view.animation.AnimationSet -android.view.animation.LinearInterpolator -android.view.animation.Transformation android.view.inputmethod.BaseInputConnection android.view.inputmethod.CompletionInfo -android.view.inputmethod.CompletionInfo$1 - android.view.inputmethod.EditorInfo -android.view.inputmethod.EditorInfo$1 - android.view.inputmethod.ExtractedText -android.view.inputmethod.ExtractedText$1 - -android.view.inputmethod.ExtractedTextRequest -android.view.inputmethod.ExtractedTextRequest$1 - -android.view.inputmethod.InputBinding -android.view.inputmethod.InputBinding$1 -android.view.inputmethod.InputConnection -android.view.inputmethod.InputMethod -android.view.inputmethod.InputMethod$SessionCallback - -android.view.inputmethod.InputMethodInfo -android.view.inputmethod.InputMethodInfo$1 android.view.inputmethod.InputMethodManager -android.view.inputmethod.InputMethodManager$1 -android.view.inputmethod.InputMethodManager$2 -android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper -android.view.inputmethod.InputMethodManager$H - -android.view.inputmethod.InputMethodSession -android.view.inputmethod.InputMethodSession$EventCallback android.webkit.BrowserFrame android.webkit.CacheManager android.webkit.CallbackProxy +android.webkit.ConsoleMessage$MessageLevel android.webkit.CookieManager android.webkit.CookieSyncManager +android.webkit.DownloadListener +android.webkit.FileLoader +android.webkit.GeolocationPermissions +android.webkit.GeolocationService +android.webkit.HTML5VideoViewProxy android.webkit.JWebCoreJavaBridge android.webkit.LoadListener -android.webkit.MimeTypeMap +android.webkit.PluginManager android.webkit.URLUtil -android.webkit.WebBackForwardList -android.webkit.WebHistoryItem -android.webkit.WebIconDatabase -android.webkit.WebIconDatabase$EventHandler -android.webkit.WebIconDatabase$EventHandler$1 android.webkit.WebIconDatabase$EventHandler$IconResult +android.webkit.WebIconDatabase$IconListener android.webkit.WebSettings -android.webkit.WebSettings$EventHandler -android.webkit.WebSettings$EventHandler$1 -android.webkit.WebSettings$LayoutAlgorithm -android.webkit.WebSettings$RenderPriority android.webkit.WebSettings$TextSize -android.webkit.WebSyncManager -android.webkit.WebSyncManager$SyncHandler +android.webkit.WebStorage android.webkit.WebTextView android.webkit.WebView -android.webkit.WebView$ExtendedZoomControls -android.webkit.WebView$PrivateHandler +android.webkit.WebView$DragTrackerHandler +android.webkit.WebView$ScaleDetectorListener android.webkit.WebViewCore -android.webkit.WebViewCore$CursorData -android.webkit.WebViewCore$EventHub -android.webkit.WebViewCore$EventHub$1 -android.webkit.WebViewCore$WebCoreThread -android.webkit.WebViewCore$WebCoreThread$1 +android.webkit.WebViewCore$4 +android.webkit.WebViewCore$TextSelectionData +android.webkit.WebViewCore$TouchEventData +android.webkit.WebViewCore$TouchUpData android.webkit.WebViewDatabase android.widget.AbsListView -android.widget.AbsListView$CheckForLongPress -android.widget.AbsListView$CheckForTap -android.widget.AbsListView$LayoutParams +android.widget.AbsListView$3 +android.widget.AbsListView$CheckForKeyLongPress android.widget.AbsListView$PerformClick -android.widget.AbsListView$RecycleBin android.widget.AbsListView$SavedState -android.widget.AbsListView$SavedState$1 android.widget.AbsSeekBar android.widget.AbsSpinner +android.widget.AbsSpinner$SavedState android.widget.AbsoluteLayout -android.widget.AbsoluteLayout$LayoutParams android.widget.AdapterView -android.widget.AdapterView$AdapterDataSetObserver android.widget.ArrayAdapter android.widget.AutoCompleteTextView android.widget.AutoCompleteTextView$DropDownItemClickListener android.widget.AutoCompleteTextView$DropDownListView android.widget.BaseAdapter -android.widget.Button +android.widget.BaseExpandableListAdapter android.widget.CheckBox -android.widget.Checkable -android.widget.CheckedTextView android.widget.CompoundButton +android.widget.CompoundButton$SavedState android.widget.CursorAdapter -android.widget.CursorAdapter$ChangeObserver -android.widget.CursorAdapter$MyDataSetObserver android.widget.CursorTreeAdapter +android.widget.DatePicker android.widget.EditText +android.widget.ExpandableListConnector android.widget.ExpandableListView android.widget.FrameLayout -android.widget.FrameLayout$LayoutParams -android.widget.Gallery +android.widget.GridView android.widget.HeaderViewListAdapter android.widget.ImageView android.widget.ImageView$ScaleType android.widget.LinearLayout -android.widget.LinearLayout$LayoutParams android.widget.ListView -android.widget.ListView$ArrowScrollFocusResult android.widget.ListView$SavedState -android.widget.ListView$SavedState$1 +android.widget.MediaController +android.widget.MediaController$4 +android.widget.MultiAutoCompleteTextView +android.widget.NumberPicker android.widget.PopupWindow +android.widget.PopupWindow$PopupViewContainer android.widget.ProgressBar -android.widget.RadioGroup +android.widget.ProgressBar$SavedState +android.widget.QuickContactBadge android.widget.RatingBar android.widget.RelativeLayout -android.widget.RelativeLayout$LayoutParams +android.widget.RelativeLayout$DependencyGraph$Node android.widget.RemoteViews +android.widget.ResourceCursorAdapter android.widget.ScrollBarDrawable android.widget.ScrollView -android.widget.Scroller android.widget.SeekBar android.widget.SimpleCursorAdapter android.widget.SlidingDrawer android.widget.Spinner -android.widget.Spinner$DropDownAdapter android.widget.TabHost android.widget.TabWidget android.widget.TableLayout android.widget.TableRow android.widget.TextView -android.widget.TextView$1 -android.widget.TextView$Blink -android.widget.TextView$BufferType -android.widget.TextView$ChangeWatcher -android.widget.TextView$CharWrapper -android.widget.TextView$Drawables -android.widget.TextView$InputContentType -android.widget.TextView$InputMethodState +android.widget.TextView$CommitSelectionReceiver android.widget.TextView$Marquee -android.widget.TextView$MenuHandler -android.widget.TextView$SavedState -android.widget.TextView$SavedState$1 -android.widget.ToggleButton +android.widget.TimePicker android.widget.TwoLineListItem +android.widget.VideoView android.widget.ViewAnimator android.widget.ViewSwitcher android.widget.ZoomButton +android.widget.ZoomButtonsController android.widget.ZoomControls -com.android.common.ArrayListCursor +com.android.common.AndroidHttpClient +com.android.common.DomainNameValidator com.android.common.FastXmlSerializer -com.android.common.NetworkConnectivityListener -com.android.common.NetworkConnectivityListener$State -com.android.common.XmlUtils -com.android.internal.database.SortCursor +com.android.common.HttpDateTime +com.android.common.Patterns +com.android.common.Rfc822Validator +com.android.common.userhappiness.UserHappinessSignals +com.android.internal.R$styleable +com.android.internal.app.AlertActivity +com.android.internal.app.AlertController +com.android.internal.app.AlertController$AlertParams +com.android.internal.app.AlertController$RecycleListView +com.android.internal.app.ChooserActivity +com.android.internal.app.ResolverActivity +com.android.internal.app.ResolverActivity$ResolveListAdapter com.android.internal.appwidget.IAppWidgetService$Stub -com.android.internal.http.multipart.FilePart -com.android.internal.http.multipart.MultipartEntity -com.android.internal.http.multipart.Part -com.android.internal.http.multipart.PartSource -com.android.internal.http.multipart.StringPart -com.android.internal.logging.AndroidConfig +com.android.internal.content.SyncStateContentProviderHelper +com.android.internal.graphics.NativeUtils +com.android.internal.location.DummyLocationProvider +com.android.internal.location.GpsLocationProvider com.android.internal.logging.AndroidHandler com.android.internal.os.AndroidPrintStream +com.android.internal.os.BinderInternal com.android.internal.os.BinderInternal$GcWatcher +com.android.internal.os.IResultReceiver$Stub com.android.internal.os.LoggingPrintStream com.android.internal.os.LoggingPrintStream$1 com.android.internal.os.RuntimeInit com.android.internal.os.RuntimeInit$1 com.android.internal.os.RuntimeInit$UncaughtHandler -com.android.internal.os.ZygoteInit$MethodAndArgsCaller -com.android.internal.policy.IPolicy +com.android.internal.os.SamplingProfilerIntegration +com.android.internal.os.ZygoteConnection +com.android.internal.os.ZygoteConnection$Arguments +com.android.internal.os.ZygoteInit com.android.internal.policy.PolicyManager com.android.internal.policy.impl.PhoneLayoutInflater com.android.internal.policy.impl.PhoneWindow -com.android.internal.policy.impl.PhoneWindow$1 -com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback com.android.internal.policy.impl.PhoneWindow$DecorView -com.android.internal.policy.impl.PhoneWindow$PanelFeatureState com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState -com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1 +com.android.internal.policy.impl.PhoneWindowManager com.android.internal.policy.impl.Policy -com.android.internal.telephony.Connection$DisconnectCause -com.android.internal.telephony.Connection$PostDialState -com.android.internal.telephony.IPhoneStateListener$Stub +com.android.internal.telephony.GsmAlphabet com.android.internal.telephony.ITelephony$Stub -com.android.internal.telephony.Phone -com.android.internal.telephony.Phone$DataActivityState -com.android.internal.telephony.Phone$DataState -com.android.internal.telephony.Phone$State -com.android.internal.telephony.Phone$SuppService -com.android.internal.telephony.PhoneBase -com.android.internal.telephony.PhoneStateIntentReceiver +com.android.internal.telephony.ITelephony$Stub$Proxy +com.android.internal.telephony.ITelephonyRegistry$Stub com.android.internal.telephony.IccCard$State -com.android.internal.telephony.BaseCommands -com.android.internal.telephony.CallForwardInfo -com.android.internal.telephony.CommandsInterface -com.android.internal.telephony.DriverCall -com.android.internal.telephony.DriverCall$State -com.android.internal.telephony.gsm.GsmConnection -com.android.internal.telephony.gsm.GSMPhone -com.android.internal.telephony.GsmAlphabet -com.android.internal.telephony.gsm.GsmMmiCode -com.android.internal.telephony.gsm.SimCard -com.android.internal.telephony.ISms$Stub -com.android.internal.telephony.RIL -com.android.internal.telephony.ServiceStateTracker - -com.android.internal.telephony.gsm.stk.ComprehensionTlvTag -com.android.internal.telephony.gsm.stk.ResultCode +com.android.internal.telephony.Phone$State +com.android.internal.telephony.SmsAddress +com.android.internal.telephony.SmsMessageBase +com.android.internal.telephony.gsm.GsmSmsAddress +com.android.internal.telephony.gsm.SmsMessage +com.android.internal.telephony.gsm.SmsMessage$PduParser +com.android.internal.util.ArrayUtils +com.android.internal.util.FastMath +com.android.internal.util.HanziToPinyin com.android.internal.view.IInputConnectionWrapper -com.android.internal.view.IInputConnectionWrapper$MyHandler -com.android.internal.view.IInputConnectionWrapper$SomeArgs - -com.android.internal.view.IInputContext com.android.internal.view.IInputContext$Stub -com.android.internal.view.IInputContext$Stub$Proxy - -com.android.internal.view.IInputContextCallback -com.android.internal.view.IInputContextCallback$Stub -com.android.internal.view.IInputContextCallback$Stub$Proxy - -com.android.internal.view.IInputMethod -com.android.internal.view.IInputMethod$Stub -com.android.internal.view.IInputMethod$Stub$Proxy - -com.android.internal.view.IInputMethodCallback -com.android.internal.view.IInputMethodCallback$Stub -com.android.internal.view.IInputMethodCallback$Stub$Proxy - -com.android.internal.view.IInputMethodClient -com.android.internal.view.IInputMethodClient$Stub -com.android.internal.view.IInputMethodClient$Stub$Proxy - -com.android.internal.view.IInputMethodManager com.android.internal.view.IInputMethodManager$Stub -com.android.internal.view.IInputMethodManager$Stub$Proxy - -com.android.internal.view.IInputMethodSession -com.android.internal.view.IInputMethodSession$Stub -com.android.internal.view.IInputMethodSession$Stub$Proxy - -com.android.internal.view.InputBindResult -com.android.internal.view.InputBindResult$1 - -com.android.internal.view.InputConnectionWrapper -com.android.internal.view.InputConnectionWrapper$InputContextCallback -com.android.internal.view.menu.ExpandedMenuView +com.android.internal.view.menu.ContextMenuBuilder com.android.internal.view.menu.IconMenuItemView com.android.internal.view.menu.IconMenuView +com.android.internal.view.menu.IconMenuView$SavedState com.android.internal.view.menu.ListMenuItemView com.android.internal.view.menu.MenuBuilder -com.android.internal.view.menu.MenuBuilder$Callback -com.android.internal.view.menu.MenuDialogHelper com.android.internal.view.menu.MenuItemImpl com.android.internal.view.menu.SubMenuBuilder -com.android.internal.widget.RotarySelector -com.android.internal.widget.Smileys -com.google.android.gles_jni.EGLDisplayImpl +com.android.internal.widget.ContactHeaderWidget +com.android.internal.widget.DialogTitle +com.android.internal.widget.EditableInputConnection +com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient +com.android.internal.widget.LockPatternUtils +com.android.internal.widget.LockPatternView +com.android.internal.widget.LockPatternView$Cell com.google.android.gles_jni.EGLImpl com.google.android.gles_jni.GLImpl com.ibm.icu4jni.charset.CharsetDecoderICU com.ibm.icu4jni.charset.CharsetEncoderICU com.ibm.icu4jni.charset.CharsetICU -com.ibm.icu4jni.text.CollationAttribute +com.ibm.icu4jni.charset.CharsetProviderICU +com.ibm.icu4jni.charset.NativeConverter +com.ibm.icu4jni.common.ErrorCode +com.ibm.icu4jni.lang.UCharacter +com.ibm.icu4jni.regex.NativeRegEx +com.ibm.icu4jni.text.Collator +com.ibm.icu4jni.text.NativeBreakIterator +com.ibm.icu4jni.text.NativeCollation com.ibm.icu4jni.text.NativeDecimalFormat com.ibm.icu4jni.text.RuleBasedCollator +com.ibm.icu4jni.text.RuleBasedNumberFormat +com.ibm.icu4jni.util.Resources com.ibm.icu4jni.util.Resources$DefaultTimeZones -dalvik.system.DexFile +dalvik.system.DalvikLogHandler +dalvik.system.DalvikLogging +dalvik.system.NativeStart dalvik.system.PathClassLoader +dalvik.system.SamplingProfiler +dalvik.system.TouchDex +dalvik.system.VMDebug +dalvik.system.VMRuntime +dalvik.system.VMStack +dalvik.system.Zygote java.beans.PropertyChangeEvent java.beans.PropertyChangeListener java.beans.PropertyChangeSupport java.io.BufferedInputStream +java.io.BufferedReader java.io.ByteArrayInputStream -java.io.ByteArrayOutputStream +java.io.Closeable +java.io.DataInput +java.io.DataOutput +java.io.DataOutputStream java.io.File java.io.FileDescriptor java.io.FileInputStream java.io.FileInputStream$RepositioningLock java.io.FileNotFoundException +java.io.FileOutputStream java.io.FilterInputStream +java.io.FilterOutputStream +java.io.Flushable java.io.IOException +java.io.InputStream +java.io.InputStreamReader +java.io.InterruptedIOException +java.io.ObjectInput +java.io.ObjectInputStream +java.io.ObjectOutput +java.io.ObjectOutputStream java.io.ObjectStreamClass +java.io.ObjectStreamClass$OSCThreadLocalCache +java.io.ObjectStreamConstants +java.io.ObjectStreamException +java.io.ObjectStreamField +java.io.OutputStream +java.io.OutputStreamWriter +java.io.PrintStream java.io.PrintWriter +java.io.PushbackReader java.io.RandomAccessFile java.io.RandomAccessFile$RepositionLock -java.io.StringWriter -java.io.Writer +java.io.Reader +java.io.Serializable +java.io.StreamCorruptedException +java.lang.AbstractStringBuilder +java.lang.Appendable +java.lang.ArrayIndexOutOfBoundsException +java.lang.Boolean +java.lang.BootClassLoader +java.lang.Byte +java.lang.CharSequence +java.lang.Character +java.lang.Character$UnicodeBlock java.lang.Class java.lang.ClassCache -java.lang.ClassNotFoundException +java.lang.ClassCache$EnumComparator +java.lang.ClassLoader +java.lang.ClassLoader$SystemClassLoader +java.lang.Cloneable +java.lang.Comparable +java.lang.Double +java.lang.Enum +java.lang.Error +java.lang.Exception +java.lang.Float java.lang.IllegalArgumentException -java.lang.IllegalStateException +java.lang.IndexOutOfBoundsException java.lang.Integer +java.lang.InternalError +java.lang.InterruptedException +java.lang.Iterable +java.lang.LangAccessImpl java.lang.LinkageError java.lang.Long +java.lang.Math java.lang.NoClassDefFoundError +java.lang.NoSuchMethodError +java.lang.Number java.lang.NumberFormatException java.lang.Object +java.lang.OutOfMemoryError +java.lang.Readable +java.lang.Runnable java.lang.Runtime java.lang.RuntimeException +java.lang.RuntimePermission +java.lang.SecurityException +java.lang.Short +java.lang.StackOverflowError +java.lang.StackTraceElement +java.lang.StrictMath java.lang.String +java.lang.String$CaseInsensitiveComparator java.lang.StringBuffer java.lang.StringBuilder +java.lang.System +java.lang.SystemProperties java.lang.Thread +java.lang.Thread$State +java.lang.Thread$UncaughtExceptionHandler +java.lang.ThreadGroup +java.lang.ThreadGroup$ChildrenGroupsLock +java.lang.ThreadGroup$ChildrenThreadsLock java.lang.ThreadLocal java.lang.ThreadLocal$Values java.lang.Throwable +java.lang.UnsatisfiedLinkError +java.lang.UnsupportedOperationException +java.lang.VMClassLoader java.lang.VMThread +java.lang.VirtualMachineError +java.lang.Void +java.lang.annotation.Annotation +java.lang.ref.PhantomReference +java.lang.ref.Reference java.lang.ref.ReferenceQueue java.lang.ref.SoftReference java.lang.ref.WeakReference +java.lang.reflect.AccessibleObject +java.lang.reflect.AnnotatedElement +java.lang.reflect.Array java.lang.reflect.Constructor +java.lang.reflect.Field +java.lang.reflect.GenericDeclaration +java.lang.reflect.InvocationHandler +java.lang.reflect.Member java.lang.reflect.Method java.lang.reflect.Modifier +java.lang.reflect.Proxy +java.lang.reflect.ReflectionAccessImpl +java.lang.reflect.Type java.math.BigDecimal java.math.BigInt java.math.BigInteger java.math.Multiplication +java.net.AddressCache +java.net.AddressCache$1 +java.net.ConnectException java.net.ContentHandler +java.net.DatagramPacket +java.net.Inet4Address java.net.InetAddress +java.net.InetAddress$1 +java.net.InetAddress$2 java.net.InetAddress$WaitReachable +java.net.InetSocketAddress java.net.JarURLConnection java.net.NetPermission -java.net.ProxySelectorImpl -java.net.Socket$ConnectLock +java.net.NetworkInterface +java.net.ServerSocket +java.net.Socket +java.net.SocketException +java.net.SocketImpl +java.net.SocketOptions java.net.URI java.net.URL java.net.URLConnection java.net.URLConnection$DefaultContentHandler java.net.URLStreamHandler +java.nio.BaseByteBuffer +java.nio.Buffer +java.nio.BufferFactory +java.nio.ByteBuffer java.nio.ByteOrder +java.nio.CharArrayBuffer +java.nio.CharBuffer java.nio.CharSequenceAdapter +java.nio.CharToByteBufferAdapter java.nio.DirectByteBuffer +java.nio.FloatToByteBufferAdapter +java.nio.HeapByteBuffer +java.nio.IntToByteBufferAdapter +java.nio.LongBuffer +java.nio.LongToByteBufferAdapter +java.nio.NIOAccess +java.nio.ReadWriteCharArrayBuffer java.nio.ReadWriteDirectByteBuffer -java.nio.ReadWriteIntArrayBuffer -java.nio.ReadWriteShortArrayBuffer -java.nio.ShortBuffer +java.nio.ReadWriteHeapByteBuffer java.nio.ShortToByteBufferAdapter +java.nio.channels.ByteChannel +java.nio.channels.Channel +java.nio.channels.FileChannel +java.nio.channels.GatheringByteChannel +java.nio.channels.InterruptibleChannel +java.nio.channels.ReadableByteChannel +java.nio.channels.ScatteringByteChannel +java.nio.channels.WritableByteChannel +java.nio.channels.spi.AbstractInterruptibleChannel +java.nio.channels.spi.AbstractInterruptibleChannel$1 +java.nio.channels.spi.AbstractInterruptibleChannel$2 +java.nio.charset.Charset +java.nio.charset.Charset$1 +java.nio.charset.CharsetDecoder java.nio.charset.CharsetEncoder +java.nio.charset.CoderResult +java.nio.charset.CodingErrorAction +java.nio.charset.spi.CharsetProvider java.security.AccessControlContext -java.security.GeneralSecurityException +java.security.AccessController +java.security.BasicPermission +java.security.Guard java.security.KeyStore java.security.MessageDigest +java.security.Permission +java.security.PrivilegedAction +java.security.PrivilegedExceptionAction java.security.ProtectionDomain java.security.Provider -java.security.SecureRandom java.security.Security -java.security.cert.CertPathValidator -java.security.cert.CertificateFactory -java.security.cert.PKIXParameters -java.security.cert.TrustAnchor -java.security.cert.X509CertSelector java.security.cert.X509Certificate +java.text.AttributedCharacterIterator$Attribute java.text.Collator +java.text.Collator$1 java.text.DateFormat java.text.DateFormat$Field java.text.DecimalFormat java.text.DecimalFormatSymbols -java.text.MessageFormat +java.text.Format java.text.NumberFormat -java.text.RuleBasedCollator java.text.SimpleDateFormat -java.util.AbstractList$FullListIterator -java.util.AbstractList$SimpleListIterator +java.util.AbstractCollection +java.util.AbstractList +java.util.AbstractMap +java.util.AbstractSet java.util.ArrayList +java.util.ArrayList$ArrayListIterator java.util.Arrays java.util.Arrays$ArrayList +java.util.BitSet java.util.Calendar -java.util.Collections$SynchronizedCollection -java.util.Collections$UnmodifiableList -java.util.Collections$UnmodifiableMap -java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1 +java.util.Collection +java.util.Collections +java.util.Collections$EmptyList +java.util.Collections$EmptyMap +java.util.Collections$EmptySet +java.util.Collections$SingletonSet +java.util.Collections$UnmodifiableCollection +java.util.Collections$UnmodifiableCollection$1 +java.util.Collections$UnmodifiableRandomAccessList +java.util.Collections$UnmodifiableSet +java.util.Comparator java.util.Date +java.util.Dictionary java.util.EnumMap +java.util.EnumSet +java.util.Enumeration java.util.EventListener java.util.EventObject java.util.Formatter java.util.GregorianCalendar java.util.HashMap +java.util.HashMap$HashIterator +java.util.HashMap$HashMapEntry +java.util.HashMap$KeyIterator +java.util.HashMap$KeySet +java.util.HashMap$Values java.util.HashSet java.util.Hashtable +java.util.Hashtable$HashIterator +java.util.Hashtable$HashtableEntry +java.util.Hashtable$KeyEnumeration +java.util.Hashtable$ValueIterator +java.util.Hashtable$Values java.util.IdentityHashMap +java.util.Iterator java.util.LinkedHashMap +java.util.LinkedHashMap$LinkedEntry +java.util.LinkedHashMap$LinkedHashIterator +java.util.LinkedHashMap$ValueIterator java.util.LinkedList -java.util.LinkedList$Link java.util.List +java.util.ListIterator java.util.Locale +java.util.Map +java.util.Map$Entry +java.util.MiniEnumSet java.util.Properties -java.util.Random +java.util.PropertyPermission +java.util.RandomAccess java.util.ResourceBundle +java.util.Set java.util.SimpleTimeZone +java.util.SortedMap +java.util.SortedSet +java.util.SpecialAccess +java.util.Stack +java.util.StringTokenizer java.util.TimeZone java.util.TreeMap -java.util.TreeMap$MapEntry java.util.TreeSet +java.util.UUID java.util.Vector java.util.WeakHashMap java.util.WeakHashMap$Entry java.util.concurrent.ConcurrentHashMap java.util.concurrent.ConcurrentLinkedQueue -java.util.concurrent.DelayQueue +java.util.concurrent.ConcurrentLinkedQueue$Node +java.util.concurrent.CopyOnWriteArrayList +java.util.concurrent.CopyOnWriteArrayList$COWIterator +java.util.concurrent.Executors$DelegatedExecutorService +java.util.concurrent.FutureTask java.util.concurrent.LinkedBlockingQueue -java.util.concurrent.ScheduledThreadPoolExecutor -java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue +java.util.concurrent.Semaphore +java.util.concurrent.ThreadPoolExecutor java.util.concurrent.TimeUnit java.util.concurrent.atomic.AtomicBoolean java.util.concurrent.atomic.AtomicInteger +java.util.concurrent.atomic.AtomicLong +java.util.concurrent.atomic.AtomicReference java.util.concurrent.atomic.UnsafeAccess +java.util.concurrent.locks.AbstractOwnableSynchronizer java.util.concurrent.locks.AbstractQueuedSynchronizer java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject java.util.concurrent.locks.AbstractQueuedSynchronizer$Node java.util.concurrent.locks.Lock -java.util.concurrent.locks.LockSupport java.util.concurrent.locks.ReentrantLock -java.util.concurrent.locks.ReentrantLock$FairSync java.util.concurrent.locks.ReentrantLock$NonfairSync java.util.concurrent.locks.ReentrantLock$Sync -java.util.concurrent.locks.ReentrantReadWriteLock -java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync java.util.concurrent.locks.UnsafeAccess java.util.jar.Attributes java.util.jar.Attributes$Name @@ -852,25 +1042,25 @@ java.util.jar.InitManifest java.util.jar.JarEntry java.util.jar.JarFile java.util.jar.JarFile$1JarFileEnumerator -java.util.jar.JarFile$JarFileInputStream java.util.jar.JarVerifier java.util.jar.Manifest -java.util.logging.ErrorManager -java.util.logging.Formatter java.util.logging.Handler java.util.logging.Level java.util.logging.LogManager java.util.logging.LogManager$1 java.util.logging.LogManager$2 java.util.logging.LogManager$2$1 -java.util.logging.LogManager$3 -java.util.logging.LogRecord +java.util.logging.LogManager$4 java.util.logging.Logger +java.util.logging.Logger$1 java.util.logging.LoggingPermission -java.util.logging.SimpleFormatter +java.util.regex.MatchResult java.util.regex.Matcher java.util.regex.Pattern -java.util.zip.DeflaterOutputStream +java.util.zip.Adler32 +java.util.zip.CRC32 +java.util.zip.Checksum +java.util.zip.Deflater java.util.zip.Inflater java.util.zip.InflaterInputStream java.util.zip.ZipConstants @@ -879,63 +1069,90 @@ java.util.zip.ZipEntry$LittleEndianReader java.util.zip.ZipFile java.util.zip.ZipFile$2 java.util.zip.ZipFile$RAFStream -javax.microedition.khronos.egl.EGLContext +java.util.zip.ZipFile$ZipInflaterInputStream +javax.crypto.Cipher +javax.crypto.Mac +javax.crypto.spec.IvParameterSpec +javax.microedition.khronos.egl.EGL +javax.microedition.khronos.egl.EGL10 +javax.microedition.khronos.opengles.GL +javax.microedition.khronos.opengles.GL10 +javax.microedition.khronos.opengles.GL10Ext +javax.microedition.khronos.opengles.GL11 +javax.microedition.khronos.opengles.GL11Ext +javax.microedition.khronos.opengles.GL11ExtensionPack +javax.net.ssl.DefaultHostnameVerifier javax.net.ssl.HttpsURLConnection -javax.net.ssl.SSLHandshakeException +javax.net.ssl.SSLServerSocket +javax.net.ssl.SSLSession +javax.net.ssl.SSLSocket +javax.net.ssl.SSLSocketFactory javax.security.auth.x500.X500Principal javax.security.cert.X509Certificate -javax.security.cert.X509Certificate$2 junit.framework.Assert -org.apache.commons.codec.binary.Base64 -org.apache.commons.codec.binary.Hex org.apache.commons.logging.LogFactory -org.apache.commons.logging.impl.Jdk14Logger org.apache.harmony.archive.util.Util -org.apache.harmony.dalvik.ddmc.Chunk +org.apache.harmony.dalvik.NativeTestTarget org.apache.harmony.dalvik.ddmc.ChunkHandler org.apache.harmony.dalvik.ddmc.DdmServer -org.apache.harmony.dalvik.ddmc.DdmVmInternal +org.apache.harmony.kernel.vm.LangAccess +org.apache.harmony.kernel.vm.ReflectionAccess +org.apache.harmony.lang.annotation.AnnotationFactory +org.apache.harmony.lang.annotation.AnnotationMember org.apache.harmony.luni.internal.net.www.protocol.file.FileURLConnection org.apache.harmony.luni.internal.net.www.protocol.file.Handler org.apache.harmony.luni.internal.net.www.protocol.http.Handler -org.apache.harmony.luni.internal.net.www.protocol.https.Handler org.apache.harmony.luni.internal.net.www.protocol.jar.Handler org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl -org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl$1 org.apache.harmony.luni.internal.net.www.protocol.jar.JarURLConnectionImpl$JarURLConnectionInputStream org.apache.harmony.luni.internal.util.TimezoneGetter -org.apache.harmony.luni.internal.util.ZoneInfo org.apache.harmony.luni.internal.util.ZoneInfoDB +org.apache.harmony.luni.net.GenericIPMreq org.apache.harmony.luni.net.PlainSocketImpl +org.apache.harmony.luni.platform.Endianness +org.apache.harmony.luni.platform.ICommonDataTypes +org.apache.harmony.luni.platform.IFileSystem +org.apache.harmony.luni.platform.IMemorySystem +org.apache.harmony.luni.platform.INetworkSystem +org.apache.harmony.luni.platform.OSFileSystem +org.apache.harmony.luni.platform.OSMemory +org.apache.harmony.luni.platform.OSNetworkSystem +org.apache.harmony.luni.platform.Platform org.apache.harmony.luni.platform.PlatformAddress -org.apache.harmony.luni.util.TwoKeyHashMap +org.apache.harmony.luni.platform.PlatformAddressFactory +org.apache.harmony.luni.util.FloatingPointParser +org.apache.harmony.luni.util.InputStreamHelper +org.apache.harmony.luni.util.InputStreamHelper$1 +org.apache.harmony.luni.util.InputStreamHelper$ExposedByteArrayInputStream +org.apache.harmony.luni.util.LocaleCache +org.apache.harmony.luni.util.Msg +org.apache.harmony.luni.util.NumberConverter +org.apache.harmony.luni.util.PriviAction +org.apache.harmony.luni.util.ThreadLocalCache +org.apache.harmony.luni.util.ThreadLocalCache$1 +org.apache.harmony.luni.util.ThreadLocalCache$2 +org.apache.harmony.luni.util.ThreadLocalCache$3 +org.apache.harmony.luni.util.ThreadLocalCache$4 +org.apache.harmony.luni.util.ThreadLocalCache$5 +org.apache.harmony.luni.util.Util +org.apache.harmony.nio.FileChannelFactory +org.apache.harmony.nio.internal.DirectBuffer +org.apache.harmony.nio.internal.FileChannelImpl org.apache.harmony.nio.internal.FileChannelImpl$RepositioningLock +org.apache.harmony.nio.internal.FileLockImpl org.apache.harmony.nio.internal.LockManager org.apache.harmony.nio.internal.LockManager$1 -org.apache.harmony.nio.internal.ReadOnlyFileChannel -org.apache.harmony.security.asn1.ASN1BitString -org.apache.harmony.security.asn1.ASN1BitString$ASN1NamedBitList -org.apache.harmony.security.asn1.ASN1Boolean -org.apache.harmony.security.asn1.ASN1Explicit +org.apache.harmony.nio.internal.WriteOnlyFileChannel org.apache.harmony.security.asn1.ASN1GeneralizedTime -org.apache.harmony.security.asn1.ASN1Implicit -org.apache.harmony.security.asn1.ASN1Integer -org.apache.harmony.security.asn1.ASN1OctetString -org.apache.harmony.security.asn1.ASN1SetOf +org.apache.harmony.security.asn1.ASN1Oid org.apache.harmony.security.asn1.ASN1StringType -org.apache.harmony.security.asn1.ASN1StringType$1 -org.apache.harmony.security.asn1.ASN1StringType$2 -org.apache.harmony.security.asn1.ASN1StringType$3 -org.apache.harmony.security.asn1.ASN1StringType$4 -org.apache.harmony.security.asn1.ASN1StringType$5 -org.apache.harmony.security.asn1.ASN1StringType$6 -org.apache.harmony.security.asn1.ASN1StringType$7 -org.apache.harmony.security.asn1.ASN1UTCTime -org.apache.harmony.security.asn1.BitString +org.apache.harmony.security.asn1.DerInputStream +org.apache.harmony.security.asn1.DerOutputStream org.apache.harmony.security.fortress.Engine org.apache.harmony.security.fortress.SecurityUtils org.apache.harmony.security.fortress.Services org.apache.harmony.security.pkcs7.ContentInfo +org.apache.harmony.security.provider.cert.DRLCertFactory org.apache.harmony.security.provider.cert.X509CertFactoryImpl org.apache.harmony.security.provider.cert.X509CertImpl org.apache.harmony.security.provider.cert.X509CertPathImpl @@ -943,183 +1160,111 @@ org.apache.harmony.security.provider.crypto.RandomBitsSupplier org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl org.apache.harmony.security.utils.AlgNameMapper org.apache.harmony.security.x501.AttributeTypeAndValue -org.apache.harmony.security.x501.AttributeValue org.apache.harmony.security.x501.DirectoryString -org.apache.harmony.security.x501.DirectoryString$1 org.apache.harmony.security.x501.Name -org.apache.harmony.security.x501.Name$1 org.apache.harmony.security.x509.AlgorithmIdentifier -org.apache.harmony.security.x509.AlgorithmIdentifier$1 org.apache.harmony.security.x509.BasicConstraints -org.apache.harmony.security.x509.BasicConstraints$1 org.apache.harmony.security.x509.Certificate -org.apache.harmony.security.x509.Certificate$1 +org.apache.harmony.security.x509.EDIPartyName org.apache.harmony.security.x509.Extension -org.apache.harmony.security.x509.Extension$1 -org.apache.harmony.security.x509.Extension$2 org.apache.harmony.security.x509.Extensions -org.apache.harmony.security.x509.Extensions$1 org.apache.harmony.security.x509.GeneralName org.apache.harmony.security.x509.GeneralNames org.apache.harmony.security.x509.KeyUsage org.apache.harmony.security.x509.ORAddress +org.apache.harmony.security.x509.OtherName org.apache.harmony.security.x509.SubjectPublicKeyInfo -org.apache.harmony.security.x509.SubjectPublicKeyInfo$1 org.apache.harmony.security.x509.TBSCertificate -org.apache.harmony.security.x509.TBSCertificate$1 org.apache.harmony.security.x509.Time -org.apache.harmony.security.x509.Time$1 org.apache.harmony.security.x509.Validity -org.apache.harmony.security.x509.Validity$1 +org.apache.harmony.text.BidiWrapper +org.apache.harmony.xml.ExpatAttributes org.apache.harmony.xml.ExpatParser org.apache.harmony.xml.ExpatPullParser -org.apache.harmony.xml.ExpatReader -org.apache.harmony.xnet.provider.jsse.ClientSessionContext +org.apache.harmony.xml.parsers.SAXParserFactoryImpl +org.apache.harmony.xnet.provider.jsse.FileClientSessionCache +org.apache.harmony.xnet.provider.jsse.NativeCrypto +org.apache.harmony.xnet.provider.jsse.OpenSSLServerSocketImpl org.apache.harmony.xnet.provider.jsse.OpenSSLSessionImpl org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$Finalizer -org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream -org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream +org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$LoggerHolder +org.apache.harmony.xnet.provider.jsse.ProtocolVersion org.apache.harmony.xnet.provider.jsse.SSLContextImpl org.apache.harmony.xnet.provider.jsse.SSLParameters -org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl -org.apache.harmony.xnet.provider.jsse.TrustManagerImpl -org.apache.http.HttpHost -org.apache.http.HttpRequestInterceptor +org.apache.harmony.xnet.provider.jsse.ServerSessionContext org.apache.http.HttpVersion -org.apache.http.auth.AuthSchemeRegistry -org.apache.http.client.HttpClient -org.apache.http.client.RequestDirector +org.apache.http.client.methods.HttpEntityEnclosingRequestBase +org.apache.http.client.methods.HttpGet +org.apache.http.client.methods.HttpPost org.apache.http.client.methods.HttpRequestBase -org.apache.http.client.protocol.RequestAddCookies -org.apache.http.client.protocol.RequestDefaultHeaders -org.apache.http.client.protocol.RequestProxyAuthentication -org.apache.http.client.protocol.RequestTargetAuthentication -org.apache.http.client.protocol.ResponseProcessCookies -org.apache.http.conn.params.ConnManagerParams$1 +org.apache.http.conn.BasicManagedEntity +org.apache.http.conn.params.ConnManagerParams org.apache.http.conn.params.ConnRouteParams org.apache.http.conn.routing.HttpRoute -org.apache.http.conn.routing.RouteInfo$LayerType -org.apache.http.conn.routing.RouteInfo$TunnelType -org.apache.http.conn.routing.RouteTracker -org.apache.http.conn.scheme.PlainSocketFactory -org.apache.http.conn.scheme.Scheme -org.apache.http.conn.scheme.SchemeRegistry -org.apache.http.conn.ssl.AllowAllHostnameVerifier -org.apache.http.conn.ssl.BrowserCompatHostnameVerifier +org.apache.http.conn.ssl.AbstractVerifier org.apache.http.conn.ssl.SSLSocketFactory -org.apache.http.conn.ssl.StrictHostnameVerifier org.apache.http.conn.util.InetAddressUtils -org.apache.http.cookie.CookieSpecRegistry -org.apache.http.impl.DefaultConnectionReuseStrategy -org.apache.http.impl.DefaultHttpResponseFactory +org.apache.http.impl.AbstractHttpClientConnection org.apache.http.impl.EnglishReasonPhraseCatalog -org.apache.http.impl.HttpConnectionMetricsImpl org.apache.http.impl.SocketHttpClientConnection -org.apache.http.impl.auth.BasicSchemeFactory -org.apache.http.impl.auth.DigestSchemeFactory org.apache.http.impl.client.AbstractAuthenticationHandler org.apache.http.impl.client.AbstractHttpClient -org.apache.http.impl.client.BasicCredentialsProvider +org.apache.http.impl.client.BasicCookieStore org.apache.http.impl.client.DefaultHttpClient -org.apache.http.impl.client.DefaultHttpRequestRetryHandler -org.apache.http.impl.client.DefaultProxyAuthenticationHandler -org.apache.http.impl.client.DefaultRedirectHandler -org.apache.http.impl.client.DefaultTargetAuthenticationHandler -org.apache.http.impl.client.DefaultUserTokenHandler org.apache.http.impl.client.EntityEnclosingRequestWrapper org.apache.http.impl.conn.AbstractClientConnAdapter +org.apache.http.impl.conn.AbstractPooledConnAdapter org.apache.http.impl.conn.DefaultClientConnection -org.apache.http.impl.conn.DefaultClientConnectionOperator -org.apache.http.impl.conn.DefaultHttpRoutePlanner -org.apache.http.impl.conn.DefaultResponseParser -org.apache.http.impl.conn.IdleConnectionHandler -org.apache.http.impl.conn.tsccm.BasicPoolEntry -org.apache.http.impl.conn.tsccm.BasicPoolEntryRef +org.apache.http.impl.conn.SingleClientConnManager org.apache.http.impl.conn.tsccm.ConnPoolByRoute -org.apache.http.impl.conn.tsccm.RefQueueWorker -org.apache.http.impl.conn.tsccm.RouteSpecificPool org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager org.apache.http.impl.cookie.BasicClientCookie -org.apache.http.impl.cookie.BestMatchSpecFactory -org.apache.http.impl.cookie.BrowserCompatSpecFactory +org.apache.http.impl.cookie.BrowserCompatSpec org.apache.http.impl.cookie.DateUtils -org.apache.http.impl.cookie.NetscapeDraftSpecFactory -org.apache.http.impl.cookie.RFC2109SpecFactory -org.apache.http.impl.cookie.RFC2965SpecFactory -org.apache.http.impl.entity.EntityDeserializer -org.apache.http.impl.entity.EntitySerializer -org.apache.http.impl.entity.LaxContentLengthStrategy -org.apache.http.impl.entity.StrictContentLengthStrategy -org.apache.http.impl.io.HttpRequestWriter -org.apache.http.impl.io.HttpTransportMetricsImpl +org.apache.http.impl.cookie.DateUtils$DateFormatHolder +org.apache.http.impl.cookie.RFC2109Spec org.apache.http.impl.io.SocketInputBuffer -org.apache.http.impl.io.SocketOutputBuffer -org.apache.http.message.BasicHeaderValueParser org.apache.http.message.BasicHttpEntityEnclosingRequest +org.apache.http.message.BasicHttpRequest org.apache.http.message.BasicHttpResponse -org.apache.http.message.BasicLineFormatter org.apache.http.message.BasicLineParser +org.apache.http.message.BasicNameValuePair +org.apache.http.message.BasicTokenIterator org.apache.http.params.BasicHttpParams org.apache.http.protocol.BasicHttpProcessor org.apache.http.protocol.HTTP -org.apache.http.protocol.HttpRequestExecutor -org.apache.http.protocol.HttpRequestInterceptorList -org.apache.http.protocol.HttpResponseInterceptorList -org.apache.http.protocol.RequestConnControl -org.apache.http.protocol.RequestContent -org.apache.http.protocol.RequestExpectContinue -org.apache.http.protocol.RequestTargetHost -org.apache.http.protocol.RequestUserAgent -org.apache.http.util.ByteArrayBuffer -org.apache.http.util.CharArrayBuffer -org.apache.http.util.EntityUtils -org.apache.http.util.VersionInfo -org.bouncycastle.asn1.DERBitString -org.bouncycastle.asn1.DERIA5String -org.bouncycastle.asn1.DERInteger +org.bouncycastle.asn1.DERNull org.bouncycastle.asn1.DERObject org.bouncycastle.asn1.DERObjectIdentifier -org.bouncycastle.asn1.DEROctetString -org.bouncycastle.asn1.DERPrintableString -org.bouncycastle.asn1.DERSequence -org.bouncycastle.asn1.DERSet -org.bouncycastle.asn1.DERTaggedObject -org.bouncycastle.asn1.DERUTCTime -org.bouncycastle.asn1.DERUTF8String -org.bouncycastle.asn1.OrderedTable +org.bouncycastle.asn1.iana.IANAObjectIdentifiers org.bouncycastle.asn1.nist.NISTObjectIdentifiers +org.bouncycastle.asn1.oiw.OIWObjectIdentifiers org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers -org.bouncycastle.asn1.x509.AlgorithmIdentifier -org.bouncycastle.asn1.x509.RSAPublicKeyStructure -org.bouncycastle.asn1.x509.SubjectPublicKeyInfo -org.bouncycastle.asn1.x509.TBSCertificateStructure -org.bouncycastle.asn1.x509.Time -org.bouncycastle.asn1.x509.X509CertificateStructure -org.bouncycastle.asn1.x509.X509Extension org.bouncycastle.asn1.x509.X509Extensions org.bouncycastle.asn1.x509.X509Name -org.bouncycastle.asn1.x509.X509NameElementList -org.bouncycastle.asn1.x9.X9ObjectIdentifiers +org.bouncycastle.crypto.digests.SHA1Digest org.bouncycastle.crypto.engines.AESFastEngine +org.bouncycastle.crypto.macs.HMac +org.bouncycastle.jce.provider.BouncyCastleProvider org.bouncycastle.jce.provider.CertPathValidatorUtilities -org.bouncycastle.jce.provider.JCEBlockCipher$AES -org.bouncycastle.jce.provider.JCERSAPublicKey -org.bouncycastle.jce.provider.JDKKeyFactory$RSA +org.bouncycastle.jce.provider.JCEBlockCipher org.bouncycastle.jce.provider.JDKKeyStore -org.bouncycastle.jce.provider.JDKKeyStore$StoreEntry +org.bouncycastle.jce.provider.JDKX509CertificateFactory org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi -org.bouncycastle.jce.provider.RSAUtil +org.bouncycastle.jce.provider.WrapCipherSpi org.bouncycastle.jce.provider.X509CertificateObject org.ccil.cowan.tagsoup.HTMLScanner +org.ccil.cowan.tagsoup.HTMLSchema org.ccil.cowan.tagsoup.Parser -org.json.JSONArray org.json.JSONObject -org.json.JSONStringer org.kxml2.io.KXmlParser org.kxml2.io.KXmlSerializer +org.openssl.NativeBN +org.xml.sax.Attributes +org.xml.sax.InputSource +org.xml.sax.helpers.AttributesImpl org.xml.sax.helpers.DefaultHandler -org.xml.sax.helpers.NewInstance +org.xmlpull.v1.XmlPullParser org.xmlpull.v1.XmlPullParserFactory -org.xmlpull.v1.sax2.Driver sun.misc.Unsafe diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index f79a02a..d4b28e2 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -1647,11 +1647,22 @@ class BackupManagerService extends IBackupManager.Stub { } if (metaInfo.versionCode > packageInfo.versionCode) { - String message = "Version " + metaInfo.versionCode - + " > installed version " + packageInfo.versionCode; - Log.w(TAG, "Package " + packageName + ": " + message); - EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, message); - continue; + // Data is from a "newer" version of the app than we have currently + // installed. If the app has not declared that it is prepared to + // handle this case, we do not attempt the restore. + if ((packageInfo.applicationInfo.flags + & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) == 0) { + String message = "Version " + metaInfo.versionCode + + " > installed version " + packageInfo.versionCode; + Log.w(TAG, "Package " + packageName + ": " + message); + EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, + packageName, message); + continue; + } else { + if (DEBUG) Log.v(TAG, "Version " + metaInfo.versionCode + + " > installed " + packageInfo.versionCode + + " but restoreAnyVersion"); + } } if (!signaturesMatch(metaInfo.signatures, packageInfo)) { @@ -1695,8 +1706,10 @@ class BackupManagerService extends IBackupManager.Stub { // The agent was probably running with a stub Application object, // which isn't a valid run mode for the main app logic. Shut // down the app so that next time it's launched, it gets the - // usual full initialization. - if ((packageInfo.applicationInfo.flags + // usual full initialization. Note that this is only done for + // full-system restores: when a single app has requested a restore, + // it is explicitly not killed following that operation. + if (mTargetPackage == null && (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0) { if (DEBUG) Log.d(TAG, "Restore complete, killing host process of " + packageInfo.applicationInfo.processName); diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 108246d..df685ab 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -289,6 +289,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { * the number of different network types is not going * to change very often. */ + boolean noMobileData = !getMobileDataEnabled(); for (int netType : mPriorityList) { switch (mNetAttributes[netType].mRadio) { case ConnectivityManager.TYPE_WIFI: @@ -306,6 +307,10 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetTrackers[netType] = new MobileDataStateTracker(context, mHandler, netType, mNetAttributes[netType].mName); mNetTrackers[netType].startMonitoring(); + if (noMobileData) { + if (DBG) Log.d(TAG, "tearing down Mobile networks due to setting"); + mNetTrackers[netType].teardown(); + } break; default: Log.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " + @@ -530,6 +535,10 @@ public class ConnectivityService extends IConnectivityManager.Stub { // TODO - move this into the MobileDataStateTracker int usedNetworkType = networkType; if(networkType == ConnectivityManager.TYPE_MOBILE) { + if (!getMobileDataEnabled()) { + if (DBG) Log.d(TAG, "requested special network with data disabled - rejected"); + return Phone.APN_TYPE_NOT_AVAILABLE; + } if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) { usedNetworkType = ConnectivityManager.TYPE_MOBILE_MMS; } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) { @@ -767,6 +776,46 @@ public class ConnectivityService extends IConnectivityManager.Stub { mContext.sendBroadcast(broadcast); } + /** + * @see ConnectivityManager#getMobileDataEnabled() + */ + public boolean getMobileDataEnabled() { + enforceAccessPermission(); + boolean retVal = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.MOBILE_DATA, 1) == 1; + if (DBG) Log.d(TAG, "getMobileDataEnabled returning " + retVal); + return retVal; + } + + /** + * @see ConnectivityManager#setMobileDataEnabled(boolean) + */ + public synchronized void setMobileDataEnabled(boolean enabled) { + enforceChangePermission(); + if (DBG) Log.d(TAG, "setMobileDataEnabled(" + enabled + ")"); + + if (getMobileDataEnabled() == enabled) return; + + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.MOBILE_DATA, enabled ? 1 : 0); + + if (enabled) { + if (mNetTrackers[ConnectivityManager.TYPE_MOBILE] != null) { + if (DBG) Log.d(TAG, "starting up " + mNetTrackers[ConnectivityManager.TYPE_MOBILE]); + mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect(); + } + } else { + for (NetworkStateTracker nt : mNetTrackers) { + if (nt == null) continue; + int netType = nt.getNetworkInfo().getType(); + if (mNetAttributes[netType].mRadio == ConnectivityManager.TYPE_MOBILE) { + if (DBG) Log.d(TAG, "tearing down " + nt); + nt.teardown(); + } + } + } + } + private int getNumConnectedNetworks() { int numConnectedNets = 0; diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index 2dc12f6..4485c79 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -16,32 +16,29 @@ package com.android.server; +import com.android.server.am.ActivityManagerService; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.content.res.Resources; import android.net.Uri; import android.os.storage.IMountService; import android.os.storage.IMountServiceListener; import android.os.storage.StorageResultCode; +import android.os.Handler; +import android.os.Message; import android.os.RemoteException; import android.os.IBinder; import android.os.Environment; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.UEventObserver; -import android.os.Handler; -import android.text.TextUtils; import android.util.Log; import java.util.ArrayList; import java.util.HashSet; -import java.io.File; -import java.io.FileReader; - /** * MountService implements back-end services for platform storage * management. @@ -115,14 +112,119 @@ class MountService extends IMountService.Stub private PackageManagerService mPms; private boolean mUmsEnabling; private ArrayList<MountServiceBinderListener> mListeners; - private boolean mBooted; - private boolean mReady; + private boolean mBooted = false; + private boolean mReady = false; + private boolean mSendUmsConnectedOnBoot = false; /** * Private hash of currently mounted secure containers. */ private HashSet<String> mAsecMountSet = new HashSet<String>(); + private static final int H_UNMOUNT_PM_UPDATE = 1; + private static final int H_UNMOUNT_PM_DONE = 2; + private static final int H_UNMOUNT_MS = 3; + private static final int RETRY_UNMOUNT_DELAY = 30; // in ms + private static final int MAX_UNMOUNT_RETRIES = 4; + + private IntentFilter mPmFilter = new IntentFilter( + Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); + private BroadcastReceiver mPmReceiver = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { + mHandler.sendEmptyMessage(H_UNMOUNT_PM_DONE); + } + } + }; + + class UnmountCallBack { + String path; + int retries; + boolean force; + + UnmountCallBack(String path, boolean force) { + retries = 0; + this.path = path; + this.force = force; + } + } + + final private Handler mHandler = new Handler() { + ArrayList<UnmountCallBack> mForceUnmounts = new ArrayList<UnmountCallBack>(); + + public void handleMessage(Message msg) { + switch (msg.what) { + case H_UNMOUNT_PM_UPDATE: { + UnmountCallBack ucb = (UnmountCallBack) msg.obj; + mForceUnmounts.add(ucb); + mContext.registerReceiver(mPmReceiver, mPmFilter); + boolean hasExtPkgs = mPms.updateExternalMediaStatus(false); + if (!hasExtPkgs) { + // Unregister right away + mHandler.sendEmptyMessage(H_UNMOUNT_PM_DONE); + } + break; + } + case H_UNMOUNT_PM_DONE: { + // Unregister receiver + mContext.unregisterReceiver(mPmReceiver); + UnmountCallBack ucb = mForceUnmounts.get(0); + if (ucb == null || ucb.path == null) { + // Just ignore + return; + } + String path = ucb.path; + boolean done = false; + if (!ucb.force) { + done = true; + } else { + int pids[] = getStorageUsers(path); + if (pids == null || pids.length == 0) { + done = true; + } else { + // Kill processes holding references first + ActivityManagerService ams = (ActivityManagerService) + ServiceManager.getService("activity"); + // Eliminate system process here? + boolean ret = ams.killPidsForMemory(pids); + if (ret) { + // Confirm if file references have been freed. + pids = getStorageUsers(path); + if (pids == null || pids.length == 0) { + done = true; + } + } + } + } + if (done) { + mForceUnmounts.remove(0); + mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_MS, + ucb)); + } else { + if (ucb.retries >= MAX_UNMOUNT_RETRIES) { + Log.i(TAG, "Cannot unmount inspite of " + + MAX_UNMOUNT_RETRIES + " to unmount media"); + // Send final broadcast indicating failure to unmount. + } else { + mHandler.sendMessageDelayed( + mHandler.obtainMessage(H_UNMOUNT_PM_DONE, + ucb.retries++), + RETRY_UNMOUNT_DELAY); + } + } + break; + } + case H_UNMOUNT_MS : { + UnmountCallBack ucb = (UnmountCallBack) msg.obj; + String path = ucb.path; + doUnmountVolume(path, true); + break; + } + } + } + }; + private void waitForReady() { while (mReady == false) { for (int retries = 5; retries > 0; retries--) { @@ -162,6 +264,14 @@ class MountService extends IMountService.Stub Log.e(TAG, String.format("Boot-time mount failed (%d)", rc)); } } + /* + * If UMS is connected in boot, send the connected event + * now that we're up. + */ + if (mSendUmsConnectedOnBoot) { + sendUmsIntent(true); + mSendUmsConnectedOnBoot = false; + } } catch (Exception ex) { Log.e(TAG, "Boot-time mount exception", ex); } @@ -545,14 +655,28 @@ class MountService extends IMountService.Stub return rc; } + /* + * If force is not set, we do not unmount if there are + * processes holding references to the volume about to be unmounted. + * If force is set, all the processes holding references need to be + * killed via the ActivityManager before actually unmounting the volume. + * This might even take a while and might be retried after timed delays + * to make sure we dont end up in an instable state and kill some core + * processes. + */ private int doUnmountVolume(String path, boolean force) { if (!getVolumeState(path).equals(Environment.MEDIA_MOUNTED)) { return VoldResponseCode.OpFailedVolNotMounted; } + // We unmounted the volume. No of the asec containers are available now. + synchronized (mAsecMountSet) { + mAsecMountSet.clear(); + } // Notify PackageManager of potential media removal and deal with // return code later on. The caller of this api should be aware or have been // notified that the applications installed on the media will be killed. + // Redundant probably. But no harm in updating state again. mPms.updateExternalMediaStatus(false); try { mConnector.doCommand(String.format( @@ -636,16 +760,17 @@ class MountService extends IMountService.Stub } if (mBooted == true) { - Intent intent; - if (avail) { - intent = new Intent(Intent.ACTION_UMS_CONNECTED); - } else { - intent = new Intent(Intent.ACTION_UMS_DISCONNECTED); - } - mContext.sendBroadcast(intent); + sendUmsIntent(avail); + } else { + mSendUmsConnectedOnBoot = avail; } } + private void sendUmsIntent(boolean c) { + mContext.sendBroadcast( + new Intent((c ? Intent.ACTION_UMS_CONNECTED : Intent.ACTION_UMS_DISCONNECTED))); + } + private void validatePermission(String perm) { if (mContext.checkCallingOrSelfPermission(perm) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException(String.format("Requires %s permission", perm)); @@ -804,11 +929,12 @@ class MountService extends IMountService.Stub return doMountVolume(path); } - public int unmountVolume(String path, boolean force) { + public void unmountVolume(String path, boolean force) { validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); waitForReady(); - return doUnmountVolume(path, force); + UnmountCallBack ucb = new UnmountCallBack(path, force); + mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_PM_UPDATE, ucb)); } public int formatVolume(String path) { @@ -1019,6 +1145,13 @@ class MountService extends IMountService.Stub } catch (NativeDaemonConnectorException e) { rc = StorageResultCode.OperationFailedInternalError; } + if (rc == StorageResultCode.OperationSucceeded) { + synchronized (mAsecMountSet) { + if (!mAsecMountSet.contains(newId)) { + mAsecMountSet.add(newId); + } + } + } return rc; } diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 9e0d623..a23fac4 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -8877,6 +8877,9 @@ class PackageManagerService extends IPackageManager.Stub { return prefix + tmpIdx; } + /* + * Return true if PackageManager does have packages to be updated. + */ public boolean updateExternalMediaStatus(final boolean mediaStatus) { synchronized (mPackages) { if (DEBUG_SD_INSTALL) Log.i(TAG, "updateExternalMediaStatus:: mediaStatus=" + @@ -8885,16 +8888,24 @@ class PackageManagerService extends IPackageManager.Stub { return false; } mMediaMounted = mediaStatus; - final HashMap<SdInstallArgs, String> processCids = - new HashMap<SdInstallArgs, String>(); - final int[] uidArr = getExternalMediaPackages(mediaStatus, processCids); - if (processCids.size() == 0) { + boolean ret = false; + synchronized (mPackages) { + Set<String> appList = mSettings.findPackagesWithFlag(ApplicationInfo.FLAG_ON_SDCARD); + ret = appList != null && appList.size() > 0; + } + if (!ret) { + // No packages will be effected by the sdcard update. Just return. return false; } // Queue up an async operation since the package installation may take a little while. mHandler.post(new Runnable() { public void run() { mHandler.removeCallbacks(this); + // If we are up here that means there are packages to be + // enabled or disabled. + final HashMap<SdInstallArgs, String> processCids = + new HashMap<SdInstallArgs, String>(); + final int[] uidArr = getExternalMediaPackages(mediaStatus, processCids); if (mediaStatus) { if (DEBUG_SD_INSTALL) Log.i(TAG, "Loading packages"); loadMediaPackages(processCids, uidArr); @@ -9019,9 +9030,9 @@ class PackageManagerService extends IPackageManager.Stub { } args.doPostInstall(retCode); } - // Send broadcasts first + // Send a broadcast to let everyone know we are done processing + sendResourcesChangedBroadcast(true, pkgList, uidArr); if (pkgList.size() > 0) { - sendResourcesChangedBroadcast(true, pkgList, uidArr); Runtime.getRuntime().gc(); // If something failed do we clean up here or next install? } @@ -9049,9 +9060,9 @@ class PackageManagerService extends IPackageManager.Stub { } } } + sendResourcesChangedBroadcast(false, pkgList, uidArr); // Send broadcasts if (pkgList.size() > 0) { - sendResourcesChangedBroadcast(false, pkgList, uidArr); Runtime.getRuntime().gc(); } // Do clean up. Just unmount diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index 10d6e3a..16638bc 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -76,14 +76,21 @@ public class Tethering extends INetworkManagementEventObserver.Stub { private BroadcastReceiver mStateReceiver; + private static final String USB_NEAR_IFACE_ADDR = "169.254.2.1"; + private String[] mDhcpRange; + private static final String DHCP_DEFAULT_RANGE_START = "169.254.2.10"; + private static final String DHCP_DEFAULT_RANGE_STOP = "169.254.2.64"; private String[] mDnsServers; + private static final String DNS_DEFAULT_SERVER1 = "8.8.8.8"; + private static final String DNS_DEFAULT_SERVER2 = "4.2.2.2"; private String mUpstreamIfaceName; // turning on/off RNDIS resets the interface generating and extra discon/conn cycle // count how many to ignore.. Self correcting if you plug/unplug a bunch of times. + // TODO - brittle - maybe don't need? private int mUsbResetExpected = 0; HierarchicalStateMachine mTetherMasterSM; @@ -119,8 +126,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { com.android.internal.R.array.config_tether_dhcp_range); if (mDhcpRange.length == 0) { mDhcpRange = new String[2]; - mDhcpRange[0] = new String("169.254.2.2"); - mDhcpRange[1] = new String("169.254.2.64"); + mDhcpRange[0] = DHCP_DEFAULT_RANGE_START; + mDhcpRange[1] = DHCP_DEFAULT_RANGE_STOP; } else if(mDhcpRange.length == 1) { String[] tmp = new String[2]; tmp[0] = mDhcpRange[0]; @@ -135,8 +142,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { // TODO - remove and rely on real notifications of the current iface mDnsServers = new String[2]; - mDnsServers[0] = "8.8.8.8"; - mDnsServers[1] = "4.2.2.2"; + mDnsServers[0] = DNS_DEFAULT_SERVER1; + mDnsServers[1] = DNS_DEFAULT_SERVER2; mUpstreamIfaceName = "rmnet0"; } @@ -300,7 +307,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { broadcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ERRORED_TETHER, erroredList); mContext.sendStickyBroadcast(broadcast); - + Log.d(TAG, "sendTetherStateChangedBroadcast " + availableList.size() + ", " + + activeList.size() + ", " + erroredList.size()); // check if we need to send a USB notification // Check if the user wants to be bothered boolean tellUser = (Settings.Secure.getInt(mContext.getContentResolver(), @@ -429,7 +437,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { return; } } - Tethering.this.toggleUsbIfaces(true); // add them + Tethering.this.enableUsbIfaces(true); // add them } else if (action.equals(Intent.ACTION_UMS_DISCONNECTED)) { Log.w(TAG, "got UMS disconneded broadcast"); synchronized (Tethering.this) { @@ -439,7 +447,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { return; } } - Tethering.this.toggleUsbIfaces(false); // remove them + Tethering.this.enableUsbIfaces(false); // remove them } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); @@ -458,7 +466,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } // used on cable insert/remove - private void toggleUsbIfaces(boolean add) { + private void enableUsbIfaces(boolean enable) { IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); String[] ifaces = new String[0]; @@ -471,7 +479,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { for (String iface : ifaces) { for (String regex : mTetherableUsbRegexs) { if (iface.matches(regex)) { - if (add) { + if (enable) { interfaceAdded(iface); } else { interfaceRemoved(iface); @@ -482,8 +490,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } // toggled when we enter/leave the fully teathered state - private boolean enableRndisUsb(boolean enabled) { - Log.d(TAG, "enableRndisUsb(" + enabled + ")"); + private boolean enableUsbRndis(boolean enabled) { + Log.d(TAG, "enableUsbRndis(" + enabled + ")"); IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); @@ -509,8 +517,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } // configured when we start tethering and unconfig'd on error or conclusion - private boolean configureUsb(boolean enabled) { - Log.d(TAG, "configureUsb(" + enabled + ")"); + private boolean configureUsbIface(boolean enabled) { + Log.d(TAG, "configureUsbIface(" + enabled + ")"); IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); INetworkManagementService service = INetworkManagementService.Stub.asInterface(b); @@ -536,6 +544,10 @@ public class Tethering extends INetworkManagementEventObserver.Stub { ifcg.interfaceFlags = ifcg.interfaceFlags.replace("down", "up"); } else { ifcg.interfaceFlags = ifcg.interfaceFlags.replace("up", "down"); + // TODO - clean this up - maybe a better regex? + ifcg.interfaceFlags = ifcg.interfaceFlags.replace(" running", ""); + ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running ",""); + ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running",""); } service.setInterfaceConfig(iface, ifcg); } @@ -547,21 +559,6 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } } - if (!enabled) { - // turn off ndis - try { - synchronized (this) { - if (service.isUsbRNDISStarted()) { - mUsbResetExpected += 2; - service.stopUsbRNDIS(); - } - } - } catch (Exception e) { - Log.e(TAG, "Error stopping usb RNDIS :" + e); - return false; - } - } - return true; } @@ -822,7 +819,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { if (errored && mUsb) { // note everything's been unwound by this point so nothing to do on // further error.. - Tethering.this.configureUsb(false); + Tethering.this.configureUsbIface(false); } } @@ -863,7 +860,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { public void enter() { setAvailable(false); if (mUsb) { - if (!Tethering.this.configureUsb(true)) { + if (!Tethering.this.configureUsbIface(true)) { Message m = mTetherMasterSM.obtainMessage( TetherMasterSM.CMD_TETHER_MODE_UNREQUESTED); m.obj = TetherInterfaceSM.this; @@ -889,7 +886,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { m.obj = TetherInterfaceSM.this; mTetherMasterSM.sendMessage(m); if (mUsb) { - if (!Tethering.this.configureUsb(false)) { + if (!Tethering.this.configureUsbIface(false)) { transitionTo(mUsbConfigurationErrorState); break; } @@ -947,7 +944,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { sendMessageAtFrontOfQueue(m); return; } - if (mUsb) Tethering.this.enableRndisUsb(true); + if (mUsb) Tethering.this.enableUsbRndis(true); Log.d(TAG, "Tethered " + mIfaceName); setAvailable(false); setTethered(true); @@ -955,7 +952,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } @Override public void exit() { - if(mUsb) Tethering.this.enableRndisUsb(false); + if (mUsb) Tethering.this.enableUsbRndis(false); } @Override public boolean processMessage(Message message) { @@ -986,7 +983,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { mTetherMasterSM.sendMessage(m); if (message.what == CMD_TETHER_UNREQUESTED) { if (mUsb) { - if (!Tethering.this.configureUsb(false)) { + if (!Tethering.this.configureUsbIface(false)) { transitionTo(mUsbConfigurationErrorState); } else { transitionTo(mInitialState); @@ -998,7 +995,6 @@ public class Tethering extends INetworkManagementEventObserver.Stub { transitionTo(mUnavailableState); } Log.d(TAG, "Untethered " + mIfaceName); - sendTetherStateChangedBroadcast(); break; case CMD_CELL_DUN_ERROR: case CMD_IP_FORWARDING_ENABLE_ERROR: @@ -1030,7 +1026,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { Log.d(TAG, "Tether lost upstream connection " + mIfaceName); sendTetherStateChangedBroadcast(); if (mUsb) { - if (!Tethering.this.configureUsb(false)) { + if (!Tethering.this.configureUsbIface(false)) { transitionTo(mUsbConfigurationErrorState); break; } @@ -1187,7 +1183,6 @@ public class Tethering extends INetworkManagementEventObserver.Stub { private HierarchicalState mCellDunRequestedState; private HierarchicalState mCellDunAliveState; private HierarchicalState mTetherModeAliveState; - private HierarchicalState mCellDunUnRequestedState; private HierarchicalState mCellDunErrorState; private HierarchicalState mSetIpForwardingEnabledErrorState; @@ -1215,8 +1210,6 @@ public class Tethering extends INetworkManagementEventObserver.Stub { addState(mCellDunAliveState); mTetherModeAliveState = new TetherModeAliveState(); addState(mTetherModeAliveState); - mCellDunUnRequestedState = new CellDunUnRequestedState(); - addState(mCellDunUnRequestedState); mCellDunErrorState = new CellDunErrorState(); addState(mCellDunErrorState); @@ -1236,8 +1229,81 @@ public class Tethering extends INetworkManagementEventObserver.Stub { setInitialState(mInitialState); } + class TetherMasterUtilState extends HierarchicalState { + @Override + public boolean processMessage(Message m) { + return false; + } + public int turnOnMobileDun() { + IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); + IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); + int retValue = Phone.APN_REQUEST_FAILED; + try { + retValue = service.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, + Phone.FEATURE_ENABLE_DUN, new Binder()); + } catch (Exception e) { + } + return retValue; + } + public boolean turnOffMobileDun() { + IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); + IConnectivityManager service = + IConnectivityManager.Stub.asInterface(b); + try { + service.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, + Phone.FEATURE_ENABLE_DUN); + } catch (Exception e) { + return false; + } + return true; + } + public boolean turnOnMasterTetherSettings() { + IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); + INetworkManagementService service = + INetworkManagementService.Stub.asInterface(b); + try { + service.setIpForwardingEnabled(true); + } catch (Exception e) { + transitionTo(mSetIpForwardingEnabledErrorState); + return false; + } + try { + service.startTethering(mDhcpRange[0], mDhcpRange[1]); + } catch (Exception e) { + transitionTo(mStartTetheringErrorState); + return false; + } + try { + service.setDnsForwarders(mDnsServers); + } catch (Exception e) { + transitionTo(mSetDnsForwardersErrorState); + return false; + } + transitionTo(mTetherModeAliveState); + return true; + } + public boolean turnOffMasterTetherSettings() { + IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); + INetworkManagementService service = + INetworkManagementService.Stub.asInterface(b); + try { + service.stopTethering(); + } catch (Exception e) { + transitionTo(mStopTetheringErrorState); + return false; + } + try { + service.setIpForwardingEnabled(false); + } catch (Exception e) { + transitionTo(mSetIpForwardingDisabledErrorState); + return false; + } + transitionTo(mInitialState); + return true; + } + } - class InitialState extends HierarchicalState { + class InitialState extends TetherMasterUtilState { @Override public boolean processMessage(Message message) { Log.d(TAG, "MasterInitialState.processMessage what=" + message.what); @@ -1267,20 +1333,11 @@ public class Tethering extends INetworkManagementEventObserver.Stub { return retValue; } } - class CellDunRequestedState extends HierarchicalState { + class CellDunRequestedState extends TetherMasterUtilState { @Override public void enter() { ++mSequenceNumber; - IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); - IConnectivityManager service = - IConnectivityManager.Stub.asInterface(b); - int result; - try { - result = service.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, - Phone.FEATURE_ENABLE_DUN, new Binder()); - } catch (Exception e) { - result = Phone.APN_REQUEST_FAILED; - } + int result = turnOnMobileDun(); switch (result) { case Phone.APN_ALREADY_ACTIVE: Log.d(TAG, "Dun already active"); @@ -1319,34 +1376,13 @@ public class Tethering extends INetworkManagementEventObserver.Stub { if (index != -1) { mNotifyList.remove(index); if (mNotifyList.isEmpty()) { - transitionTo(mCellDunUnRequestedState); + turnOffMobileDun(); + transitionTo(mInitialState); } } break; case CMD_CELL_DUN_ENABLED: - IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); - INetworkManagementService service = - INetworkManagementService.Stub.asInterface(b); - - try { - service.setIpForwardingEnabled(true); - } catch (Exception e) { - transitionTo(mSetIpForwardingEnabledErrorState); - break; - } - try { - service.startTethering(mDhcpRange[0], mDhcpRange[1]); - } catch (Exception e) { - transitionTo(mStartTetheringErrorState); - break; - } - try { - service.setDnsForwarders(mDnsServers); - } catch (Exception e) { - transitionTo(mSetDnsForwardersErrorState); - break; - } - transitionTo(mTetherModeAliveState); + turnOnMasterTetherSettings(); break; case CMD_CELL_DUN_DISABLED: break; @@ -1363,7 +1399,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } } - class CellDunAliveState extends HierarchicalState { + class CellDunAliveState extends TetherMasterUtilState { @Override public void enter() { Log.d(TAG, "renewing Dun in " + CELL_DUN_RENEW_MS + "ms"); @@ -1378,29 +1414,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { case CMD_TETHER_MODE_REQUESTED: TetherInterfaceSM who = (TetherInterfaceSM)message.obj; mNotifyList.add(who); - IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); - INetworkManagementService service = - INetworkManagementService.Stub.asInterface(b); - - try { - service.setIpForwardingEnabled(true); - } catch (Exception e) { - transitionTo(mSetIpForwardingEnabledErrorState); - break; - } - try { - service.startTethering(mDhcpRange[0], mDhcpRange[1]); - } catch (Exception e) { - transitionTo(mStartTetheringErrorState); - break; - } - try { - service.setDnsForwarders(mDnsServers); - } catch (Exception e) { - transitionTo(mSetDnsForwardersErrorState); - break; - } - transitionTo(mTetherModeAliveState); + turnOnMasterTetherSettings(); break; case CMD_TETHER_MODE_UNREQUESTED: who = (TetherInterfaceSM)message.obj; @@ -1408,7 +1422,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { if (index != -1) { mNotifyList.remove(index); if (mNotifyList.isEmpty()) { - transitionTo(mCellDunUnRequestedState); + turnOffMobileDun(); + transitionTo(mInitialState); } } break; @@ -1418,13 +1433,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { case CMD_CELL_DUN_RENEW: Log.d(TAG, "renewing dun connection - requeuing for another " + CELL_DUN_RENEW_MS + "ms"); - b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); - IConnectivityManager cservice = IConnectivityManager.Stub.asInterface(b); - try { - cservice.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, - Phone.FEATURE_ENABLE_DUN, new Binder()); - } catch (Exception e) { - } + turnOnMobileDun(); sendMessageDelayed(obtainMessage(CMD_CELL_DUN_RENEW), CELL_DUN_RENEW_MS); break; default: @@ -1435,7 +1444,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } } - class TetherModeAliveState extends HierarchicalState { + class TetherModeAliveState extends TetherMasterUtilState { @Override public void enter() { Log.d(TAG, "renewing Dun in " + CELL_DUN_RENEW_MS + "ms"); @@ -1461,7 +1470,8 @@ public class Tethering extends INetworkManagementEventObserver.Stub { if (index != -1) { mNotifyList.remove(index); if (mNotifyList.isEmpty()) { - transitionTo(mCellDunUnRequestedState); + turnOffMobileDun(); + turnOffMasterTetherSettings(); // transitions appropriately } } break; @@ -1473,33 +1483,12 @@ public class Tethering extends INetworkManagementEventObserver.Stub { sm.sendMessage(sm.obtainMessage( TetherInterfaceSM.CMD_TETHER_MODE_DEAD)); } - IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); - INetworkManagementService service = - INetworkManagementService.Stub.asInterface(b); - try { - service.stopTethering(); - } catch (Exception e) { - transitionTo(mStopTetheringErrorState); - break; - } - try { - service.setIpForwardingEnabled(false); - } catch (Exception e) { - transitionTo(mSetIpForwardingDisabledErrorState); - break; - } - transitionTo(mInitialState); + turnOffMasterTetherSettings(); // transitions appropriately break; case CMD_CELL_DUN_RENEW: Log.d(TAG, "renewing dun connection - requeuing for another " + CELL_DUN_RENEW_MS + "ms"); - b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); - IConnectivityManager cservice = IConnectivityManager.Stub.asInterface(b); - try { - cservice.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, - Phone.FEATURE_ENABLE_DUN, new Binder()); - } catch (Exception e) { - } + turnOnMobileDun(); sendMessageDelayed(obtainMessage(CMD_CELL_DUN_RENEW), CELL_DUN_RENEW_MS); break; default: @@ -1510,58 +1499,6 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } } - class CellDunUnRequestedState extends HierarchicalState { - @Override - public void enter() { - IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE); - IConnectivityManager service = - IConnectivityManager.Stub.asInterface(b); - NetworkInfo dunInfo = null; - try { - dunInfo = service.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_DUN); - } catch (Exception e) {} - if (dunInfo != null && !dunInfo.isConnectedOrConnecting()) { - sendMessage(obtainMessage(CMD_CELL_DUN_DISABLED)); - return; - } - try { - service.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, - Phone.FEATURE_ENABLE_DUN); - } catch (Exception e) {} - Message m = obtainMessage(CMD_CELL_DUN_TIMEOUT); - m.arg1 = ++mSequenceNumber; - // use a short timeout - this will often be a no-op and - // we just want this request to get into the queue before we - // try again. - sendMessageDelayed(m, CELL_DISABLE_DUN_TIMEOUT_MS); - } - @Override - public boolean processMessage(Message message) { - Log.d(TAG, "CellDunUnRequestedState.processMessage what=" + message.what); - boolean retValue = true; - switch (message.what) { - case CMD_TETHER_MODE_REQUESTED: - case CMD_TETHER_MODE_UNREQUESTED: - deferMessage(message); - break; - case CMD_CELL_DUN_DISABLED: - transitionTo(mInitialState); - break; - case CMD_CELL_DUN_TIMEOUT: - // if we aren't using a sep apn, we won't get a disconnect broadcast.. - // just go back to initial after our short pause - if (message.arg1 == mSequenceNumber) { - transitionTo(mInitialState); - } - break; - default: - retValue = false; - break; - } - return retValue; - } - } - class ErrorState extends HierarchicalState { int mErrorNotification; @Override diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java index fbb3c4c..d5f18e0 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java @@ -23,6 +23,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.net.ConnectivityManager; +import android.net.IConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.AsyncResult; @@ -188,8 +190,16 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker { // and 2) whether the RIL will setup the baseband to auto-PS attach. SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext()); + boolean dataEnabledSetting = true; + try { + dataEnabledSetting = IConnectivityManager.Stub.asInterface(ServiceManager. + getService(Context.CONNECTIVITY_SERVICE)).getMobileDataEnabled(); + } catch (Exception e) { + // nothing to do - use the old behavior and leave data on + } dataEnabled[APN_DEFAULT_ID] = - !sp.getBoolean(CDMAPhone.DATA_DISABLED_ON_BOOT_KEY, false); + !sp.getBoolean(CDMAPhone.DATA_DISABLED_ON_BOOT_KEY, false) && + dataEnabledSetting; if (dataEnabled[APN_DEFAULT_ID]) { enabledCount++; } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index 1fd6be8..30beaaa 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -27,6 +27,8 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.database.ContentObserver; import android.database.Cursor; +import android.net.ConnectivityManager; +import android.net.IConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.net.wifi.WifiManager; @@ -243,7 +245,15 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { // This preference tells us 1) initial condition for "dataEnabled", // and 2) whether the RIL will setup the baseband to auto-PS attach. SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext()); - dataEnabled[APN_DEFAULT_ID] = !sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false); + boolean dataEnabledSetting = true; + try { + dataEnabledSetting = IConnectivityManager.Stub.asInterface(ServiceManager. + getService(Context.CONNECTIVITY_SERVICE)).getMobileDataEnabled(); + } catch (Exception e) { + // nothing to do - use the old behavior and leave data on + } + dataEnabled[APN_DEFAULT_ID] = !sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false) && + dataEnabledSetting; if (dataEnabled[APN_DEFAULT_ID]) { enabledCount++; } diff --git a/tests/AndroidTests/src/com/android/unit_tests/AsecTests.java b/tests/AndroidTests/src/com/android/unit_tests/AsecTests.java index e85254d..5aaf13b 100755 --- a/tests/AndroidTests/src/com/android/unit_tests/AsecTests.java +++ b/tests/AndroidTests/src/com/android/unit_tests/AsecTests.java @@ -55,6 +55,7 @@ public class AsecTests extends AndroidTestCase { void failStr(String errMsg) { Log.w(TAG, "errMsg="+errMsg); } + void failStr(Exception e) { Log.w(TAG, "e.getMessage="+e.getMessage()); Log.w(TAG, "e="+e); @@ -67,6 +68,13 @@ public class AsecTests extends AndroidTestCase { cleanupContainers(); } + @Override + protected void tearDown() throws Exception { + super.tearDown(); + if (localLOGV) Log.i(TAG, "Cleaning out old test containers"); + cleanupContainers(); + } + private void cleanupContainers() throws RemoteException { IMountService ms = getMs(); String[] containers = ms.getSecureContainerList(); diff --git a/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java b/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java index d161a88..5e3895a 100755 --- a/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java +++ b/tests/AndroidTests/src/com/android/unit_tests/PackageManagerTests.java @@ -403,7 +403,7 @@ public class PackageManagerTests extends AndroidTestCase { return ip; } finally { if (cleanUp) { - cleanUpInstall(ip); + //cleanUpInstall(ip); } } } diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index 88c5441..ae4bd14 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -221,12 +221,12 @@ static status_t parsePackage(Bundle* bundle, const sp<AaptAssets>& assets, && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { if (strcmp16(block.getElementName(&len), uses_sdk16.string()) == 0) { - ssize_t minSdkIndex = block.indexOfAttribute("android", + ssize_t minSdkIndex = block.indexOfAttribute(RESOURCES_ANDROID_NAMESPACE, "minSdkVersion"); if (minSdkIndex >= 0) { - String8 minSdkString = String8( - block.getAttributeStringValue(minSdkIndex, &len)); - bundle->setMinSdkVersion(minSdkString.string()); + const uint16_t* minSdk16 = block.getAttributeStringValue(minSdkIndex, &len); + const char* minSdk8 = strdup(String8(minSdk16).string()); + bundle->setMinSdkVersion(minSdk8); } } } diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas.java b/tools/layoutlib/bridge/src/android/graphics/Canvas.java index 8bf5e85..d5d315e 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Canvas.java +++ b/tools/layoutlib/bridge/src/android/graphics/Canvas.java @@ -236,11 +236,6 @@ public class Canvas extends _Original_Canvas { // OVERRIDEN METHODS // -------------------- - @Override - public void finalize() throws Throwable { - // pass - } - /* (non-Javadoc) * @see android.graphics.Canvas#setBitmap(android.graphics.Bitmap) */ diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix.java b/tools/layoutlib/bridge/src/android/graphics/Matrix.java index 522415c..9e30671 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Matrix.java +++ b/tools/layoutlib/bridge/src/android/graphics/Matrix.java @@ -52,11 +52,6 @@ public class Matrix extends _Original_Matrix { mValues = data; } - @Override - public void finalize() throws Throwable { - // pass - } - //---------- Custom Methods /** diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint.java b/tools/layoutlib/bridge/src/android/graphics/Paint.java index 2d03618..e4f9794 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Paint.java +++ b/tools/layoutlib/bridge/src/android/graphics/Paint.java @@ -219,11 +219,6 @@ public class Paint extends _Original_Paint { } @Override - public void finalize() throws Throwable { - // pass - } - - @Override public void reset() { super.reset(); } diff --git a/tools/preload/20100223.compiled b/tools/preload/20100223.compiled Binary files differnew file mode 100644 index 0000000..3056388 --- /dev/null +++ b/tools/preload/20100223.compiled diff --git a/tools/preload/MemoryUsage.java b/tools/preload/MemoryUsage.java index bc21b6f..d8f95f4 100644 --- a/tools/preload/MemoryUsage.java +++ b/tools/preload/MemoryUsage.java @@ -166,7 +166,7 @@ class MemoryUsage implements Serializable { + ":/system/framework/loadclass.jar"; private static final String[] GET_DIRTY_PAGES = { - "adb", "-e", "shell", "dalvikvm", CLASS_PATH, "LoadClass" }; + "adb", "shell", "dalvikvm", CLASS_PATH, "LoadClass" }; /** * Measures memory usage for the given class. @@ -248,7 +248,7 @@ class MemoryUsage implements Serializable { String line = in.readLine(); if (line == null || !line.startsWith("DECAFBAD,")) { System.err.println("Got bad response for " + className - + ": " + line); + + ": " + line + "; command was " + Arrays.toString(commands)); errorCount += 1; return NOT_AVAILABLE; } diff --git a/tools/preload/Policy.java b/tools/preload/Policy.java index a8d761d..f557365 100644 --- a/tools/preload/Policy.java +++ b/tools/preload/Policy.java @@ -43,9 +43,14 @@ public class Policy { "system_server", "com.google.process.content", "android.process.media", + "com.android.bluetooth", + "com.android.calendar", + "com.android.inputmethod.latin", "com.android.phone", - "com.google.android.apps.maps.FriendService", + "com.google.android.apps.maps.FriendService", // pre froyo + "com.google.android.apps.maps:FriendService", // froyo "com.google.android.apps.maps.LocationFriendService", + "com.google.android.deskclock", "com.google.process.gapps", "android.tts" )); diff --git a/tools/preload/Record.java b/tools/preload/Record.java index b2be4d4..9d45a26 100644 --- a/tools/preload/Record.java +++ b/tools/preload/Record.java @@ -19,6 +19,19 @@ */ class Record { + /** + * The delimiter character we use, {@code :}, conflicts with some other + * names. In that case, manually replace the delimiter with something else. + */ + private static final String[] REPLACE_CLASSES = { + "com.google.android.apps.maps:FriendService", + "com.google.android.apps.maps\\u003AFriendService", + "com.google.android.apps.maps:driveabout", + "com.google.android.apps.maps\\u003Adriveabout", + "com.google.android.apps.maps:LocationFriendService", + "com.google.android.apps.maps\\u003ALocationFriendService", + }; + enum Type { /** Start of initialization. */ START_LOAD, @@ -74,6 +87,10 @@ class Record { } sourceLineNumber = lineNum; + + for (int i = 0; i < REPLACE_CLASSES.length; i+= 2) { + line = line.replace(REPLACE_CLASSES[i], REPLACE_CLASSES[i+1]); + } line = line.substring(1); String[] parts = line.split(":"); |