package de.danoeh.antennapod.core.util.flattr;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.util.Log;
import org.shredzone.flattr4j.FlattrService;
import org.shredzone.flattr4j.exception.FlattrException;
import org.shredzone.flattr4j.model.Flattr;
import org.shredzone.flattr4j.model.Thing;
import org.shredzone.flattr4j.oauth.AccessToken;
import org.shredzone.flattr4j.oauth.AndroidAuthenticator;
import org.shredzone.flattr4j.oauth.Scope;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.EnumSet;
import java.util.List;
import java.util.TimeZone;
import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.asynctask.FlattrTokenFetcher;
import de.danoeh.antennapod.core.storage.DBWriter;
/**
* Utility methods for doing something with flattr.
*/
public class FlattrUtils {
private FlattrUtils(){}
private static final String TAG = "FlattrUtils";
private static final String HOST_NAME = "de.danoeh.antennapod";
private static final String PREF_ACCESS_TOKEN = "de.danoeh.antennapod.preference.flattrAccessToken";
private static volatile AccessToken cachedToken;
private static AndroidAuthenticator createAuthenticator() {
return new AndroidAuthenticator(HOST_NAME, ClientConfig.flattrCallbacks.getFlattrAppKey(),
ClientConfig.flattrCallbacks.getFlattrAppSecret());
}
public static void startAuthProcess(Context context) throws FlattrException {
AndroidAuthenticator auth = createAuthenticator();
auth.setScope(EnumSet.of(Scope.FLATTR));
Intent intent = auth.createAuthenticateIntent();
context.startActivity(intent);
}
private static AccessToken retrieveToken() {
if (cachedToken == null) {
Log.d(TAG, "Retrieving access token");
String token = PreferenceManager.getDefaultSharedPreferences(
ClientConfig.applicationCallbacks.getApplicationInstance())
.getString(PREF_ACCESS_TOKEN, null);
if (token != null) {
Log.d(TAG, "Found access token. Caching.");
cachedToken = new AccessToken(token);
} else {
Log.d(TAG, "No access token found");
return null;
}
}
return cachedToken;
}
/**
* Returns true if FLATTR_APP_KEY and FLATTR_APP_SECRET in BuildConfig are not null and not empty
*/
public static boolean hasAPICredentials() {
return !TextUtils.isEmpty(ClientConfig.flattrCallbacks.getFlattrAppKey())
&& !TextUtils.isEmpty(ClientConfig.flattrCallbacks.getFlattrAppSecret());
}
public static boolean hasToken() {
return retrieveToken() != null;
}
public static void storeToken(AccessToken token) {
Log.d(TAG, "Storing token");
SharedPreferences.Editor editor = PreferenceManager
.getDefaultSharedPreferences(ClientConfig.applicationCallbacks.getApplicationInstance()).edit();
if (token != null) {
editor.putString(PREF_ACCESS_TOKEN, token.getToken());
} else {
editor.putString(PREF_ACCESS_TOKEN, null);
}
editor.commit();
cachedToken = token;
}
public static void deleteToken() {
Log.d(TAG, "Deleting flattr token");
storeToken(null);
}
public static void clickUrl(Context context, String url)
throws FlattrException {
if (hasToken()) {
FlattrService fs = FlattrServiceCreator.getService(retrieveToken());
fs.flattr(url);
} else {
Log.e(TAG, "clickUrl was called with null access token");
}
}
public static List<Flattr> retrieveFlattredThings()
throws FlattrException {
ArrayList<Flattr> myFlattrs = new ArrayList<>();
if (hasToken()) {
FlattrService fs = FlattrServiceCreator.getService(retrieveToken());
Calendar firstOfMonth = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
firstOfMonth.set(Calendar.MILLISECOND, 0);
firstOfMonth.set(Calendar.SECOND, 0);
firstOfMonth.set(Calendar.MINUTE, 0);
firstOfMonth.set(Calendar.HOUR_OF_DAY, 0);
firstOfMonth.set(Calendar.DAY_OF_MONTH, Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH));
Date firstOfMonthDate = firstOfMonth.getTime();
// subscriptions some times get flattrd slightly before midnight - give it an hour leeway
firstOfMonthDate = new Date(firstOfMonthDate.getTime() - 60 * 60 * 1000);
final int FLATTR_COUNT = 30;
final int FLATTR_MAXPAGE = 5;
for (int page = 0; page < FLATTR_MAXPAGE; page++) {
for (Flattr fl : fs.getMyFlattrs(FLATTR_COUNT, page)) {
if (fl.getCreated().after(firstOfMonthDate))
myFlattrs.add(fl);
else
break;
}
}
Log.d(TAG, "Got my flattrs list of length " + Integer.toString(myFlattrs.size()) + " comparison date" + firstOfMonthDate);
for (Flattr fl : myFlattrs) {
Thing thing = fl.getThing();
Log.d(TAG, "Flattr thing: " + fl.getThingId() + " name: " + thing.getTitle() + " url: " + thing.getUrl() + " on: " + fl.getCreated());
}
} else {
Log.e(TAG, "retrieveFlattrdThings was called with null access token");
}
return myFlattrs;
}
public static void handleCallback(Context context, Uri uri) {
AndroidAuthenticator auth = createAuthenticator();
new FlattrTokenFetcher(context, auth, uri).executeAsync();
}
public static void revokeAccessToken(Context context) {
Log.d(TAG, "Revoking access token");
deleteToken();
FlattrServiceCreator.deleteFlattrService();
showRevokeDialog(context);
DBWriter.clearAllFlattrStatus();
}
// ------------------------------------------------ DIALOGS
public static void showRevokeDialog(final Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.access_revoked_title);
builder.setMessage(R.string.access_revoked_info);
builder.setNeutralButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.create().show();
}
/**
* Opens a dialog that ask the user to either connect the app with flattr or to be redirected to
* the thing's website.
* If no API credentials are available, the user will immediately be redirected to the thing's website.
*/
public static void showNoTokenDialogOrRedirect(final Context context, final String url) {
if (hasAPICredentials()) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.no_flattr_token_title);
builder.setMessage(R.string.no_flattr_token_msg);
builder.setPositiveButton(R.string.authenticate_now_label,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
context.startActivity(
ClientConfig.flattrCallbacks.getFlattrAuthenticationActivityIntent(context));
}
}
);
builder.setNegativeButton(R.string.visit_website_label,
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri uri = Uri.parse(url);
context.startActivity(new Intent(Intent.ACTION_VIEW,
uri));
}
}
);
builder.create().show();
} else {
Uri uri = Uri.parse(url);
context.startActivity(new Intent(Intent.ACTION_VIEW, uri));
}
}
public static void showErrorDialog(final Context context, final String msg) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.error_label);
builder.setMessage(msg);
builder.setNeutralButton(android.R.string.ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.create().show();
}
}