trialware stuff, bump version

This commit is contained in:
Andrew Dolgov 2012-12-27 00:01:39 +04:00
parent f27ffe5f0a
commit 204ee6d4b9
7 changed files with 95 additions and 111 deletions

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.fox.ttrss" package="org.fox.ttrss"
android:versionCode="119" android:versionCode="122"
android:versionName="0.9.3" > android:versionName="1.0" >
<uses-sdk <uses-sdk
android:minSdkVersion="8" android:minSdkVersion="8"

View File

@ -134,7 +134,7 @@
<item <item
android:id="@+id/donate" android:id="@+id/donate"
android:showAsAction="" android:showAsAction=""
android:title="@string/donate"/> android:title="@string/trial_purchase"/>
</group> </group>
<item <item

View File

@ -147,4 +147,8 @@
<string name="prefs_dim_status_bar">Dim status bar</string> <string name="prefs_dim_status_bar">Dim status bar</string>
<string name="prefs_dim_status_bar_long">Dim status bar when reading</string> <string name="prefs_dim_status_bar_long">Dim status bar when reading</string>
<string name="article_comments">%1$d comments</string> <string name="article_comments">%1$d comments</string>
<string name="trial_mode_prompt">Trial mode, %1$d day(s) left.</string>
<string name="trial_purchase">Unlock full version</string>
<string name="trial_expired">Trial expired</string>
<string name="trial_expired_message">To continue using Tiny Tiny RSS please unlock the full version by purchasing the key.</string>
</resources> </resources>

View File

@ -1,8 +1,13 @@
package org.fox.ttrss; package org.fox.ttrss;
import java.util.List;
import org.fox.ttrss.util.DatabaseHelper; import org.fox.ttrss.util.DatabaseHelper;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;

View File

