Made automatic flattr threshold configurable

This commit is contained in:
daniel oeh 2014-07-16 17:33:09 +02:00
parent 0513302c78
commit f97a71d2f9
7 changed files with 684 additions and 496 deletions

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<CheckBox
android:id="@+id/chkAutoFlattr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:text="@string/auto_flattr_enable"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_small" />
<SeekBar
android:id="@+id/skbPercent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:max="100" />
<TextView
android:id="@+id/txtvStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:ellipsize="end"
android:lines="2"
android:text="@string/auto_flattr_after_percent"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_small" />
</LinearLayout>

View File

@ -223,7 +223,7 @@
<string name="pref_revokeAccess_title">Revoke access</string>
<string name="pref_revokeAccess_sum">Revoke the access permission to your flattr account for this app.</string>
<string name="pref_auto_flattr_title">Automatic Flattr</string>
<string name="pref_auto_flattr_sum">Flattr episodes of which 80% have been played.</string>
<string name="pref_auto_flattr_sum">Configure automatic flattring</string>
<string name="user_interface_label">User Interface</string>
<string name="pref_set_theme_title">Select theme</string>
<string name="pref_set_theme_sum">Change the appearance of AntennaPod.</string>
@ -251,6 +251,11 @@
<string name="pref_gpodnet_sethostname_title">Set hostname</string>
<string name="pref_gpodnet_sethostname_use_default_host">Use default host</string>
<!-- Auto-Flattr dialog -->
<string name="auto_flattr_enable">Enable automatic flattring</string>
<string name="auto_flattr_after_percent">Flattr episode as soon as %d percent have been played</string>
<string name="auto_flattr_ater_beginning">Flattr episode when playback starts</string>
<string name="auto_flattr_ater_end">Flattr episode when playback ends</string>
<!-- Search -->
<string name="search_hint">Search for Feeds or Episodes</string>

View File

@ -92,10 +92,8 @@
<intent android:action=".activities.FlattrAuthActivity"/>
</PreferenceScreen>
<CheckBoxPreference
android:defaultValue="false"
android:enabled="false"
android:key="pref_auto_flattr"
<Preference
android:key="prefAutoFlattrPrefs"
android:summary="@string/pref_auto_flattr_sum"
android:title="@string/pref_auto_flattr_title" />
<Preference

View File

@ -15,7 +15,6 @@ import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceScreen;
import android.support.v4.app.NavUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@ -25,6 +24,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.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.preferences.GpodnetPreferences;
@ -47,7 +47,7 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
private static final String PREF_FLATTR_THIS_APP = "prefFlattrThisApp";
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 = "pref_auto_flattr";
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";
@ -247,6 +247,26 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
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
@ -314,7 +334,7 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
findPreference(PREF_FLATTR_AUTH).setEnabled(!hasFlattrToken);
findPreference(PREF_FLATTR_REVOKE).setEnabled(hasFlattrToken);
findPreference(PREF_AUTO_FLATTR).setEnabled(hasFlattrToken);
findPreference(PREF_AUTO_FLATTR_PREFS).setEnabled(hasFlattrToken);
findPreference(UserPreferences.PREF_ENABLE_AUTODL_WIFI_FILTER)
.setEnabled(UserPreferences.isEnableAutodownload());

View File

@ -0,0 +1,107 @@
package de.danoeh.antennapod.dialog;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View;
import android.widget.CheckBox;
import android.widget.SeekBar;
import android.widget.TextView;
import org.apache.commons.lang3.Validate;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.preferences.UserPreferences;
/**
* Creates a new AlertDialog that displays preferences for auto-flattring to the user.
*/
public class AutoFlattrPreferenceDialog {
private AutoFlattrPreferenceDialog() {
}
public static void newAutoFlattrPreferenceDialog(final Activity activity, final AutoFlattrPreferenceDialogInterface callback) {
Validate.notNull(activity);
Validate.notNull(callback);
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
@SuppressLint("InflateParams") View view = activity.getLayoutInflater().inflate(R.layout.autoflattr_preference_dialog, null);
final CheckBox chkAutoFlattr = (CheckBox) view.findViewById(R.id.chkAutoFlattr);
final SeekBar skbPercent = (SeekBar) view.findViewById(R.id.skbPercent);
final TextView txtvStatus = (TextView) view.findViewById(R.id.txtvStatus);
chkAutoFlattr.setChecked(UserPreferences.isAutoFlattr());
skbPercent.setEnabled(chkAutoFlattr.isChecked());
txtvStatus.setEnabled(chkAutoFlattr.isChecked());
final int initialValue = (int) (UserPreferences.getAutoFlattrPlayedDurationThreshold() * 100.0f);
setStatusMsgText(activity, txtvStatus, initialValue);
skbPercent.setProgress(initialValue);
chkAutoFlattr.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
skbPercent.setEnabled(chkAutoFlattr.isChecked());
txtvStatus.setEnabled(chkAutoFlattr.isChecked());
}
});
skbPercent.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
setStatusMsgText(activity, txtvStatus, progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
builder.setTitle(R.string.pref_auto_flattr_title)
.setView(view)
.setPositiveButton(R.string.confirm_label, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
float progDouble = ((float) skbPercent.getProgress()) / 100.0f;
callback.onConfirmed(chkAutoFlattr.isChecked(), progDouble);
dialog.dismiss();
}
})
.setNegativeButton(R.string.cancel_label, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
callback.onCancelled();
dialog.dismiss();
}
})
.setCancelable(false).show();
}
private static void setStatusMsgText(Context context, TextView txtvStatus, int progress) {
if (progress == 0) {
txtvStatus.setText(R.string.auto_flattr_ater_beginning);
} else if (progress == 100) {
txtvStatus.setText(R.string.auto_flattr_ater_end);
} else {
txtvStatus.setText(context.getString(R.string.auto_flattr_after_percent, progress));
}
}
public static interface AutoFlattrPreferenceDialogInterface {
public void onCancelled();
public void onConfirmed(boolean autoFlattrEnabled, float autoFlattrValue);
}
}

