diff options
Diffstat (limited to 'src')
6 files changed, 97 insertions, 33 deletions
diff --git a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java index 37db59aa..231a7c4b 100644 --- a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java +++ b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java @@ -88,15 +88,18 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> } } - return create(context, packageInfo, groupInfo, permissionInfos); + return create(context, packageInfo, groupInfo, permissionInfos, + new UserHandle(context.getUserId())); } public static AppPermissionGroup create(Context context, PackageInfo packageInfo, - PackageItemInfo groupInfo, List<PermissionInfo> permissionInfos) { + PackageItemInfo groupInfo, List<PermissionInfo> permissionInfos, + UserHandle userHandle) { AppPermissionGroup group = new AppPermissionGroup(context, packageInfo, groupInfo.name, groupInfo.packageName, groupInfo.loadLabel(context.getPackageManager()), - loadGroupDescription(context, groupInfo), groupInfo.packageName, groupInfo.icon); + loadGroupDescription(context, groupInfo), groupInfo.packageName, groupInfo.icon, + userHandle); if (groupInfo instanceof PermissionInfo) { permissionInfos = new ArrayList<>(); @@ -148,8 +151,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> == AppOpsManager.MODE_ALLOWED; final int flags = context.getPackageManager().getPermissionFlags( - requestedPermission, packageInfo.packageName, - new UserHandle(context.getUserId())); + requestedPermission, packageInfo.packageName, userHandle); Permission permission = new Permission(requestedPermission, granted, appOp, appOpAllowed, flags); @@ -178,9 +180,9 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> private AppPermissionGroup(Context context, PackageInfo packageInfo, String name, String declaringPackage, CharSequence label, CharSequence description, - String iconPkg, int iconResId) { + String iconPkg, int iconResId, UserHandle userHandle) { mContext = context; - mUserHandle = new UserHandle(mContext.getUserId()); + mUserHandle = userHandle; mPackageManager = mContext.getPackageManager(); mPackageInfo = packageInfo; mAppSupportsRuntimePermissions = packageInfo.applicationInfo @@ -281,7 +283,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> if (!permission.isGranted()) { permission.setGranted(true); mPackageManager.grantRuntimePermission(mPackageInfo.packageName, - permission.getName(), new UserHandle(mContext.getUserId())); + permission.getName(), mUserHandle); } // Update the permission flags. diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java index a44482f6..dfb8c8cc 100644 --- a/src/com/android/packageinstaller/permission/model/PermissionApps.java +++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java @@ -170,7 +170,7 @@ public class PermissionApps { } AppPermissionGroup group = AppPermissionGroup.create(mContext, - app, groupInfo, groupPermInfos); + app, groupInfo, groupPermInfos, user); String label = mSkipUi ? app.packageName : app.applicationInfo.loadLabel(mPm).toString(); diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java index ba2a4cd9..98773f54 100644 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java +++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java @@ -37,6 +37,8 @@ import android.text.style.ForegroundColorSpan; import android.util.ArrayMap; import android.util.Log; import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; import android.view.Window; import android.view.WindowManager; @@ -146,6 +148,16 @@ public class GrantPermissionsActivity extends Activity } @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + View rootView = getWindow().getDecorView(); + if (rootView.getTop() != 0) { + // We are animating the top view, need to compensate for that in motion events. + ev.setLocation(ev.getX(), ev.getY() - rootView.getTop()); + } + return super.dispatchTouchEvent(ev); + } + + @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mViewHandler.saveInstanceState(outState); diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java index d755feeb..1f95352d 100644 --- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java +++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java @@ -28,6 +28,8 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.ViewRootImpl; import android.view.WindowManager.LayoutParams; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; @@ -38,6 +40,8 @@ import android.widget.TextView; import com.android.packageinstaller.R; +import java.util.ArrayList; + final class GrantPermissionsDefaultViewHandler implements GrantPermissionsViewHandler, OnClickListener { @@ -76,7 +80,7 @@ final class GrantPermissionsDefaultViewHandler private CheckBox mDoNotAskCheckbox; private Button mAllowButton; - private ViewHeightController mRootViewHeightController; + private ArrayList<ViewHeightController> mHeightControllers; private ManualLayoutFrame mRootView; // Needed for animation @@ -144,18 +148,29 @@ final class GrantPermissionsDefaultViewHandler updateGroup(); } } - updateDoNotAskCheckBox(); + } private void animateToPermission() { - if (mRootViewHeightController == null) { - // Allow height control of the real root view, not the root of what we inflate. - // Need to do it on the root view so that the background drawable of the dialog - // moves with the animation. - View realRootView = mRootView.getViewRootImpl().getView(); - mRootViewHeightController = new ViewHeightController(realRootView); - mRootViewHeightController.setHeight(realRootView.getHeight()); + if (mHeightControllers == null) { + // We need to manually control the height of any views heigher than the root that + // we inflate. Find all the views up to the root and create ViewHeightControllers for + // them. + mHeightControllers = new ArrayList<>(); + ViewRootImpl viewRoot = mRootView.getViewRootImpl(); + ViewParent v = mRootView.getParent(); + addHeightController(mDialogContainer); + addHeightController(mRootView); + while (v != viewRoot) { + addHeightController((View) v); + v = v.getParent(); + } + // On the heighest level view, we want to setTop rather than setBottom to control the + // height, this way the dialog will grow up rather than down. + ViewHeightController realRootView = + mHeightControllers.get(mHeightControllers.size() - 1); + realRootView.setControlTop(true); } // Grab the current height/y positions, then wait for the layout to change, @@ -205,7 +220,14 @@ final class GrantPermissionsDefaultViewHandler int width = mDescContainer.getRootView().getWidth(); mDescContainer.addView(mNextDesc); mNextDesc.setTranslationX(width); + final View oldDesc = mCurrentDesc; + // Remove the old view from the description, so that we can shrink if necessary. + mDescContainer.removeView(oldDesc); + oldDesc.setPadding(mDescContainer.getLeft(), mDescContainer.getTop(), + mRootView.getRight() - mDescContainer.getRight(), 0); + mRootView.addView(oldDesc); + mCurrentDesc = mNextDesc; mNextDesc.animate() .translationX(0) @@ -217,12 +239,18 @@ final class GrantPermissionsDefaultViewHandler @Override public void onAnimationEnd(Animator animation) { // This is the longest animation, when it finishes, we are done. - mDescContainer.removeView(oldDesc); + mRootView.removeView(oldDesc); } }) .start(); } + private void addHeightController(View v) { + ViewHeightController heightController = new ViewHeightController(v); + heightController.setHeight(v.getHeight()); + mHeightControllers.add(heightController); + } + private SparseArray<Float> getViewPositions() { SparseArray<Float> locMap = new SparseArray<>(); final int N = mDialogContainer.getChildCount(); @@ -254,7 +282,9 @@ final class GrantPermissionsDefaultViewHandler .start(); } } - mRootViewHeightController.animateAddHeight(heightDiff); + for (int i = 0; i < mHeightControllers.size(); i++) { + mHeightControllers.get(i).animateAddHeight(heightDiff); + } } @Override @@ -344,38 +374,53 @@ final class GrantPermissionsDefaultViewHandler private static final class ViewHeightController implements OnLayoutChangeListener { private final View mView; private int mHeight; + private int mNextHeight; + private boolean mControlTop; + private ObjectAnimator mAnimator; public ViewHeightController(View view) { mView = view; mView.addOnLayoutChangeListener(this); } + public void setControlTop(boolean controlTop) { + mControlTop = controlTop; + } + public void animateAddHeight(int heightDiff) { if (heightDiff != 0) { - final int startHeight = mHeight; - final int endHeight = startHeight + heightDiff; - ObjectAnimator animator = ObjectAnimator.ofInt(this, "height", - startHeight, endHeight); - animator.setStartDelay(SIZE_START_DELAY); - animator.setDuration(SIZE_START_LENGTH); - animator.start(); + if (mNextHeight == 0) { + mNextHeight = mHeight; + } + mNextHeight += heightDiff; + if (mAnimator != null) { + mAnimator.cancel(); + } + mAnimator = ObjectAnimator.ofInt(this, "height", mHeight, mNextHeight); + mAnimator.setStartDelay(SIZE_START_DELAY); + mAnimator.setDuration(SIZE_START_LENGTH); + mAnimator.start(); } } public void setHeight(int height) { mHeight = height; - updateTop(); + updateHeight(); } @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { // Ensure that the height never changes. - updateTop(); + updateHeight(); } - private void updateTop() { - mView.setTop(mView.getBottom() - mHeight); + private void updateHeight() { + if (mControlTop) { + mView.setTop(mView.getBottom() - mHeight); + } else { + mView.setBottom(mView.getTop() + mHeight); + } } } } diff --git a/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java b/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java index 97049df8..99a74e75 100644 --- a/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java +++ b/src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java @@ -17,6 +17,7 @@ package com.android.packageinstaller.permission.ui; import android.content.Context; import android.util.AttributeSet; +import android.view.View; import android.widget.FrameLayout; /** @@ -30,6 +31,8 @@ public class ManualLayoutFrame extends FrameLayout { private int mDesiredHeight; private int mHeight; + private View mOffsetView; + public ManualLayoutFrame(Context context, AttributeSet attrs) { super(context, attrs); setClipChildren(false); diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java index b767a266..f4c271fc 100644 --- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java @@ -111,7 +111,9 @@ public final class PermissionAppsFragment extends PreferenceFragment implements case MENU_SHOW_SYSTEM: case MENU_HIDE_SYSTEM: mShowSystem = item.getItemId() == MENU_SHOW_SYSTEM; - onPermissionsLoaded(mPermissionApps); + if (mPermissionApps.getApps() != null) { + onPermissionsLoaded(mPermissionApps); + } updateMenu(); break; } @@ -184,7 +186,7 @@ public final class PermissionAppsFragment extends PreferenceFragment implements setPreferenceScreen(preferences); } preferences.removeAll(); - for (PermissionApp app : mPermissionApps.getApps()) { + for (PermissionApp app : permissionApps.getApps()) { if (!Utils.shouldShowPermission(app)) { continue; } |