Move business logic from onBindViewHolder logic into respective ViewHolder subclasses.
This commit is contained in:
parent
c50c9f2ea0
commit
22d9f55afb
@ -199,13 +199,13 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
return new DonateViewHolder(view);
|
return new DonateViewHolder(view);
|
||||||
} else if (viewType == VIEWTYPE_LINKS) {
|
} else if (viewType == VIEWTYPE_LINKS) {
|
||||||
View view = inflater.inflate(R.layout.app_details2_links, parent, false);
|
View view = inflater.inflate(R.layout.app_details2_links, parent, false);
|
||||||
return new ExpandableLinearLayoutViewHolder(view);
|
return new LinksViewHolder(view);
|
||||||
} else if (viewType == VIEWTYPE_PERMISSIONS) {
|
} else if (viewType == VIEWTYPE_PERMISSIONS) {
|
||||||
View view = inflater.inflate(R.layout.app_details2_links, parent, false);
|
View view = inflater.inflate(R.layout.app_details2_links, parent, false);
|
||||||
return new ExpandableLinearLayoutViewHolder(view);
|
return new PermissionsViewHolder(view);
|
||||||
} else if (viewType == VIEWTYPE_VERSIONS) {
|
} else if (viewType == VIEWTYPE_VERSIONS) {
|
||||||
View view = inflater.inflate(R.layout.app_details2_links, parent, false);
|
View view = inflater.inflate(R.layout.app_details2_links, parent, false);
|
||||||
return new ExpandableLinearLayoutViewHolder(view);
|
return new VersionsViewHolder(view);
|
||||||
} else if (viewType == VIEWTYPE_VERSION) {
|
} else if (viewType == VIEWTYPE_VERSION) {
|
||||||
View view = inflater.inflate(R.layout.apklistitem, parent, false);
|
View view = inflater.inflate(R.layout.apklistitem, parent, false);
|
||||||
return new VersionViewHolder(view);
|
return new VersionViewHolder(view);
|
||||||
@ -217,283 +217,24 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
|
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
|
||||||
int viewType = getItemViewType(position);
|
int viewType = getItemViewType(position);
|
||||||
if (viewType == VIEWTYPE_HEADER) {
|
if (viewType == VIEWTYPE_HEADER) {
|
||||||
final HeaderViewHolder vh = (HeaderViewHolder) holder;
|
HeaderViewHolder header = (HeaderViewHolder) holder;
|
||||||
mHeaderView = vh;
|
mHeaderView = header;
|
||||||
ImageLoader.getInstance().displayImage(mApp.iconUrlLarge, vh.iconView, vh.displayImageOptions);
|
header.bindModel();
|
||||||
vh.titleView.setText(mApp.name);
|
|
||||||
if (!TextUtils.isEmpty(mApp.author)) {
|
|
||||||
vh.authorView.setText(mContext.getString(R.string.by_author) + " " + mApp.author);
|
|
||||||
vh.authorView.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
vh.authorView.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
vh.summaryView.setText(mApp.summary);
|
|
||||||
final Spanned desc = Html.fromHtml(mApp.description, null, new Utils.HtmlTagHandler());
|
|
||||||
vh.descriptionView.setMovementMethod(LinkMovementMethod.getInstance());
|
|
||||||
vh.descriptionView.setText(trimTrailingNewlines(desc));
|
|
||||||
if (vh.descriptionView.getText() instanceof Spannable) {
|
|
||||||
Spannable spannable = (Spannable) vh.descriptionView.getText();
|
|
||||||
URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
|
|
||||||
for (URLSpan span : spans) {
|
|
||||||
int start = spannable.getSpanStart(span);
|
|
||||||
int end = spannable.getSpanEnd(span);
|
|
||||||
int flags = spannable.getSpanFlags(span);
|
|
||||||
spannable.removeSpan(span);
|
|
||||||
// Create out own safe link span
|
|
||||||
SafeURLSpan safeUrlSpan = new SafeURLSpan(span.getURL());
|
|
||||||
spannable.setSpan(safeUrlSpan, start, end, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vh.descriptionView.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (vh.descriptionView.getLineCount() < HeaderViewHolder.MAX_LINES) {
|
|
||||||
vh.descriptionMoreView.setVisibility(View.GONE);
|
|
||||||
} else {
|
|
||||||
vh.descriptionMoreView.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
vh.buttonSecondaryView.setText(R.string.menu_uninstall);
|
|
||||||
vh.buttonSecondaryView.setVisibility(mApp.isInstalled() ? View.VISIBLE : View.INVISIBLE);
|
|
||||||
vh.buttonSecondaryView.setOnClickListener(mOnUnInstallClickListener);
|
|
||||||
vh.buttonPrimaryView.setText(R.string.menu_install);
|
|
||||||
vh.buttonPrimaryView.setVisibility(mVersions.size() > 0 ? View.VISIBLE : View.GONE);
|
|
||||||
if (mCallbacks.isAppDownloading()) {
|
|
||||||
vh.buttonPrimaryView.setText(R.string.downloading);
|
|
||||||
vh.buttonPrimaryView.setEnabled(false);
|
|
||||||
} else if (!mApp.isInstalled() && mApp.suggestedVersionCode > 0 && mVersions.size() > 0) {
|
|
||||||
// Check count > 0 due to incompatible apps resulting in an empty list.
|
|
||||||
mCallbacks.disableAndroidBeam();
|
|
||||||
// Set Install button and hide second button
|
|
||||||
vh.buttonPrimaryView.setText(R.string.menu_install);
|
|
||||||
vh.buttonPrimaryView.setOnClickListener(mOnInstallClickListener);
|
|
||||||
vh.buttonPrimaryView.setEnabled(true);
|
|
||||||
} else if (mApp.isInstalled()) {
|
|
||||||
mCallbacks.enableAndroidBeam();
|
|
||||||
if (mApp.canAndWantToUpdate(mContext)) {
|
|
||||||
vh.buttonPrimaryView.setText(R.string.menu_upgrade);
|
|
||||||
vh.buttonPrimaryView.setOnClickListener(mOnUpgradeClickListener);
|
|
||||||
} else {
|
|
||||||
if (mContext.getPackageManager().getLaunchIntentForPackage(mApp.packageName) != null) {
|
|
||||||
vh.buttonPrimaryView.setText(R.string.menu_launch);
|
|
||||||
vh.buttonPrimaryView.setOnClickListener(mOnLaunchClickListener);
|
|
||||||
} else {
|
|
||||||
vh.buttonPrimaryView.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vh.buttonPrimaryView.setEnabled(true);
|
|
||||||
}
|
|
||||||
if (mCallbacks.isAppDownloading()) {
|
|
||||||
vh.buttonLayout.setVisibility(View.GONE);
|
|
||||||
vh.progressLayout.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
vh.buttonLayout.setVisibility(View.VISIBLE);
|
|
||||||
vh.progressLayout.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
vh.progressCancel.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
mCallbacks.installCancel();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
} else if (viewType == VIEWTYPE_SCREENSHOTS) {
|
} else if (viewType == VIEWTYPE_SCREENSHOTS) {
|
||||||
ScreenShotsViewHolder vh = (ScreenShotsViewHolder) holder;
|
((ScreenShotsViewHolder) holder).bindModel();
|
||||||
LinearLayoutManager lm = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
|
|
||||||
vh.recyclerView.setLayoutManager(lm);
|
|
||||||
ScreenShotsRecyclerViewAdapter adapter = new ScreenShotsRecyclerViewAdapter(vh.itemView.getContext(), mApp);
|
|
||||||
vh.recyclerView.setAdapter(adapter);
|
|
||||||
vh.recyclerView.setHasFixedSize(true);
|
|
||||||
vh.recyclerView.setNestedScrollingEnabled(false);
|
|
||||||
if (vh.snapHelper != null) {
|
|
||||||
vh.snapHelper.attachToRecyclerView(null);
|
|
||||||
}
|
|
||||||
vh.snapHelper = new LinearLayoutManagerSnapHelper(lm);
|
|
||||||
vh.snapHelper.setLinearSnapHelperListener(adapter);
|
|
||||||
vh.snapHelper.attachToRecyclerView(vh.recyclerView);
|
|
||||||
} else if (viewType == VIEWTYPE_WHATS_NEW) {
|
} else if (viewType == VIEWTYPE_WHATS_NEW) {
|
||||||
WhatsNewViewHolder vh = (WhatsNewViewHolder) holder;
|
((WhatsNewViewHolder) holder).bindModel();
|
||||||
vh.textView.setText("WHATS NEW GOES HERE");
|
|
||||||
} else if (viewType == VIEWTYPE_DONATE) {
|
} else if (viewType == VIEWTYPE_DONATE) {
|
||||||
DonateViewHolder vh = (DonateViewHolder) holder;
|
((DonateViewHolder) holder).bindModel();
|
||||||
vh.contentView.removeAllViews();
|
|
||||||
|
|
||||||
// Donate button
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.donateURL)) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_donate, R.drawable.ic_donate, mApp.donateURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bitcoin
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.getBitcoinUri())) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_bitcoin, R.drawable.ic_bitcoin, mApp.getBitcoinUri());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Litecoin
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.getLitecoinUri())) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_litecoin, R.drawable.ic_litecoin, mApp.getLitecoinUri());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Flattr
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.getFlattrUri())) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_flattr, R.drawable.ic_flattr, mApp.getFlattrUri());
|
|
||||||
}
|
|
||||||
} else if (viewType == VIEWTYPE_LINKS) {
|
} else if (viewType == VIEWTYPE_LINKS) {
|
||||||
final ExpandableLinearLayoutViewHolder vh = (ExpandableLinearLayoutViewHolder) holder;
|
((LinksViewHolder) holder).bindModel();
|
||||||
vh.itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
boolean shouldBeVisible = vh.contentView.getVisibility() != View.VISIBLE;
|
|
||||||
vh.contentView.setVisibility(shouldBeVisible ? View.VISIBLE : View.GONE);
|
|
||||||
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(vh.headerView, R.drawable.ic_website, 0, shouldBeVisible ? R.drawable.ic_expand_less_grey600 : R.drawable.ic_expand_more_grey600, 0);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
vh.headerView.setText(R.string.links);
|
|
||||||
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(vh.headerView, R.drawable.ic_website, 0, R.drawable.ic_expand_more_grey600, 0);
|
|
||||||
vh.contentView.removeAllViews();
|
|
||||||
|
|
||||||
// Source button
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.sourceURL)) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_source, R.drawable.ic_source_code, mApp.sourceURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Issues button
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.trackerURL)) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_issues, R.drawable.ic_issues, mApp.trackerURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Changelog button
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.changelogURL)) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_changelog, R.drawable.ic_changelog, mApp.changelogURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Website button
|
|
||||||
if (uriIsSetAndCanBeOpened(mApp.webURL)) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_website, R.drawable.ic_website, mApp.webURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Email button
|
|
||||||
final String subject = Uri.encode(mContext.getString(R.string.app_details_subject, mApp.name));
|
|
||||||
String emailUrl = mApp.email == null ? null : ("mailto:" + mApp.email + "?subject=" + subject);
|
|
||||||
if (uriIsSetAndCanBeOpened(emailUrl)) {
|
|
||||||
addLinkItemView(vh.contentView, R.string.menu_email, R.drawable.ic_email, emailUrl);
|
|
||||||
}
|
|
||||||
} else if (viewType == VIEWTYPE_PERMISSIONS) {
|
} else if (viewType == VIEWTYPE_PERMISSIONS) {
|
||||||
final ExpandableLinearLayoutViewHolder vh = (ExpandableLinearLayoutViewHolder) holder;
|
((PermissionsViewHolder) holder).bindModel();
|
||||||
vh.itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
boolean shouldBeVisible = vh.contentView.getVisibility() != View.VISIBLE;
|
|
||||||
vh.contentView.setVisibility(shouldBeVisible ? View.VISIBLE : View.GONE);
|
|
||||||
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(vh.headerView, R.drawable.ic_lock_24dp_grey600, 0, shouldBeVisible ? R.drawable.ic_expand_less_grey600 : R.drawable.ic_expand_more_grey600, 0);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
vh.headerView.setText(R.string.permissions);
|
|
||||||
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(vh.headerView, R.drawable.ic_lock_24dp_grey600, 0, R.drawable.ic_expand_more_grey600, 0);
|
|
||||||
vh.contentView.removeAllViews();
|
|
||||||
AppDiff appDiff = new AppDiff(mContext.getPackageManager(), mVersions.get(0));
|
|
||||||
AppSecurityPermissions perms = new AppSecurityPermissions(mContext, appDiff.pkgInfo);
|
|
||||||
vh.contentView.addView(perms.getPermissionsView(AppSecurityPermissions.WHICH_ALL));
|
|
||||||
} else if (viewType == VIEWTYPE_VERSIONS) {
|
} else if (viewType == VIEWTYPE_VERSIONS) {
|
||||||
final ExpandableLinearLayoutViewHolder vh = (ExpandableLinearLayoutViewHolder) holder;
|
((VersionsViewHolder) holder).bindModel();
|
||||||
vh.itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
setShowVersions(!mShowVersions);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
vh.headerView.setText(R.string.versions);
|
|
||||||
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(vh.headerView, R.drawable.ic_access_time_24dp_grey600, 0, mShowVersions ? R.drawable.ic_expand_less_grey600 : R.drawable.ic_expand_more_grey600, 0);
|
|
||||||
} else if (viewType == VIEWTYPE_VERSION) {
|
} else if (viewType == VIEWTYPE_VERSION) {
|
||||||
final VersionViewHolder vh = (VersionViewHolder) holder;
|
|
||||||
java.text.DateFormat df = DateFormat.getDateFormat(mContext);
|
|
||||||
final Apk apk = (Apk) mItems.get(position);
|
final Apk apk = (Apk) mItems.get(position);
|
||||||
|
((VersionViewHolder) holder).bindModel(apk);
|
||||||
vh.version.setText(mContext.getString(R.string.version)
|
|
||||||
+ " " + apk.versionName
|
|
||||||
+ (apk.versionCode == mApp.suggestedVersionCode ? " ☆" : ""));
|
|
||||||
|
|
||||||
vh.status.setText(getInstalledStatus(apk));
|
|
||||||
|
|
||||||
vh.repository.setText(mContext.getString(R.string.repo_provider,
|
|
||||||
RepoProvider.Helper.findById(mContext, apk.repo).getName()));
|
|
||||||
|
|
||||||
if (apk.size > 0) {
|
|
||||||
vh.size.setText(Utils.getFriendlySize(apk.size));
|
|
||||||
vh.size.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
vh.size.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Preferences.get().expertMode()) {
|
|
||||||
vh.api.setVisibility(View.GONE);
|
|
||||||
} else if (apk.minSdkVersion > 0 && apk.maxSdkVersion < Apk.SDK_VERSION_MAX_VALUE) {
|
|
||||||
vh.api.setText(mContext.getString(R.string.minsdk_up_to_maxsdk,
|
|
||||||
Utils.getAndroidVersionName(apk.minSdkVersion),
|
|
||||||
Utils.getAndroidVersionName(apk.maxSdkVersion)));
|
|
||||||
vh.api.setVisibility(View.VISIBLE);
|
|
||||||
} else if (apk.minSdkVersion > 0) {
|
|
||||||
vh.api.setText(mContext.getString(R.string.minsdk_or_later,
|
|
||||||
Utils.getAndroidVersionName(apk.minSdkVersion)));
|
|
||||||
vh.api.setVisibility(View.VISIBLE);
|
|
||||||
} else if (apk.maxSdkVersion > 0) {
|
|
||||||
vh.api.setText(mContext.getString(R.string.up_to_maxsdk,
|
|
||||||
Utils.getAndroidVersionName(apk.maxSdkVersion)));
|
|
||||||
vh.api.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (apk.srcname != null) {
|
|
||||||
vh.buildtype.setText("source");
|
|
||||||
} else {
|
|
||||||
vh.buildtype.setText("bin");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (apk.added != null) {
|
|
||||||
vh.added.setText(mContext.getString(R.string.added_on,
|
|
||||||
df.format(apk.added)));
|
|
||||||
vh.added.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
vh.added.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Preferences.get().expertMode() && apk.nativecode != null) {
|
|
||||||
vh.nativecode.setText(TextUtils.join(" ", apk.nativecode));
|
|
||||||
vh.nativecode.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
vh.nativecode.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (apk.incompatibleReasons != null) {
|
|
||||||
vh.incompatibleReasons.setText(
|
|
||||||
mContext.getResources().getString(
|
|
||||||
R.string.requires_features,
|
|
||||||
TextUtils.join(", ", apk.incompatibleReasons)));
|
|
||||||
vh.incompatibleReasons.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
vh.incompatibleReasons.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable it all if it isn't compatible...
|
|
||||||
final View[] views = {
|
|
||||||
vh.itemView,
|
|
||||||
vh.version,
|
|
||||||
vh.status,
|
|
||||||
vh.repository,
|
|
||||||
vh.size,
|
|
||||||
vh.api,
|
|
||||||
vh.buildtype,
|
|
||||||
vh.added,
|
|
||||||
vh.nativecode,
|
|
||||||
};
|
|
||||||
for (final View v : views) {
|
|
||||||
v.setEnabled(apk.compatible);
|
|
||||||
}
|
|
||||||
vh.itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
mCallbacks.installApk(apk);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,6 +365,88 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bindModel() {
|
||||||
|
ImageLoader.getInstance().displayImage(mApp.iconUrlLarge, iconView, displayImageOptions);
|
||||||
|
titleView.setText(mApp.name);
|
||||||
|
if (!TextUtils.isEmpty(mApp.author)) {
|
||||||
|
authorView.setText(mContext.getString(R.string.by_author) + " " + mApp.author);
|
||||||
|
authorView.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
authorView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
summaryView.setText(mApp.summary);
|
||||||
|
final Spanned desc = Html.fromHtml(mApp.description, null, new Utils.HtmlTagHandler());
|
||||||
|
descriptionView.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
|
descriptionView.setText(trimTrailingNewlines(desc));
|
||||||
|
if (descriptionView.getText() instanceof Spannable) {
|
||||||
|
Spannable spannable = (Spannable) descriptionView.getText();
|
||||||
|
URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
|
||||||
|
for (URLSpan span : spans) {
|
||||||
|
int start = spannable.getSpanStart(span);
|
||||||
|
int end = spannable.getSpanEnd(span);
|
||||||
|
int flags = spannable.getSpanFlags(span);
|
||||||
|
spannable.removeSpan(span);
|
||||||
|
// Create out own safe link span
|
||||||
|
SafeURLSpan safeUrlSpan = new SafeURLSpan(span.getURL());
|
||||||
|
spannable.setSpan(safeUrlSpan, start, end, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
descriptionView.post(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (descriptionView.getLineCount() < HeaderViewHolder.MAX_LINES) {
|
||||||
|
descriptionMoreView.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
descriptionMoreView.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
buttonSecondaryView.setText(R.string.menu_uninstall);
|
||||||
|
buttonSecondaryView.setVisibility(mApp.isInstalled() ? View.VISIBLE : View.INVISIBLE);
|
||||||
|
buttonSecondaryView.setOnClickListener(mOnUnInstallClickListener);
|
||||||
|
buttonPrimaryView.setText(R.string.menu_install);
|
||||||
|
buttonPrimaryView.setVisibility(mVersions.size() > 0 ? View.VISIBLE : View.GONE);
|
||||||
|
if (mCallbacks.isAppDownloading()) {
|
||||||
|
buttonPrimaryView.setText(R.string.downloading);
|
||||||
|
buttonPrimaryView.setEnabled(false);
|
||||||
|
} else if (!mApp.isInstalled() && mApp.suggestedVersionCode > 0 && mVersions.size() > 0) {
|
||||||
|
// Check count > 0 due to incompatible apps resulting in an empty list.
|
||||||
|
mCallbacks.disableAndroidBeam();
|
||||||
|
// Set Install button and hide second button
|
||||||
|
buttonPrimaryView.setText(R.string.menu_install);
|
||||||
|
buttonPrimaryView.setOnClickListener(mOnInstallClickListener);
|
||||||
|
buttonPrimaryView.setEnabled(true);
|
||||||
|
} else if (mApp.isInstalled()) {
|
||||||
|
mCallbacks.enableAndroidBeam();
|
||||||
|
if (mApp.canAndWantToUpdate(mContext)) {
|
||||||
|
buttonPrimaryView.setText(R.string.menu_upgrade);
|
||||||
|
buttonPrimaryView.setOnClickListener(mOnUpgradeClickListener);
|
||||||
|
} else {
|
||||||
|
if (mContext.getPackageManager().getLaunchIntentForPackage(mApp.packageName) != null) {
|
||||||
|
buttonPrimaryView.setText(R.string.menu_launch);
|
||||||
|
buttonPrimaryView.setOnClickListener(mOnLaunchClickListener);
|
||||||
|
} else {
|
||||||
|
buttonPrimaryView.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buttonPrimaryView.setEnabled(true);
|
||||||
|
}
|
||||||
|
if (mCallbacks.isAppDownloading()) {
|
||||||
|
buttonLayout.setVisibility(View.GONE);
|
||||||
|
progressLayout.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
buttonLayout.setVisibility(View.VISIBLE);
|
||||||
|
progressLayout.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
progressCancel.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
mCallbacks.installCancel();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -646,6 +469,21 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
super(view);
|
super(view);
|
||||||
recyclerView = (RecyclerView) view.findViewById(R.id.screenshots);
|
recyclerView = (RecyclerView) view.findViewById(R.id.screenshots);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bindModel() {
|
||||||
|
LinearLayoutManager lm = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
|
||||||
|
recyclerView.setLayoutManager(lm);
|
||||||
|
ScreenShotsRecyclerViewAdapter adapter = new ScreenShotsRecyclerViewAdapter(itemView.getContext(), mApp);
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
recyclerView.setHasFixedSize(true);
|
||||||
|
recyclerView.setNestedScrollingEnabled(false);
|
||||||
|
if (snapHelper != null) {
|
||||||
|
snapHelper.attachToRecyclerView(null);
|
||||||
|
}
|
||||||
|
snapHelper = new LinearLayoutManagerSnapHelper(lm);
|
||||||
|
snapHelper.setLinearSnapHelperListener(adapter);
|
||||||
|
snapHelper.attachToRecyclerView(recyclerView);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class WhatsNewViewHolder extends RecyclerView.ViewHolder {
|
private class WhatsNewViewHolder extends RecyclerView.ViewHolder {
|
||||||
@ -655,6 +493,10 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
super(view);
|
super(view);
|
||||||
textView = (TextView) view.findViewById(R.id.text);
|
textView = (TextView) view.findViewById(R.id.text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bindModel() {
|
||||||
|
textView.setText("WHATS NEW GOES HERE");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class DonateViewHolder extends RecyclerView.ViewHolder {
|
private class DonateViewHolder extends RecyclerView.ViewHolder {
|
||||||
@ -666,9 +508,33 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
textView = (TextView) view.findViewById(R.id.information);
|
textView = (TextView) view.findViewById(R.id.information);
|
||||||
contentView = (LinearLayout) view.findViewById(R.id.ll_information);
|
contentView = (LinearLayout) view.findViewById(R.id.ll_information);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bindModel() {
|
||||||
|
contentView.removeAllViews();
|
||||||
|
|
||||||
|
// Donate button
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.donateURL)) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_donate, R.drawable.ic_donate, mApp.donateURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bitcoin
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.getBitcoinUri())) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_bitcoin, R.drawable.ic_bitcoin, mApp.getBitcoinUri());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Litecoin
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.getLitecoinUri())) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_litecoin, R.drawable.ic_litecoin, mApp.getLitecoinUri());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flattr
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.getFlattrUri())) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_flattr, R.drawable.ic_flattr, mApp.getFlattrUri());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ExpandableLinearLayoutViewHolder extends RecyclerView.ViewHolder {
|
private abstract class ExpandableLinearLayoutViewHolder extends RecyclerView.ViewHolder {
|
||||||
final TextView headerView;
|
final TextView headerView;
|
||||||
final LinearLayout contentView;
|
final LinearLayout contentView;
|
||||||
|
|
||||||
@ -679,6 +545,96 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class VersionsViewHolder extends ExpandableLinearLayoutViewHolder {
|
||||||
|
|
||||||
|
VersionsViewHolder(View view) {
|
||||||
|
super(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bindModel() {
|
||||||
|
itemView.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
setShowVersions(!mShowVersions);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
headerView.setText(R.string.versions);
|
||||||
|
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(headerView, R.drawable.ic_access_time_24dp_grey600, 0, mShowVersions ? R.drawable.ic_expand_less_grey600 : R.drawable.ic_expand_more_grey600, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class PermissionsViewHolder extends ExpandableLinearLayoutViewHolder {
|
||||||
|
|
||||||
|
PermissionsViewHolder(View view) {
|
||||||
|
super(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bindModel() {
|
||||||
|
itemView.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
boolean shouldBeVisible = contentView.getVisibility() != View.VISIBLE;
|
||||||
|
contentView.setVisibility(shouldBeVisible ? View.VISIBLE : View.GONE);
|
||||||
|
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(headerView, R.drawable.ic_lock_24dp_grey600, 0, shouldBeVisible ? R.drawable.ic_expand_less_grey600 : R.drawable.ic_expand_more_grey600, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
headerView.setText(R.string.permissions);
|
||||||
|
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(headerView, R.drawable.ic_lock_24dp_grey600, 0, R.drawable.ic_expand_more_grey600, 0);
|
||||||
|
contentView.removeAllViews();
|
||||||
|
AppDiff appDiff = new AppDiff(mContext.getPackageManager(), mVersions.get(0));
|
||||||
|
AppSecurityPermissions perms = new AppSecurityPermissions(mContext, appDiff.pkgInfo);
|
||||||
|
contentView.addView(perms.getPermissionsView(AppSecurityPermissions.WHICH_ALL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class LinksViewHolder extends ExpandableLinearLayoutViewHolder {
|
||||||
|
|
||||||
|
LinksViewHolder(View view) {
|
||||||
|
super(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bindModel() {
|
||||||
|
itemView.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
boolean shouldBeVisible = contentView.getVisibility() != View.VISIBLE;
|
||||||
|
contentView.setVisibility(shouldBeVisible ? View.VISIBLE : View.GONE);
|
||||||
|
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(headerView, R.drawable.ic_website, 0, shouldBeVisible ? R.drawable.ic_expand_less_grey600 : R.drawable.ic_expand_more_grey600, 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
headerView.setText(R.string.links);
|
||||||
|
TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(headerView, R.drawable.ic_website, 0, R.drawable.ic_expand_more_grey600, 0);
|
||||||
|
contentView.removeAllViews();
|
||||||
|
|
||||||
|
// Source button
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.sourceURL)) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_source, R.drawable.ic_source_code, mApp.sourceURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Issues button
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.trackerURL)) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_issues, R.drawable.ic_issues, mApp.trackerURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Changelog button
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.changelogURL)) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_changelog, R.drawable.ic_changelog, mApp.changelogURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Website button
|
||||||
|
if (uriIsSetAndCanBeOpened(mApp.webURL)) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_website, R.drawable.ic_website, mApp.webURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Email button
|
||||||
|
final String subject = Uri.encode(mContext.getString(R.string.app_details_subject, mApp.name));
|
||||||
|
String emailUrl = mApp.email == null ? null : ("mailto:" + mApp.email + "?subject=" + subject);
|
||||||
|
if (uriIsSetAndCanBeOpened(emailUrl)) {
|
||||||
|
addLinkItemView(contentView, R.string.menu_email, R.drawable.ic_email, emailUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class VersionViewHolder extends RecyclerView.ViewHolder {
|
private class VersionViewHolder extends RecyclerView.ViewHolder {
|
||||||
final TextView version;
|
final TextView version;
|
||||||
final TextView status;
|
final TextView status;
|
||||||
@ -706,6 +662,96 @@ public class AppDetailsRecyclerViewAdapter
|
|||||||
int padding = mContext.getResources().getDimensionPixelSize(R.dimen.details_activity_padding);
|
int padding = mContext.getResources().getDimensionPixelSize(R.dimen.details_activity_padding);
|
||||||
ViewCompat.setPaddingRelative(view, margin + padding + ViewCompat.getPaddingStart(view), view.getPaddingTop(), ViewCompat.getPaddingEnd(view), view.getPaddingBottom());
|
ViewCompat.setPaddingRelative(view, margin + padding + ViewCompat.getPaddingStart(view), view.getPaddingTop(), ViewCompat.getPaddingEnd(view), view.getPaddingBottom());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bindModel(final Apk apk) {
|
||||||
|
java.text.DateFormat df = DateFormat.getDateFormat(mContext);
|
||||||
|
|
||||||
|
version.setText(mContext.getString(R.string.version)
|
||||||
|
+ " " + apk.versionName
|
||||||
|
+ (apk.versionCode == mApp.suggestedVersionCode ? " ☆" : ""));
|
||||||
|
|
||||||
|
status.setText(getInstalledStatus(apk));
|
||||||
|
|
||||||
|
repository.setText(mContext.getString(R.string.repo_provider,
|
||||||
|
RepoProvider.Helper.findById(mContext, apk.repo).getName()));
|
||||||
|
|
||||||
|
if (apk.size > 0) {
|
||||||
|
size.setText(Utils.getFriendlySize(apk.size));
|
||||||
|
size.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
size.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Preferences.get().expertMode()) {
|
||||||
|
api.setVisibility(View.GONE);
|
||||||
|
} else if (apk.minSdkVersion > 0 && apk.maxSdkVersion < Apk.SDK_VERSION_MAX_VALUE) {
|
||||||
|
api.setText(mContext.getString(R.string.minsdk_up_to_maxsdk,
|
||||||
|
Utils.getAndroidVersionName(apk.minSdkVersion),
|
||||||
|
Utils.getAndroidVersionName(apk.maxSdkVersion)));
|
||||||
|
api.setVisibility(View.VISIBLE);
|
||||||
|
} else if (apk.minSdkVersion > 0) {
|
||||||
|
api.setText(mContext.getString(R.string.minsdk_or_later,
|
||||||
|
Utils.getAndroidVersionName(apk.minSdkVersion)));
|
||||||
|
api.setVisibility(View.VISIBLE);
|
||||||
|
} else if (apk.maxSdkVersion > 0) {
|
||||||
|
api.setText(mContext.getString(R.string.up_to_maxsdk,
|
||||||
|
Utils.getAndroidVersionName(apk.maxSdkVersion)));
|
||||||
|
api.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (apk.srcname != null) {
|
||||||
|
buildtype.setText("source");
|
||||||
|
} else {
|
||||||
|
buildtype.setText("bin");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (apk.added != null) {
|
||||||
|
added.setText(mContext.getString(R.string.added_on,
|
||||||
|
df.format(apk.added)));
|
||||||
|
added.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
added.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Preferences.get().expertMode() && apk.nativecode != null) {
|
||||||
|
nativecode.setText(TextUtils.join(" ", apk.nativecode));
|
||||||
|
nativecode.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
nativecode.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (apk.incompatibleReasons != null) {
|
||||||
|
incompatibleReasons.setText(
|
||||||
|
mContext.getResources().getString(
|
||||||
|
R.string.requires_features,
|
||||||
|
TextUtils.join(", ", apk.incompatibleReasons)));
|
||||||
|
incompatibleReasons.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
incompatibleReasons.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable it all if it isn't compatible...
|
||||||
|
final View[] views = {
|
||||||
|
itemView,
|
||||||
|
version,
|
||||||
|
status,
|
||||||
|
repository,
|
||||||
|
size,
|
||||||
|
api,
|
||||||
|
buildtype,
|
||||||
|
added,
|
||||||
|
nativecode,
|
||||||
|
};
|
||||||
|
for (final View v : views) {
|
||||||
|
v.setEnabled(apk.compatible);
|
||||||
|
}
|
||||||
|
itemView.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
mCallbacks.installApk(apk);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addLinkItemView(ViewGroup parent, int resIdText, int resIdDrawable, final String url) {
|
private void addLinkItemView(ViewGroup parent, int resIdText, int resIdDrawable, final String url) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user