package ru.perm.trubnikov.gps2sms;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;
public class DonateActivity extends BaseActivity {
private static final String LICENSE_KEY = null; // PUT YOUR MERCHANT KEY HERE; // UPD: NO NEED to verify donations
private BillingProcessor bp;
private boolean readyToPurchase = false;
private final String PRODUCT_ID_1 = "donation_1";
private final String PRODUCT_ID_2 = "donation_2";
private final String PRODUCT_ID_3 = "donation_3";
private final String PRODUCT_ID_4 = "donation_4";
private final String PRODUCT_ID_5 = "donation_5";
@Override
public 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();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ShowBackButton();
setContentView(R.layout.activity_donate);
bp = new BillingProcessor(DonateActivity.this, LICENSE_KEY, new BillingProcessor.IBillingHandler() {
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
//DBHelper.ShowToastT(DonateActivity.this, "onProductPurchased: " + productId, Toast.LENGTH_LONG);
refreshPurchasesStatus();
}
@Override
public void onBillingError(int errorCode, Throwable error) {
// DBHelper.ShowToastT(DonateActivity.this, "onBillingError: " + Integer.toString(errorCode), Toast.LENGTH_LONG);
refreshPurchasesStatus();
}
@Override
public void onBillingInitialized() {
readyToPurchase = true;
DonatePriceTextLoadAsyncTask mt = new DonatePriceTextLoadAsyncTask();
mt.execute();
}
@Override
public void onPurchaseHistoryRestored() {
//DBHelper.ShowToastT(DonateActivity.this, "onPurchaseHistoryRestored", Toast.LENGTH_LONG);
refreshPurchasesStatus();
}
});
// ListView on Fragments
DonateListFragment fragment = new DonateListFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.frgmCont, fragment).commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.donate_actions, menu);
return (super.onCreateOptionsMenu(menu));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.action_refresh:
refreshPurchasesStatus();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void ShowBackButton() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
/**
* Restores purchases, refreshes purchases local cache
*/
private void refreshPurchasesStatus() {
DonateStatusesLoadAsyncTask st = new DonateStatusesLoadAsyncTask();
st.execute();
}
public void tryToPurchase(String productId) {
if (readyToPurchase) {
refreshPurchasesStatus();
if (bp.isPurchased(productId)) {
DBHelper.ShowToast(DonateActivity.this, R.string.donation_already_purchased, Toast.LENGTH_LONG);
} else {
bp.purchase(DonateActivity.this, productId);
}
} else {
DBHelper.ShowToast(DonateActivity.this, R.string.donation_billing_not_ready, Toast.LENGTH_LONG);
}
}
public String getProductId(int idx) {
switch (idx) {
case 1:
return PRODUCT_ID_1;
case 2:
return PRODUCT_ID_2;
case 3:
return PRODUCT_ID_3;
case 4:
return PRODUCT_ID_4;
case 5:
return PRODUCT_ID_5;
default:
return "error_product_id";
}
}
/**
* AsyncTask for loading text descriptions of purchases
*/
class DonatePriceTextLoadAsyncTask extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
String[] progress = new String[]{"", "", "", "", ""};
for (int i = 0; i <= 4; i++) {
//TimeUnit.SECONDS.sleep(1);
progress[i] = bp.getPurchaseListingDetails(getProductId(i + 1)).priceText;
publishProgress(progress);
}
} catch (Exception e) {
Log.d("gps2sms", "---> Cannot load priceText from Google Play ");
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
try {
DonateListFragment fragment = (DonateListFragment) getSupportFragmentManager().findFragmentById(R.id.frgmCont);
fragment.refreshListItemsDescs(values[0], values[1], values[2], values[3], values[4]);
} catch (Exception e) {
Log.d("gps2sms", "---> Cannot set prices (onProgressUpdate)");
}
}
}
/**
* AsyncTask for checking purchases which were made by user.
* Also synchronizes completed purchases with local settings.
*/
class DonateStatusesLoadAsyncTask extends AsyncTask<Void, Void, WrapperStatuses> {
@Override
protected WrapperStatuses doInBackground(Void... params) {
try {
WrapperStatuses res = new WrapperStatuses();
if (bp.loadOwnedPurchasesFromGoogle()) {
for (int i = 1; i <= 5; i++) {
res.statuses[i - 1] = bp.isPurchased(getProductId(i)) ? 1 : 0;
}
}
return res;
} catch (Exception e) {
Log.d("gps2sms", "---> failed to retrieve purchases statuses from Google Play");
}
return null;
}
@Override
protected void onPostExecute(WrapperStatuses result) {
super.onPostExecute(result);
try {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(DonateActivity.this);
SharedPreferences.Editor editor = settings.edit();
for (int i = 1; i <= 5; i++) {
editor.putInt("prefDonate" + i, result.statuses[i - 1]);
}
editor.commit();
DonateListFragment fragment = (DonateListFragment) getSupportFragmentManager().findFragmentById(R.id.frgmCont);
fragment.refreshListItemsStatus(settings.getInt("prefDonate1", 0),
settings.getInt("prefDonate2", 0),
settings.getInt("prefDonate3", 0),
settings.getInt("prefDonate4", 0),
settings.getInt("prefDonate5", 0));
} catch (Exception e) {
Log.d("gps2sms", "---> failed to refresh list (onPostExecute)");
}
}
}
public class WrapperStatuses {
public Integer[] statuses = new Integer[]{0, 0, 0, 0, 0};
}
}