diff --git a/app/src/main/java/eu/faircode/netguard/ActivityMain.java b/app/src/main/java/eu/faircode/netguard/ActivityMain.java index 7d5858cb..c6001b79 100644 --- a/app/src/main/java/eu/faircode/netguard/ActivityMain.java +++ b/app/src/main/java/eu/faircode/netguard/ActivityMain.java @@ -20,6 +20,7 @@ package eu.faircode.netguard; */ import android.app.AlertDialog; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -259,20 +260,12 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences SinkholeService.start(this); } else if (requestCode == REQUEST_IAB) { - if (resultCode == RESULT_OK) { - // Handle donation - Intent intent = new Intent(IAB.ACTION_PURCHASED); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } else { - int response = (data == null ? -1 : data.getIntExtra("RESPONSE_CODE", -1)); - Log.i(TAG, "IAB response=" + IAB.getIABResult(response)); - - // Fail-safe - Intent donate = new Intent(Intent.ACTION_VIEW); - donate.setData(Uri.parse("http://www.netguard.me/")); - if (donate.resolveActivity(getPackageManager()) != null) - startActivity(donate); - } + // Handle IAB result + Intent intent = new Intent(IAB.ACTION_IAB); + intent.putExtra("RESULT_CODE", resultCode); + if (data != null) + intent.putExtra("RESPONSE_CODE", data.getIntExtra("RESPONSE_CODE", -1)); + LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } else if (requestCode == REQUEST_INVITE) { // Do nothing @@ -470,15 +463,16 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences @Override public void onClick(View view) { try { - IntentSender sender = iab.getIntentSender(); - if (sender == null) { + PendingIntent pi = iab.getIntentSender(); + if (pi == null) { Log.i(TAG, "Donate"); Intent donate = new Intent(Intent.ACTION_VIEW); donate.setData(Uri.parse("http://www.netguard.me/")); startActivity(donate); } else { + btnDonate.setEnabled(false); Log.i(TAG, "IAB donate"); - startIntentSenderForResult(sender, REQUEST_IAB, new Intent(), 0, 0, 0); + startIntentSenderForResult(pi.getIntentSender(), REQUEST_IAB, new Intent(), 0, 0, 0); } } catch (Throwable ex) { Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex)); @@ -486,24 +480,36 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences } }); - // Handle donated - final BroadcastReceiver onIABPurchased = new BroadcastReceiver() { + // Handle IAB result + final BroadcastReceiver onIABResult = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Log.i(TAG, "IAB donated"); + int resultCode = intent.getIntExtra("RESULT_CODE", RESULT_CANCELED); + int responseCode = intent.getIntExtra("RESPONSE_CODE", -1); + final boolean ok = (resultCode == RESULT_OK); + Log.i(TAG, "IAB result ok=" + ok + " response=" + IAB.getIABResult(responseCode)); + runOnUiThread(new Runnable() { @Override public void run() { if (running) { - btnDonate.setVisibility(View.GONE); - tvThanks.setVisibility(View.VISIBLE); + btnDonate.setEnabled(true); + if (ok) { + btnDonate.setVisibility(View.GONE); + tvThanks.setVisibility(View.VISIBLE); + } else { + Intent donate = new Intent(Intent.ACTION_VIEW); + donate.setData(Uri.parse("http://www.netguard.me/")); + if (donate.resolveActivity(getPackageManager()) != null) + startActivity(donate); + } } } }); } }; - IntentFilter iff = new IntentFilter(IAB.ACTION_PURCHASED); - LocalBroadcastManager.getInstance(this).registerReceiver(onIABPurchased, iff); + IntentFilter iff = new IntentFilter(IAB.ACTION_IAB); + LocalBroadcastManager.getInstance(this).registerReceiver(onIABResult, iff); // Show dialog dialogAbout = new AlertDialog.Builder(this) @@ -513,7 +519,7 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences @Override public void onDismiss(DialogInterface dialogInterface) { if (running) - LocalBroadcastManager.getInstance(ActivityMain.this).unregisterReceiver(onIABPurchased); + LocalBroadcastManager.getInstance(ActivityMain.this).unregisterReceiver(onIABResult); iab.unbind(); diff --git a/app/src/main/java/eu/faircode/netguard/IAB.java b/app/src/main/java/eu/faircode/netguard/IAB.java index 89b9aaa0..8f73781d 100644 --- a/app/src/main/java/eu/faircode/netguard/IAB.java +++ b/app/src/main/java/eu/faircode/netguard/IAB.java @@ -19,6 +19,7 @@ package eu.faircode.netguard; Copyright 2015 by Marcel Bokhorst (M66B) */ +import android.app.Activity; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; @@ -50,7 +51,7 @@ public class IAB implements ServiceConnection { // adb shell am start -n eu.faircode.netguard/eu.faircode.netguard.ActivityMain private static final String SKU_DONATE = "donation"; // private static final String SKU_DONATE = "android.test.purchased"; - public static final String ACTION_PURCHASED = "eu.faircode.netguard.IAB"; + public static final String ACTION_IAB = "eu.faircode.netguard.IAB"; public IAB(Context context) { this.context = context; @@ -63,8 +64,8 @@ public class IAB implements ServiceConnection { context.bindService(serviceIntent, this, Context.BIND_AUTO_CREATE); } - public IntentSender getIntentSender() throws RemoteException { - return (service != null && available ? IABgetIntent(SKU_DONATE) : null); + public PendingIntent getIntentSender() throws RemoteException { + return (service != null && available ? IABgetBuyIntent(SKU_DONATE) : null); } public void unbind() { @@ -82,7 +83,8 @@ public class IAB implements ServiceConnection { service = IInAppBillingService.Stub.asInterface(binder); if (IABisPurchased(SKU_DONATE)) { - Intent intent = new Intent(ACTION_PURCHASED); + Intent intent = new Intent(ACTION_IAB); + intent.putExtra("RESULT_CODE", Activity.RESULT_OK); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } else available = (service != null && IABisAvailable(SKU_DONATE)); @@ -144,16 +146,15 @@ public class IAB implements ServiceConnection { return (skus != null && skus.contains(sku)); } - private IntentSender IABgetIntent(String sku) throws RemoteException { - Bundle bundle = service.getBuyIntent(IAB_VERSION, context.getPackageName(), sku, "inapp", ""); + private PendingIntent IABgetBuyIntent(String sku) throws RemoteException { + Bundle bundle = service.getBuyIntent(IAB_VERSION, context.getPackageName(), sku, "inapp", "netguard"); Log.i(TAG, "getBuyIntent"); Util.logBundle(TAG, bundle); int response = (bundle == null ? -1 : bundle.getInt("RESPONSE_CODE", -1)); Log.i(TAG, "Response=" + getIABResult(response)); if (response != 0 || !bundle.containsKey("BUY_INTENT")) return null; - PendingIntent pi = bundle.getParcelable("BUY_INTENT"); - return (pi == null ? null : pi.getIntentSender()); + return bundle.getParcelable("BUY_INTENT"); } public static String getIABResult(int responseCode) {