diff --git a/app/app.iml b/app/app.iml index bdae7d00..9867421a 100644 --- a/app/app.iml +++ b/app/app.iml @@ -42,6 +42,12 @@ + + + + + + @@ -50,12 +56,6 @@ - - - - - - @@ -104,14 +104,6 @@ - - - - - - - - @@ -120,6 +112,14 @@ + + + + + + + + @@ -131,6 +131,19 @@ + + + + + + + + + + + + + @@ -152,9 +165,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fa552f2d..87a18377 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,4 +78,8 @@ dependencies { compile 'com.android.support:appcompat-v7:24.+' compile 'com.android.support:recyclerview-v7:24.+' compile 'com.squareup.picasso:picasso:2.5.+' + compile 'com.google.firebase:firebase-core:9.2.+' + compile 'com.google.firebase:firebase-ads:9.2.+' } + +apply plugin: 'com.google.gms.google-services' diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 00000000..5724bdba --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,42 @@ +{ + "project_info": { + "project_number": "495063709670", + "firebase_url": "https://netguard-811a8.firebaseio.com", + "project_id": "netguard-811a8", + "storage_bucket": "netguard-811a8.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:495063709670:android:4a7add5044bbfbe4", + "android_client_info": { + "package_name": "eu.faircode.netguard" + } + }, + "oauth_client": [ + { + "client_id": "495063709670-kmrhdn2hl4hb0mhst1g41i30mn8tv4te.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAA9DsZbwqbneF65YtAwTqBRJtaChJMTd0" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index ebf7c0e6..85fc6eb6 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -49,3 +49,6 @@ #Picasso -dontwarn com.squareup.okhttp.** + +#AdMob +-dontwarn com.google.android.gms.internal.** diff --git a/app/src/kitkat/AndroidManifest.xml b/app/src/kitkat/AndroidManifest.xml index e18b339f..879ca3ac 100644 --- a/app/src/kitkat/AndroidManifest.xml +++ b/app/src/kitkat/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -13,6 +14,14 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 337b322f..a0a58f68 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -12,6 +13,14 @@ + + + + diff --git a/app/src/main/java/eu/faircode/netguard/ActivityMain.java b/app/src/main/java/eu/faircode/netguard/ActivityMain.java index aa9259f7..f28eb8ad 100644 --- a/app/src/main/java/eu/faircode/netguard/ActivityMain.java +++ b/app/src/main/java/eu/faircode/netguard/ActivityMain.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -63,6 +64,12 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import com.google.android.gms.ads.AdListener; +import com.google.android.gms.ads.AdRequest; +import com.google.android.gms.ads.AdSize; +import com.google.android.gms.ads.AdView; +import com.google.android.gms.ads.MobileAds; + import java.util.List; public class ActivityMain extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -398,6 +405,11 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences Log.e(TAG, ex.toString() + "\n" + Log.getStackTraceString(ex)); } + // Ads + if (!IAB.isPurchasedAny(this)) + loadAds(); + + // Handle intent checkExtras(getIntent()); } @@ -416,6 +428,89 @@ public class ActivityMain extends AppCompatActivity implements SharedPreferences } } + @Override + public void onConfigurationChanged(Configuration newConfig) { + Log.i(TAG, "Config changed"); + super.onConfigurationChanged(newConfig); + + if (!IAB.isPurchasedAny(this)) + reloadAds(); + } + + private void loadAds() { + MobileAds.initialize(getApplicationContext(), getString(R.string.ad_app_id)); + + AdView adView = (AdView) findViewById(R.id.adView); + adView.setVisibility(View.VISIBLE); + adView.setAdListener(new AdListener() { + @Override + public void onAdLoaded() { + Log.i(TAG, "Ad loaded"); + } + + @Override + public void onAdFailedToLoad(int errorCode) { + switch (errorCode) { + case AdRequest.ERROR_CODE_INTERNAL_ERROR: + Log.w(TAG, "Ad load error=INTERNAL_ERROR"); + break; + case AdRequest.ERROR_CODE_INVALID_REQUEST: + Log.w(TAG, "Ad load error=INVALID_REQUEST"); + break; + case AdRequest.ERROR_CODE_NETWORK_ERROR: + Log.w(TAG, "Ad load error=NETWORK_ERROR"); + break; + case AdRequest.ERROR_CODE_NO_FILL: + Log.w(TAG, "Ad load error=NO_FILL"); + break; + default: + Log.w(TAG, "Ad load error=" + errorCode); + } + } + + @Override + public void onAdOpened() { + Log.i(TAG, "Ad opened"); + } + + @Override + public void onAdClosed() { + Log.i(TAG, "Ad closed"); + } + + @Override + public void onAdLeftApplication() { + Log.i(TAG, "Ad left app"); + } + }); + + + AdRequest adRequest = new AdRequest.Builder() + .addTestDevice(getString(R.string.ad_test_device_id)) + .build(); + adView.loadAd(adRequest); + } + + private void reloadAds() { + AdView adView = (AdView) findViewById(R.id.adView); + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) adView.getLayoutParams(); + LinearLayout parent = (LinearLayout) adView.getParent(); + parent.removeView(adView); + + adView.destroy(); + adView = new AdView(this); + adView.setAdSize(AdSize.SMART_BANNER); + adView.setAdUnitId(getString(R.string.ad_banner_unit_id)); + adView.setId(R.id.adView); + adView.setLayoutParams(params); + parent.addView(adView); + + AdRequest adRequest = new AdRequest.Builder() + .addTestDevice(getString(R.string.ad_test_device_id)) + .build(); + adView.loadAd(adRequest); + } + private void checkExtras(Intent intent) { // Approve request if (intent.hasExtra(EXTRA_APPROVE)) { diff --git a/app/src/main/java/eu/faircode/netguard/IAB.java b/app/src/main/java/eu/faircode/netguard/IAB.java index 583872c0..56b35249 100644 --- a/app/src/main/java/eu/faircode/netguard/IAB.java +++ b/app/src/main/java/eu/faircode/netguard/IAB.java @@ -183,6 +183,17 @@ public class IAB implements ServiceConnection { prefs.getBoolean(ActivityPro.SKU_DONATION, false)); } + public static boolean isPurchasedAny(Context context) { + if (Util.isDebuggable(context)) + return true; + + SharedPreferences prefs = context.getSharedPreferences("IAB", Context.MODE_PRIVATE); + for (String key : prefs.getAll().keySet()) + if (prefs.getBoolean(key, false)) + return true; + return false; + } + public static String getResult(int responseCode) { switch (responseCode) { case 0: diff --git a/app/src/main/java/eu/faircode/netguard/Rule.java b/app/src/main/java/eu/faircode/netguard/Rule.java index f9a7a663..ca8df463 100644 --- a/app/src/main/java/eu/faircode/netguard/Rule.java +++ b/app/src/main/java/eu/faircode/netguard/Rule.java @@ -338,7 +338,16 @@ public class Rule { rule.screen_other = screen_other.getBoolean(info.packageName, rule.screen_other_default); rule.roaming = roaming.getBoolean(info.packageName, rule.roaming_default); - rule.apply = apply.getBoolean(info.packageName, true); + if (info.applicationInfo.uid == Process.myUid()) + if (IAB.isPurchasedAny(context)) + rule.apply = apply.getBoolean(info.packageName, true); + else { + rule.pkg = false; + rule.apply = false; + } + else + rule.apply = apply.getBoolean(info.packageName, true); + rule.notify = notify.getBoolean(info.packageName, true); // Related packages diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml index 393b78d8..2aeb5576 100644 --- a/app/src/main/res/layout/main.xml +++ b/app/src/main/res/layout/main.xml @@ -1,5 +1,6 @@ + + + + Buy Enabled Tap on a title for more information + Buying any pro feature will disable all advertisements Challenge Response @@ -285,5 +286,8 @@ Your internet traffic is not being sent to a remote VPN server. 6 + ca-app-pub-6350249268625326~6636046697 + ca-app-pub-6350249268625326/8112779894 + B23E5E89C89F87C06C33861503174DFC ef46f813d2c8a064d72c936b9b96d1cccc989378 diff --git a/build.gradle b/build.gradle index 8c3636d7..3ee02406 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ buildscript { dependencies { // http://tools.android.com/tech-docs/new-build-system/gradle-experimental classpath 'com.android.tools.build:gradle-experimental:0.7.0' + classpath 'com.google.gms:google-services:3.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/tools/checkmanifests.sh b/tools/checkmanifests.sh new file mode 100644 index 00000000..2b26d75a --- /dev/null +++ b/tools/checkmanifests.sh @@ -0,0 +1,3 @@ +#!/bin/sh +#apt-get install meld +meld app/src/main/AndroidManifest.xml app/src/kitkat/AndroidManifest.xml &