package com.ru.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.PurchaseInfo;
import com.anjlab.android.iab.v3.SkuDetails;
import com.anjlab.android.iab.v3.TransactionDetails;
///Перед началом тестов,желательно добавить карту заново.
///Конец работы 14.08.2020.
///Весь код написан на java.
public class mainactivity extends AppCompatActivity implements BillingProcessor.IBillingHandler {
BillingProcessor mBillingProcessor;
private final static String ONE_TIME_PAYMENT = "otp";
private final static String SUBSCRIPTION = "subs";
///Вводим ключ из коносли
private final static String GPLAY_LICENSE = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnjzOg5BORvyrs6yRBjTqDdSisuHfTJGYO5ciWRbNlG8T9b0WTGfFsJAVjc31TMYERFg/w+N2Ugyj5+dgE564HORY7N23tYp6p0Iv3ozC7+z5BaNMdRGMkz6tlQFu2xqYkRjj4/yIOhq7xnnIVNohfE66N6Tleov2szfSLaIQ/3UU20zlcophWXVMMg/Hxu0raYtl9jAoJKMG9jk2iC4aI2qTLD0ulmHuesiNOtCFlntVmI9eqkiPgFpf9PoIgZyyOgYZJvXT6EK4E4DYjErY7F7YM8OsEwUDsbOzZdBS+HkxmGlcJLZmRmhBRp4s1TfcIlMhyfWKAQcdx8gHLyLYzwIDAQAB";
///Назначаем кнопки ч1.
///Смотрим ID в XML файле.
private Button mSingleTimePaymentButton;
private Button mConsumabelButton;
private Button mSubscriptionButton;
private View mProgress;
///Для работы будем использовать BillingProcessor.
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBillingProcessor = new BillingProcessor(this, GPLAY_LICENSE, this);
///Назначаем слушители ч2.
mProgress = findViewById(R.id.progress);
mSingleTimePaymentButton = findViewById(R.id.btnSingleTypePayment);
mConsumabelButton = findViewById(R.id.btnConsume);
mSubscriptionButton = findViewById(R.id.btnSubscription);
///Инициализация BillingProcessor
boolean isAvailable = BillingProcessor.isIabServiceAvailable(this);
if (!isAvailable) {
mProgress.setVisibility(View.GONE);
showMsg(getString(R.string.billing_not_available));
} else {
mBillingProcessor.initialize();
}
setupButtonClickListeners();
}
private void setupButtonClickListeners() {
mSingleTimePaymentButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBillingProcessor.purchase(mainactivity.this, ONE_TIME_PAYMENT);
}
});
mSubscriptionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBillingProcessor.subscribe(mainactivity.this, SUBSCRIPTION);
}
});
mConsumabelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean consumptionResult = mBillingProcessor.consumePurchase(ONE_TIME_PAYMENT);
if (consumptionResult) {
setupConsumableButtons(false);
}
}
});
}
///Как только процессор подгрузился можно загрузить уже купленные продукты.
@Override
public void onBillingInitialized() {
showMsg("onBillingInitialized");
if (mBillingProcessor.loadOwnedPurchasesFromGoogle()) {
handleLoadedItems();
}
}
///Обработка покупки,выдаем цифровой товар.
@Override
public void onProductPurchased(String productId, TransactionDetails details) {
showMsg("onProductPurchased");
if (checkIfPurchaseIsValid(details.purchaseInfo)) {
showMsg("purchase: " + productId + " COMPLETED");
switch (productId) {
case ONE_TIME_PAYMENT:
setupConsumableButtons(true);
break;
case SUBSCRIPTION:
setupSubscription(true);
break;
}
} else {
showMsg("fakePayment");
}
}
private boolean checkIfPurchaseIsValid(PurchaseInfo purchaseInfo) {
return false;
}
///Если что случиться,выдаем ошибку.
@Override
public void onBillingError(int errorCode, Throwable error) {
showMsg("onBillingError");
}
///Если кеш не готов, в программу придет асинхронный вызов, что история покупок была восстановлена.
@Override
public void onPurchaseHistoryRestored() {
showMsg("onPurchaseHistoryRestored");
handleLoadedItems();
}
///В любом случае мы получаем список ранее купленных вещей в нашем приложении.
private void handleLoadedItems() {
mProgress.setVisibility(View.GONE);
boolean isOneTimePurchaseSupported = mBillingProcessor.isOneTimePurchaseSupported();
if (isOneTimePurchaseSupported) {
mSingleTimePaymentButton.setVisibility(View.VISIBLE);
mConsumabelButton.setVisibility(View.VISIBLE);
} else {
showMsg(getString(R.string.one_time_payment_not_supported));
}
boolean isSubsUpdateSupported = mBillingProcessor.isSubscriptionUpdateSupported();
if (isSubsUpdateSupported) {
mSubscriptionButton.setVisibility(View.VISIBLE);
} else {
showMsg(getString(R.string.subscription_not_supported));
}
setupConsumableButtons(mBillingProcessor.listOwnedProducts().contains(ONE_TIME_PAYMENT));
setupSubscription(mBillingProcessor.listOwnedSubscriptions().contains(SUBSCRIPTION));
}
private void setupConsumableButtons(boolean isPurchased) {
mConsumabelButton.setEnabled(isPurchased);
mSingleTimePaymentButton.setEnabled(!isPurchased);
if (isPurchased) {
mSingleTimePaymentButton.setText(R.string.already_bought);
mConsumabelButton.setText(R.string.consume_one_time);
} else {
SkuDetails details = mBillingProcessor.getPurchaseListingDetails(ONE_TIME_PAYMENT);
mSingleTimePaymentButton.setText(getString(R.string.one_time_payment_value, ((SkuDetails) details).priceText));
mConsumabelButton.setText(R.string.not_bought_yet);
}
}
private void setupSubscription(boolean isPurchased) {
mSubscriptionButton.setEnabled(!isPurchased);
if (isPurchased) {
mSubscriptionButton.setText(R.string.already_subscribed);
} else {
SkuDetails details = mBillingProcessor.getSubscriptionListingDetails(SUBSCRIPTION);
mSubscriptionButton.setText(getString(R.string.subscription_value, details.priceText));
}
}
private void showMsg(String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mBillingProcessor.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onDestroy() {
if (mBillingProcessor != null) {
mBillingProcessor.release();
}
super.onDestroy();
}
}