|
|
|
@ -29,6 +29,7 @@ import android.content.res.Configuration;
|
|
|
|
|
import android.net.Uri;
|
|
|
|
|
import android.os.Build;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.os.Handler;
|
|
|
|
|
import android.os.ParcelFileDescriptor;
|
|
|
|
|
import android.preference.PreferenceManager;
|
|
|
|
|
import android.provider.Settings;
|
|
|
|
@ -44,6 +45,11 @@ import android.widget.ListView;
|
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
|
|
import com.android.billingclient.api.BillingClient;
|
|
|
|
|
import com.android.billingclient.api.BillingClientStateListener;
|
|
|
|
|
import com.android.billingclient.api.BillingFlowParams;
|
|
|
|
|
import com.android.billingclient.api.Purchase;
|
|
|
|
|
import com.android.billingclient.api.PurchasesUpdatedListener;
|
|
|
|
|
import com.google.android.material.snackbar.Snackbar;
|
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
@ -72,11 +78,12 @@ import androidx.lifecycle.Lifecycle;
|
|
|
|
|
import androidx.lifecycle.Observer;
|
|
|
|
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|
|
|
|
|
|
|
|
|
public class ActivityView extends ActivityBase implements FragmentManager.OnBackStackChangedListener {
|
|
|
|
|
public class ActivityView extends ActivityBase implements FragmentManager.OnBackStackChangedListener, PurchasesUpdatedListener {
|
|
|
|
|
private View view;
|
|
|
|
|
private DrawerLayout drawerLayout;
|
|
|
|
|
private ListView drawerList;
|
|
|
|
|
private ActionBarDrawerToggle drawerToggle;
|
|
|
|
|
private BillingClient billingClient;
|
|
|
|
|
|
|
|
|
|
private boolean newIntent = false;
|
|
|
|
|
|
|
|
|
@ -307,6 +314,9 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
|
|
|
|
}
|
|
|
|
|
}.load(this, new Bundle());
|
|
|
|
|
|
|
|
|
|
billingClient = BillingClient.newBuilder(this).setListener(this).build();
|
|
|
|
|
billingClient.startConnection(billingClientStateListener);
|
|
|
|
|
|
|
|
|
|
checkIntent(getIntent());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -349,6 +359,9 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
|
|
|
|
newIntent = false;
|
|
|
|
|
getSupportFragmentManager().popBackStack("unified", 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (billingClient.isReady())
|
|
|
|
|
queryPurchases();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -366,6 +379,7 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onDestroy() {
|
|
|
|
|
billingClient.endConnection();
|
|
|
|
|
super.onDestroy();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -518,8 +532,22 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void onMenuPro() {
|
|
|
|
|
if (Helper.isPlayStoreInstall(this)) {
|
|
|
|
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
|
|
|
|
if (prefs.getBoolean("pro", false)) {
|
|
|
|
|
Snackbar.make(view, R.string.title_pro_activated, Snackbar.LENGTH_LONG).show();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Helper.isPlayStoreInstall(this)) {
|
|
|
|
|
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
|
|
|
|
|
.setSku(BuildConfig.APPLICATION_ID + ".pro")
|
|
|
|
|
.setType(BillingClient.SkuType.INAPP)
|
|
|
|
|
.build();
|
|
|
|
|
int responseCode = billingClient.launchBillingFlow(ActivityView.this, flowParams);
|
|
|
|
|
String text = Helper.getBillingResponseText(responseCode);
|
|
|
|
|
Log.i(Helper.TAG, "IAB launch billing flow response=" + text);
|
|
|
|
|
if (responseCode != BillingClient.BillingResponse.OK)
|
|
|
|
|
Snackbar.make(view, text, Snackbar.LENGTH_LONG).show();
|
|
|
|
|
} else
|
|
|
|
|
startActivity(getIntentPro());
|
|
|
|
|
}
|
|
|
|
@ -755,4 +783,68 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
|
|
|
|
|
}.load(this, args);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private BillingClientStateListener billingClientStateListener = new BillingClientStateListener() {
|
|
|
|
|
private int backoff = 4; // seconds
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onBillingSetupFinished(@BillingClient.BillingResponse int responseCode) {
|
|
|
|
|
String text = Helper.getBillingResponseText(responseCode);
|
|
|
|
|
Log.i(Helper.TAG, "IAB connected response=" + text);
|
|
|
|
|
if (responseCode == BillingClient.BillingResponse.OK) {
|
|
|
|
|
backoff = 4;
|
|
|
|
|
queryPurchases();
|
|
|
|
|
} else
|
|
|
|
|
Snackbar.make(view, text, Snackbar.LENGTH_LONG).show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onBillingServiceDisconnected() {
|
|
|
|
|
backoff *= 2;
|
|
|
|
|
Log.i(Helper.TAG, "IAB disconnected retry in " + backoff + " s");
|
|
|
|
|
new Handler().postDelayed(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
if (!billingClient.isReady())
|
|
|
|
|
billingClient.startConnection(billingClientStateListener);
|
|
|
|
|
}
|
|
|
|
|
}, backoff * 1000L);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onPurchasesUpdated(int responseCode, @android.support.annotation.Nullable List<Purchase> purchases) {
|
|
|
|
|
String text = Helper.getBillingResponseText(responseCode);
|
|
|
|
|
Log.i(Helper.TAG, "IAB purchases updated response=" + text);
|
|
|
|
|
if (responseCode == BillingClient.BillingResponse.OK)
|
|
|
|
|
checkPurchases(purchases);
|
|
|
|
|
else
|
|
|
|
|
Snackbar.make(view, text, Snackbar.LENGTH_LONG).show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void queryPurchases() {
|
|
|
|
|
Purchase.PurchasesResult result = billingClient.queryPurchases(BillingClient.SkuType.INAPP);
|
|
|
|
|
String text = Helper.getBillingResponseText(result.getResponseCode());
|
|
|
|
|
Log.i(Helper.TAG, "IAB query purchases response=" + text);
|
|
|
|
|
if (result.getResponseCode() == BillingClient.BillingResponse.OK)
|
|
|
|
|
checkPurchases(result.getPurchasesList());
|
|
|
|
|
else
|
|
|
|
|
Snackbar.make(view, text, Snackbar.LENGTH_LONG).show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void checkPurchases(List<Purchase> purchases) {
|
|
|
|
|
if (purchases != null) {
|
|
|
|
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
|
|
|
|
SharedPreferences.Editor editor = prefs.edit();
|
|
|
|
|
editor.remove("pro");
|
|
|
|
|
for (Purchase purchase : purchases) {
|
|
|
|
|
Log.i(Helper.TAG, "IAB SKU=" + purchase.getSku());
|
|
|
|
|
if ((BuildConfig.APPLICATION_ID + ".pro").equals(purchase.getSku())) {
|
|
|
|
|
editor.putBoolean("pro", true);
|
|
|
|
|
Log.i(Helper.TAG, "IAB pro features activated");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
editor.apply();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|