summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/packageinstaller/permission/model/AppPermissionGroup.java18
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionApps.java2
-rw-r--r--src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java12
-rw-r--r--src/com/android/packageinstaller/permission/ui/GrantPermissionsDefaultViewHandler.java89
-rw-r--r--src/com/android/packageinstaller/permission/ui/ManualLayoutFrame.java3
-rw-r--r--src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java6
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;
}