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}
*/
class AppDialog extends AlertDialog implements DialogInterface.OnClickListener {
private final PackageInfo mPkgInfo;
private final Listener mListener;
private final PackageInfo mPkgInfo;
private final String mLabel;
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);
mListener = listener;
mPkgInfo = pkgInfo;
mLabel = label;
mConnected = connected;
}
@@ -58,14 +61,7 @@ class AppDialog extends AlertDialog implements DialogInterface.OnClickListener {
@Override
protected void onCreate(Bundle savedState) {
CharSequence vpnName;
try {
vpnName = VpnConfig.getVpnLabel(getContext(), mPkgInfo.packageName);
} catch (PackageManager.NameNotFoundException ex) {
vpnName = mPkgInfo.packageName;
}
setTitle(vpnName);
setTitle(mLabel);
setMessage(getContext().getString(R.string.vpn_version, mPkgInfo.versionName));
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 ARG_MANAGING = "managing";
private static final String ARG_LABEL = "label";
private static final String ARG_PACKAGE = "package";
private static final String ARG_CONNECTED = "connected";
private final IConnectivityManager mService = IConnectivityManager.Stub.asInterface(
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) {
if (!parent.isAdded()) return;
Bundle args = new Bundle();
args.putParcelable(ARG_PACKAGE, pkgInfo);
args.putString(ARG_LABEL, label);
args.putBoolean(ARG_MANAGING, managing);
args.putBoolean(ARG_CONNECTED, connected);
@@ -65,23 +67,16 @@ public class AppDialogFragment extends DialogFragment implements AppDialog.Liste
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle args = getArguments();
PackageInfo pkgInfo = (PackageInfo) args.getParcelable(ARG_PACKAGE);
String label = args.getString(ARG_LABEL);
boolean managing = args.getBoolean(ARG_MANAGING);
boolean connected = args.getBoolean(ARG_CONNECTED);
if (managing) {
return new AppDialog(getActivity(), this, pkgInfo, connected);
return new AppDialog(getActivity(), this, pkgInfo, label, connected);
} else {
// 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())
.setTitle(vpnName)
.setTitle(label)
.setMessage(getActivity().getString(R.string.vpn_disconnect_confirm))
.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.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
@@ -55,13 +54,17 @@ public class AppPreference extends ManageablePreference {
public PackageInfo getPackageInfo() {
UserHandle user = new UserHandle(UserHandle.getUserId(mUid));
try {
IPackageManager ipm = AppGlobals.getPackageManager();
return ipm.getPackageInfo(mPackageName, 0 /* flags */, user.getIdentifier());
} catch (RemoteException rme) {
PackageManager pm = getUserContext().getPackageManager();
return pm.getPackageInfo(mPackageName, 0 /* flags */);
} catch (PackageManager.NameNotFoundException nnfe) {
return null;
}
}
public String getLabel() {
return mName;
}
public String getPackageName() {
return mPackageName;
}
@@ -85,24 +88,28 @@ public class AppPreference extends ManageablePreference {
mName = mPackageName;
Drawable icon = null;
try {
// Make all calls to the package manager as the appropriate user.
int userId = UserHandle.getUserId(mUid);
Context userContext = getContext().createPackageContextAsUser(
getContext().getPackageName(), 0 /* flags */, new UserHandle(userId));
Context userContext = getUserContext();
PackageManager pm = userContext.getPackageManager();
// Fetch icon and VPN label
PackageInfo pkgInfo = pm.getPackageInfo(mPackageName, 0 /* flags */);
if (pkgInfo != null) {
icon = pkgInfo.applicationInfo.loadIcon(pm);
mName = VpnConfig.getVpnLabel(userContext, mPackageName).toString();
// Fetch icon and VPN label- the nested catch block is for the case that the app doesn't
// exist, in which case we can fall back to the default activity icon for an activity in
// that user.
try {
PackageInfo pkgInfo = pm.getPackageInfo(mPackageName, 0 /* flags */);
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) {
// Failed - use default app label and icon as fallback
}
if (icon == null) {
icon = getContext().getPackageManager().getDefaultActivityIcon();
if (icon == null) {
icon = pm.getDefaultActivityIcon();
}
} catch (PackageManager.NameNotFoundException userNotFound) {
// No user, no useful information to obtain. Quietly fail.
}
setTitle(mName);
setIcon(icon);
@@ -110,6 +117,12 @@ public class AppPreference extends ManageablePreference {
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) {
if (preference instanceof AppPreference) {
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
PackageInfo pkgInfo = pref.getPackageInfo();
AppDialogFragment.show(this, pkgInfo, false /* editing */, connected);
AppDialogFragment.show(this, pkgInfo, pref.getLabel(), false /* editing */, connected);
return true;
}
return false;
@@ -268,8 +268,9 @@ public class VpnSettings extends SettingsPreferenceFragment implements
true /* exists */);
} else if (tag instanceof AppPreference) {
AppPreference pref = (AppPreference) tag;
AppDialogFragment.show(VpnSettings.this, pref.getPackageInfo(), true /* editing */,
(pref.getState() == AppPreference.STATE_CONNECTED) /* connected */);
boolean connected = (pref.getState() == AppPreference.STATE_CONNECTED);
AppDialogFragment.show(VpnSettings.this, pref.getPackageInfo(), pref.getLabel(),
true /* editing */, connected);
}
}
};