Loading app/src/main/java/foundation/e/drive/activity/AccountsActivity.java +54 −123 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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, Loading @@ -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) Loading @@ -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); } } app/src/main/java/foundation/e/drive/utils/CommonUtils.java +30 −23 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -170,6 +171,7 @@ public abstract class CommonUtils { /** * Read accountManager settings * * @param account * @return true if usage of metered connection is allowed */ Loading Loading @@ -246,7 +248,6 @@ public abstract class CommonUtils { } /** * Get mimetype of file from the file itself * Loading Loading @@ -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) { Loading @@ -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) Loading Loading @@ -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); } } app/src/main/java/foundation/e/drive/widgets/EDriveNetworkCallback.javadeleted 100644 → 0 +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(); } app/src/main/java/foundation/e/drive/widgets/EDriveWidget.java +12 −43 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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¤t-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"; Loading @@ -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(" "); Loading Loading @@ -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 Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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)); Loading Loading @@ -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 app/src/main/java/foundation/e/drive/work/AccountUserInfoWorker.java +23 −16 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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) { Loading Loading @@ -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()) { Loading @@ -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); } } Loading
app/src/main/java/foundation/e/drive/activity/AccountsActivity.java +54 −123 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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, Loading @@ -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) Loading @@ -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); } }
app/src/main/java/foundation/e/drive/utils/CommonUtils.java +30 −23 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -170,6 +171,7 @@ public abstract class CommonUtils { /** * Read accountManager settings * * @param account * @return true if usage of metered connection is allowed */ Loading Loading @@ -246,7 +248,6 @@ public abstract class CommonUtils { } /** * Get mimetype of file from the file itself * Loading Loading @@ -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) { Loading @@ -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) Loading Loading @@ -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); } }
app/src/main/java/foundation/e/drive/widgets/EDriveNetworkCallback.javadeleted 100644 → 0 +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(); }
app/src/main/java/foundation/e/drive/widgets/EDriveWidget.java +12 −43 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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¤t-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"; Loading @@ -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(" "); Loading Loading @@ -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 Loading @@ -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; Loading Loading @@ -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)); Loading @@ -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)); Loading Loading @@ -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
app/src/main/java/foundation/e/drive/work/AccountUserInfoWorker.java +23 −16 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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) { Loading Loading @@ -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()) { Loading @@ -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); } }