@ -107,7 +107,7 @@ public class FeedsActivity extends OnlineActivity implements HeadlinesEventListe
ft.commit(); ft.commit();
AppRater.appLaunched(this); AppRater.appLaunched(this);
checkTrial(true);
} }
} else { // savedInstanceState != null } else { // savedInstanceState != null
m_actionbarUpEnabled = savedInstanceState.getBoolean("actionbarUpEnabled"); m_actionbarUpEnabled = savedInstanceState.getBoolean("actionbarUpEnabled");

View File

@ -49,6 +49,8 @@ import com.google.gson.reflect.TypeToken;
public class OnlineActivity extends CommonActivity { public class OnlineActivity extends CommonActivity {
private final String TAG = this.getClass().getSimpleName(); private final String TAG = this.getClass().getSimpleName();
private final static int TRIAL_DAYS = 8;
protected SharedPreferences m_prefs; protected SharedPreferences m_prefs;
protected Menu m_menu; protected Menu m_menu;
@ -160,6 +162,7 @@ public class OnlineActivity extends CommonActivity {
if (isOffline) { if (isOffline) {
switchOfflineSuccess(); switchOfflineSuccess();
} else { } else {
checkTrial(false);
/* if (getIntent().getExtras() != null) { /* if (getIntent().getExtras() != null) {
Intent i = getIntent(); Intent i = getIntent();
@ -440,17 +443,90 @@ public class OnlineActivity extends CommonActivity {
if (hasPendingOfflineData()) if (hasPendingOfflineData())
syncOfflineData(); syncOfflineData();
finish();
}
public void checkTrial(boolean notify) {
List<PackageInfo> pkgs = getPackageManager() List<PackageInfo> pkgs = getPackageManager()
.getInstalledPackages(0); .getInstalledPackages(0);
boolean isTrial = true;
for (PackageInfo p : pkgs) { for (PackageInfo p : pkgs) {
if ("org.fox.ttrss.key".equals(p.packageName)) { if ("org.fox.ttrss.key".equals(p.packageName)) {
toast(R.string.donate_thanks); //toast(R.string.donate_thanks);
isTrial = false;
break; break;
} }
} }
finish(); if (isTrial) {
long firstStart = m_prefs.getLong("date_firstlaunch_trial", -1);
if (firstStart == -1) {
firstStart = System.currentTimeMillis();
SharedPreferences.Editor editor = m_prefs.edit();
editor.putLong("date_firstlaunch_trial", firstStart);
editor.commit();
}
if (!notify && System.currentTimeMillis() > firstStart + (TRIAL_DAYS * 24 * 60 * 60 * 1000)) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.trial_expired)
.setMessage(R.string.trial_expired_message)
.setCancelable(false)
.setPositiveButton(getString(R.string.trial_purchase),
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
openUnlockUrl();
finish();
}
})
.setNegativeButton(getString(R.string.cancel),
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
finish();
}
});
AlertDialog dialog = builder.create();
dialog.show();
} else {
long daysLeft = Math.round((firstStart + (TRIAL_DAYS * 24 * 60 * 60 * 1000) - System.currentTimeMillis()) / (24 * 60 * 60 * 1000));
if (notify) {
toast(getString(R.string.trial_mode_prompt, Long.valueOf(daysLeft)));
}
}
}
}
private void openUnlockUrl() {
try {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=org.fox.ttrss.key"));
startActivity(intent);
} catch (ActivityNotFoundException ae) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=org.fox.ttrss.key"));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
toast(R.string.error_other_error);
}
}
} }
@Override @Override
@ -464,20 +540,7 @@ public class OnlineActivity extends CommonActivity {
return true; return true;
case R.id.donate: case R.id.donate:
if (true) { if (true) {
try { openUnlockUrl();
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=org.fox.ttrss.key"));
startActivity(intent);
} catch (ActivityNotFoundException ae) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("https://play.google.com/store/apps/details?id=org.fox.ttrss.key"));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
toast(R.string.error_other_error);
}
}
} }
return true; return true;
case R.id.logout: case R.id.logout:

View File

@ -2,16 +2,11 @@ package org.fox.ttrss.util;
// From http://androidsnippets.com/prompt-engaged-users-to-rate-your-app-in-the-android-market-appirater // From http://androidsnippets.com/prompt-engaged-users-to-rate-your-app-in-the-android-market-appirater
import java.util.List;
import org.fox.ttrss.R;
import android.app.Dialog; import android.app.Dialog;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.net.Uri; import android.net.Uri;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -22,32 +17,14 @@ import android.widget.TextView;
public class AppRater { public class AppRater {
private final static String APP_TITLE = "Tiny Tiny RSS"; private final static String APP_TITLE = "Tiny Tiny RSS";
private final static String APP_PNAME = "org.fox.ttrss"; private final static String APP_PNAME = "org.fox.ttrss";
private final static String DONATE_APP_PNAME = "org.fox.ttrss.key";
private final static int DAYS_UNTIL_PROMPT = 3; private final static int DAYS_UNTIL_PROMPT = 3;
private final static int LAUNCHES_UNTIL_PROMPT = 7; private final static int LAUNCHES_UNTIL_PROMPT = 7;
private final static int DONATION_DAYS_UNTIL_PROMPT = DAYS_UNTIL_PROMPT * 10;
private final static int DONATION_LAUNCHES_UNTIL_PROMPT = LAUNCHES_UNTIL_PROMPT * 3;
public static boolean isDonationApkInstalled(Context mContext) {
List<PackageInfo> pkgs = mContext.getPackageManager()
.getInstalledPackages(0);
for (PackageInfo p : pkgs) {
if (DONATE_APP_PNAME.equals(p.packageName)) {
return true;
}
}
return false;
}
public static void appLaunched(Context mContext) { public static void appLaunched(Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0); SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0);
if (prefs.getBoolean("dontshowagain", false) && if (prefs.getBoolean("dontshowagain", false)) { return ; }
prefs.getBoolean("donate_dontshowagain", false)) { return ; }
SharedPreferences.Editor editor = prefs.edit(); SharedPreferences.Editor editor = prefs.edit();
@ -62,82 +39,17 @@ public class AppRater {
editor.putLong("date_firstlaunch", date_firstLaunch); editor.putLong("date_firstlaunch", date_firstLaunch);
} }
boolean rateDialogShown = false;
// Wait at least n days before opening // Wait at least n days before opening
if (launch_count >= LAUNCHES_UNTIL_PROMPT && if (launch_count >= LAUNCHES_UNTIL_PROMPT &&
!prefs.getBoolean("dontshowagain", false) && !prefs.getBoolean("dontshowagain", false) &&
System.currentTimeMillis() >= date_firstLaunch + (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) { System.currentTimeMillis() >= date_firstLaunch + (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) {
rateDialogShown = true; showRateDialog(mContext, editor);
showRateDialog(mContext, editor);
}
if (launch_count >= DONATION_LAUNCHES_UNTIL_PROMPT &&
!prefs.getBoolean("donate_dontshowagain", false) &&
!rateDialogShown &&
!isDonationApkInstalled(mContext) &&
System.currentTimeMillis() >= date_firstLaunch + (DONATION_DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) {
showDonationDialog(mContext, editor);
} }
editor.commit(); editor.commit();
} }
public static void showDonationDialog(final Context mContext, final SharedPreferences.Editor editor) {
final Dialog dialog = new Dialog(mContext);
dialog.setTitle("Donate to " + APP_TITLE);
LinearLayout ll = new LinearLayout(mContext);
ll.setOrientation(LinearLayout.VERTICAL);
TextView tv = new TextView(mContext);
tv.setText("If you enjoy using " + APP_TITLE + ", please consider donating. Your $1.99 could go a long way towards continued support of this project. Thanks!");
tv.setWidth(240);
tv.setPadding(4, 0, 4, 10);
ll.addView(tv);
Button b1 = new Button(mContext);
b1.setText("Donate!");
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + DONATE_APP_PNAME)));
} catch (ActivityNotFoundException e) {
mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + DONATE_APP_PNAME)));
}
dialog.dismiss();
}
});
ll.addView(b1);
Button b2 = new Button(mContext);
b2.setText("Remind me later");
b2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
ll.addView(b2);
Button b3 = new Button(mContext);
b3.setText("No, thanks");
b3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (editor != null) {
editor.putBoolean("donate_dontshowagain", true);
editor.commit();
}
dialog.dismiss();
}
});
ll.addView(b3);
dialog.setContentView(ll);
dialog.show();
}
public static void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) { public static void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) {
final Dialog dialog = new Dialog(mContext); final Dialog dialog = new Dialog(mContext);
dialog.setTitle("Rate " + APP_TITLE); dialog.setTitle("Rate " + APP_TITLE);