Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 261ea349 authored by Abhishek Aggarwal's avatar Abhishek Aggarwal
Browse files

eDrive: Adapt activity for workmanager

 * also fix widget and workmanager
parent 0bf56578
Loading
Loading
Loading
Loading
Loading
+54 −123
Original line number Diff line number Diff line
@@ -8,6 +8,12 @@

package foundation.e.drive.activity;

import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_ALIAS_KEY;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_EMAIL;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_GROUPS;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_NAME;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_TOTAL_QUOTA_KEY;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_USED_QUOTA_KEY;
import static foundation.e.drive.widgets.EDriveWidget.buildIntent;
import static foundation.e.drive.widgets.EDriveWidget.convertIntoMB;
import static foundation.e.drive.widgets.EDriveWidget.dataForWeb;
@@ -18,41 +24,26 @@ import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.UserInfo;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation;

import java.util.ArrayList;

import foundation.e.drive.R;
import foundation.e.drive.databinding.ActivityAccountsBinding;
import foundation.e.drive.operations.GetAliasOperation;
import foundation.e.drive.utils.CommonUtils;
import foundation.e.drive.widgets.EDriveNetworkCallback;
import foundation.e.drive.widgets.EDriveWidget;

public class AccountsActivity extends AppCompatActivity {

    private static final String NON_OFFICIAL_AVATAR_PATH = "/index.php/avatar/";
    public static final String NON_OFFICIAL_AVATAR_PATH = "/index.php/avatar/";
    private static final String ACCOUNT_SETTINGS =
            EDriveWidget.ACCOUNT_MANAGER_PACKAGE_NAME + ".ui.AccountsActivity";

    private final GetRemoteUserInfoOperation getRemoteUserInfoOperation = new GetRemoteUserInfoOperation();
    private final GetAliasOperation getAliasOperation = new GetAliasOperation();
    private UserInfo userInfo = null;
    private ArrayList<Object> aliases;
    private OwnCloudClient client;
    private Account account;

    private ActivityAccountsBinding binding;

