Search in sources :

Example 6 with OCUpload

use of com.owncloud.android.datamodel.OCUpload in project android by owncloud.

the class ExpandableUploadListAdapter method getView.

private View getView(OCUpload[] uploadsItems, int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        LayoutInflater inflator = (LayoutInflater) mParentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflator.inflate(R.layout.upload_list_item, parent, false);
        // Allow or disallow touches with other visible windows
        view.setFilterTouchesWhenObscured(PreferenceUtils.shouldDisallowTouchesWithOtherVisibleWindows(mParentActivity));
    }
    if (uploadsItems != null && uploadsItems.length > position) {
        final OCUpload upload = uploadsItems[position];
        // local file name
        TextView fileTextView = view.findViewById(R.id.upload_name);
        File remoteFile = new File(upload.getRemotePath());
        String fileName = remoteFile.getName();
        if (fileName.length() == 0) {
            fileName = File.separator;
        }
        fileTextView.setText(fileName);
        // remote path to parent folder
        TextView pathTextView = view.findViewById(R.id.upload_remote_path);
        pathTextView.setText(PREF__CAMERA_UPLOADS_DEFAULT_PATH);
        String remoteParentPath = upload.getRemotePath();
        remoteParentPath = new File(remoteParentPath).getParent();
        String pathText = mParentActivity.getString(R.string.app_name) + remoteParentPath;
        pathTextView.setText(pathText);
        // file size
        TextView fileSizeTextView = view.findViewById(R.id.upload_file_size);
        String fileSize = DisplayUtils.bytesToHumanReadable(upload.getFileSize(), mParentActivity) + ", ";
        fileSizeTextView.setText(fileSize);
        // * upload date
        TextView uploadDateTextView = view.findViewById(R.id.upload_date);
        long updateTime = upload.getUploadEndTimestamp();
        CharSequence dateString = DisplayUtils.getRelativeDateTimeString(mParentActivity, updateTime, DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0);
        uploadDateTextView.setText(dateString);
        TextView accountNameTextView = view.findViewById(R.id.upload_account);
        try {
            Account account = AccountUtils.getOwnCloudAccountByName(mParentActivity, upload.getAccountName());
            OwnCloudAccount oca = new OwnCloudAccount(account, mParentActivity);
            String accountName = oca.getDisplayName() + " @ " + DisplayUtils.convertIdn(account.name.substring(account.name.lastIndexOf("@") + 1), false);
            accountNameTextView.setText(accountName);
        } catch (Exception e) {
            Timber.w("Couldn't get display name for account, using old style");
            accountNameTextView.setText(upload.getAccountName());
        }
        TextView statusTextView = view.findViewById(R.id.upload_status);
        ProgressBar progressBar = view.findViewById(R.id.upload_progress_bar);
        // / Reset fields visibility
        uploadDateTextView.setVisibility(View.VISIBLE);
        pathTextView.setVisibility(View.VISIBLE);
        fileSizeTextView.setVisibility(View.VISIBLE);
        accountNameTextView.setVisibility(View.VISIBLE);
        statusTextView.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.GONE);
        // / Update information depending of upload details
        String status = getStatusText(upload);
        switch(upload.getUploadStatus()) {
            case UPLOAD_IN_PROGRESS:
                progressBar.setProgress(0);
                progressBar.setVisibility(View.VISIBLE);
                FileUploader.FileUploaderBinder binder = mParentActivity.getFileUploaderBinder();
                if (binder != null) {
                    if (binder.isUploadingNow(upload)) {
                        // / ... unbind the old progress bar, if any; ...
                        if (mProgressListener != null) {
                            binder.removeDatatransferProgressListener(mProgressListener, // the one that was added
                            mProgressListener.getUpload());
                        }
                        // / ... then, bind the current progress bar to listen for updates
                        mProgressListener = new ProgressListener(upload, progressBar);
                        binder.addDatatransferProgressListener(mProgressListener, upload);
                    } else {
                        // / not really uploading; stop listening progress if view is reused!
                        if (convertView != null && mProgressListener != null && mProgressListener.isWrapping(progressBar)) {
                            binder.removeDatatransferProgressListener(mProgressListener, // the one that was added
                            mProgressListener.getUpload());
                            mProgressListener = null;
                        }
                    }
                } else {
                    Timber.w("FileUploaderBinder not ready yet for upload %s", upload.getRemotePath());
                }
                uploadDateTextView.setVisibility(View.GONE);
                pathTextView.setVisibility(View.GONE);
                progressBar.invalidate();
                break;
            case UPLOAD_FAILED:
                uploadDateTextView.setVisibility(View.GONE);
                break;
            case UPLOAD_SUCCEEDED:
                statusTextView.setVisibility(View.GONE);
                break;
        }
        statusTextView.setText(status);
        // / bind listeners to perform actions
        ImageButton rightButton = view.findViewById(R.id.upload_right_button);
        if (upload.getUploadStatus() == UploadStatus.UPLOAD_IN_PROGRESS) {
            // Cancel
            rightButton.setImageResource(R.drawable.ic_action_cancel_grey);
            rightButton.setVisibility(View.VISIBLE);
            rightButton.setOnClickListener(v -> {
                String localPath = upload.getLocalPath();
                boolean isDocumentUri = DocumentFile.isDocumentUri(parent.getContext(), Uri.parse(localPath));
                if (isDocumentUri) {
                    CancelUploadWithIdUseCase cancelUploadWithIdUseCase = new CancelUploadWithIdUseCase(WorkManager.getInstance(parent.getContext()));
                    cancelUploadWithIdUseCase.execute(new CancelUploadWithIdUseCase.Params(upload));
                } else {
                    FileUploader.FileUploaderBinder uploaderBinder = mParentActivity.getFileUploaderBinder();
                    if (uploaderBinder != null) {
                        uploaderBinder.cancel(upload);
                    }
                }
                refreshView();
            });
        } else if (upload.getUploadStatus() == UploadStatus.UPLOAD_FAILED) {
            // Delete
            rightButton.setImageResource(R.drawable.ic_action_delete_grey);
            rightButton.setVisibility(View.VISIBLE);
            rightButton.setOnClickListener(v -> {
                mUploadsStorageManager.removeUpload(upload);
                refreshView();
            });
        } else {
            // UploadStatus.UPLOAD_SUCCESS
            rightButton.setVisibility(View.INVISIBLE);
        }
        // retry
        if (upload.getUploadStatus() == UploadStatus.UPLOAD_FAILED) {
            if (UploadResult.CREDENTIAL_ERROR.equals(upload.getLastResult())) {
                view.setOnClickListener(v -> mParentActivity.getFileOperationsHelper().checkCurrentCredentials(upload.getAccount(mParentActivity)));
            } else {
                // not a credentials error
                view.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        File file = new File(upload.getLocalPath());
                        if (file.exists()) {
                            TransferRequester requester = new TransferRequester();
                            requester.retry(mParentActivity, upload, false);
                            refreshView();
                        } else if (DocumentFile.isDocumentUri(v.getContext(), Uri.parse(upload.getLocalPath()))) {
                            WorkManager workManager = WorkManager.getInstance(MainApp.Companion.getAppContext());
                            RetryUploadFromContentUriUseCase retryUploadFromContentUriUseCase = new RetryUploadFromContentUriUseCase(workManager);
                            RetryUploadFromContentUriUseCase.Params useCaseParams = new RetryUploadFromContentUriUseCase.Params(upload.getUploadId());
                            retryUploadFromContentUriUseCase.execute(useCaseParams);
                        } else {
                            Snackbar snackbar = Snackbar.make(v.getRootView().findViewById(android.R.id.content), mParentActivity.getString(R.string.local_file_not_found_toast), Snackbar.LENGTH_LONG);
                            snackbar.show();
                        }
                    }
                });
            }
        } else {
            view.setOnClickListener(null);
        }
        // / Set icon or thumbnail
        ImageView fileIcon = view.findViewById(R.id.thumbnail);
        fileIcon.setImageResource(R.drawable.file);
        /* Cancellation needs do be checked and done before changing the drawable in fileIcon, or
             * {@link ThumbnailsCacheManager#cancelPotentialWork} will NEVER cancel any task.
             */
        OCFile fakeFileToCheatThumbnailsCacheManagerInterface = new OCFile(upload.getRemotePath());
        fakeFileToCheatThumbnailsCacheManagerInterface.setStoragePath(upload.getLocalPath());
        fakeFileToCheatThumbnailsCacheManagerInterface.setMimetype(upload.getMimeType());
        boolean allowedToCreateNewThumbnail = (ThumbnailsCacheManager.cancelPotentialThumbnailWork(fakeFileToCheatThumbnailsCacheManagerInterface, fileIcon));
        // TODO this code is duplicated; refactor to a common place
        if ((fakeFileToCheatThumbnailsCacheManagerInterface.isImage() && fakeFileToCheatThumbnailsCacheManagerInterface.getRemoteId() != null && upload.getUploadStatus() == UploadStatus.UPLOAD_SUCCEEDED)) {
            // Thumbnail in Cache?
            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(String.valueOf(fakeFileToCheatThumbnailsCacheManagerInterface.getRemoteId()));
            if (thumbnail != null && !fakeFileToCheatThumbnailsCacheManagerInterface.needsUpdateThumbnail()) {
                fileIcon.setImageBitmap(thumbnail);
            } else {
                // generate new Thumbnail
                if (allowedToCreateNewThumbnail) {
                    final ThumbnailsCacheManager.ThumbnailGenerationTask task = new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon, mParentActivity.getStorageManager(), mParentActivity.getAccount());
                    if (thumbnail == null) {
                        thumbnail = ThumbnailsCacheManager.mDefaultImg;
                    }
                    final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable = new ThumbnailsCacheManager.AsyncThumbnailDrawable(mParentActivity.getResources(), thumbnail, task);
                    fileIcon.setImageDrawable(asyncDrawable);
                    task.execute(fakeFileToCheatThumbnailsCacheManagerInterface);
                }
            }
            if ("image/png".equals(upload.getMimeType())) {
                fileIcon.setBackgroundColor(mParentActivity.getResources().getColor(R.color.background_color));
            }
        } else if (fakeFileToCheatThumbnailsCacheManagerInterface.isImage()) {
            File file = new File(upload.getLocalPath());
            // Thumbnail in Cache?
            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(String.valueOf(file.hashCode()));
            if (thumbnail != null) {
                fileIcon.setImageBitmap(thumbnail);
            } else {
                // generate new Thumbnail
                if (allowedToCreateNewThumbnail) {
                    final ThumbnailsCacheManager.ThumbnailGenerationTask task = new ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon);
                    thumbnail = ThumbnailsCacheManager.mDefaultImg;
                    final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable = new ThumbnailsCacheManager.AsyncThumbnailDrawable(mParentActivity.getResources(), thumbnail, task);
                    fileIcon.setImageDrawable(asyncDrawable);
                    task.execute(file);
                    Timber.v("Executing task to generate a new thumbnail");
                }
            }
            if ("image/png".equalsIgnoreCase(upload.getMimeType())) {
                fileIcon.setBackgroundColor(mParentActivity.getResources().getColor(R.color.background_color));
            }
        } else {
            fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(upload.getMimeType(), fileName));
        }
    }
    return view;
}
Also used : OnDatatransferProgressListener(com.owncloud.android.lib.common.network.OnDatatransferProgressListener) Observer(java.util.Observer) ImageButton(android.widget.ImageButton) ThumbnailsCacheManager(com.owncloud.android.datamodel.ThumbnailsCacheManager) Arrays(java.util.Arrays) DateUtils(android.text.format.DateUtils) ProgressBar(android.widget.ProgressBar) Uri(android.net.Uri) ImageView(android.widget.ImageView) OCFile(com.owncloud.android.datamodel.OCFile) PreferenceUtils(com.owncloud.android.utils.PreferenceUtils) BaseExpandableListAdapter(android.widget.BaseExpandableListAdapter) CancelUploadWithIdUseCase(com.owncloud.android.usecases.CancelUploadWithIdUseCase) View(android.view.View) DisplayUtils(com.owncloud.android.utils.DisplayUtils) PREF__CAMERA_UPLOADS_DEFAULT_PATH(com.owncloud.android.db.PreferenceManager.PREF__CAMERA_UPLOADS_DEFAULT_PATH) DataSetObserver(android.database.DataSetObserver) RetryUploadFromContentUriUseCase(com.owncloud.android.usecases.RetryUploadFromContentUriUseCase) TransferRequester(com.owncloud.android.files.services.TransferRequester) Account(android.accounts.Account) UploadStatus(com.owncloud.android.datamodel.UploadsStorageManager.UploadStatus) AppCompatButton(androidx.appcompat.widget.AppCompatButton) ViewGroup(android.view.ViewGroup) Timber(timber.log.Timber) OCUpload(com.owncloud.android.datamodel.OCUpload) TextView(android.widget.TextView) OwnCloudAccount(com.owncloud.android.lib.common.OwnCloudAccount) MainApp(com.owncloud.android.MainApp) DocumentFile(androidx.documentfile.provider.DocumentFile) UploadResult(com.owncloud.android.db.UploadResult) FileUploader(com.owncloud.android.files.services.FileUploader) Snackbar(com.google.android.material.snackbar.Snackbar) R(com.owncloud.android.R) MimetypeIconUtil(com.owncloud.android.utils.MimetypeIconUtil) Context(android.content.Context) FileActivity(com.owncloud.android.ui.activity.FileActivity) UploadsStorageManager(com.owncloud.android.datamodel.UploadsStorageManager) WorkManager(androidx.work.WorkManager) UploadListFragment(com.owncloud.android.ui.fragment.UploadListFragment) WeakReference(java.lang.ref.WeakReference) LayoutInflater(android.view.LayoutInflater) AccountUtils(com.owncloud.android.authentication.AccountUtils) File(java.io.File) OptionsInUploadListClickListener(com.owncloud.android.ui.fragment.OptionsInUploadListClickListener) Bitmap(android.graphics.Bitmap) ExpandableListView(android.widget.ExpandableListView) Comparator(java.util.Comparator) Observable(java.util.Observable) OnClickListener(android.view.View.OnClickListener) Account(android.accounts.Account) OwnCloudAccount(com.owncloud.android.lib.common.OwnCloudAccount) FileUploader(com.owncloud.android.files.services.FileUploader) OwnCloudAccount(com.owncloud.android.lib.common.OwnCloudAccount) OCFile(com.owncloud.android.datamodel.OCFile) OCUpload(com.owncloud.android.datamodel.OCUpload) ImageButton(android.widget.ImageButton) Bitmap(android.graphics.Bitmap) ThumbnailsCacheManager(com.owncloud.android.datamodel.ThumbnailsCacheManager) WorkManager(androidx.work.WorkManager) TextView(android.widget.TextView) ImageView(android.widget.ImageView) ProgressBar(android.widget.ProgressBar) RetryUploadFromContentUriUseCase(com.owncloud.android.usecases.RetryUploadFromContentUriUseCase) ImageView(android.widget.ImageView) View(android.view.View) TextView(android.widget.TextView) ExpandableListView(android.widget.ExpandableListView) CancelUploadWithIdUseCase(com.owncloud.android.usecases.CancelUploadWithIdUseCase) TransferRequester(com.owncloud.android.files.services.TransferRequester) OnDatatransferProgressListener(com.owncloud.android.lib.common.network.OnDatatransferProgressListener) LayoutInflater(android.view.LayoutInflater) OnClickListener(android.view.View.OnClickListener) OCFile(com.owncloud.android.datamodel.OCFile) DocumentFile(androidx.documentfile.provider.DocumentFile) File(java.io.File) Snackbar(com.google.android.material.snackbar.Snackbar)

