Add the download/install progress bar
This commit is contained in:
parent
b2d363b947
commit
d02ea05865
@ -40,7 +40,7 @@ import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
@ -67,6 +67,7 @@ import org.fdroid.fdroid.views.LinearLayoutManagerSnapHelper;
|
||||
import org.fdroid.fdroid.views.ScreenShotsRecyclerViewAdapter;
|
||||
import org.fdroid.fdroid.views.ShareChooserDialog;
|
||||
|
||||
import java.text.NumberFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@ -225,6 +226,8 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
private ArrayList<Apk> mVersions;
|
||||
private boolean mShowVersions;
|
||||
|
||||
private HeaderViewHolder mHeaderView;
|
||||
|
||||
public AppDetailsRecyclerViewAdapter(Context context) {
|
||||
mContext = context;
|
||||
updateItems();
|
||||
@ -300,6 +303,10 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
uriIsSetAndCanBeOpened(mApp.flattrID);
|
||||
}
|
||||
|
||||
public HeaderViewHolder getHeaderView() {
|
||||
return mHeaderView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
if (viewType == VIEWTYPE_HEADER) {
|
||||
@ -343,6 +350,7 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
int viewType = getItemViewType(position);
|
||||
if (viewType == VIEWTYPE_HEADER) {
|
||||
final HeaderViewHolder vh = (HeaderViewHolder) holder;
|
||||
mHeaderView = vh;
|
||||
ImageLoader.getInstance().displayImage(mApp.iconUrlLarge, vh.iconView, vh.displayImageOptions);
|
||||
vh.titleView.setText(mApp.name);
|
||||
if (!TextUtils.isEmpty(mApp.author)) {
|
||||
@ -418,6 +426,19 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
}
|
||||
vh.buttonPrimaryView.setEnabled(true);
|
||||
}
|
||||
if (!TextUtils.isEmpty(mActiveDownloadUrlString)) {
|
||||
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) {
|
||||
cancelInstall();
|
||||
}
|
||||
});
|
||||
|
||||
/*TextView currentVersion = (TextView) view.findViewById(R.id.current_version);
|
||||
if (!appDetails.getApks().isEmpty()) {
|
||||
@ -619,6 +640,14 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewRecycled(RecyclerView.ViewHolder holder) {
|
||||
if (holder instanceof HeaderViewHolder) {
|
||||
mHeaderView = null;
|
||||
}
|
||||
super.onViewRecycled(holder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mItems.size();
|
||||
@ -640,8 +669,14 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
final TextView summaryView;
|
||||
final TextView descriptionView;
|
||||
final TextView descriptionMoreView;
|
||||
final View buttonLayout;
|
||||
final Button buttonPrimaryView;
|
||||
final Button buttonSecondaryView;
|
||||
final View progressLayout;
|
||||
final ProgressBar progressBar;
|
||||
final TextView progressLabel;
|
||||
final TextView progressPercent;
|
||||
final View progressCancel;
|
||||
final DisplayImageOptions displayImageOptions;
|
||||
|
||||
HeaderViewHolder(View view) {
|
||||
@ -652,8 +687,14 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
summaryView = (TextView) view.findViewById(R.id.summary);
|
||||
descriptionView = (TextView) view.findViewById(R.id.description);
|
||||
descriptionMoreView = (TextView) view.findViewById(R.id.description_more);
|
||||
buttonLayout = view.findViewById(R.id.button_layout);
|
||||
buttonPrimaryView = (Button) view.findViewById(R.id.primaryButtonView);
|
||||
buttonSecondaryView = (Button) view.findViewById(R.id.secondaryButtonView);
|
||||
progressLayout = view.findViewById(R.id.progress_layout);
|
||||
progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);
|
||||
progressLabel = (TextView) view.findViewById(R.id.progress_label);
|
||||
progressPercent = (TextView) view.findViewById(R.id.progress_percent);
|
||||
progressCancel = view.findViewById(R.id.progress_cancel);
|
||||
displayImageOptions = new DisplayImageOptions.Builder()
|
||||
.cacheInMemory(true)
|
||||
.cacheOnDisk(true)
|
||||
@ -694,6 +735,37 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
buttonSecondaryView.setTransformationMethod(allCapsTransformation);
|
||||
descriptionMoreView.setTransformationMethod(allCapsTransformation);
|
||||
}
|
||||
|
||||
public void setProgress(int bytesDownloaded, int totalBytes, int resIdString) {
|
||||
if (bytesDownloaded == 0 && totalBytes == 0) {
|
||||
// Remove progress bar
|
||||
progressLayout.setVisibility(View.GONE);
|
||||
buttonLayout.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
progressBar.setMax(totalBytes);
|
||||
progressBar.setProgress(bytesDownloaded);
|
||||
progressBar.setIndeterminate(totalBytes == -1);
|
||||
if (resIdString != 0) {
|
||||
progressLabel.setText(resIdString);
|
||||
progressPercent.setText("");
|
||||
} else if (totalBytes > 0 && bytesDownloaded >= 0) {
|
||||
float percent = bytesDownloaded * 100 / totalBytes;
|
||||
progressLabel.setText(Utils.getFriendlySize(bytesDownloaded) + " / " + Utils.getFriendlySize(totalBytes));
|
||||
NumberFormat format = NumberFormat.getPercentInstance();
|
||||
format.setMaximumFractionDigits(0);
|
||||
progressPercent.setText(format.format(percent / 100));
|
||||
} else if (bytesDownloaded >= 0) {
|
||||
progressLabel.setText(Utils.getFriendlySize(bytesDownloaded));
|
||||
progressPercent.setText("");
|
||||
}
|
||||
|
||||
// Make sure it's visible
|
||||
if (progressLayout.getVisibility() != View.VISIBLE) {
|
||||
progressLayout.setVisibility(View.VISIBLE);
|
||||
buttonLayout.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ScreenShotsViewHolder extends RecyclerView.ViewHolder {
|
||||
@ -987,6 +1059,12 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
InstallManagerService.queue(this, mApp, apk);
|
||||
}
|
||||
|
||||
private void cancelInstall() {
|
||||
if (!TextUtils.isEmpty(mActiveDownloadUrlString)) {
|
||||
InstallManagerService.cancel(this, mActiveDownloadUrlString);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Queue for uninstall based on the instance variable {@link #app}
|
||||
*/
|
||||
@ -1056,18 +1134,18 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case Downloader.ACTION_STARTED:
|
||||
//if (headerFragment != null) {
|
||||
// headerFragment.startProgress();
|
||||
//}
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(-1, -1, R.string.download_pending);
|
||||
}
|
||||
break;
|
||||
case Downloader.ACTION_PROGRESS:
|
||||
//if (headerFragment != null) {
|
||||
// headerFragment.updateProgress(intent.getIntExtra(Downloader.EXTRA_BYTES_READ, -1),
|
||||
// intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, -1));
|
||||
//}
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(intent.getIntExtra(Downloader.EXTRA_BYTES_READ, -1),
|
||||
intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, -1), 0);
|
||||
}
|
||||
break;
|
||||
case Downloader.ACTION_COMPLETE:
|
||||
// Starts the install process one the download is complete.
|
||||
// Starts the install process once the download is complete.
|
||||
cleanUpFinishedDownload();
|
||||
mLocalBroadcastManager.registerReceiver(installReceiver,
|
||||
Installer.getInstallIntentFilter(intent.getData()));
|
||||
@ -1094,16 +1172,21 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case Installer.ACTION_INSTALL_STARTED:
|
||||
//headerFragment.startProgress(false);
|
||||
//headerFragment.showIndeterminateProgress(getString(R.string.installing));
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(-1, -1, R.string.installing);
|
||||
}
|
||||
break;
|
||||
case Installer.ACTION_INSTALL_COMPLETE:
|
||||
//headerFragment.removeProgress();
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(0, 0, 0); // Remove
|
||||
}
|
||||
unregisterInstallReceiver();
|
||||
onAppChanged();
|
||||
break;
|
||||
case Installer.ACTION_INSTALL_INTERRUPTED:
|
||||
//headerFragment.removeProgress();
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(0, 0, 0); // Remove
|
||||
}
|
||||
onAppChanged();
|
||||
|
||||
String errorMessage =
|
||||
@ -1146,17 +1229,21 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case Installer.ACTION_UNINSTALL_STARTED:
|
||||
//headerFragment.startProgress(false);
|
||||
//headerFragment.showIndeterminateProgress(getString(R.string.uninstalling));
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(-1, -1, R.string.uninstalling);
|
||||
}
|
||||
break;
|
||||
case Installer.ACTION_UNINSTALL_COMPLETE:
|
||||
//headerFragment.removeProgress();
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(0, 0, 0); // Remove
|
||||
}
|
||||
onAppChanged();
|
||||
unregisterUninstallReceiver();
|
||||
break;
|
||||
case Installer.ACTION_UNINSTALL_INTERRUPTED:
|
||||
//headerFragment.removeProgress();
|
||||
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(0, 0, 0); // Remove
|
||||
}
|
||||
String errorMessage =
|
||||
intent.getStringExtra(Installer.EXTRA_ERROR_MESSAGE);
|
||||
|
||||
@ -1221,9 +1308,9 @@ public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog
|
||||
*/
|
||||
private void cleanUpFinishedDownload() {
|
||||
mActiveDownloadUrlString = null;
|
||||
//if (headerFragment != null) {
|
||||
// headerFragment.removeProgress();
|
||||
//}
|
||||
if (mAdapter.getHeaderView() != null) {
|
||||
mAdapter.getHeaderView().setProgress(0, 0, 0); // Remove
|
||||
}
|
||||
unregisterDownloaderReceiver();
|
||||
}
|
||||
|
||||
|
@ -56,14 +56,66 @@
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||
tools:text="Author" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/progress_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/icon"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true">
|
||||
<ImageView
|
||||
android:id="@+id/progress_cancel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:src="@android:drawable/ic_menu_close_clear_cancel"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/progress_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||
android:text="@string/downloading"
|
||||
/>
|
||||
<TextView
|
||||
android:id="@+id/progress_percent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toLeftOf="@id/progress_cancel"
|
||||
android:layout_toStartOf="@id/progress_cancel"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Small"
|
||||
android:text=""
|
||||
/>
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_bar"
|
||||
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toLeftOf="@id/progress_cancel"
|
||||
android:layout_toStartOf="@id/progress_cancel"
|
||||
android:layout_below="@id/progress_label"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
/>
|
||||
</RelativeLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/icon"
|
||||
android:layout_toEndOf="@id/icon"
|
||||
android:layout_toRightOf="@id/icon"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true">
|
||||
android:layout_alignParentRight="true"
|
||||
android:visibility="gone"
|
||||
>
|
||||
|
||||
<Button
|
||||
android:id="@+id/secondaryButtonView"
|
||||
|
Loading…
x
Reference in New Issue
Block a user