From 3d0d40ff276694f19558db296eff5c8d567faa17 Mon Sep 17 00:00:00 2001 From: fabienli Date: Tue, 15 Jun 2021 13:07:32 +0200 Subject: sync interval setting is done via a popup Signed-off-by: fabienli --- .../owncloudnewsreader/NewsReaderListActivity.java | 2 +- .../owncloudnewsreader/SettingsActivity.java | 1 + .../owncloudnewsreader/SettingsFragment.java | 62 ++++++- .../SyncIntervalSelectorActivity.java | 192 --------------------- .../luhmer/owncloudnewsreader/di/AppComponent.java | 3 - .../src/main/res/xml/pref_data_sync.xml | 12 +- 6 files changed, 69 insertions(+), 203 deletions(-) delete mode 100644 News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java index 5b0ffd5c..34138f2e 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java @@ -391,7 +391,7 @@ public class NewsReaderListActivity extends PodcastFragmentActivity implements Account account = new Account(getString(R.string.app_name), accountType); mAccountManager.addAccountExplicitly(account, "", new Bundle()); - SyncIntervalSelectorActivity.setAccountSyncInterval(this, mPrefs); + SettingsFragment.setAccountSyncInterval(this, R.integer.default_sync_minutes); } } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsActivity.java index 757ad2c4..602906ba 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsActivity.java @@ -80,6 +80,7 @@ public class SettingsActivity extends AppCompatActivity { public static final String PREF_SERVER_SETTINGS = "pref_server_settings"; public static final String PREF_SYNC_SETTINGS = "pref_sync_settings"; + public static final String SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED = "SYNC_INTERVAL_IN_MINUTES_STRING"; public static final String SP_APP_THEME = "sp_app_theme"; public static final String CB_OLED_MODE = "cb_oled_mode"; diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsFragment.java index fba6676a..576fd573 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsFragment.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsFragment.java @@ -1,8 +1,11 @@ package de.luhmer.owncloudnewsreader; +import android.accounts.Account; +import android.accounts.AccountManager; import android.app.Activity; import android.app.DialogFragment; import android.app.ProgressDialog; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -32,6 +35,7 @@ import java.util.Map; import javax.inject.Inject; import javax.inject.Named; +import de.luhmer.owncloudnewsreader.authentication.AccountGeneral; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.helper.ImageHandler; import de.luhmer.owncloudnewsreader.helper.NewsFileUtils; @@ -63,6 +67,7 @@ import static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SEARCH_IN; import static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SORT_ORDER; import static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_LEFT_ACTION; import static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_RIGHT_ACTION; +import static de.luhmer.owncloudnewsreader.SettingsActivity.SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED; public class SettingsFragment extends PreferenceFragmentCompat { @@ -79,6 +84,8 @@ public class SettingsFragment extends PreferenceFragmentCompat { version = VersionInfoDialogFragment.getVersionString(getActivity()); + migrateSyncIntervalValue(); // migrates pref SYNC_INTERVAL_IN_MINUTES_STRING to pref_sync_settings + addPreferencesFromResource(R.xml.pref_general); bindGeneralPreferences(this); @@ -135,6 +142,10 @@ public class SettingsFragment extends PreferenceFragmentCompat { // value "1" means Light theme preference.getPreferenceManager().findPreference(CB_OLED_MODE).setEnabled(!value.equals("1")); } + else if(PREF_SYNC_SETTINGS.equals(preference.getKey())) { + // set the sync value in account + setAccountSyncInterval(preference.getContext(), Integer.parseInt(stringValue)); + } } else { String key = preference.getKey(); @@ -191,6 +202,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { mPrefs.getBoolean(preference.getKey(), false)); } + // TODO DO WE NEED THE CODE BELOW?!! /* @Nullable @@ -236,8 +248,31 @@ public class SettingsFragment extends PreferenceFragmentCompat { bindPreferenceSummaryToValue(prefFrag.findPreference(SP_SWIPE_LEFT_ACTION)); } + /** + * migrates pref SYNC_INTERVAL_IN_MINUTES_STRING to pref_sync_settings + * temporary function, could be removed whenever is wished + */ + private void migrateSyncIntervalValue() { + // For migration compatibility, in case preference SYNC_INTERVAL_IN_MINUTES_STRING is there + // we migrate its value in PREF_SYNC_SETTINGS + int minutes = mPrefs.getInt(SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED, -1); + if (minutes != -1) { // we need to migrate + mPrefs.edit().putString(PREF_SYNC_SETTINGS, String.valueOf(minutes)).commit(); + mPrefs.edit().remove(SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED).commit(); + } + // impact if the above code is removed: + // the list will show the default sync interval value of 15min + // whereas the user may have configured some other value + // once the user selects a value, this new value is actually used; and no more impact is expected + + } + private void bindDataSyncPreferences(final PreferenceFragmentCompat prefFrag) { + + // handle the sync interval list: + bindPreferenceSummaryToValue(prefFrag.findPreference(PREF_SYNC_SETTINGS)); + // String[] authorities = { "de.luhmer.owncloudnewsreader" }; // Intent intentSyncSettings = new Intent(Settings.ACTION_SYNC_SETTINGS); // intentSyncSettings.putExtra(Settings.EXTRA_AUTHORITIES, authorities); @@ -245,8 +280,6 @@ public class SettingsFragment extends PreferenceFragmentCompat { // String[] authorities = { "de.luhmer.owncloudnewsreader" }; // Intent intentSyncSettings = new Intent(Settings.ACTION_SYNC_SETTINGS); // intentSyncSettings.putExtra(Settings.EXTRA_AUTHORITIES, authorities); - Intent intentSyncSettings = new Intent(getActivity(), SyncIntervalSelectorActivity.class); - prefFrag.findPreference(PREF_SYNC_SETTINGS).setIntent(intentSyncSettings); //bindPreferenceSummaryToValue(prefFrag.findPreference(SP_MAX_ITEMS_SYNC)); Preference clearCachePref = prefFrag.findPreference(EDT_CLEAR_CACHE); @@ -357,6 +390,31 @@ public class SettingsFragment extends PreferenceFragmentCompat { startActivity(browserIntent); } + + public static final long SECONDS_PER_MINUTE = 60L; + + public static void setAccountSyncInterval(Context context, int minutes) { + AccountManager mAccountManager = AccountManager.get(context); + String accountType = AccountGeneral.getAccountType(context); + Account[] accounts = mAccountManager.getAccountsByType(accountType); + for (Account account : accounts) { + if (minutes != 0) { + long SYNC_INTERVAL = minutes * SECONDS_PER_MINUTE; + ContentResolver.setSyncAutomatically(account, accountType, true); + + Bundle bundle = new Bundle(); + ContentResolver.addPeriodicSync( + account, + accountType, + bundle, + SYNC_INTERVAL); + + } else { + ContentResolver.setSyncAutomatically(account, accountType, false); + } + } + } + public static class ResetDatabaseAsyncTask extends AsyncTask { private ProgressDialog pd; diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java deleted file mode 100644 index 7a7a74e3..00000000 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SyncIntervalSelectorActivity.java +++ /dev/null @@ -1,192 +0,0 @@ -package de.luhmer.owncloudnewsreader; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.content.ContentResolver; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ListView; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.Fragment; - -import javax.inject.Inject; - -import de.luhmer.owncloudnewsreader.authentication.AccountGeneral; -import de.luhmer.owncloudnewsreader.databinding.ActivitySyncIntervalSelectorBinding; -import de.luhmer.owncloudnewsreader.helper.ThemeChooser; - - -public class SyncIntervalSelectorActivity extends AppCompatActivity { - - private PlaceholderFragment mFragment; - private String[] items_values; - protected ActivitySyncIntervalSelectorBinding binding; - protected @Inject SharedPreferences mPrefs; - private Integer btn_save; - - @Override - protected void onCreate(Bundle savedInstanceState) { - ((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this); - - ThemeChooser.chooseTheme(this); - super.onCreate(savedInstanceState); - ThemeChooser.afterOnCreate(this); - - binding = ActivitySyncIntervalSelectorBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - setSupportActionBar(binding.toolbarLayout.toolbar); - - items_values = getResources().getStringArray(R.array.array_sync_interval_values); - - if (savedInstanceState == null) { - mFragment = new PlaceholderFragment(); - - getSupportFragmentManager().beginTransaction() - .add(R.id.container, mFragment) - .commit(); - } - } - - private int getBtn_save_normal_holo() { - if (btn_save == null) { - if (ThemeChooser.getSelectedTheme().equals(ThemeChooser.THEME.LIGHT)) { - btn_save = R.drawable.ic_action_save_light; - } else { - btn_save = R.drawable.ic_action_save_dark; // dark - } - } - return btn_save; - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.sync_interval_selector, menu); - - - MenuItem btnSave = (MenuItem) menu.getItem(0); - if (btnSave != null) { - //btnSave.setIcon(getBtn_save_normal_holo()); - //btnSave.setIcon(ContextCompat.getDrawable(this, getBtn_save_normal_holo())); - } - - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - MenuItem btnSave = (MenuItem) menu.getItem(0); - if (btnSave != null) { - btnSave.setIcon(getBtn_save_normal_holo()); - } - return super.onPrepareOptionsMenu(menu); - } - - public static final int SYNC_DEFAULT_INTERVAL = 15; - - public static void setAccountSyncInterval(Context context, SharedPreferences mPrefs) { - int minutes = mPrefs.getInt(SYNC_INTERVAL_IN_MINUTES_STRING, SYNC_DEFAULT_INTERVAL); - - AccountManager mAccountManager = AccountManager.get(context); - String accountType = AccountGeneral.getAccountType(context); - Account[] accounts = mAccountManager.getAccountsByType(accountType); - for (Account account : accounts) { - if (minutes != 0) { - long SYNC_INTERVAL = minutes * SECONDS_PER_MINUTE; - ContentResolver.setSyncAutomatically(account, accountType, true); - - Bundle bundle = new Bundle(); - ContentResolver.addPeriodicSync( - account, - accountType, - bundle, - SYNC_INTERVAL); - - } else { - ContentResolver.setSyncAutomatically(account, accountType, false); - } - } - } - - - /** - * A placeholder fragment containing a simple view. - */ - - // Sync interval constants - public static final long SECONDS_PER_MINUTE = 60L; - public static final String SYNC_INTERVAL_IN_MINUTES_STRING = "SYNC_INTERVAL_IN_MINUTES_STRING"; - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically StartYoutubePlayer clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - if (id == R.id.action_save) { - int checkedPosition = mFragment.lvItems.getCheckedItemPosition(); - int minutes = Integer.parseInt(items_values[checkedPosition]); - mPrefs.edit().putInt(SYNC_INTERVAL_IN_MINUTES_STRING, minutes).commit(); - setAccountSyncInterval(this, mPrefs); - finish(); - } - - return super.onOptionsItemSelected(item); - } - // public static final int SYNC_DEFAULT_INTERVAL = 60*24; - - public static class PlaceholderFragment extends Fragment { - - private ListView lvItems; - protected @Inject - SharedPreferences mPrefs; - - public PlaceholderFragment() { - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_sync_interval_selector, container, false); - - String[] items = getResources().getStringArray(R.array.array_sync_interval); - - lvItems = rootView.findViewById(R.id.lv_sync_interval_items); - lvItems.setChoiceMode(ListView.CHOICE_MODE_SINGLE); - - ArrayAdapter adapter = new ArrayAdapter<>(getActivity(), - android.R.layout.simple_list_item_single_choice, android.R.id.text1, items); - - lvItems.setAdapter(adapter); - - int position = 0; - int minutes = mPrefs.getInt(SYNC_INTERVAL_IN_MINUTES_STRING, SYNC_DEFAULT_INTERVAL); - for (String item : ((SyncIntervalSelectorActivity) requireActivity()).items_values) { - if (Integer.parseInt(item) == minutes) - break; - position++; - } - lvItems.setItemChecked(position, true); - - return rootView; - } - } - -} diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/di/AppComponent.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/di/AppComponent.java index ce2e49b2..5a071604 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/di/AppComponent.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/di/AppComponent.java @@ -14,7 +14,6 @@ import de.luhmer.owncloudnewsreader.NewsReaderListFragment; import de.luhmer.owncloudnewsreader.PodcastFragmentActivity; import de.luhmer.owncloudnewsreader.SettingsActivity; import de.luhmer.owncloudnewsreader.SettingsFragment; -import de.luhmer.owncloudnewsreader.SyncIntervalSelectorActivity; import de.luhmer.owncloudnewsreader.authentication.OwnCloudSyncAdapter; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.services.SyncItemStateService; @@ -33,7 +32,6 @@ public interface AppComponent { void injectActivity(PodcastFragmentActivity activity); void injectActivity(NewFeedActivity activity); void injectActivity(SettingsActivity activity); - void injectActivity(SyncIntervalSelectorActivity activity); void injectActivity(LoginDialogActivity activity); void injectFragment(NewsReaderListDialogFragment fragment); @@ -41,7 +39,6 @@ public interface AppComponent { void injectFragment(SettingsFragment fragment); void injectFragment(NewsDetailFragment fragment); void injectFragment(NewsReaderDetailFragment fragment); - void injectFragment(SyncIntervalSelectorActivity.PlaceholderFragment fragment); void injectService(SyncItemStateService service); void injectService(OwnCloudSyncAdapter ownCloudSyncAdapter); diff --git a/News-Android-App/src/main/res/xml/pref_data_sync.xml b/News-Android-App/src/main/res/xml/pref_data_sync.xml index bf2da08d..a668cd68 100644 --- a/News-Android-App/src/main/res/xml/pref_data_sync.xml +++ b/News-Android-App/src/main/res/xml/pref_data_sync.xml @@ -24,12 +24,14 @@ This preference simply launches an intent when selected. Use this UI sparingly, per design guidelines. --> - - - + android:title="Interval Sync" + app:iconSpaceReserved="false" + />