Add support for linear progress bar to installed app layout.
This commit is contained in:
parent
40cc328e98
commit
ce2ac71206
@ -20,7 +20,10 @@ import android.support.v7.widget.RecyclerView;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewOutlineProvider;
|
import android.view.ViewOutlineProvider;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.ImageButton;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||||
@ -70,6 +73,18 @@ public class AppListItemController extends RecyclerView.ViewHolder {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private final TextView ignoredStatus;
|
private final TextView ignoredStatus;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final ProgressBar progressBar;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private final ImageButton cancelButton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will operate as the "Download is complete, click to (install|update)" button.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private final Button actionButton;
|
||||||
|
|
||||||
private final DisplayImageOptions displayImageOptions;
|
private final DisplayImageOptions displayImageOptions;
|
||||||
|
|
||||||
private App currentApp;
|
private App currentApp;
|
||||||
@ -107,6 +122,13 @@ public class AppListItemController extends RecyclerView.ViewHolder {
|
|||||||
status = (TextView) itemView.findViewById(R.id.status);
|
status = (TextView) itemView.findViewById(R.id.status);
|
||||||
installedVersion = (TextView) itemView.findViewById(R.id.installed_version);
|
installedVersion = (TextView) itemView.findViewById(R.id.installed_version);
|
||||||
ignoredStatus = (TextView) itemView.findViewById(R.id.ignored_status);
|
ignoredStatus = (TextView) itemView.findViewById(R.id.ignored_status);
|
||||||
|
progressBar = (ProgressBar) itemView.findViewById(R.id.progress_bar);
|
||||||
|
cancelButton = (ImageButton) itemView.findViewById(R.id.cancel_button);
|
||||||
|
actionButton = (Button) itemView.findViewById(R.id.action_button);
|
||||||
|
|
||||||
|
if (cancelButton != null) {
|
||||||
|
cancelButton.setOnClickListener(onCancelDownload);
|
||||||
|
}
|
||||||
|
|
||||||
displayImageOptions = Utils.getImageLoadingOptions().build();
|
displayImageOptions = Utils.getImageLoadingOptions().build();
|
||||||
|
|
||||||
@ -133,6 +155,7 @@ public class AppListItemController extends RecyclerView.ViewHolder {
|
|||||||
configureInstalledVersion(app);
|
configureInstalledVersion(app);
|
||||||
configureIgnoredStatus(app);
|
configureIgnoredStatus(app);
|
||||||
configureInstallButton(app);
|
configureInstallButton(app);
|
||||||
|
configureActionButton(app);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -212,6 +235,37 @@ public class AppListItemController extends RecyclerView.ViewHolder {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The action button will either tell the user to "Update" or "Install" the app. Both actually do
|
||||||
|
* the same thing (launch the package manager). It depends on whether the app has a previous
|
||||||
|
* version installed or not as to the chosen terminology.
|
||||||
|
*/
|
||||||
|
private void configureActionButton(@NonNull App app) {
|
||||||
|
if (actionButton == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean readyToInstall = false;
|
||||||
|
for (AppUpdateStatusManager.AppUpdateStatus status : AppUpdateStatusManager.getInstance(activity).getByPackageName(app.packageName)) {
|
||||||
|
if (status.status == AppUpdateStatusManager.Status.ReadyToInstall) {
|
||||||
|
readyToInstall = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!readyToInstall) {
|
||||||
|
actionButton.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
actionButton.setVisibility(View.VISIBLE);
|
||||||
|
if (app.isInstalled()) {
|
||||||
|
actionButton.setText(R.string.app__install_downloaded_update);
|
||||||
|
} else {
|
||||||
|
actionButton.setText(R.string.menu_install);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The install button is shown when an app:
|
* The install button is shown when an app:
|
||||||
* * Is compatible with the users device.
|
* * Is compatible with the users device.
|
||||||
@ -242,6 +296,61 @@ public class AppListItemController extends RecyclerView.ViewHolder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onDownloadStarted() {
|
||||||
|
if (installButton != null) {
|
||||||
|
installButton.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_download_progress));
|
||||||
|
installButton.setImageLevel(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progressBar != null) {
|
||||||
|
progressBar.setVisibility(View.VISIBLE);
|
||||||
|
progressBar.setIndeterminate(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancelButton != null) {
|
||||||
|
cancelButton.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onDownloadProgressUpdated(int bytesRead, int totalBytes) {
|
||||||
|
if (installButton != null) {
|
||||||
|
installButton.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_download_progress));
|
||||||
|
int progressAsDegrees = totalBytes <= 0 ? 0 : (int) (((float) bytesRead / totalBytes) * 360);
|
||||||
|
installButton.setImageLevel(progressAsDegrees);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progressBar != null) {
|
||||||
|
progressBar.setVisibility(View.VISIBLE);
|
||||||
|
if (totalBytes <= 0) {
|
||||||
|
progressBar.setIndeterminate(true);
|
||||||
|
} else {
|
||||||
|
progressBar.setIndeterminate(false);
|
||||||
|
progressBar.setMax(totalBytes);
|
||||||
|
progressBar.setProgress(bytesRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancelButton != null) {
|
||||||
|
cancelButton.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onDownloadComplete() {
|
||||||
|
if (installButton != null) {
|
||||||
|
installButton.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_download_complete));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progressBar != null) {
|
||||||
|
progressBar.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancelButton != null) {
|
||||||
|
cancelButton.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
configureActionButton(currentApp);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("FieldCanBeLocal")
|
@SuppressWarnings("FieldCanBeLocal")
|
||||||
private final View.OnClickListener onAppClicked = new View.OnClickListener() {
|
private final View.OnClickListener onAppClicked = new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
@ -262,22 +371,25 @@ public class AppListItemController extends RecyclerView.ViewHolder {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates both the progress bar and the circular install button (which shows progress around the outside of the circle).
|
||||||
|
* Also updates the app label to indicate that the app is being downloaded.
|
||||||
|
*/
|
||||||
private final BroadcastReceiver onDownloadProgress = new BroadcastReceiver() {
|
private final BroadcastReceiver onDownloadProgress = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
if (installButton == null || currentApp == null || !TextUtils.equals(currentAppDownloadUrl, intent.getDataString())) {
|
if (currentApp == null || !TextUtils.equals(currentAppDownloadUrl, intent.getDataString()) || (installButton == null && progressBar == null)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Downloader.ACTION_PROGRESS.equals(intent.getAction())) {
|
if (Downloader.ACTION_STARTED.equals(intent.getAction())) {
|
||||||
installButton.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_download_progress));
|
onDownloadStarted();
|
||||||
|
} else if (Downloader.ACTION_PROGRESS.equals(intent.getAction())) {
|
||||||
int bytesRead = intent.getIntExtra(Downloader.EXTRA_BYTES_READ, 0);
|
int bytesRead = intent.getIntExtra(Downloader.EXTRA_BYTES_READ, 0);
|
||||||
int totalBytes = intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, 100);
|
int totalBytes = intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, 0);
|
||||||
|
onDownloadProgressUpdated(bytesRead, totalBytes);
|
||||||
int progressAsDegrees = (int) (((float) bytesRead / totalBytes) * 360);
|
|
||||||
installButton.setImageLevel(progressAsDegrees);
|
|
||||||
} else if (Downloader.ACTION_COMPLETE.equals(intent.getAction())) {
|
} else if (Downloader.ACTION_COMPLETE.equals(intent.getAction())) {
|
||||||
installButton.setImageDrawable(ContextCompat.getDrawable(activity, R.drawable.ic_download_complete));
|
onDownloadComplete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -347,4 +459,16 @@ public class AppListItemController extends RecyclerView.ViewHolder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@SuppressWarnings("FieldCanBeLocal")
|
||||||
|
private final View.OnClickListener onCancelDownload = new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (currentAppDownloadUrl == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
InstallManagerService.cancel(activity, currentAppDownloadUrl);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,7 @@
|
|||||||
<string name="app_recommended_version_installed">Version %1$s (Recommended)</string>
|
<string name="app_recommended_version_installed">Version %1$s (Recommended)</string>
|
||||||
<string name="app__newly_added">New</string>
|
<string name="app__newly_added">New</string>
|
||||||
<string name="added_on">Added on %s</string>
|
<string name="added_on">Added on %s</string>
|
||||||
|
<string name="app__install_downloaded_update">Update</string>
|
||||||
|
|
||||||
<string name="installed_apps__activity_title">Installed Apps</string>
|
<string name="installed_apps__activity_title">Installed Apps</string>
|
||||||
<string name="installed_app__updates_ignored">Updates ignored</string>
|
<string name="installed_app__updates_ignored">Updates ignored</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user