View File

@ -7,10 +7,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
import de.danoeh.antennapod.BuildConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.OpmlImportFromPathActivity;
import de.danoeh.antennapod.receiver.FeedUpdateReceiver;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.json.JSONArray;
@ -22,6 +19,11 @@ import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import de.danoeh.antennapod.BuildConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.OpmlImportFromPathActivity;
import de.danoeh.antennapod.receiver.FeedUpdateReceiver;
/**
* Provides access to preferences set by the user in the settings screen. A
* private instance of this class must first be instantiated via
@ -40,6 +42,7 @@ public class UserPreferences implements
public static final String PREF_DISPLAY_ONLY_EPISODES = "prefDisplayOnlyEpisodes";
public static final String PREF_AUTO_DELETE = "prefAutoDelete";
public static final String PREF_AUTO_FLATTR = "pref_auto_flattr";
public static final String PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD = "prefAutoFlattrPlayedDurationThreshold";
public static final String PREF_THEME = "prefTheme";
public static final String PREF_DATA_FOLDER = "prefDataFolder";
public static final String PREF_ENABLE_AUTODL = "prefEnableAutoDl";
@ -52,7 +55,7 @@ public class UserPreferences implements
private static final String PREF_SEEK_DELTA_SECS = "prefSeekDeltaSecs";
// TODO: Make this value configurable
private static final double PLAYED_DURATION_AUTOFLATTR_THRESHOLD = 0.8;
private static final float PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD_DEFAULT = 0.8f;
private static int EPISODE_CACHE_SIZE_UNLIMITED = -1;
@ -68,6 +71,7 @@ public class UserPreferences implements
private boolean displayOnlyEpisodes;
private boolean autoDelete;
private boolean autoFlattr;
private float autoFlattrPlayedDurationThreshold;
private int theme;
private boolean enableAutodownload;
private boolean enableAutodownloadWifiFilter;
@ -87,9 +91,8 @@ public class UserPreferences implements
/**
* Sets up the UserPreferences class.
*
* @throws IllegalArgumentException
* if context is null
* */
* @throws IllegalArgumentException if context is null
*/
public static void createInstance(Context context) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Creating new instance of UserPreferences");
@ -120,6 +123,8 @@ public class UserPreferences implements
displayOnlyEpisodes = sp.getBoolean(PREF_DISPLAY_ONLY_EPISODES, false);
autoDelete = sp.getBoolean(PREF_AUTO_DELETE, false);
autoFlattr = sp.getBoolean(PREF_AUTO_FLATTR, false);
autoFlattrPlayedDurationThreshold = sp.getFloat(PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD,
PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD_DEFAULT);
theme = readThemeValue(sp.getString(PREF_THEME, "0"));
enableAutodownloadWifiFilter = sp.getBoolean(
PREF_ENABLE_AUTODL_WIFI_FILTER, false);
@ -238,6 +243,15 @@ public class UserPreferences implements
return instance.autoFlattr;
}
/**
* Returns the time after which an episode should be auto-flattr'd in percent of the episode's
* duration.
*/
public static float getAutoFlattrPlayedDurationThreshold() {
instanceAvailable();
return instance.autoFlattrPlayedDurationThreshold;
}
public static int getTheme() {
instanceAvailable();
return instance.theme;
@ -349,6 +363,9 @@ public class UserPreferences implements
seekDeltaSecs = Integer.valueOf(sp.getString(PREF_SEEK_DELTA_SECS, "30"));
} else if (key.equals(PREF_PAUSE_ON_HEADSET_DISCONNECT)) {
pauseOnHeadsetDisconnect = sp.getBoolean(PREF_PAUSE_ON_HEADSET_DISCONNECT, true);
} else if (key.equals(PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD)) {
autoFlattrPlayedDurationThreshold = sp.getFloat(PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD,
PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD_DEFAULT);
}
}
@ -379,7 +396,7 @@ public class UserPreferences implements
/**
* Sets the update interval value. Should only be used for testing purposes!
* */
*/
public static void setUpdateInterval(Context context, long newValue) {
instanceAvailable();
SharedPreferences.Editor editor = PreferenceManager
@ -391,12 +408,22 @@ public class UserPreferences implements
instance.updateInterval = newValue;
}
public static void setAutoFlattrSettings(Context context, boolean enabled, float autoFlattrThreshold) {
instanceAvailable();
PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext())
.edit()
.putBoolean(PREF_AUTO_FLATTR, enabled)
.putFloat(PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD, autoFlattrThreshold)
.commit();
instance.autoFlattr = enabled;
instance.autoFlattrPlayedDurationThreshold = autoFlattrThreshold;
}
/**
* Return the folder where the app stores all of its data. This method will
* return the standard data folder if none has been set by the user.
*
* @param type
* The name of the folder inside the data folder. May be null
* @param type The name of the folder inside the data folder. May be null
* when accessing the root of the data folder.
* @return The data folder that has been requested or null if the folder
* could not be created.
@ -463,7 +490,9 @@ public class UserPreferences implements
createImportDirectory();
}
/** Create a .nomedia file to prevent scanning by the media scanner. */
/**
* Create a .nomedia file to prevent scanning by the media scanner.
*/
private static void createNoMediaFile() {
File f = new File(instance.context.getExternalFilesDir(null),
".nomedia");
@ -504,10 +533,9 @@ public class UserPreferences implements
/**
* Updates alarm registered with the AlarmManager service or deactivates it.
*
* @param millis
* new value to register with AlarmManager. If millis is 0, the
* @param millis new value to register with AlarmManager. If millis is 0, the
* alarm is deactivated.
* */
*/
public static void restartUpdateAlarm(long millis) {
instanceAvailable();
if (BuildConfig.DEBUG)
@ -516,7 +544,8 @@ public class UserPreferences implements
.getSystemService(Context.ALARM_SERVICE);
PendingIntent updateIntent = PendingIntent.getBroadcast(
instance.context, 0, new Intent(
FeedUpdateReceiver.ACTION_REFRESH_FEEDS), 0);
FeedUpdateReceiver.ACTION_REFRESH_FEEDS), 0
);
alarmManager.cancel(updateIntent);
if (millis != 0) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, millis, millis,
@ -531,14 +560,9 @@ public class UserPreferences implements
/**
* Reads episode cache size as it is saved in the episode_cache_size_values array.
* */
*/
public static int readEpisodeCacheSize(String valueFromPrefs) {
instanceAvailable();
return instance.readEpisodeCacheSizeInternal(valueFromPrefs);
}
public static double getPlayedDurationAutoflattrThreshold() {
instanceAvailable();
return PLAYED_DURATION_AUTOFLATTR_THRESHOLD;
}
}

