diff options
22 files changed, 214 insertions, 132 deletions
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 64054c5dfd27..3e4795c08957 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -575,6 +575,10 @@ public class AppOpsManager { } } + private String buildSecurityExceptionMsg(int op, int uid, String packageName) { + return packageName + " from uid " + uid + " not allowed to perform " + sOpNames[op]; + } + /** * Do a quick check for whether an application might be able to perform an operation. * This is <em>not</em> a security check; you must use {@link #noteOp(int, int, String)} @@ -595,7 +599,7 @@ public class AppOpsManager { try { int mode = mService.checkOperation(op, uid, packageName); if (mode == MODE_ERRORED) { - throw new SecurityException("Operation not allowed"); + throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); } return mode; } catch (RemoteException e) { @@ -650,7 +654,7 @@ public class AppOpsManager { try { int mode = mService.noteOperation(op, uid, packageName); if (mode == MODE_ERRORED) { - throw new SecurityException("Operation not allowed"); + throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); } return mode; } catch (RemoteException e) { @@ -672,7 +676,7 @@ public class AppOpsManager { /** @hide */ public int noteOp(int op) { - return noteOp(op, Process.myUid(), mContext.getBasePackageName()); + return noteOp(op, Process.myUid(), mContext.getOpPackageName()); } /** @hide */ @@ -710,7 +714,7 @@ public class AppOpsManager { try { int mode = mService.startOperation(getToken(mService), op, uid, packageName); if (mode == MODE_ERRORED) { - throw new SecurityException("Operation not allowed"); + throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); } return mode; } catch (RemoteException e) { @@ -732,7 +736,7 @@ public class AppOpsManager { /** @hide */ public int startOp(int op) { - return startOp(op, Process.myUid(), mContext.getBasePackageName()); + return startOp(op, Process.myUid(), mContext.getOpPackageName()); } /** @@ -749,6 +753,6 @@ public class AppOpsManager { } public void finishOp(int op) { - finishOp(op, Process.myUid(), mContext.getBasePackageName()); + finishOp(op, Process.myUid(), mContext.getOpPackageName()); } } diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index ab2739d411ac..e522b7881eb8 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1275,7 +1275,7 @@ final class ApplicationPackageManager extends PackageManager { int newState, int flags) { try { mPM.setApplicationEnabledSetting(packageName, newState, flags, - mContext.getUserId(), mContext.getBasePackageName()); + mContext.getUserId(), mContext.getOpPackageName()); } catch (RemoteException e) { // Should never happen! } diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 7ff75625a114..fe8c50666361 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -183,6 +183,7 @@ class ContextImpl extends Context { /*package*/ LoadedApk mPackageInfo; private String mBasePackageName; + private String mOpPackageName; private Resources mResources; /*package*/ ActivityThread mMainThread; private Context mOuterContext; @@ -679,6 +680,12 @@ class ContextImpl extends Context { return mBasePackageName != null ? mBasePackageName : getPackageName(); } + /** @hide */ + @Override + public String getOpPackageName() { + return mOpPackageName != null ? mOpPackageName : getBasePackageName(); + } + @Override public ApplicationInfo getApplicationInfo() { if (mPackageInfo != null) { @@ -1961,6 +1968,7 @@ class ContextImpl extends Context { public ContextImpl(ContextImpl context) { mPackageInfo = context.mPackageInfo; mBasePackageName = context.mBasePackageName; + mOpPackageName = context.mOpPackageName; mResources = context.mResources; mMainThread = context.mMainThread; mContentResolver = context.mContentResolver; @@ -1977,7 +1985,21 @@ class ContextImpl extends Context { final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread, Resources container, String basePackageName, UserHandle user) { mPackageInfo = packageInfo; - mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName; + if (basePackageName != null) { + mBasePackageName = mOpPackageName = basePackageName; + } else { + mBasePackageName = packageInfo.mPackageName; + ApplicationInfo ainfo = packageInfo.getApplicationInfo(); + if (ainfo.uid == Process.SYSTEM_UID && ainfo.uid != Process.myUid()) { + // Special case: system components allow themselves to be loaded in to other + // processes. For purposes of app ops, we must then consider the context as + // belonging to the package of this process, not the system itself, otherwise + // the package+uid verifications in app ops will fail. + mOpPackageName = ActivityThread.currentPackageName(); + } else { + mOpPackageName = mBasePackageName; + } + } mResources = mPackageInfo.getResources(mainThread); mResourcesManager = ResourcesManager.getInstance(); @@ -2011,6 +2033,7 @@ class ContextImpl extends Context { final void init(Resources resources, ActivityThread mainThread, UserHandle user) { mPackageInfo = null; mBasePackageName = null; + mOpPackageName = null; mResources = resources; mMainThread = mainThread; mContentResolver = new ApplicationContentResolver(this, mainThread, user); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index dbafc7830a97..3ee430639ab1 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -133,7 +133,7 @@ public class NotificationManager } if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); try { - service.enqueueNotificationWithTag(pkg, mContext.getBasePackageName(), tag, id, + service.enqueueNotificationWithTag(pkg, mContext.getOpPackageName(), tag, id, notification, idOut, UserHandle.myUserId()); if (id != idOut[0]) { Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]); @@ -158,7 +158,7 @@ public class NotificationManager } if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); try { - service.enqueueNotificationWithTag(pkg, mContext.getBasePackageName(), tag, id, + service.enqueueNotificationWithTag(pkg, mContext.getOpPackageName(), tag, id, notification, idOut, user.getIdentifier()); if (id != idOut[0]) { Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]); diff --git a/core/java/android/content/ClipboardManager.java b/core/java/android/content/ClipboardManager.java index 69f9d4a876b2..73e6fd0d8f8c 100644 --- a/core/java/android/content/ClipboardManager.java +++ b/core/java/android/content/ClipboardManager.java @@ -122,7 +122,7 @@ public class ClipboardManager extends android.text.ClipboardManager { if (clip != null) { clip.prepareToLeaveProcess(); } - getService().setPrimaryClip(clip, mContext.getBasePackageName()); + getService().setPrimaryClip(clip, mContext.getOpPackageName()); } catch (RemoteException e) { } } @@ -132,7 +132,7 @@ public class ClipboardManager extends android.text.ClipboardManager { */ public ClipData getPrimaryClip() { try { - return getService().getPrimaryClip(mContext.getBasePackageName()); + return getService().getPrimaryClip(mContext.getOpPackageName()); } catch (RemoteException e) { return null; } @@ -144,7 +144,7 @@ public class ClipboardManager extends android.text.ClipboardManager { */ public ClipDescription getPrimaryClipDescription() { try { - return getService().getPrimaryClipDescription(mContext.getBasePackageName()); + return getService().getPrimaryClipDescription(mContext.getOpPackageName()); } catch (RemoteException e) { return null; } @@ -155,7 +155,7 @@ public class ClipboardManager extends android.text.ClipboardManager { */ public boolean hasPrimaryClip() { try { - return getService().hasPrimaryClip(mContext.getBasePackageName()); + return getService().hasPrimaryClip(mContext.getOpPackageName()); } catch (RemoteException e) { return false; } @@ -166,7 +166,7 @@ public class ClipboardManager extends android.text.ClipboardManager { if (mPrimaryClipChangedListeners.size() == 0) { try { getService().addPrimaryClipChangedListener( - mPrimaryClipChangedServiceListener, mContext.getBasePackageName()); + mPrimaryClipChangedServiceListener, mContext.getOpPackageName()); } catch (RemoteException e) { } } @@ -213,7 +213,7 @@ public class ClipboardManager extends android.text.ClipboardManager { */ public boolean hasText() { try { - return getService().hasClipboardText(mContext.getBasePackageName()); + return getService().hasClipboardText(mContext.getOpPackageName()); } catch (RemoteException e) { return false; } diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index f3c4df9852b5..f250029153f6 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -261,7 +261,7 @@ public abstract class ContentResolver { public ContentResolver(Context context) { mContext = context != null ? context : ActivityThread.currentApplication(); - mPackageName = mContext.getBasePackageName(); + mPackageName = mContext.getOpPackageName(); } /** @hide */ diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 8df5bee57b86..7b15e63b4bb0 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -435,6 +435,13 @@ public abstract class Context { /** @hide Return the name of the base context this context is derived from. */ public abstract String getBasePackageName(); + /** @hide Return the package name that should be used for app ops calls from + * this context. This is the same as {@link #getBasePackageName()} except in + * cases where system components are loaded into other app processes, in which + * case this will be the name of the primary package in that process (so that app + * ops uid verification will work with the name). */ + public abstract String getOpPackageName(); + /** Return the full application info for this context's package. */ public abstract ApplicationInfo getApplicationInfo(); diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index e09d36743dcf..a708dad6bf3e 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -141,6 +141,12 @@ public class ContextWrapper extends Context { return mBase.getBasePackageName(); } + /** @hide */ + @Override + public String getOpPackageName() { + return mBase.getOpPackageName(); + } + @Override public ApplicationInfo getApplicationInfo() { return mBase.getApplicationInfo(); diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java index d3e57523e945..40a3612efe5a 100644 --- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -22,6 +22,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; @@ -80,10 +81,15 @@ public final class ApduServiceInfo implements Parcelable { final boolean mRequiresDeviceUnlock; /** + * The id of the service banner specified in XML. + */ + final int mBannerResourceId; + + /** * @hide */ public ApduServiceInfo(ResolveInfo info, boolean onHost, String description, - ArrayList<AidGroup> aidGroups, boolean requiresUnlock) { + ArrayList<AidGroup> aidGroups, boolean requiresUnlock, int bannerResource) { this.mService = info; this.mDescription = description; this.mAidGroups = aidGroups; @@ -95,6 +101,7 @@ public final class ApduServiceInfo implements Parcelable { this.mCategoryToGroup.put(aidGroup.category, aidGroup); this.mAids.addAll(aidGroup.aids); } + this.mBannerResourceId = bannerResource; } public ApduServiceInfo(PackageManager pm, ResolveInfo info, boolean onHost) @@ -141,6 +148,9 @@ public final class ApduServiceInfo implements Parcelable { mRequiresDeviceUnlock = sa.getBoolean( com.android.internal.R.styleable.HostApduService_requireDeviceUnlock, false); + mBannerResourceId = sa.getResourceId( + com.android.internal.R.styleable.HostApduService_apduServiceBanner, -1); + sa.recycle(); } else { TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.OffHostApduService); @@ -148,6 +158,9 @@ public final class ApduServiceInfo implements Parcelable { mDescription = sa.getString( com.android.internal.R.styleable.OffHostApduService_description); mRequiresDeviceUnlock = false; + mBannerResourceId = sa.getResourceId( + com.android.internal.R.styleable.HostApduService_apduServiceBanner, -1); + sa.recycle(); } mAidGroups = new ArrayList<AidGroup>(); @@ -183,6 +196,7 @@ public final class ApduServiceInfo implements Parcelable { } else { currentGroup = new AidGroup(groupCategory, groupDescription); } + groupAttrs.recycle(); } else if (eventType == XmlPullParser.END_TAG && "aid-group".equals(tagName) && currentGroup != null) { if (currentGroup.aids.size() > 0) { @@ -206,6 +220,7 @@ public final class ApduServiceInfo implements Parcelable { } else { Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid); } + a.recycle(); } } } catch (NameNotFoundException e) { @@ -248,6 +263,21 @@ public final class ApduServiceInfo implements Parcelable { return mService.loadIcon(pm); } + public Drawable loadBanner(PackageManager pm) { + Resources res; + try { + res = pm.getResourcesForApplication(mService.serviceInfo.packageName); + Drawable banner = res.getDrawable(mBannerResourceId); + return banner; + } catch (NotFoundException e) { + Log.e(TAG, "Could not load banner."); + return null; + } catch (NameNotFoundException e) { + Log.e(TAG, "Could not load banner."); + return null; + } + } + static boolean isValidAid(String aid) { if (aid == null) return false; @@ -302,6 +332,7 @@ public final class ApduServiceInfo implements Parcelable { dest.writeTypedList(mAidGroups); } dest.writeInt(mRequiresDeviceUnlock ? 1 : 0); + dest.writeInt(mBannerResourceId); }; public static final Parcelable.Creator<ApduServiceInfo> CREATOR = @@ -317,7 +348,8 @@ public final class ApduServiceInfo implements Parcelable { source.readTypedList(aidGroups, AidGroup.CREATOR); } boolean requiresUnlock = (source.readInt() != 0) ? true : false; - return new ApduServiceInfo(info, onHost, description, aidGroups, requiresUnlock); + int bannerResource = source.readInt(); + return new ApduServiceInfo(info, onHost, description, aidGroups, requiresUnlock, bannerResource); } @Override diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 52e5f38dc90f..5e0d48949c22 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -407,7 +407,7 @@ public final class PowerManager { */ public WakeLock newWakeLock(int levelAndFlags, String tag) { validateWakeLockParameters(levelAndFlags, tag); - return new WakeLock(levelAndFlags, tag, mContext.getBasePackageName()); + return new WakeLock(levelAndFlags, tag, mContext.getOpPackageName()); } /** @hide */ diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java index e66fb2854aa7..700f80d1991c 100644 --- a/core/java/android/os/SystemVibrator.java +++ b/core/java/android/os/SystemVibrator.java @@ -39,7 +39,7 @@ public class SystemVibrator extends Vibrator { } public SystemVibrator(Context context) { - mPackageName = context.getBasePackageName(); + mPackageName = context.getOpPackageName(); mService = IVibratorService.Stub.asInterface( ServiceManager.getService("vibrator")); } diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 1ff0d635c576..8cb152db06e3 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -479,7 +479,13 @@ void AndroidPixelRef::globalRef(void* localref) { if (fWrappedPixelRef) { // delegate java obj management to the wrapped ref fWrappedPixelRef->globalRef(localref); - } else if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) { + + // Note: we only ref and unref the wrapped AndroidPixelRef so that + // bitmap->pixelRef()->globalRef() and globalUnref() can be used in a pair, even if + // the bitmap has its underlying AndroidPixelRef swapped out/wrapped + return; + } + if (fOnJavaHeap && sk_atomic_inc(&fGlobalRefCnt) == 0) { JNIEnv *env = vm2env(fVM); // If JNI ref was passed, it is always used @@ -506,7 +512,9 @@ void AndroidPixelRef::globalUnref() { if (fWrappedPixelRef) { // delegate java obj management to the wrapped ref fWrappedPixelRef->globalUnref(); - } else if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) { + return; + } + if (fOnJavaHeap && sk_atomic_dec(&fGlobalRefCnt) == 1) { JNIEnv *env = vm2env(fVM); if (!fHasGlobalRef) { SkDebugf("We don't have a global ref!"); diff --git a/docs/html/guide/topics/ui/how-android-draws.jd b/docs/html/guide/topics/ui/how-android-draws.jd index 6a8cd869e535..168f77b265cf 100644 --- a/docs/html/guide/topics/ui/how-android-draws.jd +++ b/docs/html/guide/topics/ui/how-android-draws.jd @@ -4,15 +4,19 @@ parent.link=index.html @jd:body -<p>When an Activity receives focus, it will be requested to draw its layout. -The Android framework will handle the procedure for drawing, but the Activity must provide +<p>When an {@link android.app.Activity} receives focus, it will be requested to +draw its layout. +The Android framework will handle the procedure for drawing, but the +{@link android.app.Activity} must provide the root node of its layout hierarchy.</p> <p>Drawing begins with the root node of the layout. It is requested to measure and -draw the layout tree. Drawing is handled by walking the tree and rendering each View that - intersects the invalid region. In turn, each View group is responsible for requesting -each of its children to be drawn (with the <code>{@link android.view.View#draw(Canvas) draw()}</code> method) -and each View is responsible for drawing itself. +draw the layout tree. Drawing is handled by walking the tree and rendering each +{@link android.view.View} that intersects the invalid region. In turn, each +{@link android.view.ViewGroup} is responsible for requesting +each of its children to be drawn +(with the {@link android.view.View#draw(Canvas) draw()} method) +and each {@link android.view.View} is responsible for drawing itself. Because the tree is traversed in-order, this means that parents will be drawn before (i.e., behind) their children, with siblings drawn in the order they appear in the tree. @@ -20,76 +24,107 @@ and each View is responsible for drawing itself. <div class="sidebox-wrapper"> <div class="sidebox"> - <p>The framework will not draw Views that are not in the invalid region, and also - will take care of drawing the Views background for you.</p> - <p>You can force a View to draw, by calling <code>{@link android.view.View#invalidate()}</code>. + <p>The framework will not draw {@link android.view.View} objects that are not +in the invalid region, and also + will take care of drawing the {@link android.view.View} background for you.</p> + <p>You can force a {@link android.view.View} to draw, by calling +{@link android.view.View#invalidate()}. </p> </div> </div> <p> - Drawing the layout is a two pass process: a measure pass and a layout pass. The measuring - pass is implemented in <code>{@link android.view.View#measure(int, int)}</code> and is a top-down traversal - of the View tree. Each View pushes dimension specifications down the tree - during the recursion. At the end of the measure pass, every View has stored + Drawing the layout is a two pass process: a measure pass and a layout pass. +The measuring pass is implemented in {@link android.view.View#measure(int, int)} +and is a top-down traversal of the {@link android.view.View} tree. Each {@link android.view.View} +pushes dimension specifications down the tree + during the recursion. At the end of the measure pass, every +{@link android.view.View} has stored its measurements. The second pass happens in - <code>{@link android.view.View#layout(int,int,int,int)}</code> and is also top-down. During + {@link android.view.View#layout(int,int,int,int)} and is also top-down. During this pass each parent is responsible for positioning all of its children using the sizes computed in the measure pass. </p> <p> - When a View's <code>measure()</code> method returns, its <code>{@link android.view.View#getMeasuredWidth()}</code> and - <code>{@link android.view.View#getMeasuredHeight()}</code> values must be set, along with those for all of - that View's descendants. A View's measured width and measured height values - must respect the constraints imposed by the View's parents. This guarantees + When a {@link android.view.View} object's +{@link android.view.View#measure(int, int) measure()} method +returns, its {@link android.view.View#getMeasuredWidth()} and + {@link android.view.View#getMeasuredHeight()} values must be set, along + with those for all of that {@link android.view.View} object's descendants. +A {@link android.view.View} object's measured width and +measured height values must respect the constraints imposed by the +{@link android.view.View} object's parents. This guarantees that at the end of the measure pass, all parents accept all of their - children's measurements. A parent View may call <code>measure()</code> more than once on + children's measurements. A parent {@link android.view.View} may call +{@link android.view.View#measure(int, int) measure()} more than once on its children. For example, the parent may measure each child once with unspecified dimensions to find out how big they want to be, then call - <code>measure()</code> on them again with actual numbers if the sum of all the children's - unconstrained sizes is too big or too small (i.e., if the children don't agree among themselves - as to how much space they each get, the parent will intervene and set the rules on the second pass). + {@link android.view.View#measure(int, int) measure()} on them again with +actual numbers if the sum of all the children's + unconstrained sizes is too big or too small (that is, if the children +don't agree among themselves + as to how much space they each get, the parent will intervene and set +the rules on the second pass). </p> <div class="sidebox-wrapper"> <div class="sidebox"><p> - To initiate a layout, call <code>{@link android.view.View#requestLayout}</code>. This method is typically - called by a View on itself when it believes that is can no longer fit within + To initiate a layout, call {@link android.view.View#requestLayout}. +This method is typically + called by a {@link android.view.View} on itself +when it believes that is can no longer fit within its current bounds.</p> </div> </div> <p> The measure pass uses two classes to communicate dimensions. The - {@link android.view.ViewGroup.LayoutParams} class is used by Views to tell their parents how they - want to be measured and positioned. The base LayoutParams class just - describes how big the View wants to be for both width and height. For each + {@link android.view.ViewGroup.LayoutParams} class is used by +{@link android.view.View} objects to tell their parents how they + want to be measured and positioned. The base +{@link android.view.ViewGroup.LayoutParams} class just + describes how big the {@link android.view.View} wants to be for both +width and height. For each dimension, it can specify one of:</p> <ul> <li> an exact number - <li><var>FILL_PARENT</var>, which means the View wants to be as big as its parent + <li>{@link android.view.ViewGroup.LayoutParams#MATCH_PARENT MATCH_PARENT}, +which means the {@link android.view.View} wants to be as big as its parent (minus padding)</li> - <li><var>WRAP_CONTENT</var>, which means that the View wants to be just big enough to + <li>{@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT WRAP_CONTENT}, +which means that the {@link android.view.View} wants to be just big enough to enclose its content (plus padding).</li> </ul> - <p>There are subclasses of LayoutParams for different subclasses of ViewGroup. - For example, RelativeLayout has its own subclass of LayoutParams, which includes - the ability to center child Views horizontally and vertically. + <p>There are subclasses of {@link android.view.ViewGroup.LayoutParams} for +different subclasses of {@link android.view.ViewGroup}. + For example, {@link android.widget.RelativeLayout} has its own subclass of +{@link android.view.ViewGroup.LayoutParams}, which includes + the ability to center child {@link android.view.View} objects +horizontally and vertically. </p> <p> - MeasureSpecs are used to push requirements down the tree from parent to - child. A MeasureSpec can be in one of three modes:</p> + {@link android.view.View.MeasureSpec MeasureSpec} objects are used to push +requirements down the tree from parent to + child. A {@link android.view.View.MeasureSpec MeasureSpec} can be in one of +three modes:</p> <ul> - <li><var>UNSPECIFIED</var>: This is used by a parent to determine the desired dimension - of a child View. For example, a LinearLayout may call <code>measure()</code> on its child - with the height set to <var>UNSPECIFIED</var> and a width of <var>EXACTLY</var> 240 to find out how - tall the child View wants to be given a width of 240 pixels.</li> - <li><var>EXACTLY</var>: This is used by the parent to impose an exact size on the + <li>{@link android.view.View.MeasureSpec#UNSPECIFIED UNSPECIFIED}: This is +used by a parent to determine the desired dimension + of a child {@link android.view.View}. For example, a +{@link android.widget.LinearLayout} may call +{@link android.view.View#measure(int, int) measure()} on its child + with the height set to {@link android.view.View.MeasureSpec#UNSPECIFIED UNSPECIFIED} +and a width of {@link android.view.View.MeasureSpec#EXACTLY EXACTLY} 240 to +find out how tall the child {@link android.view.View} wants to be given a +width of 240 pixels.</li> + <li>{@link android.view.View.MeasureSpec#EXACTLY EXACTLY}: This is used +by the parent to impose an exact size on the child. The child must use this size, and guarantee that all of its descendants will fit within this size.</li> - <li><var>AT_MOST</var>: This is used by the parent to impose a maximum size on the + <li>{@link android.view.View.MeasureSpec#AT_MOST AT MOST}: This is used by +the parent to impose a maximum size on the child. The child must guarantee that it and all of its descendants will fit within this size.</li> </ul> diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 1dcf0e92b610..d1f71563295e 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -551,10 +551,10 @@ public class AudioManager { IAudioService service = getService(); try { if (mUseMasterVolume) { - service.adjustMasterVolume(direction, flags, mContext.getBasePackageName()); + service.adjustMasterVolume(direction, flags, mContext.getOpPackageName()); } else { service.adjustStreamVolume(streamType, direction, flags, - mContext.getBasePackageName()); + mContext.getOpPackageName()); } } catch (RemoteException e) { Log.e(TAG, "Dead object in adjustStreamVolume", e); @@ -582,9 +582,9 @@ public class AudioManager { IAudioService service = getService(); try { if (mUseMasterVolume) { - service.adjustMasterVolume(direction, flags, mContext.getBasePackageName()); + service.adjustMasterVolume(direction, flags, mContext.getOpPackageName()); } else { - service.adjustVolume(direction, flags, mContext.getBasePackageName()); + service.adjustVolume(direction, flags, mContext.getOpPackageName()); } } catch (RemoteException e) { Log.e(TAG, "Dead object in adjustVolume", e); @@ -612,10 +612,10 @@ public class AudioManager { IAudioService service = getService(); try { if (mUseMasterVolume) { - service.adjustMasterVolume(direction, flags, mContext.getBasePackageName()); + service.adjustMasterVolume(direction, flags, mContext.getOpPackageName()); } else { service.adjustSuggestedStreamVolume(direction, suggestedStreamType, flags, - mContext.getBasePackageName()); + mContext.getOpPackageName()); } } catch (RemoteException e) { Log.e(TAG, "Dead object in adjustSuggestedStreamVolume", e); @@ -634,7 +634,7 @@ public class AudioManager { public void adjustMasterVolume(int steps, int flags) { IAudioService service = getService(); try { - service.adjustMasterVolume(steps, flags, mContext.getBasePackageName()); + service.adjustMasterVolume(steps, flags, mContext.getOpPackageName()); } catch (RemoteException e) { Log.e(TAG, "Dead object in adjustMasterVolume", e); } @@ -786,9 +786,9 @@ public class AudioManager { IAudioService service = getService(); try { if (mUseMasterVolume) { - service.setMasterVolume(index, flags, mContext.getBasePackageName()); + service.setMasterVolume(index, flags, mContext.getOpPackageName()); } else { - service.setStreamVolume(streamType, index, flags, mContext.getBasePackageName()); + service.setStreamVolume(streamType, index, flags, mContext.getOpPackageName()); } } catch (RemoteException e) { Log.e(TAG, "Dead object in setStreamVolume", e); @@ -854,7 +854,7 @@ public class AudioManager { public void setMasterVolume(int index, int flags) { IAudioService service = getService(); try { - service.setMasterVolume(index, flags, mContext.getBasePackageName()); + service.setMasterVolume(index, flags, mContext.getOpPackageName()); } catch (RemoteException e) { Log.e(TAG, "Dead object in setMasterVolume", e); } @@ -1569,7 +1569,7 @@ public class AudioManager { IAudioService service = getService(); try { service.adjustLocalOrRemoteStreamVolume(streamType, direction, - mContext.getBasePackageName()); + mContext.getOpPackageName()); } catch (RemoteException e) { Log.e(TAG, "Dead object in adjustLocalOrRemoteStreamVolume", e); } @@ -1996,7 +1996,7 @@ public class AudioManager { try { status = service.requestAudioFocus(streamType, durationHint, mICallBack, mAudioFocusDispatcher, getIdForAudioFocusListener(l), - mContext.getBasePackageName() /* package name */); + mContext.getOpPackageName() /* package name */); } catch (RemoteException e) { Log.e(TAG, "Can't call requestAudioFocus() on AudioService due to "+e); } @@ -2018,7 +2018,7 @@ public class AudioManager { try { service.requestAudioFocus(streamType, durationHint, mICallBack, null, MediaFocusControl.IN_VOICE_COMM_FOCUS_ID, - mContext.getBasePackageName()); + mContext.getOpPackageName()); } catch (RemoteException e) { Log.e(TAG, "Can't call requestAudioFocusForCall() on AudioService due to "+e); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 27bf38cc3d9f..8a285e30e7f9 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -3637,7 +3637,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER, 0, - mContext.getBasePackageName()); + mContext.getOpPackageName()); } catch (RemoteException e) { Log.w(TAG, "IAudioService.adjustStreamVolume() threw RemoteException " + e); } finally { @@ -4964,7 +4964,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { owningPackage = win.getOwningPackage(); } else { owningUid = android.os.Process.myUid(); - owningPackage = mContext.getBasePackageName(); + owningPackage = mContext.getOpPackageName(); } if (pattern.length == 1) { // One-shot vibration diff --git a/preloaded-classes b/preloaded-classes index 064ca3a12d75..cb2ace388398 100644 --- a/preloaded-classes +++ b/preloaded-classes @@ -663,8 +663,8 @@ android.net.wifi.IWifiManager$Stub$Proxy android.net.wifi.WifiManager android.net.wifi.WifiManager$ServiceHandler android.net.wifi.WifiNative -android.nfc.INdefPushCallback -android.nfc.INdefPushCallback$Stub +android.nfc.IAppCallback +android.nfc.IAppCallback$Stub android.nfc.INfcAdapter android.nfc.INfcAdapter$Stub android.nfc.INfcAdapter$Stub$Proxy @@ -1209,13 +1209,9 @@ android.webkit.BrowserFrame android.webkit.BrowserFrame$ConfigCallback android.webkit.CallbackProxy android.webkit.CookieManager -android.webkit.CookieManagerClassic android.webkit.CookieSyncManager android.webkit.DeviceMotionAndOrientationManager android.webkit.GeolocationPermissions -android.webkit.GeolocationPermissionsClassic -android.webkit.GeolocationPermissionsClassic$1 -android.webkit.GeolocationPermissionsClassic$2 android.webkit.HTML5Audio android.webkit.HTML5VideoViewProxy android.webkit.JWebCoreJavaBridge @@ -1231,42 +1227,19 @@ android.webkit.ViewManager$2 android.webkit.ViewManager$3 android.webkit.ViewStateSerializer android.webkit.WebBackForwardList -android.webkit.WebBackForwardListClassic android.webkit.WebCoreThreadWatchdog android.webkit.WebHistoryItem -android.webkit.WebHistoryItemClassic android.webkit.WebIconDatabase -android.webkit.WebIconDatabaseClassic -android.webkit.WebIconDatabaseClassic$EventHandler -android.webkit.WebIconDatabaseClassic$EventHandler$1 android.webkit.WebSettings android.webkit.WebSettings$LayoutAlgorithm android.webkit.WebSettings$PluginState android.webkit.WebSettings$RenderPriority android.webkit.WebSettings$ZoomDensity -android.webkit.WebSettingsClassic -android.webkit.WebSettingsClassic$AutoFillProfile -android.webkit.WebSettingsClassic$EventHandler -android.webkit.WebSettingsClassic$EventHandler$1 android.webkit.WebStorage -android.webkit.WebStorageClassic -android.webkit.WebStorageClassic$1 -android.webkit.WebStorageClassic$2 android.webkit.WebSyncManager android.webkit.WebSyncManager$SyncHandler android.webkit.WebView android.webkit.WebView$PrivateAccess -android.webkit.WebViewClassic -android.webkit.WebViewClassic$Factory -android.webkit.WebViewClassic$OnTrimMemoryListener -android.webkit.WebViewClassic$PackageListener -android.webkit.WebViewClassic$PageSwapDelegate -android.webkit.WebViewClassic$PrivateHandler -android.webkit.WebViewClassic$ProxyReceiver -android.webkit.WebViewClassic$SelectionHandleAlpha -android.webkit.WebViewClassic$TitleBarDelegate -android.webkit.WebViewClassic$TrustStorageListener -android.webkit.WebViewClassic$ViewSizeData android.webkit.WebViewClient android.webkit.WebViewCore$AutoFillData android.webkit.WebViewCore$DrawData @@ -1278,8 +1251,6 @@ android.webkit.WebViewCore$ViewState android.webkit.WebViewCore$WebCoreThread android.webkit.WebViewCore$WebCoreThread$1 android.webkit.WebViewDatabase -android.webkit.WebViewDatabaseClassic -android.webkit.WebViewDatabaseClassic$1 android.webkit.WebViewFactory android.webkit.WebViewFactory$Preloader android.webkit.WebViewFactoryProvider diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 4e3faca51af6..1af7cc89a9ec 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -4684,12 +4684,12 @@ public class ConnectivityService extends IConnectivityManager.Stub { @Override public void setAirplaneMode(boolean enable) { enforceConnectivityInternalPermission(); - final ContentResolver cr = mContext.getContentResolver(); - Settings.Global.putInt(cr, Settings.Global.AIRPLANE_MODE_ON, enable ? 1 : 0); - Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); - intent.putExtra("state", enable); final long ident = Binder.clearCallingIdentity(); try { + final ContentResolver cr = mContext.getContentResolver(); + Settings.Global.putInt(cr, Settings.Global.AIRPLANE_MODE_ON, enable ? 1 : 0); + Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); + intent.putExtra("state", enable); mContext.sendBroadcast(intent); } finally { Binder.restoreCallingIdentity(ident); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 40201ada54b8..7d8b64fe014c 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -309,7 +309,7 @@ public class TelephonyManager { */ public List<NeighboringCellInfo> getNeighboringCellInfo() { try { - return getITelephony().getNeighboringCellInfo(mContext.getBasePackageName()); + return getITelephony().getNeighboringCellInfo(mContext.getOpPackageName()); } catch (RemoteException ex) { return null; } catch (NullPointerException ex) { diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index 252a14e87f67..0d9cd18999f2 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -112,6 +112,12 @@ public class MockContext extends Context { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public String getOpPackageName() { + throw new UnsupportedOperationException(); + } + @Override public ApplicationInfo getApplicationInfo() { throw new UnsupportedOperationException(); diff --git a/tools/layoutlib/bridge/src/android/webkit/WebView.java b/tools/layoutlib/bridge/src/android/webkit/WebView.java index 3b6618831113..202f2046a3fd 100644 --- a/tools/layoutlib/bridge/src/android/webkit/WebView.java +++ b/tools/layoutlib/bridge/src/android/webkit/WebView.java @@ -99,14 +99,6 @@ public class WebView extends MockView { public static void disablePlatformNotifications() { } - public WebBackForwardList saveState(Bundle outState) { - return null; - } - - public WebBackForwardList restoreState(Bundle inState) { - return null; - } - public void loadUrl(String url) { } @@ -213,10 +205,6 @@ public class WebView extends MockView { public void clearSslPreferences() { } - public WebBackForwardList copyBackForwardList() { - return null; - } - public static String findAddress(String addr) { return null; } @@ -236,10 +224,6 @@ public class WebView extends MockView { public void addJavascriptInterface(Object obj, String interfaceName) { } - public WebSettings getSettings() { - return null; - } - public View getZoomControls() { return null; } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index a1f269715d52..b9294ab3c0f9 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -1090,6 +1090,12 @@ public final class BridgeContext extends Context { } @Override + public String getOpPackageName() { + // pass + return null; + } + + @Override public ApplicationInfo getApplicationInfo() { return mApplicationInfo; } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 5f5d54fc5525..2a5b4da02678 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -833,7 +833,7 @@ public class WifiManager { */ public List<BatchedScanResult> getBatchedScanResults() { try { - return mService.getBatchedScanResults(mContext.getBasePackageName()); + return mService.getBatchedScanResults(mContext.getOpPackageName()); } catch (RemoteException e) { return null; } @@ -883,7 +883,7 @@ public class WifiManager { */ public List<ScanResult> getScanResults() { try { - return mService.getScanResults(mContext.getBasePackageName()); + return mService.getScanResults(mContext.getOpPackageName()); } catch (RemoteException e) { return null; } |