Search in sources :

Example 6 with WorkManager

use of androidx.work.WorkManager in project android-job by evernote.

the class JobProxyWorkManager method plantOneOff.

@Override
public void plantOneOff(JobRequest request) {
    if (request.isTransient()) {
        TransientBundleHolder.putBundle(request.getJobId(), request.getTransientExtras());
    }
    OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(PlatformWorker.class).setInitialDelay(request.getStartMs(), // don't use the average here, WorkManager will do the right thing
    TimeUnit.MILLISECONDS).setConstraints(buildConstraints(request)).addTag(createTag(request.getJobId())).build();
    // don't set the back-off criteria, android-job is handling this
    WorkManager workManager = getWorkManager();
    if (workManager == null) {
        throw new JobProxyIllegalStateException("WorkManager is null");
    }
    workManager.enqueue(workRequest);
}
Also used : WorkManager(androidx.work.WorkManager) JobProxyIllegalStateException(com.evernote.android.job.JobProxyIllegalStateException) OneTimeWorkRequest(androidx.work.OneTimeWorkRequest)

Example 7 with WorkManager

use of androidx.work.WorkManager 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 8 with WorkManager

use of androidx.work.WorkManager in project fdroidclient by f-droid.

the class CleanCacheWorker method schedule.

/**
 * Schedule or cancel a work request to clean up caches, according to the
 * current preferences. Should be called a) at boot, b) if the preference
 * is changed, or c) on startup, in case we get upgraded.
 */
public static void schedule(@NonNull final Context context) {
    final WorkManager workManager = WorkManager.getInstance(context);
    final long keepTime = Preferences.get().getKeepCacheTime();
    long interval = TimeUnit.DAYS.toMillis(1);
    if (keepTime < interval) {
        interval = keepTime;
    }
    final Constraints.Builder constraintsBuilder = new Constraints.Builder().setRequiresCharging(true).setRequiresBatteryNotLow(true);
    if (Build.VERSION.SDK_INT >= 23) {
        constraintsBuilder.setRequiresDeviceIdle(true);
    }
    final PeriodicWorkRequest cleanCache = new PeriodicWorkRequest.Builder(CleanCacheWorker.class, interval, TimeUnit.MILLISECONDS).setConstraints(constraintsBuilder.build()).build();
    workManager.enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, cleanCache);
    Utils.debugLog(TAG, "Scheduled periodic work for cleaning the cache.");
}
Also used : Constraints(androidx.work.Constraints) WorkManager(androidx.work.WorkManager) PeriodicWorkRequest(androidx.work.PeriodicWorkRequest)

Example 9 with WorkManager

use of androidx.work.WorkManager in project fdroidclient by f-droid.

the class CleanCacheWorker method force.

/**
 * Force a cache cleanup.  Since {@link #deleteOldInstallerFiles(Context)}
 * only deletes files older than an hour, any ongoing APK install processes
 * should not have their APKs are deleted out from under them.
 */
public static void force(@NonNull final Context context) {
    OneTimeWorkRequest cleanCache = new OneTimeWorkRequest.Builder(CleanCacheWorker.class).build();
    WorkManager workManager = WorkManager.getInstance(context);
    workManager.enqueueUniqueWork(TAG + ".force", ExistingWorkPolicy.KEEP, cleanCache);
    Utils.debugLog(TAG, "Enqueued forced run for cleaning the cache.");
}
Also used : WorkManager(androidx.work.WorkManager) OneTimeWorkRequest(androidx.work.OneTimeWorkRequest)

Aggregations

WorkManager (androidx.work.WorkManager)9 PeriodicWorkRequest (androidx.work.PeriodicWorkRequest)4 Constraints (androidx.work.Constraints)2 OneTimeWorkRequest (androidx.work.OneTimeWorkRequest)2 JobProxyIllegalStateException (com.evernote.android.job.JobProxyIllegalStateException)2 Account (android.accounts.Account)1 Context (android.content.Context)1 DataSetObserver (android.database.DataSetObserver)1 Bitmap (android.graphics.Bitmap)1 Uri (android.net.Uri)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 ProgressBar (android.widget.ProgressBar)1