package com.njlabs.showjava.ui;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.Constants;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.crashlytics.android.Crashlytics;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.njlabs.showjava.BuildConfig;
import com.njlabs.showjava.R;
import com.njlabs.showjava.utils.AesCbcWithIntegrity;
import com.njlabs.showjava.utils.Verify;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import cz.msebera.android.httpclient.Header;
import xyz.codezero.apl.SV;
public class PurchaseActivity extends BaseActivity implements BillingProcessor.IBillingHandler {
private BillingProcessor bp;
private ProgressBar progressBar;
private LinearLayout mainLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupLayout(R.layout.activity_purchase);
if(!checkDataConnection()) {
Toast.makeText(this,"Internet connection is required to purchase",Toast.LENGTH_LONG).show();
finish();
}
try {
AesCbcWithIntegrity.SecretKeys keys = new AesCbcWithIntegrity.SecretKeys(getResources().getString(R.string.cc),getResources().getString(R.string.ii));
String plainText = AesCbcWithIntegrity.decryptString(BuildConfig.GOOGLE_PLAY_LICENSE_KEY, keys);
bp = new BillingProcessor(this, plainText, this);
} catch (GeneralSecurityException | UnsupportedEncodingException e) {
Crashlytics.logException(e);
Toast.makeText(this,"An unexpected error occurred",Toast.LENGTH_SHORT).show();
finish();
}
progressBar = (ProgressBar) findViewById(R.id.progressBar);
mainLayout = (LinearLayout) findViewById(R.id.mainLayout);
if(!Verify.good(baseContext)){
put(false);
AlertDialog.Builder alertDialog = new AlertDialog.Builder(baseContext, R.style.AlertDialog);
alertDialog.setCancelable(false);
alertDialog.setMessage("You cannot purchase Show Java Pro. Either you have Lucky Patcher (or) Freedom (or) the apk has been tampered with. If you have really purchased Pro, please fix the above mentioned errors to get the purchase restored.");
alertDialog.setPositiveButton("I Understand", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(baseContext, "Thanks for understanding ... :)", Toast.LENGTH_LONG).show();
finish();
}
});
alertDialog.setNegativeButton("I'm a Pirate", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(baseContext, "Well... I'm not :)", Toast.LENGTH_LONG).show();
finish();
}
});
alertDialog.show();
}
}
public void initiateBuy(View v) {
progressBar.setVisibility(View.VISIBLE);
mainLayout.setVisibility(View.GONE);
bp.purchase(this, BuildConfig.IAP_PRODUCT_ID);
}
@Override
public void onBillingInitialized() {
bp.loadOwnedPurchasesFromGoogle();
}
@Override
public void onProductPurchased(String productId, final TransactionDetails transactionDetails) {
if(transactionDetails.productId.equals(BuildConfig.IAP_PRODUCT_ID) && transactionDetails.productId.equals(productId) && productId.equals(BuildConfig.IAP_PRODUCT_ID)) {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("payload", SV.gen(baseContext,transactionDetails.purchaseToken));
params.put("order_id", transactionDetails.orderId);
client.post(com.njlabs.showjava.Constants.VERIFICATION_URL, params,
new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
if(response.has("status") && response.getString("status").equals("ok")) {
if(response.has("payload")){
if(SV.good(baseContext,response.getString("payload"),transactionDetails.purchaseToken)){
showPurchased();
} else {
showError();
}
} else {
showError();
}
} else {
showError();
}
} catch (JSONException e) {
showError();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
if(checkDataConnection()) {
Toast.makeText(baseContext, "An error occurred while verifying your purchase.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(baseContext, "Lost internet connection while verifying your purchase.", Toast.LENGTH_SHORT).show();
}
}
});
}
}
@Override
public void onBillingError(int i, Throwable throwable) {
progressBar.setVisibility(View.GONE);
mainLayout.setVisibility(View.VISIBLE);
switch (i) {
case Constants.BILLING_RESPONSE_RESULT_USER_CANCELED:
Toast.makeText(this,"The process was cancelled",Toast.LENGTH_SHORT).show();
break;
case Constants.BILLING_RESPONSE_RESULT_ERROR:
Toast.makeText(this,"An error occurred while processing your payment. Please try again",Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this,"An error occurred while processing your request",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onPurchaseHistoryRestored() {
Toast.makeText(baseContext, "Checking if you have already bought Pro :)", Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.VISIBLE);
mainLayout.setVisibility(View.GONE);
try {
final TransactionDetails transactionDetails = bp.getPurchaseTransactionDetails(BuildConfig.IAP_PRODUCT_ID);
if(transactionDetails.productId.equals(BuildConfig.IAP_PRODUCT_ID)) {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("payload", SV.gen(baseContext,transactionDetails.purchaseToken));
params.put("order_id", transactionDetails.orderId);
client.post(com.njlabs.showjava.Constants.VERIFICATION_URL, params,
new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
if (response.has("status") && response.getString("status").equals("ok")) {
if (response.has("payload")) {
if (SV.good(baseContext,response.getString("payload"),transactionDetails.purchaseToken)) {
showPurchased();
} else {
showError();
}
} else {
showError();
}
} else {
showError();
}
} catch (JSONException e) {
showError();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
progressBar.setVisibility(View.GONE);
mainLayout.setVisibility(View.VISIBLE);
if(checkDataConnection()) {
Toast.makeText(baseContext, "An error occurred while restoring your purchases.", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(baseContext, "Lost internet connection while restoring your purchases.", Toast.LENGTH_SHORT).show();
}
}
});
} else {
put(false);
progressBar.setVisibility(View.GONE);
mainLayout.setVisibility(View.VISIBLE);
}
} catch (Exception ignored) {
put(false);
progressBar.setVisibility(View.GONE);
mainLayout.setVisibility(View.VISIBLE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!bp.handleActivityResult(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
if (bp != null)
bp.release();
super.onDestroy();
}
public void showPurchased() {
put(true);
Toast.makeText(this, "Thank you for purchasing Show Java Pro :)", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(baseContext, Landing.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
public void showError() {
progressBar.setVisibility(View.GONE);
mainLayout.setVisibility(View.VISIBLE);
Toast.makeText(this, "Your purchase could not be verified.", Toast.LENGTH_SHORT).show();
}
}