Made automatic flattr threshold configurable
This commit is contained in:
parent
0513302c78
commit
f97a71d2f9
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue