From fef75eee1d7389f3bcff41fb8fded4f1801a2b92 Mon Sep 17 00:00:00 2001 From: Vladislav Kuzkokov Date: Mon, 22 Jan 2018 23:37:14 +0100 Subject: [PATCH] Fix Printing policy in profile owner. Sometimes app inside profile can't get package info for its owner. Instead of relying on calling user id, we make PrintManagerService switch to system id and pass user that called print() explicitly. Bug: 72309652 Test: cts-tradefed run cts-dev --module CtsDevicePolicyManagerTestCases --test com.android.cts.devicepolicy.MixedDeviceOwnerTest#testPrintingPolicy Test: cts-tradefed run cts-dev --module CtsDevicePolicyManagerTestCases --test com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPrintingPolicy Test: cts-tradefed run cts-dev --module CtsDevicePolicyManagerTestCases --test com.android.cts.devicepolicy.MixedProfileOwnerTest#testPrintingPolicy Test: bit FrameworksServicesTests:com.android.server.devicepolicy.DevicePolicyManagerTest Change-Id: Ib97018f56693549fbca506dba6efaadb6dd010b3 --- api/system-current.txt | 1 - .../app/admin/DevicePolicyManager.java | 16 ---- .../admin/DevicePolicyManagerInternal.java | 9 ++ .../app/admin/IDevicePolicyManager.aidl | 1 - .../BaseIDevicePolicyManager.java | 5 -- .../DevicePolicyManagerService.java | 88 ++++++++----------- .../server/print/PrintManagerService.java | 19 +++- 7 files changed, 63 insertions(+), 76 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 14320c46152fb..55c98c863acc5 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -382,7 +382,6 @@ package android.app.admin { method public java.lang.CharSequence getDeviceOwnerOrganizationName(); method public java.util.List getPermittedAccessibilityServices(int); method public java.util.List getPermittedInputMethodsForCurrentUser(); - method public java.lang.CharSequence getPrintingDisabledReason(); method public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException; method public java.lang.String getProfileOwnerNameAsUser(int) throws java.lang.IllegalArgumentException; method public int getUserProvisioningState(); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 52870b3f28aef..434b68afc67a1 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -9284,22 +9284,6 @@ public class DevicePolicyManager { } } - /** - * Returns error message to be displayed when printing is disabled. - * - * Used only by PrintService. - * @return Localized error message. - * @hide - */ - @SystemApi - public CharSequence getPrintingDisabledReason() { - try { - return mService.getPrintingDisabledReason(); - } catch (RemoteException re) { - throw re.rethrowFromSystemServer(); - } - } - /** * Called by device owner to add an override APN. * diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java index 531bef014c0b1..ebaf4648d80af 100644 --- a/core/java/android/app/admin/DevicePolicyManagerInternal.java +++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java @@ -132,4 +132,13 @@ public abstract class DevicePolicyManagerInternal { * @param userId The user in question */ public abstract boolean canUserHaveUntrustedCredentialReset(@UserIdInt int userId); + + /** + * Return text of error message if printing is disabled. + * Called by Print Service when printing is disabled by PO or DO when printing is attempted. + * + * @param userId The user in question + * @return localized error message + */ + public abstract CharSequence getPrintingDisabledReasonForUser(@UserIdInt int userId); } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index a5ca4cf12ffac..d4f7db6b90999 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -400,7 +400,6 @@ interface IDevicePolicyManager { void setPrintingEnabled(in ComponentName admin, boolean enabled); boolean isPrintingEnabled(); - CharSequence getPrintingDisabledReason(); List setMeteredDataDisabled(in ComponentName admin, in List packageNames); List getMeteredDataDisabled(in ComponentName admin); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java index 886747ccb4352..b312f2f439d78 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java @@ -134,11 +134,6 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub { return true; } - @Override - public CharSequence getPrintingDisabledReason() { - return null; - } - @Override public List setMeteredDataDisabled(ComponentName admin, List packageNames) { return packageNames; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index cb346cc877ae4..3a24770819a13 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -10251,6 +10251,45 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { public boolean canUserHaveUntrustedCredentialReset(@UserIdInt int userId) { return DevicePolicyManagerService.this.canUserHaveUntrustedCredentialReset(userId); } + + @Override + public CharSequence getPrintingDisabledReasonForUser(@UserIdInt int userId) { + synchronized (DevicePolicyManagerService.this) { + DevicePolicyData policy = getUserData(userId); + if (policy.mPrintingEnabled) { + Log.e(LOG_TAG, "printing is enabled"); + return null; + } + String ownerPackage = mOwners.getProfileOwnerPackage(userId); + if (ownerPackage == null) { + ownerPackage = mOwners.getDeviceOwnerPackageName(); + } + PackageManager pm = mInjector.getPackageManager(); + PackageInfo packageInfo; + try { + packageInfo = pm.getPackageInfo(ownerPackage, 0); + } catch (NameNotFoundException e) { + Log.e(LOG_TAG, "getPackageInfo error", e); + return null; + } + if (packageInfo == null) { + Log.e(LOG_TAG, "packageInfo is inexplicably null"); + return null; + } + ApplicationInfo appInfo = packageInfo.applicationInfo; + if (appInfo == null) { + Log.e(LOG_TAG, "appInfo is inexplicably null"); + return null; + } + CharSequence appLabel = pm.getApplicationLabel(appInfo); + if (appLabel == null) { + Log.e(LOG_TAG, "appLabel is inexplicably null"); + return null; + } + return ((Context) ActivityThread.currentActivityThread().getSystemUiContext()) + .getResources().getString(R.string.printing_disabled_by, appLabel); + } + } } private Intent createShowAdminSupportIntent(ComponentName admin, int userId) { @@ -12480,55 +12519,6 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } - /** - * Returns text of error message if printing is disabled. - * Only to be called by Print Service. - * @hide - */ - @Override - public CharSequence getPrintingDisabledReason() { - if (!hasPrinting() || !mHasFeature) { - Log.e(LOG_TAG, "no printing or no management"); - return null; - } - synchronized (this) { - final int userHandle = mInjector.userHandleGetCallingUserId(); - DevicePolicyData policy = getUserData(userHandle); - if (policy.mPrintingEnabled) { - Log.e(LOG_TAG, "printing is enabled"); - return null; - } - String ownerPackage = mOwners.getProfileOwnerPackage(userHandle); - if (ownerPackage == null) { - ownerPackage = mOwners.getDeviceOwnerPackageName(); - } - PackageManager pm = mInjector.getPackageManager(); - PackageInfo packageInfo; - try { - packageInfo = pm.getPackageInfo(ownerPackage, 0); - } catch (NameNotFoundException e) { - Log.e(LOG_TAG, "getPackageInfo error", e); - return null; - } - if (packageInfo == null) { - Log.e(LOG_TAG, "packageInfo is inexplicably null"); - return null; - } - ApplicationInfo appInfo = packageInfo.applicationInfo; - if (appInfo == null) { - Log.e(LOG_TAG, "appInfo is inexplicably null"); - return null; - } - CharSequence appLabel = pm.getApplicationLabel(appInfo); - if (appLabel == null) { - Log.e(LOG_TAG, "appLabel is inexplicably null"); - return null; - } - return ((Context) ActivityThread.currentActivityThread().getSystemUiContext()) - .getResources().getString(R.string.printing_disabled_by, appLabel); - } - } - @Override public int addOverrideApn(@NonNull ComponentName who, @NonNull ApnSetting apnSetting) { if (!mHasFeature) { diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index 89a5fe1b82c7d..d6cc805164853 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -22,6 +22,7 @@ import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; +import android.app.admin.DevicePolicyManagerInternal; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -64,6 +65,7 @@ import com.android.internal.print.DualDumpOutputStream; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; +import com.android.server.LocalServices; import com.android.server.SystemService; import java.io.FileDescriptor; @@ -113,12 +115,12 @@ public final class PrintManagerService extends SystemService { private final SparseArray mUserStates = new SparseArray<>(); - private final DevicePolicyManager mDpc; + private final DevicePolicyManager mDpm; PrintManagerImpl(Context context) { mContext = context; mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - mDpc = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); + mDpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); registerContentObservers(); registerBroadcastReceivers(); } @@ -128,7 +130,16 @@ public final class PrintManagerService extends SystemService { PrintAttributes attributes, String packageName, int appId, int userId) { adapter = Preconditions.checkNotNull(adapter); if (!isPrintingEnabled()) { - final CharSequence disabledMessage = mDpc.getPrintingDisabledReason(); + CharSequence disabledMessage = null; + DevicePolicyManagerInternal dpmi = + LocalServices.getService(DevicePolicyManagerInternal.class); + final int callingUserId = UserHandle.getCallingUserId(); + final long identity = Binder.clearCallingIdentity(); + try { + disabledMessage = dpmi.getPrintingDisabledReasonForUser(callingUserId); + } finally { + Binder.restoreCallingIdentity(identity); + } if (disabledMessage != null) { Toast.makeText(mContext, Looper.getMainLooper(), disabledMessage, Toast.LENGTH_LONG).show(); @@ -711,7 +722,7 @@ public final class PrintManagerService extends SystemService { } private boolean isPrintingEnabled() { - return mDpc == null || mDpc.isPrintingEnabled(); + return mDpm == null || mDpm.isPrintingEnabled(); } private void dump(@NonNull DualDumpOutputStream dumpStream,