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

Commit 291ceffa authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

fix: workers not initialize on boot complete

On os update, workers are not initialize by itself. We have to init the
workers on successful boot.

issue: e/backlog#7578, e/backlog#7740
parents 4592bab3 f8151116
Loading
Loading
Loading
Loading
Loading
+4 −47
Original line number Diff line number Diff line
@@ -12,15 +12,11 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager
import foundation.e.drive.R
import foundation.e.drive.models.SyncedFolder
import foundation.e.drive.utils.AccountUtils
import foundation.e.drive.utils.AppConstants
import foundation.e.drive.utils.CommonUtils
import foundation.e.drive.utils.DavClientProvider
import foundation.e.drive.utils.RootSyncedFolderProvider
import foundation.e.drive.work.WorkRequestFactory.*
import foundation.e.drive.utils.WorkerUtils
import timber.log.Timber

/**
@@ -48,11 +44,7 @@ class AccountAddedReceiver() : BroadcastReceiver() {
            .putString(AccountManager.KEY_ACCOUNT_NAME, accountName)
            .apply()

        if (registerSetupWorkers(context)) {
            DavClientProvider.getInstance().cleanUp()

            CommonUtils.registerPeriodicUserInfoChecking(WorkManager.getInstance(context))
        }
        WorkerUtils.registerSetupWorkers(context)
}

    /**
@@ -68,7 +60,7 @@ class AccountAddedReceiver() : BroadcastReceiver() {
        prefs: SharedPreferences,
        context: Context
    ): Boolean {
        if (isSetupAlreadyDone(prefs)) {
        if (AccountUtils.isSetupAlreadyDone(prefs)) {
            return false
        }

@@ -92,44 +84,9 @@ class AccountAddedReceiver() : BroadcastReceiver() {
        return accountType != validAccountType
    }

    private fun isSetupAlreadyDone(prefs: SharedPreferences): Boolean {
        return prefs.getBoolean(AppConstants.SETUP_COMPLETED, false)
    }

    private fun isExistingAccount(accountName: String, accountType: String, context: Context): Boolean {
        val account = CommonUtils.getAccount(accountName, accountType, AccountManager.get(context))
        return account != null
    }

    private fun registerSetupWorkers(context: Context): Boolean {
        val rootFolderSetupWorkers = generateRootFolderSetupWorkers(context) ?: return false
        val getUserInfoRequest = getOneTimeWorkRequest(WorkType.ONE_TIME_USER_INFO, null)
        val finishSetupRequest = getOneTimeWorkRequest(WorkType.ONE_TIME_FINISH_SETUP, null)
        val workManager = WorkManager.getInstance(context)

        workManager.beginWith(getUserInfoRequest)
            .then(rootFolderSetupWorkers)
            .then(finishSetupRequest)
            .enqueue()
        return true
    }

    private fun generateRootFolderSetupWorkers(context: Context): MutableList<OneTimeWorkRequest>? {
        val rootSyncedFolderList: List<SyncedFolder> =
            RootSyncedFolderProvider.getSyncedFolderRoots(context)

        if (rootSyncedFolderList.isNullOrEmpty()) {
            return null
        }

        val workRequests: MutableList<OneTimeWorkRequest> = ArrayList()
        for (folder in rootSyncedFolderList) {
            val rootFolderSetupWorkRequest = getOneTimeWorkRequest(
                WorkType.ONE_TIME_ROOT_FOLDER_SETUP,
                folder
            )
            workRequests.add(rootFolderSetupWorkRequest)
        }
        return workRequests
    }
}
 No newline at end of file
+3 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import androidx.work.WorkerParameters;
import foundation.e.drive.periodicScan.FullScanWorker;
import foundation.e.drive.periodicScan.PeriodicScanWorker;
import foundation.e.drive.utils.AppConstants;
import foundation.e.drive.utils.CommonUtils;
import foundation.e.drive.work.WorkRequestFactory;
import timber.log.Timber;

@@ -71,6 +72,8 @@ public class FinishSetupWorker extends Worker {
        enqueueAppListGenerationWorker(workManager);
        enqueueFullScanWorker(workManager);
        enqueuePeriodicFileScanWorker(workManager);

        CommonUtils.registerPeriodicUserInfoChecking(workManager);
    }

    private void enqueueFullScanWorker(@NonNull final WorkManager workManager) {
+13 −3
Original line number Diff line number Diff line
@@ -20,8 +20,10 @@ import androidx.annotation.NonNull;
import foundation.e.drive.BuildConfig;
import foundation.e.drive.database.DbHelper;
import foundation.e.drive.synchronization.SyncProxy;
import foundation.e.drive.utils.AccountUtils;
import foundation.e.drive.utils.AppConstants;
import foundation.e.drive.utils.CommonUtils;
import foundation.e.drive.utils.WorkerUtils;
import timber.log.Timber;

/**
@@ -31,10 +33,11 @@ import timber.log.Timber;
public class BootCompletedReceiver extends BroadcastReceiver {
    private static final String DATE_SYSTEM_PROPERTY = "ro.build.date";
    private static final String PREF_VERSION_CODE = "VERSION_CODE";

    @Override
    public void onReceive(@NonNull Context context, @NonNull Intent intent) {
        final String action = intent.getAction();
        Timber.tag(BootCompletedReceiver.class.getSimpleName()).v("onReceive(...)");
        Timber.v("onReceive(...)");
        final SharedPreferences pref = context.getSharedPreferences(AppConstants.SHARED_PREFERENCE_NAME, Context.MODE_PRIVATE);

        if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
@@ -44,8 +47,10 @@ public class BootCompletedReceiver extends BroadcastReceiver {
                handleOsUpdate(context);
            }

            if (pref.getBoolean(AppConstants.SETUP_COMPLETED, false)
                    && BuildConfig.VERSION_CODE > pref.getInt(PREF_VERSION_CODE, 1002000)) {
            final boolean isSetupDone = AccountUtils.isSetupAlreadyDone(pref);
            final boolean isAccountPresent = AccountUtils.isAccountPresent(context);

            if (isSetupDone && BuildConfig.VERSION_CODE > pref.getInt(PREF_VERSION_CODE, 1002000)) {
                pref.edit().putInt(PREF_VERSION_CODE, BuildConfig.VERSION_CODE).apply();
                try {
                    DbHelper.cleanSyncedFileStateTableAfterUpdate(context);
@@ -54,6 +59,10 @@ public class BootCompletedReceiver extends BroadcastReceiver {
                }
            }

            if (isAccountPresent) {
                WorkerUtils.INSTANCE.registerSetupWorkers(context.getApplicationContext());
            }

            SyncProxy.INSTANCE.startListeningFiles((Application) context.getApplicationContext());
        }
    }
@@ -66,6 +75,7 @@ public class BootCompletedReceiver extends BroadcastReceiver {
    /**
     * Force reinitialization, upgrade of DB in case of OS update
     * todo remove when setPersistentFlag=true will be removed
     *
     * @param context Context used to start InitializationService
     */
    private void handleOsUpdate(@NonNull Context context) {
+14 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static foundation.e.drive.utils.AppConstants.ACCOUNT_DATA_GROUPS;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.SharedPreferences;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -27,6 +29,8 @@ import androidx.annotation.Nullable;
import java.util.Arrays;
import java.util.Optional;

import foundation.e.drive.R;

public class AccountUtils {


@@ -48,4 +52,14 @@ public class AccountUtils {
                .filter(group -> group.contains("premium-"))
                .findFirst();
    }

    public static boolean isSetupAlreadyDone(@NonNull SharedPreferences preferences) {
        return preferences.getBoolean(AppConstants.SETUP_COMPLETED, false);
    }

    public static boolean isAccountPresent(@NonNull Context context) {
        AccountManager accountManager = AccountManager.get(context.getApplicationContext());
        Account[] accountList = accountManager.getAccountsByType(context.getString(R.string.eelo_account_type));
        return accountList != null && accountList.length > 0;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ object RootSyncedFolderProvider {
    private val REMOTE_ROM_SETTINGS_PATH = PATH_SEPARATOR + "Devices" + PATH_SEPARATOR + BRAND + "_" + MODEL + "_" + Build.getSerial() + "/rom_settings/"
    private val REMOTE_APP_LIST_PATH = REMOTE_ROM_SETTINGS_PATH + "app_list/"

    fun getSyncedFolderRoots(context : Context): ArrayList<SyncedFolder> {
    fun getSyncedFolderRoots(context : Context): List<SyncedFolder> {
        val syncedFolders = ArrayList<SyncedFolder>()
        val categories = getSyncableCategories()

Loading