Fix paid features unlocking in beta builds

Paid features inherited from the official app were not properly
unlocked when the VPN was started by the Android system

Fixes #255
This commit is contained in:
emanuele-f
2022-09-09 22:10:10 +02:00
parent 88e65b5336
commit 3f6f32809a
3 changed files with 30 additions and 7 deletions
@@ -42,12 +42,14 @@ import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/* Billing stub */
public class Billing {
private static final String TAG = "Billing";
private static final String KEY = "ME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6cS1N1P0kaiuxq0g70OVVE0uIOD+t809" +
"Etg3k2h11k8uNvfkx3mL1HTjQyzSfdueyY4DqTW7+sk=";
private static final String PEER_SKU_KEY = "peer_skus";
// SKUs
public static final String SUPPORTER_SKU = "pcapdroid_supporter";
@@ -79,6 +81,11 @@ public class Billing {
protected Billing(Context ctx) {
mContext = ctx;
mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
// Load peer skus
Set<String> peer_skus = mPrefs.getStringSet(PEER_SKU_KEY, null);
if(peer_skus != null)
mPeerSkus.addAll(peer_skus);
}
public static Billing newInstance(Context ctx) {
@@ -198,7 +205,21 @@ public class Billing {
return !Prefs.isRootCaptureEnabled(mPrefs);
}
public void addPeerSku(String sku) {
mPeerSkus.add(sku);
public void handlePeerSkus(Set<String> skus) {
if(skus.equals(mPeerSkus))
return; // nothing changed
mPeerSkus.clear();
mPeerSkus.addAll(skus);
Log.i(TAG, "Peer skus updated: " + skus);
mPrefs.edit()
.putStringSet(PEER_SKU_KEY, mPeerSkus)
.apply();
}
public void clearPeerSkus() {
handlePeerSkus(new HashSet<>());
}
}
@@ -318,12 +318,14 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
AppDescriptor peer = AppsResolver.resolve(getPackageManager(), peerAppPackage, 0);
if(peer == null) {
Log.d(TAG, "Peer app not found");
mIab.clearPeerSkus();
return;
}
PackageInfo pInfo = peer.getPackageInfo();
if((pInfo == null) || (PackageInfoCompat.getLongVersionCode(pInfo) < 56)) {
Log.d(TAG, "Unsupported peer app version found");
mIab.clearPeerSkus();
return;
}
@@ -331,6 +333,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
Utils.BuildType buildType = Utils.getVerifiedBuild(this, peerAppPackage);
if((buildType != Utils.BuildType.FDROID) && (buildType != Utils.BuildType.PLAYSTORE) && (buildType != Utils.BuildType.GITHUB)) {
Log.d(TAG, "Unsupported peer app build: " + buildType.name());
mIab.clearPeerSkus();
return;
}
@@ -343,6 +346,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
peerInfoLauncher.launch(intent);
} catch (ActivityNotFoundException e) {
Log.d(TAG, "Peer app launch failed");
mIab.clearPeerSkus();
}
}
@@ -357,10 +361,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
if(skus != null) {
Log.d(TAG, "Found peer app info");
for(String sku: skus) {
Log.d(TAG, "Peer sku: " + sku);
mIab.addPeerSku(sku);
}
mIab.handlePeerSkus(skus);
// success
return;
@@ -370,6 +371,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
// fail
Log.d(TAG, "Invalid peer app result");
mIab.clearPeerSkus();
}
private static class MainStateAdapter extends FragmentStateAdapter {