trialware stuff, bump version
This commit is contained in:
parent
f27ffe5f0a
commit
204ee6d4b9
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
@ -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;
|
||||||
|
@ -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");
|
||||||
|
@ -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:
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user