View File

@ -763,13 +763,12 @@ public class PlaybackService extends Service {
m.setPlayedDuration(m.getPlayedDuration() + ((int)(deltaPlayedDuration * playbackSpeed)));
// Auto flattr
if (FlattrUtils.hasToken() && UserPreferences.isAutoFlattr() && item.getPaymentLink() != null && item.getFlattrStatus().getUnflattred() &&
(m.getPlayedDuration() > UserPreferences.getPlayedDurationAutoflattrThreshold() * duration)) {
(m.getPlayedDuration() > UserPreferences.getAutoFlattrPlayedDurationThreshold() * duration)) {
if (BuildConfig.DEBUG)
Log.d(TAG, "saveCurrentPosition: performing auto flattr since played duration " + Integer.toString(m.getPlayedDuration())
+ " is " + UserPreferences.getPlayedDurationAutoflattrThreshold() * 100 + "% of file duration " + Integer.toString(duration));
item.getFlattrStatus().setFlattrQueue();
DBWriter.setFeedItemFlattrStatus(PodcastApp.getInstance(), item, false);
+ " is " + UserPreferences.getAutoFlattrPlayedDurationThreshold() * 100 + "% of file duration " + Integer.toString(duration));
DBTasks.flattrItemIfLoggedIn(this, item);
}
}
playable.saveCurrentPosition(PreferenceManager