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 &