diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c34fc3e65..b57670201 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -129,6 +129,15 @@ + + + + + + diff --git a/app/src/main/java/com/aurora/store/Constants.java b/app/src/main/java/com/aurora/store/Constants.java index cb24e8941..74826e85a 100644 --- a/app/src/main/java/com/aurora/store/Constants.java +++ b/app/src/main/java/com/aurora/store/Constants.java @@ -84,4 +84,5 @@ public class Constants { public static final String PREFERENCE_LOCALE_LANG = "PREFERENCE_LOCALE_LANG"; public static final String PREFERENCE_LOCALE_LIST = "PREFERENCE_LOCALE_LIST"; public static final String PREFERENCE_LOCALE_COUNTRY = "PREFERENCE_LOCALE_COUNTRY"; + public static final String PREFERENCE_UPDATES_INTERVAL = "PREFERENCE_UPDATES_INTERVAL"; } diff --git a/app/src/main/java/com/aurora/store/activity/AuroraActivity.java b/app/src/main/java/com/aurora/store/activity/AuroraActivity.java index eebf98482..a65cf7476 100644 --- a/app/src/main/java/com/aurora/store/activity/AuroraActivity.java +++ b/app/src/main/java/com/aurora/store/activity/AuroraActivity.java @@ -112,7 +112,7 @@ public class AuroraActivity extends AppCompatActivity { super.onNewIntent(intent); Bundle mBundle = intent.getExtras(); if (mBundle != null) - fragmentPos = mBundle.getInt(Constants.INTENT_FRAGMENT_POSITION); + fragmentCur = mBundle.getInt(Constants.INTENT_FRAGMENT_POSITION); if (intent.getScheme() != null && intent.getScheme().equals("market")) { fragmentCur = 3; isSearchIntent = true; diff --git a/app/src/main/java/com/aurora/store/fragment/preference/UpdatesPrefFragment.java b/app/src/main/java/com/aurora/store/fragment/preference/UpdatesPrefFragment.java new file mode 100644 index 000000000..42f7f4541 --- /dev/null +++ b/app/src/main/java/com/aurora/store/fragment/preference/UpdatesPrefFragment.java @@ -0,0 +1,48 @@ +package com.aurora.store.fragment.preference; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.ListPreference; +import androidx.preference.PreferenceFragmentCompat; + +import com.aurora.store.Constants; +import com.aurora.store.R; +import com.aurora.store.receiver.UpdatesReceiver; +import com.aurora.store.utility.PrefUtil; +import com.aurora.store.utility.Util; + +public class UpdatesPrefFragment extends PreferenceFragmentCompat { + + private Context context; + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + this.context = context; + } + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + getPreferenceManager().setSharedPreferencesName(Constants.SHARED_PREFERENCES_KEY); + setPreferencesFromResource(R.xml.preferences_updates, rootKey); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + ListPreference updatesIntervalList = findPreference(Constants.PREFERENCE_UPDATES_INTERVAL); + assert updatesIntervalList != null; + updatesIntervalList.setOnPreferenceChangeListener((preference, newValue) -> { + String value = newValue.toString(); + PrefUtil.putString(context, Constants.PREFERENCE_UPDATES_INTERVAL, value); + UpdatesReceiver.enable(context, Util.parseInt(value, 0)); + return true; + }); + } + +} diff --git a/app/src/main/java/com/aurora/store/receiver/BootReceiver.java b/app/src/main/java/com/aurora/store/receiver/BootReceiver.java new file mode 100644 index 000000000..445af06c2 --- /dev/null +++ b/app/src/main/java/com/aurora/store/receiver/BootReceiver.java @@ -0,0 +1,47 @@ +/* + * Aurora Store + * Copyright (C) 2019, Rahul Kumar Patel + * + * Yalp Store + * Copyright (C) 2018 Sergey Yeriomin + * + * Aurora Store is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Aurora Store is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aurora Store. If not, see . + * + * + */ + +package com.aurora.store.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.aurora.store.Constants; +import com.aurora.store.utility.Util; + +public class BootReceiver extends BroadcastReceiver { + + static private int getUpdateInterval(Context context) { + return Util.parseInt(Util.getPrefs(context) + .getString(Constants.PREFERENCE_UPDATES_INTERVAL, "-1"), -1); + } + + @Override + public void onReceive(Context context, Intent intent) { + if (!Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { + return; + } + UpdatesReceiver.enable(context.getApplicationContext(), getUpdateInterval(context)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/receiver/UpdatesReceiver.java b/app/src/main/java/com/aurora/store/receiver/UpdatesReceiver.java new file mode 100644 index 000000000..c094c4ce1 --- /dev/null +++ b/app/src/main/java/com/aurora/store/receiver/UpdatesReceiver.java @@ -0,0 +1,68 @@ +package com.aurora.store.receiver; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.aurora.store.Constants; +import com.aurora.store.R; +import com.aurora.store.activity.AuroraActivity; +import com.aurora.store.notification.QuickNotification; +import com.aurora.store.task.UpdatableApps; +import com.aurora.store.utility.Log; + +import org.apache.commons.lang3.StringUtils; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; + +public class UpdatesReceiver extends BroadcastReceiver { + static public void enable(Context context, int interval) { + Intent intent = new Intent(context, UpdatesReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + alarmManager.cancel(pendingIntent); + if (interval > 0) { + Log.e("Enabling periodic update checks"); + alarmManager.setRepeating( + AlarmManager.RTC_WAKEUP, + System.currentTimeMillis(), + interval, + pendingIntent + ); + } + } + + @Override + public void onReceive(Context context, Intent intent) { + Log.e("Update check Started"); + CompositeDisposable disposable = new CompositeDisposable(); + UpdatableApps updatableAppTask = new UpdatableApps(context); + disposable.add(Observable.fromCallable(updatableAppTask::getUpdatableApps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe((appList) -> { + if (!appList.isEmpty()) { + QuickNotification.show(context, + context.getString(R.string.action_updates), + new StringBuilder() + .append(appList.size()) + .append(StringUtils.SPACE) + .append(context.getString(R.string.list_update_all_txt)) + .toString(), + getContentIntent(context)); + } + }, err -> Log.e("Update check failed"))); + } + + private PendingIntent getContentIntent(Context context) { + Intent intent = new Intent(context, AuroraActivity.class); + intent.putExtra(Constants.INTENT_FRAGMENT_POSITION, 2); + return PendingIntent.getActivity(context, 0, intent, + PendingIntent.FLAG_UPDATE_CURRENT); + } +} diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml index a80402788..0dcc21cd6 100644 --- a/app/src/main/res/drawable/ic_update.xml +++ b/app/src/main/res/drawable/ic_update.xml @@ -21,9 +21,14 @@ + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillAlpha="0.3" + android:fillColor="?android:attr/colorControlNormal" + android:pathData="M7,19h10L17,5L7,5v14zM11,13L11,8h2v5h3l-4,4 -4,-4h3z" + android:strokeAlpha="0.3" /> + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index d1413c821..30a542423 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -262,4 +262,18 @@ @string/about_telegram_summary @string/about_fdroid_summary + + + -1 + 3600000 + 86400000 + 604800000 + + + + @string/pref_update_interval_manually + @string/pref_update_interval_hourly + @string/pref_update_interval_daily + @string/pref_update_interval_weekly + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e51e377b..279d53039 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -288,6 +288,11 @@ Scrollable tabs Enable to make tabs scrollable, recommended for low-dpi devices Select default tab + Updates interval + Manually + Hourly + Weekly + Daily Join Leave diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml index 34c95b5d1..c9b3a367a 100644 --- a/app/src/main/res/xml/preferences_main.xml +++ b/app/src/main/res/xml/preferences_main.xml @@ -74,4 +74,9 @@ app:fragment="com.aurora.store.fragment.preference.UIFragment" app:icon="@drawable/ic_ui" app:title="@string/pref_app_ui" /> + + diff --git a/app/src/main/res/xml/preferences_updates.xml b/app/src/main/res/xml/preferences_updates.xml new file mode 100644 index 000000000..f5d4db04c --- /dev/null +++ b/app/src/main/res/xml/preferences_updates.xml @@ -0,0 +1,31 @@ + + + + + + +