Changed IAB logic

Still crashing:

11-19 09:18:19.688 28800 28800 E AndroidRuntime: java.lang.NullPointerException: Attempt to read from field 'com.google.android.finsky.protos.Acquisition$AutoDismissTemplate com.google.android.finsky.protos.Acquisition$PostAcquisitionPrompt.autoDismissTemplate' on a null object reference
11-19 09:18:19.688 28800 28800 E AndroidRuntime: 	at com.google.android.finsky.billing.SuccessStep.getLayoutResId(SuccessStep.java:75)
11-19 09:18:19.688 28800 28800 E AndroidRuntime: 	at com.google.android.finsky.billing.lightpurchase.PurchaseFragment.onStateChange(PurchaseFragment.java:31066)
11-19 09:18:19.688 28800 28800 E AndroidRuntime: 	at com.google.android.finsky.fragments.SidecarFragment.notifyListener(SidecarFragment.java:255)
11-19 09:18:19.688 28800 28800 E AndroidRuntime: 	at com.google.android.finsky.fragments.SidecarFragment.setState(SidecarFragment.java:250)
11-19 09:18:19.688 28800 28800 E AndroidRuntime: 	at com.google.android.finsky.billing.lightpurchase.CheckoutPurchaseSidecar.confirmAuthChoiceSelected(CheckoutPurchaseSidecar.java:631)
11-19 09:18:19.688 28800 28800 E AndroidRuntime: 	at com.google.android.finsky.billing.lightpurchase.purchasesteps.SuccessStepWithAuthChoices.onClick(SuccessStepWithAuthChoices.java:5156)
This commit is contained in:
M66B 2015-11-19 09:21:00 +01:00
parent e66daf0e4d
commit 878ba1eeec
2 changed files with 40 additions and 33 deletions

View File

@ -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();

View File

@ -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) {