Always display installed app version in the app version list

This commit is contained in:
wsdfhjxc 2018-09-12 11:38:32 +00:00 committed by Hans-Christoph Steiner
parent 71e87043a2
commit 11e8a3e2b6
2 changed files with 62 additions and 20 deletions

View File

@ -265,7 +265,10 @@ public final class Utils {
"5.0", // 21 "5.0", // 21
"5.1", // 22 "5.1", // 22
"6.0", // 23 "6.0", // 23
"7.0", // 24 "7.0", // 24,
"7.1", // 25,
"8.0", // 26,
"8.1", // 27
}; };
public static String getAndroidVersionName(int sdkLevel) { public static String getAndroidVersionName(int sdkLevel) {

View File

@ -92,7 +92,8 @@ public class AppDetailsRecyclerViewAdapter
private static final int VIEWTYPE_LINKS = 3; private static final int VIEWTYPE_LINKS = 3;
private static final int VIEWTYPE_PERMISSIONS = 4; private static final int VIEWTYPE_PERMISSIONS = 4;
private static final int VIEWTYPE_VERSIONS = 5; private static final int VIEWTYPE_VERSIONS = 5;
private static final int VIEWTYPE_VERSION = 6; private static final int VIEWTYPE_NO_VERSIONS = 6;
private static final int VIEWTYPE_VERSION = 7;
private final Context context; private final Context context;
@NonNull @NonNull
@ -123,6 +124,7 @@ public class AppDetailsRecyclerViewAdapter
versions = new ArrayList<>(); versions = new ArrayList<>();
compatibleVersionsDifferentSig = new ArrayList<>(); compatibleVersionsDifferentSig = new ArrayList<>();
final List<Apk> apks = ApkProvider.Helper.findByPackageName(context, this.app.packageName); final List<Apk> apks = ApkProvider.Helper.findByPackageName(context, this.app.packageName);
ensureInstalledApkExists(apks);
boolean showIncompatibleVersions = Preferences.get().showIncompatibleVersions(); boolean showIncompatibleVersions = Preferences.get().showIncompatibleVersions();
for (final Apk apk : apks) { for (final Apk apk : apks) {
boolean allowByCompatibility = apk.compatible || showIncompatibleVersions; boolean allowByCompatibility = apk.compatible || showIncompatibleVersions;
@ -150,14 +152,30 @@ public class AppDetailsRecyclerViewAdapter
addItem(VIEWTYPE_DONATE); addItem(VIEWTYPE_DONATE);
addItem(VIEWTYPE_LINKS); addItem(VIEWTYPE_LINKS);
addItem(VIEWTYPE_PERMISSIONS); addItem(VIEWTYPE_PERMISSIONS);
if (versions.size() > 0) {
addItem(VIEWTYPE_VERSIONS); addItem(VIEWTYPE_VERSIONS);
if (showVersions) { if (showVersions) {
setShowVersions(true); setShowVersions(true);
} }
} else {
addItem(VIEWTYPE_NO_VERSIONS);
}
notifyDataSetChanged(); notifyDataSetChanged();
} }
private void ensureInstalledApkExists(final List<Apk> apks) {
Apk installedApk = app.getInstalledApk(this.context);
// These conditions should be enough to determine if the installedApk
// is a generated dummy or a proper APK containing data from a repository.
if (installedApk != null && installedApk.added == null && installedApk.sig == null) {
installedApk.compatible = true;
installedApk.sig = app.installedSig;
installedApk.maxSdkVersion = -1;
apks.add(installedApk);
}
}
void setShowVersions(boolean showVersions) { void setShowVersions(boolean showVersions) {
setShowVersions(showVersions, false); setShowVersions(showVersions, false);
} }
@ -290,11 +308,10 @@ public class AppDetailsRecyclerViewAdapter
return new PermissionsViewHolder(permissions); return new PermissionsViewHolder(permissions);
case VIEWTYPE_VERSIONS: case VIEWTYPE_VERSIONS:
View versionsView = inflater.inflate(R.layout.app_details2_links, parent, false); View versionsView = inflater.inflate(R.layout.app_details2_links, parent, false);
if (versions.size() == 0) {
return new NoVersionsViewHolder(versionsView);
} else {
return new VersionsViewHolder(versionsView); return new VersionsViewHolder(versionsView);
} case VIEWTYPE_NO_VERSIONS:
View noVersionsView = inflater.inflate(R.layout.app_details2_links, parent, false);
return new NoVersionsViewHolder(noVersionsView);
case VIEWTYPE_VERSION: case VIEWTYPE_VERSION:
View version = inflater.inflate(R.layout.app_details2_version_item, parent, false); View version = inflater.inflate(R.layout.app_details2_version_item, parent, false);
return new VersionViewHolder(version); return new VersionViewHolder(version);
@ -318,6 +335,7 @@ public class AppDetailsRecyclerViewAdapter
case VIEWTYPE_LINKS: case VIEWTYPE_LINKS:
case VIEWTYPE_PERMISSIONS: case VIEWTYPE_PERMISSIONS:
case VIEWTYPE_VERSIONS: case VIEWTYPE_VERSIONS:
case VIEWTYPE_NO_VERSIONS:
((AppDetailsViewHolder) holder).bindModel(); ((AppDetailsViewHolder) holder).bindModel();
break; break;
@ -1042,6 +1060,8 @@ public class AppDetailsRecyclerViewAdapter
TextUtils.equals(apk.sig, app.getMostAppropriateSignature()); TextUtils.equals(apk.sig, app.getMostAppropriateSignature());
boolean isApkDownloading = callbacks.isAppDownloading() && downloadedApk != null && boolean isApkDownloading = callbacks.isAppDownloading() && downloadedApk != null &&
downloadedApk.compareTo(apk) == 0 && TextUtils.equals(apk.apkName, downloadedApk.apkName); downloadedApk.compareTo(apk) == 0 && TextUtils.equals(apk.apkName, downloadedApk.apkName);
boolean isApkInstalledDummy = apk.versionCode == app.installedVersionCode &&
apk.compatible && apk.size == 0 && apk.maxSdkVersion == -1;
// Version name and statuses // Version name and statuses
version.setText(apk.versionName); version.setText(apk.versionName);
@ -1061,15 +1081,26 @@ public class AppDetailsRecyclerViewAdapter
} }
// Added date // Added date
if (apk.added != null) {
java.text.DateFormat df = DateFormat.getDateFormat(context); java.text.DateFormat df = DateFormat.getDateFormat(context);
added.setVisibility(View.VISIBLE);
added.setText(context.getString(R.string.added_on, df.format(apk.added))); added.setText(context.getString(R.string.added_on, df.format(apk.added)));
} else {
added.setVisibility(View.INVISIBLE);
}
// Repository name, APK size and required Android version // Repository name, APK size and required Android version
Repo repo = RepoProvider.Helper.findById(context, apk.repoId); Repo repo = RepoProvider.Helper.findById(context, apk.repoId);
repository.setText(repo != null ? repo.getName() : context.getString(R.string.unknown)); if (repo != null) {
repository.setVisibility(View.VISIBLE);
repository.setText(repo.getName());
} else {
repository.setVisibility(View.INVISIBLE);
}
size.setText(context.getString(R.string.app_size, Utils.getFriendlySize(apk.size))); size.setText(context.getString(R.string.app_size, Utils.getFriendlySize(apk.size)));
api.setText(getApiText(apk)); api.setText(getApiText(apk));
// Figuring out whether to show Install/Upgrade button or Downgrade button // Figuring out whether to show Install/Upgrade button or Downgrade button
buttonDowngrade.setVisibility(View.GONE); buttonDowngrade.setVisibility(View.GONE);
buttonInstallUpgrade.setVisibility(View.GONE); buttonInstallUpgrade.setVisibility(View.GONE);
@ -1121,13 +1152,21 @@ public class AppDetailsRecyclerViewAdapter
// Expand the view if it was previously expanded or when downloading // Expand the view if it was previously expanded or when downloading
expand(versionsExpandTracker.get(apk.apkName) || isApkDownloading); expand(versionsExpandTracker.get(apk.apkName) || isApkDownloading);
// Toggle expanded view when clicking the whole version item // Toggle expanded view when clicking the whole version item,
// unless it's an installed app version dummy item - it doesn't
// contain any meaningful info, so there is no reason to expand it.
if (!isApkInstalledDummy) {
expandArrow.setAlpha(1f);
itemView.setOnClickListener(new View.OnClickListener() { itemView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
toggleExpanded(); toggleExpanded();
} }
}); });
} else {
expandArrow.setAlpha(0.3f);
itemView.setOnClickListener(null);
}
} }
private String getApiText(final Apk apk) { private String getApiText(final Apk apk) {