VPN: Convert current-context IPCs to user context

These fetch info for the wrong user, which may be either wrong or worse
wholly nonexistent.

Bug: 20747154
Change-Id: Ibd5f2e5d3c5dfd252a032ebdfe204de7166fa3a5
This commit is contained in:
Robin Lee
2015-05-01 17:42:30 +01:00
parent f09497a2a7
commit ab6a65c03b
4 changed files with 47 additions and 42 deletions

View File

@@ -40,15 +40,18 @@ import com.android.settings.R;
* {@see ConfigDialog} * {@see ConfigDialog}
*/ */
class AppDialog extends AlertDialog implements DialogInterface.OnClickListener { class AppDialog extends AlertDialog implements DialogInterface.OnClickListener {
private final PackageInfo mPkgInfo;
private final Listener mListener; private final Listener mListener;
private final PackageInfo mPkgInfo;
private final String mLabel;
private final boolean mConnected; private final boolean mConnected;
AppDialog(Context context, Listener listener, PackageInfo pkgInfo, boolean connected) { AppDialog(Context context, Listener listener, PackageInfo pkgInfo, String label,
boolean connected) {
super(context); super(context);
mListener = listener; mListener = listener;
mPkgInfo = pkgInfo; mPkgInfo = pkgInfo;
mLabel = label;
mConnected = connected; mConnected = connected;
} }
@@ -58,14 +61,7 @@ class AppDialog extends AlertDialog implements DialogInterface.OnClickListener {
@Override @Override
protected void onCreate(Bundle savedState) { protected void onCreate(Bundle savedState) {
CharSequence vpnName; setTitle(mLabel);
try {
vpnName = VpnConfig.getVpnLabel(getContext(), mPkgInfo.packageName);
} catch (PackageManager.NameNotFoundException ex) {
vpnName = mPkgInfo.packageName;
}
setTitle(vpnName);
setMessage(getContext().getString(R.string.vpn_version, mPkgInfo.versionName)); setMessage(getContext().getString(R.string.vpn_version, mPkgInfo.versionName));
createButtons(); createButtons();

View File

@@ -40,18 +40,20 @@ public class AppDialogFragment extends DialogFragment implements AppDialog.Liste
private static final String TAG = "AppDialogFragment"; private static final String TAG = "AppDialogFragment";
private static final String ARG_MANAGING = "managing"; private static final String ARG_MANAGING = "managing";
private static final String ARG_LABEL = "label";
private static final String ARG_PACKAGE = "package"; private static final String ARG_PACKAGE = "package";
private static final String ARG_CONNECTED = "connected"; private static final String ARG_CONNECTED = "connected";
private final IConnectivityManager mService = IConnectivityManager.Stub.asInterface( private final IConnectivityManager mService = IConnectivityManager.Stub.asInterface(
ServiceManager.getService(Context.CONNECTIVITY_SERVICE)); ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
public static void show(VpnSettings parent, PackageInfo pkgInfo, boolean managing, public static void show(VpnSettings parent, PackageInfo pkgInfo, String label, boolean managing,
boolean connected) { boolean connected) {
if (!parent.isAdded()) return; if (!parent.isAdded()) return;
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putParcelable(ARG_PACKAGE, pkgInfo); args.putParcelable(ARG_PACKAGE, pkgInfo);
args.putString(ARG_LABEL, label);
args.putBoolean(ARG_MANAGING, managing); args.putBoolean(ARG_MANAGING, managing);
args.putBoolean(ARG_CONNECTED, connected); args.putBoolean(ARG_CONNECTED, connected);
@@ -65,23 +67,16 @@ public class AppDialogFragment extends DialogFragment implements AppDialog.Liste
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle args = getArguments(); Bundle args = getArguments();
PackageInfo pkgInfo = (PackageInfo) args.getParcelable(ARG_PACKAGE); PackageInfo pkgInfo = (PackageInfo) args.getParcelable(ARG_PACKAGE);
String label = args.getString(ARG_LABEL);
boolean managing = args.getBoolean(ARG_MANAGING); boolean managing = args.getBoolean(ARG_MANAGING);
boolean connected = args.getBoolean(ARG_CONNECTED); boolean connected = args.getBoolean(ARG_CONNECTED);
if (managing) { if (managing) {
return new AppDialog(getActivity(), this, pkgInfo, connected); return new AppDialog(getActivity(), this, pkgInfo, label, connected);
} else { } else {
// Build an AlertDialog with an option to disconnect. // Build an AlertDialog with an option to disconnect.
CharSequence vpnName;
try {
vpnName = VpnConfig.getVpnLabel(getActivity(), pkgInfo.packageName);
} catch (PackageManager.NameNotFoundException ex) {
vpnName = pkgInfo.packageName;
}
AlertDialog.Builder dlog = new AlertDialog.Builder(getActivity()) AlertDialog.Builder dlog = new AlertDialog.Builder(getActivity())
.setTitle(vpnName) .setTitle(label)
.setMessage(getActivity().getString(R.string.vpn_disconnect_confirm)) .setMessage(getActivity().getString(R.string.vpn_disconnect_confirm))
.setNegativeButton(getActivity().getString(R.string.vpn_cancel), null); .setNegativeButton(getActivity().getString(R.string.vpn_cancel), null);

View File

@@ -18,7 +18,6 @@ package com.android.settings.vpn2;
import android.app.AppGlobals; import android.app.AppGlobals;
import android.content.Context; import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@@ -55,13 +54,17 @@ public class AppPreference extends ManageablePreference {
public PackageInfo getPackageInfo() { public PackageInfo getPackageInfo() {
UserHandle user = new UserHandle(UserHandle.getUserId(mUid)); UserHandle user = new UserHandle(UserHandle.getUserId(mUid));
try { try {
IPackageManager ipm = AppGlobals.getPackageManager(); PackageManager pm = getUserContext().getPackageManager();
return ipm.getPackageInfo(mPackageName, 0 /* flags */, user.getIdentifier()); return pm.getPackageInfo(mPackageName, 0 /* flags */);
} catch (RemoteException rme) { } catch (PackageManager.NameNotFoundException nnfe) {
return null; return null;
} }
} }
public String getLabel() {
return mName;
}
public String getPackageName() { public String getPackageName() {
return mPackageName; return mPackageName;
} }
@@ -85,24 +88,28 @@ public class AppPreference extends ManageablePreference {
mName = mPackageName; mName = mPackageName;
Drawable icon = null; Drawable icon = null;
try { try {
// Make all calls to the package manager as the appropriate user. // Make all calls to the package manager as the appropriate user.
int userId = UserHandle.getUserId(mUid); Context userContext = getUserContext();
Context userContext = getContext().createPackageContextAsUser(
getContext().getPackageName(), 0 /* flags */, new UserHandle(userId));
PackageManager pm = userContext.getPackageManager(); PackageManager pm = userContext.getPackageManager();
// Fetch icon and VPN label- the nested catch block is for the case that the app doesn't
// Fetch icon and VPN label // exist, in which case we can fall back to the default activity icon for an activity in
PackageInfo pkgInfo = pm.getPackageInfo(mPackageName, 0 /* flags */); // that user.
if (pkgInfo != null) { try {
icon = pkgInfo.applicationInfo.loadIcon(pm); PackageInfo pkgInfo = pm.getPackageInfo(mPackageName, 0 /* flags */);
mName = VpnConfig.getVpnLabel(userContext, mPackageName).toString(); if (pkgInfo != null) {
icon = pkgInfo.applicationInfo.loadIcon(pm);
mName = VpnConfig.getVpnLabel(userContext, mPackageName).toString();
}
} catch (PackageManager.NameNotFoundException pkgNotFound) {
// Use default app label and icon as fallback
} }
} catch (PackageManager.NameNotFoundException nnfe) { if (icon == null) {
// Failed - use default app label and icon as fallback icon = pm.getDefaultActivityIcon();
} }
if (icon == null) { } catch (PackageManager.NameNotFoundException userNotFound) {
icon = getContext().getPackageManager().getDefaultActivityIcon(); // No user, no useful information to obtain. Quietly fail.
} }
setTitle(mName); setTitle(mName);
setIcon(icon); setIcon(icon);
@@ -110,6 +117,12 @@ public class AppPreference extends ManageablePreference {
notifyHierarchyChanged(); notifyHierarchyChanged();
} }
private Context getUserContext() throws PackageManager.NameNotFoundException {
UserHandle user = new UserHandle(UserHandle.getUserId(mUid));
return getContext().createPackageContextAsUser(
getContext().getPackageName(), 0 /* flags */, user);
}
public int compareTo(Preference preference) { public int compareTo(Preference preference) {
if (preference instanceof AppPreference) { if (preference instanceof AppPreference) {
AppPreference another = (AppPreference) preference; AppPreference another = (AppPreference) preference;

View File

@@ -251,7 +251,7 @@ public class VpnSettings extends SettingsPreferenceFragment implements
// Already onnected or no launch intent available - show an info dialog // Already onnected or no launch intent available - show an info dialog
PackageInfo pkgInfo = pref.getPackageInfo(); PackageInfo pkgInfo = pref.getPackageInfo();
AppDialogFragment.show(this, pkgInfo, false /* editing */, connected); AppDialogFragment.show(this, pkgInfo, pref.getLabel(), false /* editing */, connected);
return true; return true;
} }
return false; return false;
@@ -268,8 +268,9 @@ public class VpnSettings extends SettingsPreferenceFragment implements
true /* exists */); true /* exists */);
} else if (tag instanceof AppPreference) { } else if (tag instanceof AppPreference) {
AppPreference pref = (AppPreference) tag; AppPreference pref = (AppPreference) tag;
AppDialogFragment.show(VpnSettings.this, pref.getPackageInfo(), true /* editing */, boolean connected = (pref.getState() == AppPreference.STATE_CONNECTED);
(pref.getState() == AppPreference.STATE_CONNECTED) /* connected */); AppDialogFragment.show(VpnSettings.this, pref.getPackageInfo(), pref.getLabel(),
true /* editing */, connected);
} }
} }
}; };