Be more aggressive caching Vpn preference attrs

As any change to the preference title will cause it to lose focus,
best not to do this too often.

Change-Id: Ibac27ee1de42fd7ca05f3e3685b84f37dac39517
Fix: 28191965
This commit is contained in:
Robin Lee
2016-04-21 12:56:21 +01:00
parent e06d757a0c
commit b166ea2668
4 changed files with 71 additions and 87 deletions

View File

@@ -34,17 +34,43 @@ public class AppPreference extends ManageablePreference {
public static final int STATE_CONNECTED = LegacyVpnInfo.STATE_CONNECTED;
public static final int STATE_DISCONNECTED = STATE_NONE;
private String mPackageName;
private String mName;
private final String mPackageName;
private final String mName;
public AppPreference(Context context) {
public AppPreference(Context context, int userId, String packageName) {
super(context, null /* attrs */);
}
@Override
public void setUserId(int userId) {
super.setUserId(userId);
update();
mPackageName = packageName;
// Fetch icon and VPN label
String label = packageName;
Drawable icon = null;
try {
// Make all calls to the package manager as the appropriate user.
Context userContext = getUserContext();
PackageManager pm = userContext.getPackageManager();
// The nested catch block is for the case that the app doesn't exist, so we can fall
// back to the default activity icon.
try {
PackageInfo pkgInfo = pm.getPackageInfo(mPackageName, 0 /* flags */);
if (pkgInfo != null) {
icon = pkgInfo.applicationInfo.loadIcon(pm);
label = VpnConfig.getVpnLabel(userContext, mPackageName).toString();
}
} catch (PackageManager.NameNotFoundException pkgNotFound) {
// Use default app label and icon as fallback
}
if (icon == null) {
icon = pm.getDefaultActivityIcon();
}
} catch (PackageManager.NameNotFoundException userNotFound) {
// No user, no useful information to obtain. Quietly fail.
}
mName = label;
setTitle(mName);
setIcon(icon);
}
public PackageInfo getPackageInfo() {
@@ -64,48 +90,6 @@ public class AppPreference extends ManageablePreference {
return mPackageName;
}
public void setPackageName(String name) {
mPackageName = name;
update();
}
private void update() {
if (mPackageName == null || mUserId == UserHandle.USER_NULL) {
return;
}
mName = mPackageName;
Drawable icon = null;
try {
// Make all calls to the package manager as the appropriate user.
Context userContext = getUserContext();
PackageManager pm = userContext.getPackageManager();
// 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
}
if (icon == null) {
icon = pm.getDefaultActivityIcon();
}
} catch (PackageManager.NameNotFoundException userNotFound) {
// No user, no useful information to obtain. Quietly fail.
}
setTitle(mName);
setIcon(icon);
updateSummary();
notifyHierarchyChanged();
}
private Context getUserContext() throws PackageManager.NameNotFoundException {
UserHandle user = UserHandle.of(mUserId);
return getContext().createPackageContextAsUser(