Example 7 with OCUpload

use of com.owncloud.android.datamodel.OCUpload in project android by owncloud.

the class TransferRequester method getRequiredNetworkType.

/**
 * Retrieve the type of network connection required to schedule the last upload for an account
 *
 * @param context
 * @param accountName
 * @param remotePath  to upload the file
 * @return 2 if only wifi is required, 1 if any internet connection is required (wifi or cellular)
 */
private int getRequiredNetworkType(Context context, String accountName, String remotePath) {
    UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(context.getContentResolver());
    // Get last upload to be retried
    OCUpload ocUpload = uploadsStorageManager.getLastUploadFor(new OCFile(remotePath), accountName);
    // Wifi by default
    int networkType = JobInfo.NETWORK_TYPE_UNMETERED;
    return networkType;
}
Also used : OCFile(com.owncloud.android.datamodel.OCFile) OCUpload(com.owncloud.android.datamodel.OCUpload) UploadsStorageManager(com.owncloud.android.datamodel.UploadsStorageManager)

Aggregations

OCUpload (com.owncloud.android.datamodel.OCUpload)7 UploadsStorageManager (com.owncloud.android.datamodel.UploadsStorageManager)5 OCFile (com.owncloud.android.datamodel.OCFile)4 Account (android.accounts.Account)3 OwnCloudAccount (com.owncloud.android.lib.common.OwnCloudAccount)2 Context (android.content.Context)1 DataSetObserver (android.database.DataSetObserver)1 Bitmap (android.graphics.Bitmap)1 Uri (android.net.Uri)1 Message (android.os.Message)1 Parcelable (android.os.Parcelable)1 DateUtils (android.text.format.DateUtils)1 LayoutInflater (android.view.LayoutInflater)1 View (android.view.View)1 OnClickListener (android.view.View.OnClickListener)1 ViewGroup (android.view.ViewGroup)1 BaseExpandableListAdapter (android.widget.BaseExpandableListAdapter)1 ExpandableListView (android.widget.ExpandableListView)1 ImageButton (android.widget.ImageButton)1 ImageView (android.widget.ImageView)1