    @Override
@@ -63,130 +54,77 @@ public class AccountsActivity extends AppCompatActivity {
        setContentView(binding.getRoot());
        setSupportActionBar(binding.toolbar);

        binding.toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        binding.toolbar.setNavigationOnClickListener(v -> onBackPressed());

        binding.settings.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        binding.settings.setOnClickListener(v -> {
            final Intent settingsIntent = buildIntent(Intent.ACTION_VIEW, "")
                    .setComponent(new ComponentName(
                            EDriveWidget.ACCOUNT_MANAGER_PACKAGE_NAME, ACCOUNT_SETTINGS));
            startActivity(settingsIntent);
            }
        });
        showDetails();
    }

    private void showDetails() {
        final AccountManager accountManager = AccountManager.get(this);
        account = CommonUtils.getAccount(getString(R.string.eelo_account_type),
        final Account account = CommonUtils.getAccount(getString(R.string.eelo_account_type),
                accountManager);
        client = CommonUtils.getOwnCloudClient(account, this);

        final HandlerThread handlerThread = new HandlerThread("Network Request");
        handlerThread.start();
        final Handler mHandler = new Handler(handlerThread.getLooper());

        final EDriveNetworkCallback callback = new EDriveNetworkCallback() {
            @Override
            public void onComplete() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        onNetworkRequestCompleted();
                    }
                });
            }
        };

        if (!CommonUtils.haveNetworkConnection(this, true)) {
            handleNoInternetConnection();
            return;
        }

        binding.loading.setVisibility(View.VISIBLE);
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if (client != null) {
                    RemoteOperationResult ocsResult = getRemoteUserInfoOperation.execute(client);
                    if (ocsResult.isSuccess() && ocsResult.getData() != null) {
                        userInfo = (UserInfo) ocsResult.getData().get(0);
                    }
                    RemoteOperationResult aliasResult = getAliasOperation.execute(client);
                    if (aliasResult.isSuccess() && aliasResult.getData() != null) {
                        aliases = aliasResult.getData();
                    }
                }
                callback.onComplete();
            }
        });
    }
        final OwnCloudClient client = CommonUtils.getOwnCloudClient(account, this);

    private void onNetworkRequestCompleted() {
        binding.loading.setVisibility(View.GONE);
        if (userInfo.displayName == null) {
            binding.name.setText(userInfo.alternateDisplayName);
        } else {
            binding.name.setText(userInfo.displayName);
        }
        binding.email.setText(userInfo.id);
        final String usedMB = accountManager.getUserData(account, ACCOUNT_DATA_USED_QUOTA_KEY);
        final String totalMB = accountManager.getUserData(account, ACCOUNT_DATA_TOTAL_QUOTA_KEY);
        final String email = accountManager.getUserData(account, ACCOUNT_DATA_EMAIL);

        final int usedMB = convertIntoMB(String.valueOf(userInfo.quota.used));
        final int totalMB = convertIntoMB(String.valueOf(userInfo.quota.total));
        binding.name.setText(accountManager.getUserData(account, ACCOUNT_DATA_NAME));
        binding.email.setText(email);

        binding.progress.setMax(totalMB);
        binding.progress.setProgress(usedMB);
        binding.progress.setMax(convertIntoMB(totalMB));
        binding.progress.setProgress(convertIntoMB(usedMB));
        binding.progress.setVisibility(View.VISIBLE);

        binding.plan.setText(getString(R.string.free_plan,
                CommonUtils.humanReadableByteCountBin(userInfo.quota.total)));
        for (String group : userInfo.groups) {
                CommonUtils.humanReadableByteCountBin(Long.parseLong(totalMB))));

        String[] groups = accountManager.getUserData(account, ACCOUNT_DATA_GROUPS).split(",");
        for (String group : groups) {
            if (group.contains("premium-")) {
                binding.plan.setText(getString(R.string.premium_plan, group.split("-")[1]));
                binding.plan.setText(getString(R.string.premium_plan,
                        group.split("-")[1]));

                break;
            }
        }

        binding.myPlan.setVisibility(View.VISIBLE);
        binding.plan.setVisibility(View.VISIBLE);

        binding.status.setText(getString(R.string.progress_status,
                CommonUtils.humanReadableByteCountBin(userInfo.quota.used),
                CommonUtils.humanReadableByteCountBin(userInfo.quota.total)));
                CommonUtils.humanReadableByteCountBin(Long.parseLong(usedMB)),
                CommonUtils.humanReadableByteCountBin(Long.parseLong(totalMB))));

        String aliases = accountManager.getUserData(account, ACCOUNT_DATA_ALIAS_KEY);
        if (aliases != null && !aliases.isEmpty()) {
            binding.alias.setVisibility(View.VISIBLE);
            binding.alias1.setText(aliases.get(0).toString());
            binding.alias1.setText(aliases.split(",")[0]);
            binding.aliasDivider.setVisibility(View.VISIBLE);
        } else {
            binding.alias.setVisibility(View.GONE);
            binding.alias1Container.setVisibility(View.GONE);
        }

        binding.alias1Clipboard.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        binding.alias1Clipboard.setOnClickListener(v ->
                CommonUtils.copyToClipboard(Uri.parse(binding.alias1.getText().toString()),
                        v.getContext(), v.getContext().getString(R.string.alias));
            }
        });
                        v.getContext(), v.getContext().getString(R.string.alias)));

        binding.upgrade.setVisibility(View.VISIBLE);
        binding.upgrade.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        binding.upgrade.setOnClickListener(v -> {
            final Intent upgradeIntent = buildIntent(Intent.ACTION_VIEW,
                        String.format(EDriveWidget.WEBPAGE, userInfo.id,
                                dataForWeb(userInfo.quota.total)));
                    String.format(EDriveWidget.WEBPAGE, email,
                            dataForWeb(Long.parseLong(totalMB))));
            startActivity(upgradeIntent);
            }
        });

        binding.alias.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        binding.alias.setOnClickListener(v -> {
            if (binding.alias1Container.getVisibility() == View.VISIBLE) {
                binding.alias1Container.setVisibility(View.GONE);
                binding.alias.setCompoundDrawablesWithIntrinsicBounds(null, null,
@@ -196,7 +134,6 @@ public class AccountsActivity extends AppCompatActivity {
                binding.alias.setCompoundDrawablesWithIntrinsicBounds(null, null,
                        ContextCompat.getDrawable(v.getContext(), R.drawable.ic_expand_less), null);
            }
            }
        });

        Glide.with(this)
@@ -206,10 +143,4 @@ public class AccountsActivity extends AppCompatActivity {
                .into(binding.avatar);
        binding.avatar.setVisibility(View.VISIBLE);
    }

    private void handleNoInternetConnection() {
        binding.name.setText(account.name);
        binding.email.setText(account.type);
        binding.avatar.setVisibility(View.VISIBLE);
    }
}
+30 −23
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import androidx.work.BackoffPolicy;
import androidx.work.Constraints;
import androidx.work.Data;
import androidx.work.ExistingPeriodicWorkPolicy;
import androidx.work.ExistingWorkPolicy;
import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
@@ -170,6 +171,7 @@ public abstract class CommonUtils {

    /**
     * Read accountManager settings
     *
     * @param account
     * @return true if usage of metered connection is allowed
     */
@@ -246,7 +248,6 @@ public abstract class CommonUtils {
    }



    /**
     * Get mimetype of file from the file itself
     *
@@ -344,8 +345,10 @@ public abstract class CommonUtils {
        value *= Long.signum(bytes);
        return String.format(Locale.ENGLISH, "%.1f %cB", value / 1024.0, ci.current());
    }

    /**
     * Enqueue a unique periodic worker to look for file to be synchronized (remote files + local files
     *
     * @param workManager the instance of workManager
     */
    public static void registerPeriodicFullScanWorker(WorkManager workManager) {
@@ -370,7 +373,7 @@ public abstract class CommonUtils {
     * This method create a chain of WorkRequests to perform Initialization tasks:
     * Firstly, it creates WorkRequest to create remote root folders on ecloud
     * Then, once all folders are present on cloud, run the FirstStartWorker.
     *
     * <p>
     * in details:
     * - Create 9 remote folders on ecloud
     * - Run a first fullscan (ObserverService)
@@ -460,17 +463,21 @@ public abstract class CommonUtils {

    /**
     * Job for Widget & notification about quota
     *
     * @param workManager
     */
    public static void registerPeriodicUserInfoChecking(WorkManager workManager) {
        final Constraints constraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build();

        final PeriodicWorkRequest periodicUserInfoScanRequest =
                new PeriodicWorkRequest.Builder(AccountUserInfoWorker.class,
                        31, TimeUnit.MINUTES,
                        5, TimeUnit.MINUTES)
                        30, TimeUnit.MINUTES)
                        .addTag(AppConstants.WORK_GENERIC_TAG)
                        .setConstraints(constraints)
                        .build();

        workManager.enqueueUniquePeriodicWork(AccountUserInfoWorker.UNIQUE_WORK_NAME, ExistingPeriodicWorkPolicy.REPLACE, periodicUserInfoScanRequest);
    }

}
+0 −16
Original line number Diff line number Diff line
/*
 * Copyright © ECORP SAS 2022.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 */

package foundation.e.drive.widgets;

/**
 * @author TheScarastic
 */
public interface EDriveNetworkCallback {
    void onComplete();
}
+12 −43
Original line number Diff line number Diff line
@@ -23,10 +23,9 @@ import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.Uri;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.RemoteViews;

@@ -42,14 +41,14 @@ import foundation.e.drive.utils.CommonUtils;
 * Implementation of App Widget functionality.
 */
public class EDriveWidget extends AppWidgetProvider {
    public static final String INTENT_EXTRA_ACCOUNT_KEY = "account";
    public static final String WEBPAGE =
            "https://esolutions.shop/ecloud-subscriptions/?username=%s&token=placeholder&current-quota=%s&from=wp";
    public static final String ACCOUNT_MANAGER_PACKAGE_NAME = "foundation.e.accountmanager";
    private static final String TAG = EDriveWidget.class.getSimpleName();
    private static final String ADD_ACCOUNT_WEBPAGE = "https://e.foundation/e-email-invite/";

    public static final String ACCOUNT_MANAGER_PACKAGE_NAME = "foundation.e.accountmanager";
    private static final String GET_ACCOUNT_MANAGER_COMPONENT_NAME = ACCOUNT_MANAGER_PACKAGE_NAME +
            ".ui.setup.LoginActivity";

    private static final String SETUP_ACCOUNT_PROVIDER_TYPE = "setup_account_provider_type";
    private static final String ACCOUNT_PROVIDER_EELO = "eelo";

@@ -57,14 +56,13 @@ public class EDriveWidget extends AppWidgetProvider {
    private static final String HIDE_ALIAS = "hide_alias";
    private static final String COPY_ALIAS = "copy_alias";
    private static boolean showAlias = false;
    private static boolean isNetworkAvailable = false;

    private final Calendar calender = Calendar.getInstance();
    private final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());

    private RemoteViews views;
    private Account account = null;


    public static String dataForWeb(Long bytes) {
        final String space = CommonUtils.humanReadableByteCountBin(bytes);
        final String[] split = space.split(" ");
@@ -105,12 +103,12 @@ public class EDriveWidget extends AppWidgetProvider {
                    accountManager);
        }

        if (account == null && isNetworkAvailable) {
        if (account == null && CommonUtils.haveNetworkConnection(context, true)) {
            noAccountView(context);
            appWidgetManager.updateAppWidget(appWidgetId, views);
        } else {
            onAccountAvailable(context, accountManager);
        }
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
@@ -125,13 +123,6 @@ public class EDriveWidget extends AppWidgetProvider {
        if (action == null) return;
        switch (action) {
            case AppWidgetManager.ACTION_APPWIDGET_UPDATE:
                if (intent.getExtras() != null) {
                    account = (Account) intent.getExtras().get(INTENT_EXTRA_ACCOUNT_KEY);
                    updateAppWidget(context);
                }
                break;
            case Intent.ACTION_BOOT_COMPLETED:
                registerConnectivityCallback(context);
            case AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION:
                updateAppWidget(context);
                break;
@@ -168,7 +159,11 @@ public class EDriveWidget extends AppWidgetProvider {
    }

    private void onAccountAvailable(Context context, AccountManager accountManager) {
        if (!isNetworkAvailable) {
        final String usedMB = accountManager.getUserData(account, ACCOUNT_DATA_USED_QUOTA_KEY);
        final String totalMB = accountManager.getUserData(account, ACCOUNT_DATA_TOTAL_QUOTA_KEY);
        final String email = accountManager.getUserData(account, ACCOUNT_DATA_EMAIL);

        if (email == null || email.isEmpty()) {
            views = new RemoteViews(context.getPackageName(), R.layout.e_drive_widget_login);
            views.setViewVisibility(R.id.button_container, View.GONE);
            views.setTextViewText(R.id.summary, context.getString(R.string.no_internet_widget));
@@ -177,10 +172,6 @@ public class EDriveWidget extends AppWidgetProvider {

        views = new RemoteViews(context.getPackageName(), R.layout.e_drive_widget);

        final String usedMB = accountManager.getUserData(account, ACCOUNT_DATA_USED_QUOTA_KEY);
        final String totalMB = accountManager.getUserData(account, ACCOUNT_DATA_TOTAL_QUOTA_KEY);
        final String email = accountManager.getUserData(account, ACCOUNT_DATA_EMAIL);

        views.setTextViewText(R.id.email, email);
        views.setTextViewText(R.id.name, accountManager.getUserData(account, ACCOUNT_DATA_NAME));

@@ -248,26 +239,4 @@ public class EDriveWidget extends AppWidgetProvider {
        }
        return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
    }

    private void registerConnectivityCallback(final Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
                Context.CONNECTIVITY_SERVICE);
        cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                if (!isNetworkAvailable) {
                    isNetworkAvailable = true;
                    updateAppWidget(context);
                }
            }

            @Override
            public void onLost(Network network) {
                if (isNetworkAvailable) {
                    isNetworkAvailable = false;
                    updateAppWidget(context);
                }
            }
        });
    }
}
 No newline at end of file
+23 −16
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@ import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_NAME;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_RELATIVE_QUOTA_KEY;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_TOTAL_QUOTA_KEY;
import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_USED_QUOTA_KEY;
import static foundation.e.drive.widgets.EDriveWidget.INTENT_EXTRA_ACCOUNT_KEY;

import android.accounts.Account;
import android.accounts.AccountManager;
@@ -28,6 +27,8 @@ import androidx.core.app.NotificationCompat;
import androidx.work.Worker;
import androidx.work.WorkerParameters;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.UserInfo;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -36,6 +37,7 @@ import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation;
import java.util.ArrayList;

import foundation.e.drive.R;
import foundation.e.drive.activity.AccountsActivity;
import foundation.e.drive.operations.GetAliasOperation;
import foundation.e.drive.utils.AppConstants;
import foundation.e.drive.utils.CommonUtils;
@@ -50,43 +52,46 @@ public class AccountUserInfoWorker extends Worker {
    final AccountManager accountManager;
    final GetRemoteUserInfoOperation getRemoteUserInfoOperation = new GetRemoteUserInfoOperation();
    final GetAliasOperation getAliasOperation = new GetAliasOperation();
    private final Account account;
    private final Context mContext;

    private Account account;

    public AccountUserInfoWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        mContext = context;
        accountManager = AccountManager.get(context);
        account = CommonUtils.getAccount(context.getString(R.string.eelo_account_type),
                accountManager);
    }

    @NonNull
    @Override
    public Result doWork() {
        if (account != null && CommonUtils.haveNetworkConnection(mContext, true)) {
            final OwnCloudClient client = CommonUtils.getOwnCloudClient(account, mContext);

            if (client != null) {
                fetchUserInfo(client);
                fetchAliases(client);
        account = CommonUtils.getAccount(mContext.getString(R.string.eelo_account_type),
                accountManager);
        OwnCloudClient client = CommonUtils.getOwnCloudClient(account, mContext);

        if (account != null && client != null) {
            if (fetchUserInfo(client) && fetchAliases(client)) {
                Glide.with(mContext)
                        .load(client.getBaseUri() + AccountsActivity.NON_OFFICIAL_AVATAR_PATH
                                + client.getCredentials().getUsername() + "/" + 300)
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .preload();
                updateWidget(mContext);
                return Result.success();
            } else {
                return Result.retry();
            }
        }
        updateWidget(mContext);
        return Result.failure();
    }

    private void fetchUserInfo(final OwnCloudClient client) {
    private boolean fetchUserInfo(final OwnCloudClient client) {
        final RemoteOperationResult ocsResult = getRemoteUserInfoOperation.execute(client);

        if (ocsResult.isSuccess() && ocsResult.getData() != null && !ocsResult.getData().isEmpty()) {
            final UserInfo userInfo = (UserInfo) ocsResult.getData().get(0);

            final String name;
            if (userInfo.displayName.isEmpty()) {
            if (userInfo.displayName == null || userInfo.displayName.isEmpty()) {
                name = userInfo.alternateDisplayName;
            } else {
                name = userInfo.displayName;
@@ -105,7 +110,9 @@ public class AccountUserInfoWorker extends Worker {
            accountManager.setUserData(account, ACCOUNT_DATA_USED_QUOTA_KEY, "" + usedQuota);

            addNotifAboutQuota(relativeQuota);
            return true;
        }
        return false;
    }

    private void addNotifAboutQuota(final double relativeQuota) {
@@ -138,7 +145,7 @@ public class AccountUserInfoWorker extends Worker {
        manager.notify(0, builder.build());
    }

    private void fetchAliases(final OwnCloudClient client) {
    private boolean fetchAliases(final OwnCloudClient client) {
        final RemoteOperationResult ocsResult = getAliasOperation.execute(client);
        String aliases = "";
        if (ocsResult.isSuccess() && ocsResult.getData() != null && !ocsResult.getData().isEmpty()) {
@@ -149,12 +156,12 @@ public class AccountUserInfoWorker extends Worker {
            aliases = String.join(",", alias);
        }
        accountManager.setUserData(account, ACCOUNT_DATA_ALIAS_KEY, aliases);
        return true;
    }

    private void updateWidget(final Context context) {
        final Intent updateIntent = new Intent(context, EDriveWidget.class);
        updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        updateIntent.putExtra(INTENT_EXTRA_ACCOUNT_KEY, account);
        context.sendBroadcast(updateIntent);
    }
}