diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod')
24 files changed, 820 insertions, 928 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java index 033d650ce..9979896f6 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -6,11 +6,11 @@ import android.content.res.Configuration; import android.content.res.TypedArray; import android.os.AsyncTask; import android.os.Bundle; -import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.ListFragment; import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -32,23 +32,22 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.ChapterListAdapter; import de.danoeh.antennapod.adapter.NavListAdapter; import de.danoeh.antennapod.core.asynctask.PicassoProvider; -import de.danoeh.antennapod.core.util.id3reader.ChapterReader; -import de.danoeh.antennapod.dialog.VariableSpeedDialog; import de.danoeh.antennapod.core.feed.Chapter; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.feed.SimpleChapter; -import de.danoeh.antennapod.fragment.CoverFragment; -import de.danoeh.antennapod.fragment.ItemDescriptionFragment; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.storage.DBReader; -import de.danoeh.antennapod.menuhandler.MenuItemUtils; -import de.danoeh.antennapod.menuhandler.NavDrawerActivity; import de.danoeh.antennapod.core.util.playback.ExternalMedia; import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackController; +import de.danoeh.antennapod.dialog.VariableSpeedDialog; +import de.danoeh.antennapod.fragment.CoverFragment; +import de.danoeh.antennapod.fragment.ItemDescriptionFragment; +import de.danoeh.antennapod.menuhandler.MenuItemUtils; +import de.danoeh.antennapod.menuhandler.NavDrawerActivity; /** * Activity for playing audio files. @@ -428,8 +427,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc butNavRight = (ImageButton) findViewById(R.id.butNavRight); butPlaybackSpeed = (Button) findViewById(R.id.butPlaybackSpeed); - TypedArray typedArray = obtainStyledAttributes(new int[]{R.attr.nav_drawer_toggle}); - drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, typedArray.getResourceId(0, 0), R.string.drawer_open, R.string.drawer_close) { + drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close) { CharSequence currentTitle = getSupportActionBar().getTitle(); @Override @@ -447,7 +445,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc supportInvalidateOptionsMenu(); } }; - typedArray.recycle(); + drawerToggle.setDrawerIndicatorEnabled(false); drawerLayout.setDrawerListener(drawerToggle); diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java index f4a973fac..3b10ba4c3 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java @@ -16,6 +16,8 @@ import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.flattr.FlattrUtils; +import de.danoeh.antennapod.preferences.PreferenceController; + import org.shredzone.flattr4j.exception.FlattrException; /** Guides the user through the authentication process */ @@ -108,7 +110,7 @@ public class FlattrAuthActivity extends ActionBarActivity { switch (item.getItemId()) { case android.R.id.home: if (authSuccessful) { - Intent intent = new Intent(this, PreferenceActivity.class); + Intent intent = new Intent(this, PreferenceController.getPreferenceActivity()); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } else { diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index 9b7c11843..df6ff1046 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -3,42 +3,51 @@ package de.danoeh.antennapod.activity; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; -import android.content.res.TypedArray; import android.media.AudioManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; -import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; +import android.support.v7.app.ActionBarDrawerToggle; import android.util.Log; -import android.view.*; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import org.apache.commons.lang3.Validate; +import java.util.List; + import de.danoeh.antennapod.BuildConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.NavListAdapter; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; -import de.danoeh.antennapod.fragment.*; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.StorageUtils; +import de.danoeh.antennapod.fragment.AddFeedFragment; +import de.danoeh.antennapod.fragment.DownloadsFragment; +import de.danoeh.antennapod.fragment.ExternalPlayerFragment; +import de.danoeh.antennapod.fragment.ItemlistFragment; +import de.danoeh.antennapod.fragment.NewEpisodesFragment; +import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; +import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; - -import java.util.List; +import de.danoeh.antennapod.preferences.PreferenceController; /** * The activity that is shown when the user launches the app. */ -public class MainActivity extends ActionBarActivity implements NavDrawerActivity{ +public class MainActivity extends ActionBarActivity implements NavDrawerActivity { private static final String TAG = "MainActivity"; private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED @@ -84,8 +93,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); navList = (ListView) findViewById(R.id.nav_list); - TypedArray typedArray = obtainStyledAttributes(new int[]{R.attr.nav_drawer_toggle}); - drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, typedArray.getResourceId(0, 0), R.string.drawer_open, R.string.drawer_close) { + drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close) { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); @@ -102,7 +110,6 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } }; - typedArray.recycle(); drawerLayout.setDrawerListener(drawerToggle); FragmentManager fm = getSupportFragmentManager(); @@ -308,7 +315,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity } switch (item.getItemId()) { case R.id.show_preferences: - startActivity(new Intent(this, PreferenceActivity.class)); + startActivity(new Intent(this, PreferenceController.getPreferenceActivity())); return true; default: return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java index 95e352874..1454a2eff 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java @@ -1,387 +1,83 @@ package de.danoeh.antennapod.activity; -import android.annotation.SuppressLint; +import android.annotation.TargetApi; import android.app.ActionBar; -import android.content.Context; -import android.content.DialogInterface; +import android.app.Activity; import android.content.Intent; -import android.content.res.Resources.Theme; -import android.net.wifi.WifiConfiguration; -import android.net.wifi.WifiManager; -import android.os.Bundle; import android.os.Build; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; +import android.os.Bundle; import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceScreen; -import android.util.Log; +import android.preference.PreferenceFragment; import android.view.Menu; import android.view.MenuItem; -import android.widget.Toast; -import de.danoeh.antennapod.BuildConfig; +import android.view.ViewGroup; +import android.widget.FrameLayout; + import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.asynctask.FlattrClickWorker; -import de.danoeh.antennapod.asynctask.OpmlExportWorker; -import de.danoeh.antennapod.dialog.AuthenticationDialog; -import de.danoeh.antennapod.dialog.AutoFlattrPreferenceDialog; -import de.danoeh.antennapod.dialog.GpodnetSetHostnameDialog; -import de.danoeh.antennapod.dialog.VariableSpeedDialog; -import de.danoeh.antennapod.core.preferences.GpodnetPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.util.flattr.FlattrStatus; -import de.danoeh.antennapod.core.util.flattr.FlattrUtils; -import de.danoeh.antennapod.core.util.flattr.SimpleFlattrThing; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import de.danoeh.antennapod.preferences.PreferenceController; /** - * The main preference activity + * PreferenceActivity for API 11+. In order to change the behavior of the preference UI, see + * PreferenceController. */ -public class PreferenceActivity extends android.preference.PreferenceActivity { - private static final String TAG = "PreferenceActivity"; +public class PreferenceActivity extends Activity { - private static final String PREF_FLATTR_THIS_APP = "prefFlattrThisApp"; - private static final String PREF_FLATTR_SETTINGS = "prefFlattrSettings"; - private static final String PREF_FLATTR_AUTH = "pref_flattr_authenticate"; - private static final String PREF_FLATTR_REVOKE = "prefRevokeAccess"; - private static final String PREF_AUTO_FLATTR_PREFS = "prefAutoFlattrPrefs"; - private static final String PREF_OPML_EXPORT = "prefOpmlExport"; - private static final String PREF_ABOUT = "prefAbout"; - private static final String PREF_CHOOSE_DATA_DIR = "prefChooseDataDir"; - private static final String AUTO_DL_PREF_SCREEN = "prefAutoDownloadSettings"; - private static final String PREF_PLAYBACK_SPEED_LAUNCHER = "prefPlaybackSpeedLauncher"; + private PreferenceController preferenceController; + private MainFragment prefFragment; + private static PreferenceActivity instance; - private static final String PREF_GPODNET_LOGIN = "pref_gpodnet_authenticate"; - private static final String PREF_GPODNET_SETLOGIN_INFORMATION = "pref_gpodnet_setlogin_information"; - private static final String PREF_GPODNET_LOGOUT = "pref_gpodnet_logout"; - private static final String PREF_GPODNET_HOSTNAME = "pref_gpodnet_hostname"; - private static final String PREF_EXPANDED_NOTIFICATION = "prefExpandNotify"; - private static final String PREF_PERSISTENT_NOTIFICATION = "prefPersistNotify"; + private final PreferenceController.PreferenceUI preferenceUI = new PreferenceController.PreferenceUI() { + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + @Override + public Preference findPreference(CharSequence key) { + return prefFragment.findPreference(key); + } - private CheckBoxPreference[] selectedNetworks; + @Override + public Activity getActivity() { + return PreferenceActivity.this; + } + }; - @SuppressLint("NewApi") - @SuppressWarnings("deprecation") + @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override - public void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { setTheme(UserPreferences.getTheme()); super.onCreate(savedInstanceState); + instance = this; - if (android.os.Build.VERSION.SDK_INT >= 11) { - @SuppressLint("AppCompatMethod") ActionBar ab = getActionBar(); - if (ab != null) { - ab.setDisplayHomeAsUpEnabled(true); - } + ActionBar ab = getActionBar(); + if (ab != null) { + ab.setDisplayHomeAsUpEnabled(true); } - addPreferencesFromResource(R.xml.preferences); - - if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - // disable expanded notification option on unsupported android versions - findPreference(PREF_EXPANDED_NOTIFICATION).setEnabled(false); - findPreference(PREF_EXPANDED_NOTIFICATION).setOnPreferenceClickListener( - new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - Toast toast = Toast.makeText(PreferenceActivity.this, R.string.pref_expand_notify_unsupport_toast, Toast.LENGTH_SHORT); - toast.show(); - return true; - } - } - ); - } - - findPreference(PREF_FLATTR_THIS_APP).setOnPreferenceClickListener( - new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - new FlattrClickWorker(PreferenceActivity.this, - new SimpleFlattrThing(PreferenceActivity.this.getString(R.string.app_name), - FlattrUtils.APP_URL, - new FlattrStatus(FlattrStatus.STATUS_QUEUE) - ) - ).executeAsync(); - - return true; - } - } - ); - - findPreference(PREF_FLATTR_REVOKE).setOnPreferenceClickListener( - new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - FlattrUtils.revokeAccessToken(PreferenceActivity.this); - checkItemVisibility(); - return true; - } - - } - ); - - findPreference(PREF_ABOUT).setOnPreferenceClickListener( - new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - PreferenceActivity.this.startActivity(new Intent( - PreferenceActivity.this, AboutActivity.class)); - return true; - } - - } - ); - - findPreference(PREF_OPML_EXPORT).setOnPreferenceClickListener( - new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - new OpmlExportWorker(PreferenceActivity.this) - .executeAsync(); - - return true; - } - } - ); - - findPreference(PREF_CHOOSE_DATA_DIR).setOnPreferenceClickListener( - new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - startActivityForResult( - new Intent(PreferenceActivity.this, - DirectoryChooserActivity.class), - DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED - ); - return true; - } - } - ); - findPreference(UserPreferences.PREF_THEME) - .setOnPreferenceChangeListener( - new OnPreferenceChangeListener() { - - @Override - public boolean onPreferenceChange( - Preference preference, Object newValue) { - Intent i = getIntent(); - i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK - | Intent.FLAG_ACTIVITY_NEW_TASK); - finish(); - startActivity(i); - return true; - } - } - ); - findPreference(UserPreferences.PREF_ENABLE_AUTODL) - .setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (newValue instanceof Boolean) { - findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER).setEnabled((Boolean) newValue); - setSelectedNetworksEnabled((Boolean) newValue && UserPreferences.isEnableAutodownloadWifiFilter()); - } - return true; - } - }); - findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER) - .setOnPreferenceChangeListener( - new OnPreferenceChangeListener() { - - @Override - public boolean onPreferenceChange( - Preference preference, Object newValue) { - if (newValue instanceof Boolean) { - setSelectedNetworksEnabled((Boolean) newValue); - return true; - } else { - return false; - } - } - } - ); - findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE) - .setOnPreferenceChangeListener( - new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object o) { - if (o instanceof String) { - setEpisodeCacheSizeText(UserPreferences.readEpisodeCacheSize((String) o)); - } - return true; - } - } - ); - findPreference(PREF_PLAYBACK_SPEED_LAUNCHER) - .setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - VariableSpeedDialog.showDialog(PreferenceActivity.this); - return true; - } - }); - findPreference(PREF_GPODNET_SETLOGIN_INFORMATION).setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AuthenticationDialog dialog = new AuthenticationDialog(PreferenceActivity.this, - R.string.pref_gpodnet_setlogin_information_title, false, false, GpodnetPreferences.getUsername(), - null) { - - @Override - protected void onConfirmed(String username, String password, boolean saveUsernamePassword) { - GpodnetPreferences.setPassword(password); - } - }; - dialog.show(); - return true; - } - }); - findPreference(PREF_GPODNET_LOGOUT).setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - GpodnetPreferences.logout(); - Toast toast = Toast.makeText(PreferenceActivity.this, R.string.pref_gpodnet_logout_toast, Toast.LENGTH_SHORT); - toast.show(); - updateGpodnetPreferenceScreen(); - return true; - } - }); - findPreference(PREF_GPODNET_HOSTNAME).setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - GpodnetSetHostnameDialog.createDialog(PreferenceActivity.this).setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - updateGpodnetPreferenceScreen(); - } - }); - return true; - } - }); - - findPreference(PREF_AUTO_FLATTR_PREFS).setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AutoFlattrPreferenceDialog.newAutoFlattrPreferenceDialog(PreferenceActivity.this, - new AutoFlattrPreferenceDialog.AutoFlattrPreferenceDialogInterface() { - @Override - public void onCancelled() { - - } - - @Override - public void onConfirmed(boolean autoFlattrEnabled, float autoFlattrValue) { - UserPreferences.setAutoFlattrSettings(PreferenceActivity.this, autoFlattrEnabled, autoFlattrValue); - checkItemVisibility(); - } - }); - return true; - } - }); - buildUpdateIntervalPreference(); - buildAutodownloadSelectedNetworsPreference(); - setSelectedNetworksEnabled(UserPreferences - .isEnableAutodownloadWifiFilter()); - } - - private void updateGpodnetPreferenceScreen() { - final boolean loggedIn = GpodnetPreferences.loggedIn(); - findPreference(PREF_GPODNET_LOGIN).setEnabled(!loggedIn); - findPreference(PREF_GPODNET_SETLOGIN_INFORMATION).setEnabled(loggedIn); - findPreference(PREF_GPODNET_LOGOUT).setEnabled(loggedIn); - findPreference(PREF_GPODNET_HOSTNAME).setSummary(GpodnetPreferences.getHostname()); - } - - private void buildUpdateIntervalPreference() { - ListPreference pref = (ListPreference) findPreference(UserPreferences.PREF_UPDATE_INTERVAL); - String[] values = getResources().getStringArray( - R.array.update_intervall_values); - String[] entries = new String[values.length]; - for (int x = 0; x < values.length; x++) { - Integer v = Integer.parseInt(values[x]); - switch (v) { - case 0: - entries[x] = getString(R.string.pref_update_interval_hours_manual); - break; - case 1: - entries[x] = v - + " " - + getString(R.string.pref_update_interval_hours_singular); - break; - default: - entries[x] = v + " " - + getString(R.string.pref_update_interval_hours_plural); - break; - - } - } - pref.setEntries(entries); + // set up layout + FrameLayout root = new FrameLayout(this); + root.setId(R.id.content); + root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + setContentView(root); + prefFragment = new MainFragment(); + getFragmentManager().beginTransaction().replace(R.id.content, prefFragment).commit(); - } - - private void setSelectedNetworksEnabled(boolean b) { - if (selectedNetworks != null) { - for (Preference p : selectedNetworks) { - p.setEnabled(b); - } - } + preferenceController = new PreferenceController(preferenceUI); } @Override - protected void onResume() { - super.onResume(); - checkItemVisibility(); - setEpisodeCacheSizeText(UserPreferences.getEpisodeCacheSize()); - setDataFolderText(); - updateGpodnetPreferenceScreen(); - } - - @SuppressWarnings("deprecation") - private void checkItemVisibility() { - - boolean hasFlattrToken = FlattrUtils.hasToken(); - - findPreference(PREF_FLATTR_SETTINGS).setEnabled(FlattrUtils.hasAPICredentials()); - findPreference(PREF_FLATTR_AUTH).setEnabled(!hasFlattrToken); - findPreference(PREF_FLATTR_REVOKE).setEnabled(hasFlattrToken); - findPreference(PREF_AUTO_FLATTR_PREFS).setEnabled(hasFlattrToken); - - findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER) - .setEnabled(UserPreferences.isEnableAutodownload()); - setSelectedNetworksEnabled(UserPreferences.isEnableAutodownload() - && UserPreferences.isEnableAutodownloadWifiFilter()); - - } - - private void setEpisodeCacheSizeText(int cacheSize) { - String s; - if (cacheSize == getResources().getInteger( - R.integer.episode_cache_size_unlimited)) { - s = getString(R.string.pref_episode_cache_unlimited); - } else { - s = Integer.toString(cacheSize) - + getString(R.string.episodes_suffix); - } - findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE).setSummary(s); + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + preferenceController.onActivityResult(requestCode, resultCode, data); } - private void setDataFolderText() { - File f = UserPreferences.getDataFolder(this, null); - if (f != null) { - findPreference(PREF_CHOOSE_DATA_DIR) - .setSummary(f.getAbsolutePath()); - } + @Override + public void onBackPressed() { + // The default back button behavior has to be overwritten because changing the theme clears the back stack + Intent destIntent = new Intent(this, MainActivity.class); + destIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(destIntent); + finish(); } @Override @@ -404,129 +100,20 @@ public class PreferenceActivity extends android.preference.PreferenceActivity { } } - @Override - protected void onApplyThemeResource(Theme theme, int resid, boolean first) { - theme.applyStyle(UserPreferences.getTheme(), true); - } + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public static class MainFragment extends PreferenceFragment { - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) { - String dir = data - .getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR); - if (BuildConfig.DEBUG) - Log.d(TAG, "Setting data folder"); - UserPreferences.setDataFolder(dir); + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences); + instance.preferenceController.onCreate(); } - } - private void buildAutodownloadSelectedNetworsPreference() { - if (selectedNetworks != null) { - clearAutodownloadSelectedNetworsPreference(); + @Override + public void onResume() { + super.onResume(); + instance.preferenceController.onResume(); } - // get configured networks - WifiManager wifiservice = (WifiManager) getSystemService(Context.WIFI_SERVICE); - List<WifiConfiguration> networks = wifiservice.getConfiguredNetworks(); - - if (networks != null) { - selectedNetworks = new CheckBoxPreference[networks.size()]; - List<String> prefValues = Arrays.asList(UserPreferences - .getAutodownloadSelectedNetworks()); - PreferenceScreen prefScreen = (PreferenceScreen) findPreference(AUTO_DL_PREF_SCREEN); - OnPreferenceClickListener clickListener = new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - if (preference instanceof CheckBoxPreference) { - String key = preference.getKey(); - ArrayList<String> prefValuesList = new ArrayList<String>( - Arrays.asList(UserPreferences - .getAutodownloadSelectedNetworks()) - ); - boolean newValue = ((CheckBoxPreference) preference) - .isChecked(); - if (BuildConfig.DEBUG) - Log.d(TAG, "Selected network " + key - + ". New state: " + newValue); - - int index = prefValuesList.indexOf(key); - if (index >= 0 && newValue == false) { - // remove network - prefValuesList.remove(index); - } else if (index < 0 && newValue == true) { - prefValuesList.add(key); - } - - UserPreferences.setAutodownloadSelectedNetworks( - PreferenceActivity.this, prefValuesList - .toArray(new String[prefValuesList - .size()]) - ); - return true; - } else { - return false; - } - } - }; - // create preference for each known network. attach listener and set - // value - for (int i = 0; i < networks.size(); i++) { - WifiConfiguration config = networks.get(i); - - CheckBoxPreference pref = new CheckBoxPreference(this); - String key = Integer.toString(config.networkId); - pref.setTitle(config.SSID); - pref.setKey(key); - pref.setOnPreferenceClickListener(clickListener); - pref.setPersistent(false); - pref.setChecked(prefValues.contains(key)); - selectedNetworks[i] = pref; - prefScreen.addPreference(pref); - } - } else { - Log.e(TAG, "Couldn't get list of configure Wi-Fi networks"); - } - } - - private void clearAutodownloadSelectedNetworsPreference() { - if (selectedNetworks != null) { - PreferenceScreen prefScreen = (PreferenceScreen) findPreference(AUTO_DL_PREF_SCREEN); - - for (int i = 0; i < selectedNetworks.length; i++) { - if (selectedNetworks[i] != null) { - prefScreen.removePreference(selectedNetworks[i]); - } - } - } - } - - @SuppressWarnings("deprecation") - @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, - Preference preference) { - super.onPreferenceTreeClick(preferenceScreen, preference); - if (preference != null) - if (preference instanceof PreferenceScreen) - if (((PreferenceScreen) preference).getDialog() != null) - ((PreferenceScreen) preference) - .getDialog() - .getWindow() - .getDecorView() - .setBackgroundDrawable( - this.getWindow().getDecorView() - .getBackground().getConstantState() - .newDrawable() - ); - return false; - } - - @Override - public void onBackPressed() { - // The default back button behavior has to be overwritten because changing the theme clears the back stack - Intent destIntent = new Intent(this, MainActivity.class); - destIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(destIntent); - finish(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivityGingerbread.java b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivityGingerbread.java new file mode 100644 index 000000000..c58593f77 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivityGingerbread.java @@ -0,0 +1,96 @@ +package de.danoeh.antennapod.activity; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Intent; +import android.content.res.Resources.Theme; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceScreen; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.preferences.PreferenceController; + +/** + * PreferenceActivity for API 10. In order to change the behavior of the preference UI, see + * PreferenceController. + */ +public class PreferenceActivityGingerbread extends android.preference.PreferenceActivity { + private static final String TAG = "PreferenceActivity"; + + private PreferenceController preferenceController; + + private final PreferenceController.PreferenceUI preferenceUI = new PreferenceController.PreferenceUI() { + + @SuppressWarnings("deprecation") + @Override + public Preference findPreference(CharSequence key) { + return PreferenceActivityGingerbread.this.findPreference(key); + } + + @Override + public Activity getActivity() { + return PreferenceActivityGingerbread.this; + } + }; + + @SuppressLint("NewApi") + @SuppressWarnings("deprecation") + @Override + public void onCreate(Bundle savedInstanceState) { + setTheme(UserPreferences.getTheme()); + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.preferences); + preferenceController = new PreferenceController(preferenceUI); + preferenceController.onCreate(); + } + + + @Override + protected void onResume() { + super.onResume(); + preferenceController.onResume(); + } + + @Override + protected void onApplyThemeResource(Theme theme, int resid, boolean first) { + theme.applyStyle(UserPreferences.getTheme(), true); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + preferenceController.onActivityResult(requestCode, resultCode, data); + } + + @SuppressWarnings("deprecation") + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, + Preference preference) { + super.onPreferenceTreeClick(preferenceScreen, preference); + if (preference != null) + if (preference instanceof PreferenceScreen) + if (((PreferenceScreen) preference).getDialog() != null) + ((PreferenceScreen) preference) + .getDialog() + .getWindow() + .getDecorView() + .setBackgroundDrawable( + this.getWindow().getDecorView() + .getBackground().getConstantState() + .newDrawable() + ); + return false; + } + + @Override + public void onBackPressed() { + // The default back button behavior has to be overwritten because changing the theme clears the back stack + Intent destIntent = new Intent(this, MainActivity.class); + destIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(destIntent); + finish(); + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java index fecddeaf4..c35bb9694 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java @@ -27,7 +27,7 @@ public class ActionButtonUtils { this.context = context; drawables = context.obtainStyledAttributes(new int[]{ - R.attr.av_play, R.attr.navigation_cancel, R.attr.av_download, R.attr.navigation_chapters, R.attr.navigation_accept}); + R.attr.av_play, R.attr.navigation_cancel, R.attr.av_download, R.attr.av_pause, R.attr.navigation_accept}); labels = new int[]{R.string.play_label, R.string.cancel_download_label, R.string.download_label, R.string.mark_read_label}; } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/AdapterUtils.java b/app/src/main/java/de/danoeh/antennapod/adapter/AdapterUtils.java index c3902639a..e22b31361 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/AdapterUtils.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/AdapterUtils.java @@ -4,7 +4,7 @@ import android.content.res.Resources; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; -import de.danoeh.antennapod.R; + import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.util.Converter; @@ -44,13 +44,9 @@ public class AdapterUtils { - media.getPosition())); } } else if (!media.isDownloaded()) { - txtvPos.setText(res.getString( - R.string.size_prefix) - + Converter.byteToString(media.getSize())); + txtvPos.setText(Converter.byteToString(media.getSize())); } else { - txtvPos.setText(res.getString( - R.string.length_prefix) - + Converter.getDurationStringLong(media + txtvPos.setText(Converter.getDurationStringLong(media .getDuration())); } } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java index 8785916a0..3af9bdcda 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java @@ -72,7 +72,7 @@ public class DownloadedEpisodesListAdapter extends BaseAdapter { } holder.title.setText(item.getTitle()); - holder.pubDate.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_SHOW_DATE)); + holder.pubDate.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_ABBREV_ALL)); holder.txtvSize.setText(Converter.byteToString(item.getMedia().getSize())); FeedItem.State state = item.getState(); diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java index 4257c6eb9..206d07f0f 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java @@ -8,6 +8,7 @@ import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.TextView; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadStatus; @@ -49,7 +50,7 @@ public class DownloadlistAdapter extends BaseAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder; - Downloader downloader = getItem(position); + Downloader downloader = getItem(position); DownloadRequest request = downloader.getDownloadRequest(); // Inflate layout if (convertView == null) { @@ -58,8 +59,6 @@ public class DownloadlistAdapter extends BaseAdapter { .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.downloadlist_item, parent, false); holder.title = (TextView) convertView.findViewById(R.id.txtvTitle); - holder.message = (TextView) convertView - .findViewById(R.id.txtvMessage); holder.downloaded = (TextView) convertView .findViewById(R.id.txtvDownloaded); holder.percent = (TextView) convertView @@ -82,9 +81,9 @@ public class DownloadlistAdapter extends BaseAdapter { } holder.title.setText(request.getTitle()); - if (request.getStatusMsg() != 0) { - holder.message.setText(request.getStatusMsg()); - } + + holder.progbar.setIndeterminate(request.getSoFar() <= 0); + String strDownloaded = Converter.byteToString(request.getSoFar()); if (request.getSize() != DownloadStatus.SIZE_UNKNOWN) { strDownloaded += " / " + Converter.byteToString(request.getSize()); @@ -115,7 +114,6 @@ public class DownloadlistAdapter extends BaseAdapter { static class Holder { TextView title; - TextView message; TextView downloaded; TextView percent; ProgressBar progbar; diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java deleted file mode 100644 index 8b1ed9112..000000000 --- a/app/src/main/java/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java +++ /dev/null @@ -1,306 +0,0 @@ -package de.danoeh.antennapod.adapter; - -import android.content.Context; -import android.content.res.TypedArray; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.BaseExpandableListAdapter; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; - -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.asynctask.PicassoProvider; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.storage.DownloadRequester; -import de.danoeh.antennapod.core.util.Converter; - -/** - * Displays unread items and items in the queue in one combined list. The - * structure of this list is: [header] [queueItems] [header] [unreadItems]. - */ -public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter { - private static final String TAG = "ExternalEpisodesListAdapter"; - - public static final int GROUP_POS_QUEUE = 0; - public static final int GROUP_POS_UNREAD = 1; - - private Context context; - private ItemAccess itemAccess; - - private ActionButtonCallback feedItemActionCallback; - private OnGroupActionClicked groupActionCallback; - - private final int imageSize; - - public ExternalEpisodesListAdapter(Context context, - ActionButtonCallback callback, - OnGroupActionClicked groupActionCallback, - ItemAccess itemAccess) { - super(); - this.context = context; - this.itemAccess = itemAccess; - this.feedItemActionCallback = callback; - this.groupActionCallback = groupActionCallback; - this.imageSize = (int) context.getResources().getDimension(R.dimen.thumbnail_length); - } - - @Override - public boolean areAllItemsEnabled() { - return true; - } - - @Override - public FeedItem getChild(int groupPosition, int childPosition) { - if (groupPosition == GROUP_POS_QUEUE) { - return itemAccess.getQueueItemAt(childPosition); - } else if (groupPosition == GROUP_POS_UNREAD) { - return itemAccess.getUnreadItemAt(childPosition); - } - return null; - } - - @Override - public long getChildId(int groupPosition, int childPosition) { - return childPosition; - } - - @Override - public View getChildView(int groupPosition, final int childPosition, - boolean isLastChild, View convertView, ViewGroup parent) { - Holder holder; - final FeedItem item = getChild(groupPosition, childPosition); - - if (convertView == null) { - holder = new Holder(); - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.external_itemlist_item, - parent, false); - holder.title = (TextView) convertView.findViewById(R.id.txtvTitle); - holder.feedTitle = (TextView) convertView - .findViewById(R.id.txtvFeedname); - holder.lenSize = (TextView) convertView - .findViewById(R.id.txtvLenSize); - holder.downloadStatus = (ImageView) convertView - .findViewById(R.id.imgvDownloadStatus); - holder.feedImage = (ImageView) convertView - .findViewById(R.id.imgvFeedimage); - holder.butAction = (ImageButton) convertView - .findViewById(R.id.butAction); - holder.statusPlaying = (View) convertView - .findViewById(R.id.statusPlaying); - holder.episodeProgress = (ProgressBar) convertView - .findViewById(R.id.pbar_episode_progress); - convertView.setTag(holder); - } else { - holder = (Holder) convertView.getTag(); - } - - holder.title.setText(item.getTitle()); - holder.feedTitle.setText(item.getFeed().getTitle()); - FeedItem.State state = item.getState(); - - if (groupPosition == GROUP_POS_QUEUE) { - switch (state) { - case PLAYING: - holder.statusPlaying.setVisibility(View.VISIBLE); - holder.episodeProgress.setVisibility(View.VISIBLE); - break; - case IN_PROGRESS: - holder.statusPlaying.setVisibility(View.GONE); - holder.episodeProgress.setVisibility(View.VISIBLE); - break; - case NEW: - holder.statusPlaying.setVisibility(View.GONE); - holder.episodeProgress.setVisibility(View.GONE); - break; - default: - holder.statusPlaying.setVisibility(View.GONE); - holder.episodeProgress.setVisibility(View.GONE); - break; - } - } else { - holder.statusPlaying.setVisibility(View.GONE); - holder.episodeProgress.setVisibility(View.GONE); - } - - FeedMedia media = item.getMedia(); - if (media != null) { - - if (state == FeedItem.State.PLAYING - || state == FeedItem.State.IN_PROGRESS) { - if (media.getDuration() > 0) { - holder.episodeProgress.setProgress((int) (((double) media - .getPosition()) / media.getDuration() * 100)); - holder.lenSize.setText(Converter - .getDurationStringLong(media.getDuration() - - media.getPosition())); - } - } else if (!media.isDownloaded()) { - holder.lenSize.setText(context.getString(R.string.size_prefix) - + Converter.byteToString(media.getSize())); - } else { - holder.lenSize.setText(context - .getString(R.string.length_prefix) - + Converter.getDurationStringLong(media.getDuration())); - } - - TypedArray drawables = context.obtainStyledAttributes(new int[]{ - R.attr.av_download, R.attr.navigation_refresh}); - final int[] labels = new int[]{R.string.status_downloaded_label, R.string.downloading_label}; - holder.lenSize.setVisibility(View.VISIBLE); - if (!media.isDownloaded()) { - if (DownloadRequester.getInstance().isDownloadingFile(media)) { - holder.downloadStatus.setVisibility(View.VISIBLE); - holder.downloadStatus.setImageDrawable(drawables - .getDrawable(1)); - holder.downloadStatus.setContentDescription(context.getString(labels[1])); - } else { - holder.downloadStatus.setVisibility(View.INVISIBLE); - } - } else { - holder.downloadStatus.setVisibility(View.VISIBLE); - holder.downloadStatus - .setImageDrawable(drawables.getDrawable(0)); - holder.downloadStatus.setContentDescription(context.getString(labels[0])); - } - } else { - holder.downloadStatus.setVisibility(View.INVISIBLE); - holder.lenSize.setVisibility(View.INVISIBLE); - } - - PicassoProvider.getMediaMetadataPicassoInstance(context) - .load(item.getImageUri()) - .fit() - .into(holder.feedImage); - - holder.butAction.setFocusable(false); - holder.butAction.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - feedItemActionCallback.onActionButtonPressed(item); - } - }); - - return convertView; - - } - - static class Holder { - TextView title; - TextView feedTitle; - TextView lenSize; - ImageView downloadStatus; - ImageView feedImage; - ImageButton butAction; - View statusPlaying; - ProgressBar episodeProgress; - } - - @Override - public int getChildrenCount(int groupPosition) { - if (groupPosition == GROUP_POS_QUEUE) { - return itemAccess.getQueueSize(); - } else if (groupPosition == GROUP_POS_UNREAD) { - return itemAccess.getUnreadItemsSize(); - } - return 0; - } - - @Override - public int getGroupCount() { - // Hide 'unread items' group if empty - if (itemAccess.getUnreadItemsSize() > 0) { - return 2; - } else { - return 1; - } - } - - @Override - public long getGroupId(int groupPosition) { - return groupPosition; - } - - @Override - public View getGroupView(final int groupPosition, boolean isExpanded, - View convertView, ViewGroup parent) { - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.feeditemlist_header, parent, false); - TextView headerTitle = (TextView) convertView - .findViewById(0); - ImageButton actionButton = (ImageButton) convertView - .findViewById(R.id.butAction); - TextView numItems = (TextView) convertView.findViewById(0); - - String headerString = null; - int childrenCount = 0; - - if (groupPosition == 0) { - headerString = context.getString(R.string.queue_label); - childrenCount = getChildrenCount(GROUP_POS_QUEUE); - } else { - headerString = context.getString(R.string.waiting_list_label); - childrenCount = getChildrenCount(GROUP_POS_UNREAD); - } - headerTitle.setText(headerString); - if (childrenCount <= 0) { - numItems.setVisibility(View.INVISIBLE); - } else { - numItems.setVisibility(View.VISIBLE); - numItems.setText(Integer.toString(childrenCount)); - } - actionButton.setFocusable(false); - actionButton.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - groupActionCallback.onClick(getGroupId(groupPosition)); - } - }); - return convertView; - } - - @Override - public boolean isEmpty() { - return itemAccess.getUnreadItemsSize() == 0 - && itemAccess.getQueueSize() == 0; - } - - @Override - public Object getGroup(int groupPosition) { - return null; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public boolean isChildSelectable(int groupPosition, int childPosition) { - return true; - } - - public interface OnGroupActionClicked { - public void onClick(long groupId); - } - - public static interface ItemAccess { - public int getQueueSize(); - - public int getUnreadItemsSize(); - - public FeedItem getQueueItemAt(int position); - - public FeedItem getUnreadItemAt(int position); - } - -} diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java index 2f69e6580..8f1a838f9 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java @@ -107,22 +107,22 @@ public class FeedItemlistAdapter extends BaseAdapter { FeedItem.State state = item.getState(); switch (state) { case PLAYING: - holder.statusUnread.setVisibility(View.GONE); + holder.statusUnread.setVisibility(View.INVISIBLE); holder.episodeProgress.setVisibility(View.VISIBLE); break; case IN_PROGRESS: - holder.statusUnread.setVisibility(View.GONE); + holder.statusUnread.setVisibility(View.INVISIBLE); holder.episodeProgress.setVisibility(View.VISIBLE); break; case NEW: holder.statusUnread.setVisibility(View.VISIBLE); break; default: - holder.statusUnread.setVisibility(View.GONE); + holder.statusUnread.setVisibility(View.INVISIBLE); break; } - holder.published.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_SHOW_DATE)); + holder.published.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_ABBREV_ALL)); FeedMedia media = item.getMedia(); @@ -145,6 +145,10 @@ public class FeedItemlistAdapter extends BaseAdapter { item.getMedia())) { holder.episodeProgress.setVisibility(View.VISIBLE); holder.episodeProgress.setProgress(((ItemAccess) itemAccess).getItemDownloadProgressPercent(item)); + holder.published.setVisibility(View.GONE); + } else { + holder.episodeProgress.setVisibility(View.GONE); + holder.published.setVisibility(View.VISIBLE); } TypedArray typeDrawables = context.obtainStyledAttributes( diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java index a917633e6..cbe7665fd 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java @@ -10,6 +10,7 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.asynctask.PicassoProvider; import de.danoeh.antennapod.core.feed.Feed; @@ -37,7 +38,7 @@ public class NavListAdapter extends BaseAdapter { this.context = context; TypedArray ta = context.obtainStyledAttributes(new int[]{R.attr.ic_new, R.attr.stat_playlist, - R.attr.av_download, R.attr.device_access_time, R.attr.content_new}); + R.attr.av_download, R.attr.ic_history, R.attr.content_new}); drawables = new Drawable[]{ta.getDrawable(0), ta.getDrawable(1), ta.getDrawable(2), ta.getDrawable(3), ta.getDrawable(4)}; ta.recycle(); @@ -54,7 +55,7 @@ public class NavListAdapter extends BaseAdapter { if (viewType == VIEW_TYPE_NAV) { return context.getString(NAV_TITLES[position]); } else if (viewType == VIEW_TYPE_SECTION_DIVIDER) { - return context.getString(R.string.podcasts_label); + return ""; } else { return itemAccess.getItem(position); } @@ -88,11 +89,11 @@ public class NavListAdapter extends BaseAdapter { if (viewType == VIEW_TYPE_NAV) { v = getNavView((String) getItem(position), position, convertView, parent); } else if (viewType == VIEW_TYPE_SECTION_DIVIDER) { - v = getSectionDividerView((String) getItem(position), position, convertView, parent); + v = getSectionDividerView(convertView, parent); } else { v = getFeedView(position - SUBSCRIPTION_OFFSET, convertView, parent); } - if (v != null) { + if (v != null && viewType != VIEW_TYPE_SECTION_DIVIDER) { TextView txtvTitle = (TextView) v.findViewById(R.id.txtvTitle); if (position == itemAccess.getSelectedItemIndex()) { txtvTitle.setTypeface(null, Typeface.BOLD); @@ -147,22 +148,11 @@ public class NavListAdapter extends BaseAdapter { return convertView; } - private View getSectionDividerView(String title, int position, View convertView, ViewGroup parent) { - SectionHolder holder; - if (convertView == null) { - holder = new SectionHolder(); - LayoutInflater inflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - - convertView = inflater.inflate(R.layout.nav_section_item, parent, false); - - holder.title = (TextView) convertView.findViewById(R.id.txtvTitle); - convertView.setTag(holder); - } else { - holder = (SectionHolder) convertView.getTag(); - } + private View getSectionDividerView(View convertView, ViewGroup parent) { + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - holder.title.setText(title); + convertView = inflater.inflate(R.layout.nav_section_item, parent, false); convertView.setEnabled(false); convertView.setOnClickListener(null); @@ -204,10 +194,6 @@ public class NavListAdapter extends BaseAdapter { ImageView image; } - static class SectionHolder { - TextView title; - } - static class FeedHolder { TextView title; ImageView image; diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java index a0829286c..171f82114 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java @@ -86,9 +86,9 @@ public class NewEpisodesListAdapter extends BaseAdapter { } holder.title.setText(item.getTitle()); - holder.pubDate.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_SHOW_DATE)); + holder.pubDate.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_ABBREV_ALL)); if (item.isRead()) { - holder.statusUnread.setVisibility(View.GONE); + holder.statusUnread.setVisibility(View.INVISIBLE); } else { holder.statusUnread.setVisibility(View.VISIBLE); } @@ -99,6 +99,8 @@ public class NewEpisodesListAdapter extends BaseAdapter { if (media.getDuration() > 0) { holder.txtvDuration.setText(Converter.getDurationStringLong(media.getDuration())); + } else if (media.getSize() > 0) { + holder.txtvDuration.setText(Converter.byteToString(media.getSize())); } else { holder.txtvDuration.setText(""); } @@ -106,8 +108,10 @@ public class NewEpisodesListAdapter extends BaseAdapter { if (isDownloadingMedia) { holder.downloadProgress.setVisibility(View.VISIBLE); holder.txtvDuration.setVisibility(View.GONE); + holder.pubDate.setVisibility(View.GONE); } else { holder.txtvDuration.setVisibility(View.VISIBLE); + holder.pubDate.setVisibility(View.VISIBLE); holder.downloadProgress.setVisibility(View.GONE); } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java index 7bee8e861..8549f4f7a 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java @@ -39,7 +39,6 @@ public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> { convertView = inflater.inflate(R.layout.gpodnet_podcast_listitem, parent, false); holder.title = (TextView) convertView.findViewById(R.id.txtvTitle); - holder.description = (TextView) convertView.findViewById(R.id.txtvDescription); holder.image = (ImageView) convertView.findViewById(R.id.imgvCover); convertView.setTag(holder); @@ -48,7 +47,6 @@ public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> { } holder.title.setText(podcast.getTitle()); - holder.description.setText(podcast.getDescription()); if (StringUtils.isNoneBlank(podcast.getLogoUrl())) { PicassoProvider.getDefaultPicassoInstance(convertView.getContext()) @@ -62,7 +60,6 @@ public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> { static class Holder { TextView title; - TextView description; ImageView image; } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index 21e4cbd80..645e7ebd9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -7,6 +7,8 @@ import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.View; import android.widget.ListView; + +import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.DownloadedEpisodesListAdapter; import de.danoeh.antennapod.dialog.FeedItemDialog; import de.danoeh.antennapod.core.feed.EventDistributor; @@ -82,6 +84,13 @@ public class CompletedDownloadsFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + // add padding + final ListView lv = getListView(); + lv.setClipToPadding(false); + final int vertPadding = getResources().getDimensionPixelSize(R.dimen.list_vertical_padding); + lv.setPadding(0, vertPadding, 0, vertPadding); + viewCreated = true; if (itemsLoaded && getActivity() != null) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java index 9c7fade67..c40fce351 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -5,6 +5,9 @@ import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.View; +import android.widget.ListView; + +import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.DownloadLogAdapter; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.service.download.DownloadStatus; @@ -40,6 +43,13 @@ public class DownloadLogFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + // add padding + final ListView lv = getListView(); + lv.setClipToPadding(false); + final int vertPadding = getResources().getDimensionPixelSize(R.dimen.list_vertical_padding); + lv.setPadding(0, vertPadding, 0, vertPadding); + viewsCreated = true; if (itemsLoaded) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index ab294ecfe..15f6e85e4 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -350,7 +350,6 @@ public class ItemlistFragment extends ListFragment { TextView txtvAuthor = (TextView) header.findViewById(R.id.txtvAuthor); ImageView imgvCover = (ImageView) header.findViewById(R.id.imgvCover); ImageButton butShowInfo = (ImageButton) header.findViewById(R.id.butShowInfo); - ImageButton butVisitWebsite = (ImageButton) header.findViewById(R.id.butVisitWebsite); txtvTitle.setText(feed.getTitle()); txtvAuthor.setText(feed.getAuthor()); @@ -360,18 +359,6 @@ public class ItemlistFragment extends ListFragment { .fit() .into(imgvCover); - if (feed.getLink() == null) { - butVisitWebsite.setVisibility(View.INVISIBLE); - } else { - butVisitWebsite.setVisibility(View.VISIBLE); - butVisitWebsite.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Uri uri = Uri.parse(feed.getLink()); - startActivity(new Intent(Intent.ACTION_VIEW, uri)); - } - }); - } butShowInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index 4a07ce2b7..e226c5c4f 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -112,6 +112,13 @@ public class PlaybackHistoryFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + // add padding + final ListView lv = getListView(); + lv.setClipToPadding(false); + final int vertPadding = getResources().getDimensionPixelSize(R.dimen.list_vertical_padding); + lv.setPadding(0, vertPadding, 0, vertPadding); + viewsCreated = true; if (itemsLoaded) { onFragmentLoaded(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java index 514b05efd..f578d4338 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java @@ -4,6 +4,9 @@ import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ListFragment; import android.view.View; +import android.widget.ListView; + +import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.DownloadlistAdapter; import de.danoeh.antennapod.core.asynctask.DownloadObserver; import de.danoeh.antennapod.core.service.download.Downloader; @@ -32,6 +35,13 @@ public class RunningDownloadsFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + // add padding + final ListView lv = getListView(); + lv.setClipToPadding(false); + final int vertPadding = getResources().getDimensionPixelSize(R.dimen.list_vertical_padding); + lv.setPadding(0, vertPadding, 0, vertPadding); + final DownloadlistAdapter downloadlistAdapter = new DownloadlistAdapter(getActivity(), itemAccess); setListAdapter(downloadlistAdapter); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index 7419b42ab..0f98a2780 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -108,6 +108,13 @@ public class SearchFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + // add padding + final ListView lv = getListView(); + lv.setClipToPadding(false); + final int vertPadding = getResources().getDimensionPixelSize(R.dimen.list_vertical_padding); + lv.setPadding(0, vertPadding, 0, vertPadding); + ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle(R.string.search_label); viewCreated = true; if (itemsLoaded) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java index 7e02b647f..d39b69b3b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagFragment.java @@ -1,17 +1,18 @@ package de.danoeh.antennapod.fragment.gpodnet; +import android.app.Activity; import android.os.Bundle; import org.apache.commons.lang3.Validate; +import java.util.List; + import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.gpoddernet.GpodnetService; import de.danoeh.antennapod.core.gpoddernet.GpodnetServiceException; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetPodcast; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetTag; -import java.util.List; - /** * Shows all podcasts from gpodder.net that belong to a specific tag. * Use the newInstance method of this class to create a new TagFragment. @@ -40,6 +41,11 @@ public class TagFragment extends PodcastListFragment { Validate.isTrue(args != null && args.getString("tag") != null, "args invalid"); tag = new GpodnetTag(args.getString("tag")); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); ((MainActivity) getActivity()).getMainActivtyActionBar().setTitle(tag.getName()); } diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java index 62ae28820..e382a5888 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java @@ -7,80 +7,73 @@ import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import de.danoeh.antennapod.core.BuildConfig; + import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.feed.Feed; -import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; -import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.ShareUtils; -/** Handles interactions with the FeedItemMenu. */ +/** + * Handles interactions with the FeedItemMenu. + */ public class FeedMenuHandler { - private static final String TAG = "FeedMenuHandler"; + private static final String TAG = "FeedMenuHandler"; - public static boolean onCreateOptionsMenu(MenuInflater inflater, Menu menu) { - inflater.inflate(R.menu.feedlist, menu); - return true; - } + public static boolean onCreateOptionsMenu(MenuInflater inflater, Menu menu) { + inflater.inflate(R.menu.feedlist, menu); + return true; + } - public static boolean onPrepareOptionsMenu(Menu menu, Feed selectedFeed) { + public static boolean onPrepareOptionsMenu(Menu menu, Feed selectedFeed) { if (selectedFeed == null) { return true; } - if (BuildConfig.DEBUG) - Log.d(TAG, "Preparing options menu"); - menu.findItem(R.id.mark_all_read_item).setVisible( - selectedFeed.hasNewItems(true)); - if (selectedFeed.getPaymentLink() != null && selectedFeed.getFlattrStatus().flattrable()) - menu.findItem(R.id.support_item).setVisible(true); - else - menu.findItem(R.id.support_item).setVisible(false); - MenuItem refresh = menu.findItem(R.id.refresh_item); - if (DownloadService.isRunning - && DownloadRequester.getInstance().isDownloadingFile( - selectedFeed)) { - refresh.setVisible(false); - } else { - refresh.setVisible(true); - } + if (BuildConfig.DEBUG) + Log.d(TAG, "Preparing options menu"); + menu.findItem(R.id.mark_all_read_item).setVisible( + selectedFeed.hasNewItems(true)); + if (selectedFeed.getPaymentLink() != null && selectedFeed.getFlattrStatus().flattrable()) + menu.findItem(R.id.support_item).setVisible(true); + else + menu.findItem(R.id.support_item).setVisible(false); - return true; - } + return true; + } - /** - * NOTE: This method does not handle clicks on the 'remove feed' - item. - * - * @throws DownloadRequestException - */ - public static boolean onOptionsItemClicked(Context context, MenuItem item, - Feed selectedFeed) throws DownloadRequestException { - switch (item.getItemId()) { - case R.id.refresh_item: - DBTasks.refreshFeed(context, selectedFeed); - break; - case R.id.mark_all_read_item: - DBWriter.markFeedRead(context, selectedFeed.getId()); - break; - case R.id.visit_website_item: - Uri uri = Uri.parse(selectedFeed.getLink()); - context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); - break; - case R.id.support_item: - DBTasks.flattrFeedIfLoggedIn(context, selectedFeed); - break; - case R.id.share_link_item: - ShareUtils.shareFeedlink(context, selectedFeed); - break; - case R.id.share_source_item: - ShareUtils.shareFeedDownloadLink(context, selectedFeed); - break; - default: - return false; - } - return true; - } + /** + * NOTE: This method does not handle clicks on the 'remove feed' - item. + * + * @throws DownloadRequestException + */ + public static boolean onOptionsItemClicked(Context context, MenuItem item, + Feed selectedFeed) throws DownloadRequestException { + switch (item.getItemId()) { + case R.id.refresh_item: + DBTasks.refreshFeed(context, selectedFeed); + break; + case R.id.mark_all_read_item: + DBWriter.markFeedRead(context, selectedFeed.getId()); + break; + case R.id.visit_website_item: + Uri uri = Uri.parse(selectedFeed.getLink()); + context.startActivity(new Intent(Intent.ACTION_VIEW, uri)); + break; + case R.id.support_item: + DBTasks.flattrFeedIfLoggedIn(context, selectedFeed); + break; + case R.id.share_link_item: + ShareUtils.shareFeedlink(context, selectedFeed); + break; + case R.id.share_source_item: + ShareUtils.shareFeedDownloadLink(context, selectedFeed); + break; + default: + return false; + } + return true; + } } diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java new file mode 100644 index 000000000..41930a7f2 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java @@ -0,0 +1,494 @@ +package de.danoeh.antennapod.preferences; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Resources; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.PreferenceScreen; +import android.util.Log; +import android.widget.Toast; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import de.danoeh.antennapod.BuildConfig; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.AboutActivity; +import de.danoeh.antennapod.activity.DirectoryChooserActivity; +import de.danoeh.antennapod.activity.PreferenceActivity; +import de.danoeh.antennapod.activity.PreferenceActivityGingerbread; +import de.danoeh.antennapod.asynctask.OpmlExportWorker; +import de.danoeh.antennapod.core.asynctask.FlattrClickWorker; +import de.danoeh.antennapod.core.preferences.GpodnetPreferences; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.util.flattr.FlattrStatus; +import de.danoeh.antennapod.core.util.flattr.FlattrUtils; +import de.danoeh.antennapod.core.util.flattr.SimpleFlattrThing; +import de.danoeh.antennapod.dialog.AuthenticationDialog; +import de.danoeh.antennapod.dialog.AutoFlattrPreferenceDialog; +import de.danoeh.antennapod.dialog.GpodnetSetHostnameDialog; +import de.danoeh.antennapod.dialog.VariableSpeedDialog; + +/** + * Sets up a preference UI that lets the user change user preferences. + */ +public class PreferenceController { + private static final String TAG = "PreferenceController"; + public static final String PREF_FLATTR_THIS_APP = "prefFlattrThisApp"; + public static final String PREF_FLATTR_SETTINGS = "prefFlattrSettings"; + public static final String PREF_FLATTR_AUTH = "pref_flattr_authenticate"; + public static final String PREF_FLATTR_REVOKE = "prefRevokeAccess"; + public static final String PREF_AUTO_FLATTR_PREFS = "prefAutoFlattrPrefs"; + public static final String PREF_OPML_EXPORT = "prefOpmlExport"; + public static final String PREF_ABOUT = "prefAbout"; + public static final String PREF_CHOOSE_DATA_DIR = "prefChooseDataDir"; + public static final String AUTO_DL_PREF_SCREEN = "prefAutoDownloadSettings"; + public static final String PREF_PLAYBACK_SPEED_LAUNCHER = "prefPlaybackSpeedLauncher"; + public static final String PREF_GPODNET_LOGIN = "pref_gpodnet_authenticate"; + public static final String PREF_GPODNET_SETLOGIN_INFORMATION = "pref_gpodnet_setlogin_information"; + public static final String PREF_GPODNET_LOGOUT = "pref_gpodnet_logout"; + public static final String PREF_GPODNET_HOSTNAME = "pref_gpodnet_hostname"; + public static final String PREF_EXPANDED_NOTIFICATION = "prefExpandNotify"; + private static final String PREF_PERSISTENT_NOTIFICATION = "prefPersistNotify"; + + + private final PreferenceUI ui; + + private CheckBoxPreference[] selectedNetworks; + + public PreferenceController(PreferenceUI ui) { + this.ui = ui; + } + + /** + * Returns the preference activity that should be used on this device. + * + * @return PreferenceActivity if the API level is greater than 10, PreferenceActivityGingerbread otherwise. + */ + public static Class getPreferenceActivity() { + if (Build.VERSION.SDK_INT > 10) { + return PreferenceActivity.class; + } else { + return PreferenceActivityGingerbread.class; + } + } + + public void onCreate() { + final Activity activity = ui.getActivity(); + + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + // disable expanded notification option on unsupported android versions + ui.findPreference(PreferenceController.PREF_EXPANDED_NOTIFICATION).setEnabled(false); + ui.findPreference(PreferenceController.PREF_EXPANDED_NOTIFICATION).setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + Toast toast = Toast.makeText(activity, R.string.pref_expand_notify_unsupport_toast, Toast.LENGTH_SHORT); + toast.show(); + return true; + } + } + ); + } + + ui.findPreference(PreferenceController.PREF_FLATTR_THIS_APP).setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + new FlattrClickWorker(activity, + new SimpleFlattrThing(activity.getString(R.string.app_name), + FlattrUtils.APP_URL, + new FlattrStatus(FlattrStatus.STATUS_QUEUE) + ) + ).executeAsync(); + + return true; + } + } + ); + + ui.findPreference(PreferenceController.PREF_FLATTR_REVOKE).setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + FlattrUtils.revokeAccessToken(activity); + checkItemVisibility(); + return true; + } + + } + ); + + ui.findPreference(PreferenceController.PREF_ABOUT).setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + activity.startActivity(new Intent( + activity, AboutActivity.class)); + return true; + } + + } + ); + + ui.findPreference(PreferenceController.PREF_OPML_EXPORT).setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + new OpmlExportWorker(activity) + .executeAsync(); + + return true; + } + } + ); + + ui.findPreference(PreferenceController.PREF_CHOOSE_DATA_DIR).setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + activity.startActivityForResult( + new Intent(activity, + DirectoryChooserActivity.class), + DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED + ); + return true; + } + } + ); + ui.findPreference(UserPreferences.PREF_THEME) + .setOnPreferenceChangeListener( + new Preference.OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange( + Preference preference, Object newValue) { + Intent i = activity.getIntent(); + i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK + | Intent.FLAG_ACTIVITY_NEW_TASK); + activity.finish(); + activity.startActivity(i); + return true; + } + } + ); + ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL) + .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (newValue instanceof Boolean) { + ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER).setEnabled((Boolean) newValue); + setSelectedNetworksEnabled((Boolean) newValue && UserPreferences.isEnableAutodownloadWifiFilter()); + } + return true; + } + }); + ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER) + .setOnPreferenceChangeListener( + new Preference.OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange( + Preference preference, Object newValue) { + if (newValue instanceof Boolean) { + setSelectedNetworksEnabled((Boolean) newValue); + return true; + } else { + return false; + } + } + } + ); + ui.findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE) + .setOnPreferenceChangeListener( + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object o) { + if (o instanceof String) { + setEpisodeCacheSizeText(UserPreferences.readEpisodeCacheSize((String) o)); + } + return true; + } + } + ); + ui.findPreference(PreferenceController.PREF_PLAYBACK_SPEED_LAUNCHER) + .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + VariableSpeedDialog.showDialog(activity); + return true; + } + }); + ui.findPreference(PreferenceController.PREF_GPODNET_SETLOGIN_INFORMATION).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AuthenticationDialog dialog = new AuthenticationDialog(activity, + R.string.pref_gpodnet_setlogin_information_title, false, false, GpodnetPreferences.getUsername(), + null) { + + @Override + protected void onConfirmed(String username, String password, boolean saveUsernamePassword) { + GpodnetPreferences.setPassword(password); + } + }; + dialog.show(); + return true; + } + }); + ui.findPreference(PreferenceController.PREF_GPODNET_LOGOUT).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + GpodnetPreferences.logout(); + Toast toast = Toast.makeText(activity, R.string.pref_gpodnet_logout_toast, Toast.LENGTH_SHORT); + toast.show(); + updateGpodnetPreferenceScreen(); + return true; + } + }); + ui.findPreference(PreferenceController.PREF_GPODNET_HOSTNAME).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + GpodnetSetHostnameDialog.createDialog(activity).setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + updateGpodnetPreferenceScreen(); + } + }); + return true; + } + }); + + ui.findPreference(PreferenceController.PREF_AUTO_FLATTR_PREFS).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AutoFlattrPreferenceDialog.newAutoFlattrPreferenceDialog(activity, + new AutoFlattrPreferenceDialog.AutoFlattrPreferenceDialogInterface() { + @Override + public void onCancelled() { + + } + + @Override + public void onConfirmed(boolean autoFlattrEnabled, float autoFlattrValue) { + UserPreferences.setAutoFlattrSettings(activity, autoFlattrEnabled, autoFlattrValue); + checkItemVisibility(); + } + }); + return true; + } + }); + buildUpdateIntervalPreference(); + buildAutodownloadSelectedNetworsPreference(); + setSelectedNetworksEnabled(UserPreferences + .isEnableAutodownloadWifiFilter()); + } + + public void onResume() { + checkItemVisibility(); + setEpisodeCacheSizeText(UserPreferences.getEpisodeCacheSize()); + setDataFolderText(); + updateGpodnetPreferenceScreen(); + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) { + String dir = data + .getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR); + if (BuildConfig.DEBUG) + Log.d(TAG, "Setting data folder"); + UserPreferences.setDataFolder(dir); + } + } + + private void updateGpodnetPreferenceScreen() { + final boolean loggedIn = GpodnetPreferences.loggedIn(); + ui.findPreference(PreferenceController.PREF_GPODNET_LOGIN).setEnabled(!loggedIn); + ui.findPreference(PreferenceController.PREF_GPODNET_SETLOGIN_INFORMATION).setEnabled(loggedIn); + ui.findPreference(PreferenceController.PREF_GPODNET_LOGOUT).setEnabled(loggedIn); + ui.findPreference(PreferenceController.PREF_GPODNET_HOSTNAME).setSummary(GpodnetPreferences.getHostname()); + } + + private void buildUpdateIntervalPreference() { + final Resources res = ui.getActivity().getResources(); + + ListPreference pref = (ListPreference) ui.findPreference(UserPreferences.PREF_UPDATE_INTERVAL); + String[] values = res.getStringArray( + R.array.update_intervall_values); + String[] entries = new String[values.length]; + for (int x = 0; x < values.length; x++) { + Integer v = Integer.parseInt(values[x]); + switch (v) { + case 0: + entries[x] = res.getString(R.string.pref_update_interval_hours_manual); + break; + case 1: + entries[x] = v + + " " + + res.getString(R.string.pref_update_interval_hours_singular); + break; + default: + entries[x] = v + " " + + res.getString(R.string.pref_update_interval_hours_plural); + break; + + } + } + pref.setEntries(entries); + + } + + private void setSelectedNetworksEnabled(boolean b) { + if (selectedNetworks != null) { + for (Preference p : selectedNetworks) { + p.setEnabled(b); + } + } + } + + @SuppressWarnings("deprecation") + private void checkItemVisibility() { + + boolean hasFlattrToken = FlattrUtils.hasToken(); + + ui.findPreference(PreferenceController.PREF_FLATTR_SETTINGS).setEnabled(FlattrUtils.hasAPICredentials()); + ui.findPreference(PreferenceController.PREF_FLATTR_AUTH).setEnabled(!hasFlattrToken); + ui.findPreference(PreferenceController.PREF_FLATTR_REVOKE).setEnabled(hasFlattrToken); + ui.findPreference(PreferenceController.PREF_AUTO_FLATTR_PREFS).setEnabled(hasFlattrToken); + + ui.findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER) + .setEnabled(UserPreferences.isEnableAutodownload()); + setSelectedNetworksEnabled(UserPreferences.isEnableAutodownload() + && UserPreferences.isEnableAutodownloadWifiFilter()); + + } + + private void setEpisodeCacheSizeText(int cacheSize) { + final Resources res = ui.getActivity().getResources(); + + String s; + if (cacheSize == res.getInteger( + R.integer.episode_cache_size_unlimited)) { + s = res.getString(R.string.pref_episode_cache_unlimited); + } else { + s = Integer.toString(cacheSize) + + res.getString(R.string.episodes_suffix); + } + ui.findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE).setSummary(s); + } + + private void setDataFolderText() { + File f = UserPreferences.getDataFolder(ui.getActivity(), null); + if (f != null) { + ui.findPreference(PreferenceController.PREF_CHOOSE_DATA_DIR) + .setSummary(f.getAbsolutePath()); + } + } + + private void buildAutodownloadSelectedNetworsPreference() { + final Activity activity = ui.getActivity(); + + if (selectedNetworks != null) { + clearAutodownloadSelectedNetworsPreference(); + } + // get configured networks + WifiManager wifiservice = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE); + List<WifiConfiguration> networks = wifiservice.getConfiguredNetworks(); + + if (networks != null) { + selectedNetworks = new CheckBoxPreference[networks.size()]; + List<String> prefValues = Arrays.asList(UserPreferences + .getAutodownloadSelectedNetworks()); + PreferenceScreen prefScreen = (PreferenceScreen) ui.findPreference(PreferenceController.AUTO_DL_PREF_SCREEN); + Preference.OnPreferenceClickListener clickListener = new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + if (preference instanceof CheckBoxPreference) { + String key = preference.getKey(); + ArrayList<String> prefValuesList = new ArrayList<String>( + Arrays.asList(UserPreferences + .getAutodownloadSelectedNetworks()) + ); + boolean newValue = ((CheckBoxPreference) preference) + .isChecked(); + if (BuildConfig.DEBUG) + Log.d(TAG, "Selected network " + key + + ". New state: " + newValue); + + int index = prefValuesList.indexOf(key); + if (index >= 0 && newValue == false) { + // remove network + prefValuesList.remove(index); + } else if (index < 0 && newValue == true) { + prefValuesList.add(key); + } + + UserPreferences.setAutodownloadSelectedNetworks( + activity, prefValuesList + .toArray(new String[prefValuesList + .size()]) + ); + return true; + } else { + return false; + } + } + }; + // create preference for each known network. attach listener and set + // value + for (int i = 0; i < networks.size(); i++) { + WifiConfiguration config = networks.get(i); + + CheckBoxPreference pref = new CheckBoxPreference(activity); + String key = Integer.toString(config.networkId); + pref.setTitle(config.SSID); + pref.setKey(key); + pref.setOnPreferenceClickListener(clickListener); + pref.setPersistent(false); + pref.setChecked(prefValues.contains(key)); + selectedNetworks[i] = pref; + prefScreen.addPreference(pref); + } + } else { + Log.e(TAG, "Couldn't get list of configure Wi-Fi networks"); + } + } + + private void clearAutodownloadSelectedNetworsPreference() { + if (selectedNetworks != null) { + PreferenceScreen prefScreen = (PreferenceScreen) ui.findPreference(PreferenceController.AUTO_DL_PREF_SCREEN); + + for (int i = 0; i < selectedNetworks.length; i++) { + if (selectedNetworks[i] != null) { + prefScreen.removePreference(selectedNetworks[i]); + } + } + } + } + + + public static interface PreferenceUI { + + /** + * Finds a preference based on its key. + */ + public Preference findPreference(CharSequence key); + + public Activity getActivity(); + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java b/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java index 4622e2f79..55dfdc20b 100644 --- a/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java +++ b/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java @@ -104,12 +104,12 @@ public class PlayerWidgetService extends Service { if (progressString != null) { views.setTextViewText(R.id.txtvProgress, progressString); } - views.setImageViewResource(R.id.butPlay, R.drawable.av_pause_dark); + views.setImageViewResource(R.id.butPlay, R.drawable.ic_pause_white_24dp); if (Build.VERSION.SDK_INT >= 15) { views.setContentDescription(R.id.butPlay, getString(R.string.pause_label)); } } else { - views.setImageViewResource(R.id.butPlay, R.drawable.av_play_dark); + views.setImageViewResource(R.id.butPlay, R.drawable.ic_play_arrow_white_24dp); if (Build.VERSION.SDK_INT >= 15) { views.setContentDescription(R.id.butPlay, getString(R.string.play_label)); } @@ -120,7 +120,7 @@ public class PlayerWidgetService extends Service { views.setViewVisibility(R.id.txtvProgress, View.INVISIBLE); views.setTextViewText(R.id.txtvTitle, this.getString(R.string.no_media_playing_label)); - views.setImageViewResource(R.id.butPlay, R.drawable.av_play); + views.setImageViewResource(R.id.butPlay, R.drawable.ic_play_arrow_white_24dp); } |