diff --git a/.gitmodules b/.gitmodules index e37a6d28c..40622c5db 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,9 @@ path = external/netcipher url = https://github.com/guardianproject/NetCipher.git branch = master +[submodule "Bonsai"] + path = Bonsai + url = https://github.com/anthonycr/Bonsai.git +[submodule "AnimatedProgressBar"] + path = AnimatedProgressBar + url = https://github.com/anthonycr/AnimatedProgressBar.git diff --git a/.travis.yml b/.travis.yml index 175e809bf..1fc5f7032 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,14 @@ language: android sudo: false +jdk: + - oraclejdk8 android: components: - tools + - build-tools-24.0.3 - build-tools-23.0.3 - build-tools-22.0.1 + - android-24 - android-23 - android-22 - extra-android-support diff --git a/AnimatedProgressBar b/AnimatedProgressBar new file mode 160000 index 000000000..2d7f756be --- /dev/null +++ b/AnimatedProgressBar @@ -0,0 +1 @@ +Subproject commit 2d7f756be8f562b2cedca46de7d2ff24f9383040 diff --git a/Bonsai b/Bonsai new file mode 160000 index 000000000..53608c03b --- /dev/null +++ b/Bonsai @@ -0,0 +1 @@ +Subproject commit 53608c03b77d598aaebd17eb0acbedd8ffb1bf51 diff --git a/app/build.gradle b/app/build.gradle index 0784786e3..6210bca1a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,18 +3,14 @@ apply plugin: 'com.neenbedankt.android-apt' apply plugin: 'com.getkeepsafe.dexcount' android { - compileSdkVersion 23 - buildToolsVersion "23.0.3" + compileSdkVersion 24 + buildToolsVersion "24.0.3" defaultConfig { minSdkVersion 14 - targetSdkVersion 23 - versionName "4.3.3" - generatedDensities = [] - } - - aaptOptions { - additionalParameters "--no-version-vectors" + targetSdkVersion 24 + versionName "4.4.0" + vectorDrawables.useSupportLibrary = true } sourceSets { @@ -40,13 +36,13 @@ android { lightningPlus { buildConfigField "boolean", "FULL_VERSION", "true" applicationId "acr.browser.lightning" - versionCode 88 + versionCode 89 } lightningLite { buildConfigField "boolean", "FULL_VERSION", "false" applicationId "acr.browser.barebones" - versionCode 90 + versionCode 91 } } @@ -70,14 +66,14 @@ dexcount { dependencies { // support libraries - compile 'com.android.support:palette-v7:23.3.0' - compile 'com.android.support:appcompat-v7:23.3.0' - compile 'com.android.support:design:23.3.0' - compile 'com.android.support:recyclerview-v7:23.3.0' - compile 'com.android.support:support-v4:23.3.0' + compile 'com.android.support:palette-v7:24.2.1' + compile 'com.android.support:appcompat-v7:24.2.1' + compile 'com.android.support:design:24.2.1' + compile 'com.android.support:recyclerview-v7:24.2.1' + compile 'com.android.support:support-v4:24.2.1' - // html parsing fo reading mode - compile 'org.jsoup:jsoup:1.9.1' + // html parsing for reading mode + compile 'org.jsoup:jsoup:1.9.2' // event bus compile 'com.squareup:otto:1.3.8' @@ -85,6 +81,7 @@ dependencies { // dependency injection compile 'com.google.dagger:dagger:2.0.2' apt 'com.google.dagger:dagger-compiler:2.0.2' + provided 'javax.annotation:jsr250-api:1.0' // view binding compile 'com.jakewharton:butterknife:7.0.1' @@ -100,8 +97,11 @@ dependencies { // git submodule update --remote compile project(':libnetcipher') + compile project(':bonsai') + + compile project(':animated-progress-bar') + // memory leak analysis - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' - provided 'javax.annotation:jsr250-api:1.0' + debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4' + releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4' } \ No newline at end of file diff --git a/app/src/LightningPlus/assets/hosts.txt b/app/src/LightningPlus/assets/hosts.txt index 12168698c..5377c6a1f 100644 --- a/app/src/LightningPlus/assets/hosts.txt +++ b/app/src/LightningPlus/assets/hosts.txt @@ -298,6 +298,8 @@ 127.0.0.1 123.6.87.194.dynamic.dol.ru 127.0.0.1 123.dominoad.com 127.0.0.1 123.duba.net +127.0.0.1 123456.center +127.0.0.1 123456.click 127.0.0.1 1239.9014.302br.net 127.0.0.1 123ads.nl 127.0.0.1 123advertising.nl @@ -1363,6 +1365,7 @@ 127.0.0.1 9450.302br.net 127.0.0.1 9458.302br.net 127.0.0.1 9489.302br.net +127.0.0.1 94982c5b634975e50103ce96082d2827.adsk2.co 127.0.0.1 95.6.87.194.dynamic.dol.ru 127.0.0.1 95126.hittail.com 127.0.0.1 9528.302br.net @@ -1434,8 +1437,10 @@ 127.0.0.1 a.alimama.cn 127.0.0.1 a.analytics.yahoo.com 127.0.0.1 a.applovin.com +127.0.0.1 a.c.appier.net 127.0.0.1 a.cam4free.com 127.0.0.1 a.chartboost.com +127.0.0.1 a.clicksor.cn 127.0.0.1 a.clickyab.com 127.0.0.1 a.clookie.net 127.0.0.1 a.collective-media.net @@ -1850,6 +1855,7 @@ 127.0.0.1 achever.science 127.0.0.1 achmedia.com 127.0.0.1 acim.com +127.0.0.1 aclick.adhoc1.net 127.0.0.1 acme.bfast.com 127.0.0.1 acmeaffiliate.go2cloud.org 127.0.0.1 acmgold.go2cloud.org @@ -2660,6 +2666,7 @@ 127.0.0.1 ad.adlantis.jp 127.0.0.1 ad.adlegend.com 127.0.0.1 ad.admediaprovider.com +127.0.0.1 ad.admitad.com 127.0.0.1 ad.adnet.biz 127.0.0.1 ad.adnet.de 127.0.0.1 ad.adnetinteractive.com @@ -2729,6 +2736,7 @@ 127.0.0.1 ad.amtk-media.com.52678.9302.302br.net 127.0.0.1 ad.antventure.com 127.0.0.1 ad.app-authority.com +127.0.0.1 ad.appier.net 127.0.0.1 ad.apps.fm 127.0.0.1 ad.aquamediadirect.com 127.0.0.1 ad.ar.doubleclick.net @@ -15953,6 +15961,7 @@ 127.0.0.1 adcache.aftenposten.no 127.0.0.1 adcade.com 127.0.0.1 adcamp.ru +127.0.0.1 adcarem.co 127.0.0.1 adcash.com 127.0.0.1 adcastplus.net 127.0.0.1 adcdnx.com @@ -16334,6 +16343,7 @@ 127.0.0.1 admaym.com 127.0.0.1 admazing.adfarm1.adition.com 127.0.0.1 admedia.com +127.0.0.1 admedo.com 127.0.0.1 admeld-match.dotomi.com 127.0.0.1 admeld.adnxs.com 127.0.0.1 admeld.com @@ -16570,6 +16580,7 @@ 127.0.0.1 ads.adflight.com 127.0.0.1 ads.adfox.ru 127.0.0.1 ads.adfuzz.com +127.0.0.1 ads.adgorithms.com 127.0.0.1 ads.adgoto.com 127.0.0.1 ads.adhearus.com 127.0.0.1 ads.adhood.com @@ -16800,6 +16811,7 @@ 127.0.0.1 ads.cybersales.cz 127.0.0.1 ads.dada.it 127.0.0.1 ads.dai.org +127.0.0.1 ads.dailyclicks.net 127.0.0.1 ads.dailyjolt.com 127.0.0.1 ads.datais.com 127.0.0.1 ads.date.com @@ -16898,6 +16910,7 @@ 127.0.0.1 ads.filmlush.com 127.0.0.1 ads.filmup.com 127.0.0.1 ads.finance.yahoo.com +127.0.0.1 ads.fixlive.tech 127.0.0.1 ads.flashtrack.net 127.0.0.1 ads.flightsim.com 127.0.0.1 ads.flipkart.com @@ -17216,6 +17229,7 @@ 127.0.0.1 ads.ontheweb.com 127.0.0.1 ads.ookla.com 127.0.0.1 ads.oomz.de +127.0.0.1 ads.opensubtitles.org 127.0.0.1 ads.openx.net 127.0.0.1 ads.opera.com 127.0.0.1 ads.optusnet.com.au @@ -17670,6 +17684,7 @@ 127.0.0.1 ads.videoaxs.com 127.0.0.1 ads.videomega.tv 127.0.0.1 ads.videoslots.com +127.0.0.1 ads.videostrip.com-prizes-giveaway.online 127.0.0.1 ads.vintageporntubenet.com 127.0.0.1 ads.vipmobile.co.za 127.0.0.1 ads.visionads.de @@ -17741,6 +17756,7 @@ 127.0.0.1 ads.yourfreedvds.com 127.0.0.1 ads.yumenetworks.com 127.0.0.1 ads.yupimsn.com +127.0.0.1 ads.zamunda.se 127.0.0.1 ads.zchat.no 127.0.0.1 ads.zdnet.com 127.0.0.1 ads.zdnet.de @@ -17943,6 +17959,7 @@ 127.0.0.1 ads2.mojiva.com 127.0.0.1 ads2.mweb.co.th 127.0.0.1 ads2.oneplace.com +127.0.0.1 ads2.opensubtitles.org 127.0.0.1 ads2.playnet.com 127.0.0.1 ads2.rp.pl 127.0.0.1 ads2.searchmiracle.com @@ -18199,6 +18216,7 @@ 127.0.0.1 adscampaign.net 127.0.0.1 adscendmedia.com 127.0.0.1 adscontent.indiatimes.com +127.0.0.1 adscoops.com 127.0.0.1 adscpm.com 127.0.0.1 adsdaq.com 127.0.0.1 adsdb.timesink.com @@ -18450,17 +18468,27 @@ 127.0.0.1 adservices02.picadmedia.com 127.0.0.1 adserving.ads.ec 127.0.0.1 adserving.adswisher.com +127.0.0.1 adserving.ariesads.com 127.0.0.1 adserving.autotrader.com 127.0.0.1 adserving.bizcrank.com 127.0.0.1 adserving.budsinc.com 127.0.0.1 adserving.claxon.com +127.0.0.1 adserving.clicknety.com +127.0.0.1 adserving.cpmgo.com 127.0.0.1 adserving.cpminventory.com 127.0.0.1 adserving.cpxadroit.com 127.0.0.1 adserving.flagcpc.com +127.0.0.1 adserving.greenadvertizing.com +127.0.0.1 adserving.hugecpm.com 127.0.0.1 adserving.liveuniversenetwork.com +127.0.0.1 adserving.localpages.com +127.0.0.1 adserving.mediatrafficreports.com 127.0.0.1 adserving.supreme.clicksor.com +127.0.0.1 adserving.trafficsupplier.net +127.0.0.1 adserving.uniquetrafficgroup.com 127.0.0.1 adservinginternational.com 127.0.0.1 adservingnetwork.com +127.0.0.1 adservone.com 127.0.0.1 adservpi.com 127.0.0.1 adservr.net 127.0.0.1 adsexpand.go2cloud.org @@ -18650,6 +18678,8 @@ 127.0.0.1 adtest.timesink.com 127.0.0.1 adtgs.com 127.0.0.1 adtheorent.com +127.0.0.1 adthrive.com +127.0.0.1 adti.me 127.0.0.1 adtiger.de 127.0.0.1 adtilt.com 127.0.0.1 adtimes.nytimes.com @@ -18733,6 +18763,7 @@ 127.0.0.1 adv.pconline.com.cn 127.0.0.1 adv.quipo.it 127.0.0.1 adv.researchnow.co.uk +127.0.0.1 adv.securestudies.com 127.0.0.1 adv.sexcounter.com 127.0.0.1 adv.tre.it 127.0.0.1 adv.videomega.tv @@ -18870,6 +18901,7 @@ 127.0.0.1 advertisementbanners.com 127.0.0.1 advertiser.adknowledge.com 127.0.0.1 advertiser.ads.ec +127.0.0.1 advertiser.clicknety.com 127.0.0.1 advertiser.cyberghostvpn.com 127.0.0.1 advertiser.fyber.com 127.0.0.1 advertiser.lifestyleadnetwork.com @@ -18950,6 +18982,7 @@ 127.0.0.1 advolution.de 127.0.0.1 advombat.ru 127.0.0.1 advrts.s3.amazonaws.com +127.0.0.1 advserver.xyz 127.0.0.1 advspot.com 127.0.0.1 advt.webindia123.com 127.0.0.1 adw.ero-advertising.com @@ -19267,6 +19300,7 @@ 127.0.0.1 afs.googlesyndication.com 127.0.0.1 afs.googleusercontent.com 127.0.0.1 afs.moatads.com +127.0.0.1 afsanalytics.com 127.0.0.1 afterdawn.us.intellitxt.com 127.0.0.1 afterdownload.com 127.0.0.1 afterview.ru @@ -19342,6 +19376,7 @@ 127.0.0.1 akaads-espn.starwave.com 127.0.0.1 akamai.bizrate.com 127.0.0.1 akamai.smartadserver.com +127.0.0.1 akillimeyveler.reklamagaci.com 127.0.0.1 akmnetwork.com 127.0.0.1 aknoj.voluumtrk.com 127.0.0.1 aksb-a.akamaihd.net @@ -19518,6 +19553,7 @@ 127.0.0.1 analytic.xingcloud.com 127.0.0.1 analytics-api-samples.googlecode.com 127.0.0.1 analytics-news.seevolution.com +127.0.0.1 analytics-prod-ingress.bricknet.com 127.0.0.1 analytics-v2.anvato.com 127.0.0.1 analytics.163.com 127.0.0.1 analytics.1and1.com @@ -19599,6 +19635,7 @@ 127.0.0.1 analytics.unister-gmbh.de 127.0.0.1 analytics.upworthy.com 127.0.0.1 analytics.us.archive.org +127.0.0.1 analytics.vodafone.co.uk 127.0.0.1 analytics.wildtangent.com 127.0.0.1 analytics.wittyfeed.com 127.0.0.1 analytics.worldnow.com @@ -19641,6 +19678,8 @@ 127.0.0.1 androidsdk.ads.mp.mydas.mobi 127.0.0.1 androidsk.ads.mp.mydas.mobi 127.0.0.1 andropit.ivwbox.de +127.0.0.1 anet.apx.appier.net +127.0.0.1 anet.c.appier.net 127.0.0.1 anfyx.voluumtrk.com 127.0.0.1 angebot0.ivwbox.de 127.0.0.1 angelia-malave.us @@ -19676,6 +19715,7 @@ 127.0.0.1 ans2.adsoftware.com 127.0.0.1 ans3.adsoftware.com 127.0.0.1 ans4.adsoftware.com +127.0.0.1 answermedia.com 127.0.0.1 answers.us.intellitxt.com 127.0.0.1 antenne.ivwbox.de 127.0.0.1 antezeta.com @@ -19689,6 +19729,7 @@ 127.0.0.1 anycast.fw.adsafeprotected.com 127.0.0.1 anycast.pixel.adsafeprotected.com 127.0.0.1 anyday.com +127.0.0.1 anylist.c.appier.net 127.0.0.1 anymanga.com 127.0.0.1 anz.ads.link4ads.com 127.0.0.1 anz.ms.link4ads.com @@ -19787,6 +19828,7 @@ 127.0.0.1 api.mixpanel.com 127.0.0.1 api.mobileapptracking.com 127.0.0.1 api.mobpartner.mobi +127.0.0.1 api.mobula.sdk.duapps.com 127.0.0.1 api.nanigans.com 127.0.0.1 api.native.ai 127.0.0.1 api.naturaltracking.com @@ -19810,8 +19852,10 @@ 127.0.0.1 api.statdns.com 127.0.0.1 api.superfish.com 127.0.0.1 api.tapfortap.com +127.0.0.1 api.taplytics.com 127.0.0.1 api.taps.io 127.0.0.1 api.target.smi2.net +127.0.0.1 api.testrequest.info 127.0.0.1 api.thetrafficstat.net 127.0.0.1 api.trak.io 127.0.0.1 api.tweetmeme.com @@ -19847,12 +19891,16 @@ 127.0.0.1 api1.thesearchagency.net 127.0.0.1 api15.cmdragracing.com 127.0.0.1 api2.playhaven.com +127.0.0.1 api2.testrequest.info 127.0.0.1 api2.thesearchagency.net 127.0.0.1 api28.thetrafficstat.net 127.0.0.1 api28.webovernet.com +127.0.0.1 api3.testrequest.info 127.0.0.1 api3.thesearchagency.net 127.0.0.1 api31.thetrafficstat.net +127.0.0.1 api4.testrequest.info 127.0.0.1 api4.thesearchagency.net +127.0.0.1 api5.testrequest.info 127.0.0.1 api5.thesearchagency.net 127.0.0.1 api6.thesearchagency.net 127.0.0.1 api7.thesearchagency.net @@ -19863,6 +19911,7 @@ 127.0.0.1 apiservices.krxd.net 127.0.0.1 apiskywebbercom-a.akamaihd.net 127.0.0.1 apkquery.ksmobile.net +127.0.0.1 apm.crittercism.com 127.0.0.1 apnx-match.dotomi.com 127.0.0.1 apo.ero-advertising.com 127.0.0.1 apollo.go2cloud.org @@ -19882,7 +19931,6 @@ 127.0.0.1 app-sjn.marketo.com 127.0.0.1 app-sjo.marketo.com 127.0.0.1 app-storage.elicitapp.com -127.0.0.1 app.adjust.com 127.0.0.1 app.adjust.io 127.0.0.1 app.androidphone.mobi 127.0.0.1 app.app-authority.com @@ -19932,6 +19980,7 @@ 127.0.0.1 appintop.com 127.0.0.1 applab-sdk.amazon.com 127.0.0.1 applebarq.com +127.0.0.1 appledaily.apx.appier.net 127.0.0.1 appleglobal.112.2o7.net 127.0.0.1 appleitl.rewards-bonanza-2.com 127.0.0.1 applestoreus.112.2o7.net @@ -20258,6 +20307,7 @@ 127.0.0.1 autohits.dk 127.0.0.1 autolinkmaker.itunes.apple.com 127.0.0.1 automaticsystem.com +127.0.0.1 autopilothq.com 127.0.0.1 autosurfpro.com 127.0.0.1 autotrader-www.baynote.net 127.0.0.1 autotrader.tt.omtrdc.net @@ -21445,6 +21495,7 @@ 127.0.0.1 bbvj6.voluumtrk.com 127.0.0.1 bc84-88b8-96b7-6515.reporo.net 127.0.0.1 bcanalytics.bigcommerce.com +127.0.0.1 bcast.pw 127.0.0.1 bcfads.com 127.0.0.1 bcm.itv.com 127.0.0.1 bcmediagroup.com @@ -21452,6 +21503,7 @@ 127.0.0.1 bd.moatads.com 127.0.0.1 bdbaffiliates.go2cloud.org 127.0.0.1 bddff.voluumtrk.com +127.0.0.1 bdex.com 127.0.0.1 bdv.bidvertiser.com 127.0.0.1 be.mobsweet.com 127.0.0.1 be.nedstat.net @@ -21492,7 +21544,8 @@ 127.0.0.1 beacon2.indieclicktv.com 127.0.0.1 beacons.brandads.net 127.0.0.1 beam.hlserve.com -127.0.0.1 beap-bc.yahoo.com +127.0.0.1 beanstock.com +127.0.0.1 beanstockmedia.com 127.0.0.1 beastasuum.a.ssl.fastly.net 127.0.0.1 bebsz.voluumtrk.com 127.0.0.1 becausebabes.go2cloud.org @@ -21511,6 +21564,7 @@ 127.0.0.1 belole.ru 127.0.0.1 belstat.be 127.0.0.1 benchbrands.com +127.0.0.1 benefique-shiseido.b.appier.net 127.0.0.1 berater.adition.com 127.0.0.1 bergenstidende.112.2o7.net 127.0.0.1 bergfex.ivwbox.de @@ -21569,6 +21623,7 @@ 127.0.0.1 bi827.voluumtrk.com 127.0.0.1 bianca-rhoton.us 127.0.0.1 bibqh.voluumtrk.com +127.0.0.1 bid.contextweb.com 127.0.0.1 bid.pubmatic.com 127.0.0.1 bid.socdm.com 127.0.0.1 bidclix.com @@ -21603,6 +21658,7 @@ 127.0.0.1 binarybliss.com 127.0.0.1 binaryoffers.go2cloud.org 127.0.0.1 binaryperform.go2cloud.org +127.0.0.1 binglee-com-au.b.appier.net 127.0.0.1 bingocabin.com 127.0.0.1 bist.ailsg.com 127.0.0.1 bit.do @@ -21807,6 +21863,7 @@ 127.0.0.1 braincash.com 127.0.0.1 brainient.com 127.0.0.1 brainteasers.freestats.com +127.0.0.1 branch.io 127.0.0.1 branche.science 127.0.0.1 brandedoffersaff.go2cloud.org 127.0.0.1 brandi-haskins.us @@ -23165,6 +23222,7 @@ 127.0.0.1 buildtrafficx.com 127.0.0.1 builfico.de 127.0.0.1 bujrc.voluumtrk.com +127.0.0.1 bukalapak-com.b.appier.net 127.0.0.1 buket7.justclick.ru 127.0.0.1 buldog-stats.com 127.0.0.1 bullseye-media.net @@ -23241,6 +23299,7 @@ 127.0.0.1 c.bigmir.net 127.0.0.1 c.bing.com 127.0.0.1 c.bizjournals.com +127.0.0.1 c.c.appier.net 127.0.0.1 c.casalemedia.com 127.0.0.1 c.chango.com 127.0.0.1 c.chartboost.com @@ -23265,6 +23324,7 @@ 127.0.0.1 c.homestore.com 127.0.0.1 c.kakaku.com 127.0.0.1 c.kuryjs.info +127.0.0.1 c.l.qq.com 127.0.0.1 c.la1w1.salesforceliveagent.com 127.0.0.1 c.live.com 127.0.0.1 c.medialytics.com @@ -23442,9 +23502,11 @@ 127.0.0.1 c97a-b910-eb5b-b0b8.reporo.net 127.0.0.1 c9k4p.voluumtrk.com 127.0.0.1 ca.2.cqcounter.com +127.0.0.1 ca.akamai.startappservice.com 127.0.0.1 ca.clickinc.com 127.0.0.1 ca.cqcounter.com 127.0.0.1 ca.livestat.com +127.0.0.1 ca.origin.startappservice.com 127.0.0.1 ca305656.luckyorange.com 127.0.0.1 caartoonnetwork.com 127.0.0.1 caasco.go2cloud.org @@ -23524,6 +23586,7 @@ 127.0.0.1 cap1ss.xp1.ru4.com 127.0.0.1 caprewards.go2cloud.org 127.0.0.1 capture.trackjs.com +127.0.0.1 carambo.la 127.0.0.1 carbonads.com 127.0.0.1 careers.112.2o7.net 127.0.0.1 caren-jerry.us @@ -23562,6 +23625,7 @@ 127.0.0.1 cash4webmaster.de 127.0.0.1 cashadsllc.go2cloud.org 127.0.0.1 cashassociate.com +127.0.0.1 cashcashpinoy-com.b.appier.net 127.0.0.1 cashcount.com 127.0.0.1 cashcount.de 127.0.0.1 cashcrate.com @@ -24156,6 +24220,7 @@ 127.0.0.1 choice.demdex.net 127.0.0.1 choice.microsoft.com 127.0.0.1 choices.truste.com +127.0.0.1 chope-co.b.appier.net 127.0.0.1 christie-hanlon.us 127.0.0.1 christie-pearlman.us 127.0.0.1 christin-alejandro.us @@ -24283,6 +24348,7 @@ 127.0.0.1 clck.yandex.ru 127.0.0.1 clck.yandex.ua 127.0.0.1 clckme.com +127.0.0.1 cld.edg.startappservice.com 127.0.0.1 clddt.com 127.0.0.1 cleangamemedia.go2cloud.org 127.0.0.1 clear-reports.com @@ -24360,6 +24426,7 @@ 127.0.0.1 click.silvercash.com 127.0.0.1 click.simba.taobao.com 127.0.0.1 click.solocpm.com +127.0.0.1 click.startappexchange.com 127.0.0.1 click.tanx.com 127.0.0.1 click.topica.com 127.0.0.1 click.tv.repubblica.it @@ -24368,6 +24435,7 @@ 127.0.0.1 click.vgnett.no 127.0.0.1 click.whittlesbiz.info 127.0.0.1 click.wrating.com +127.0.0.1 click1.performance-zone.com 127.0.0.1 click168.com 127.0.0.1 click2.cafepress.com 127.0.0.1 click2.danarimedia.com @@ -24497,6 +24565,7 @@ 127.0.0.1 clicktripz.com 127.0.0.1 clicktv.com 127.0.0.1 clickus.admailtiser.com +127.0.0.1 clickus.reimsrvcm.com 127.0.0.1 clickus.tractionize.com 127.0.0.1 clickv.com 127.0.0.1 clickvacations.com @@ -24536,6 +24605,7 @@ 127.0.0.1 clk.directrev.com 127.0.0.1 clk.fetchback.com 127.0.0.1 clk.flmsecure.com +127.0.0.1 clk.im 127.0.0.1 clk.integral-marketing.com 127.0.0.1 clk.jmp9.com 127.0.0.1 clk.members.fling.com @@ -24555,6 +24625,7 @@ 127.0.0.1 clkmon.com 127.0.0.1 clkmr.com 127.0.0.1 clkrev.com +127.0.0.1 clksite.com 127.0.0.1 clkstat.qihoo.com 127.0.0.1 clktag.com 127.0.0.1 clkuk.tradedoubler.com @@ -24633,7 +24704,6 @@ 127.0.0.1 cms.analytics.yahoo.com 127.0.0.1 cms.grandcloud.cn 127.0.0.1 cms.quantserve.com -127.0.0.1 cms.springboardplatform.com 127.0.0.1 cms2.net 127.0.0.1 cmstrendslog.indiatimes.com 127.0.0.1 cmstrendslog.timesnow.tv @@ -24756,7 +24826,6 @@ 127.0.0.1 com.djinnworks.sdm.s3.amazonaws.com 127.0.0.1 com.econa.com 127.0.0.1 comagic.ru -127.0.0.1 combine.urbanairship.com 127.0.0.1 comcast.112.2o7.net 127.0.0.1 comcast.demdex.net 127.0.0.1 comclick.com @@ -26231,8 +26300,10 @@ 127.0.0.1 cpasaw.go2cloud.org 127.0.0.1 cpaswag.go2cloud.org 127.0.0.1 cpatrac.com +127.0.0.1 cpatrackkee.com 127.0.0.1 cpatrackr.com 127.0.0.1 cpaway.afftrack.com +127.0.0.1 cpayard.com 127.0.0.1 cpays.com 127.0.0.1 cpcadnet.com 127.0.0.1 cpcserve.clickbooth.com @@ -26257,6 +26328,7 @@ 127.0.0.1 cpv2tracking.com 127.0.0.1 cpvads.com 127.0.0.1 cpvadvertise.com +127.0.0.1 cpx.acloudweb.com 127.0.0.1 cpx.go2cloud.org 127.0.0.1 cpx.golem.de 127.0.0.1 cpxcenter.com @@ -26269,7 +26341,6 @@ 127.0.0.1 cr.tractionize.com 127.0.0.1 crackberry.us.intellitxt.com 127.0.0.1 crakmedia.com -127.0.0.1 crashlytics.com 127.0.0.1 craveandlamb.com 127.0.0.1 crd1.bannerbank.ru 127.0.0.1 creafi.com @@ -26281,6 +26352,7 @@ 127.0.0.1 createsend5.com 127.0.0.1 creative-mobile.com 127.0.0.1 creative.360yield.com +127.0.0.1 creative.abestservers.com 127.0.0.1 creative.ad120m.com 127.0.0.1 creative.ad121m.com 127.0.0.1 creative.ad122m.com @@ -26434,6 +26506,7 @@ 127.0.0.1 cu.genesismedia.com 127.0.0.1 cube.ign.us.intellitxt.com 127.0.0.1 cubegroup.go2cloud.org +127.0.0.1 cuccu.me 127.0.0.1 cucdn.genesismedia.com 127.0.0.1 cujaz.voluumtrk.com 127.0.0.1 cunda.122.2o7.net @@ -26588,7 +26661,6 @@ 127.0.0.1 d23guct4biwna6.cloudfront.net 127.0.0.1 d23nyyb6dc29z6.cloudfront.net 127.0.0.1 d23p9gffjvre9v.cloudfront.net -127.0.0.1 d24w6bsrhbeh9d.cloudfront.net 127.0.0.1 d25ruj6ht8bs1.cloudfront.net 127.0.0.1 d26dzd2k67we08.cloudfront.net 127.0.0.1 d26j9bp9bq4uhd.cloudfront.net @@ -26893,6 +26965,7 @@ 127.0.0.1 dbltb02.vmsn.de 127.0.0.1 dbltb03.vmsn.de 127.0.0.1 dbox.mobi +127.0.0.1 dbs-com-sg.b.appier.net 127.0.0.1 dbs.112.207.net 127.0.0.1 dbs.advertising.com 127.0.0.1 dbs.bitterstrawberry.org @@ -27009,7 +27082,6 @@ 127.0.0.1 delivery.uasdel.com 127.0.0.1 delivery.uauniverse.com 127.0.0.1 delivery.us.myswitchads.com -127.0.0.1 delivery.vidible.tv 127.0.0.1 delivery.yieldoptimisers.net 127.0.0.1 delivery04.dhe.ibm.com 127.0.0.1 delivery1.trafficjunky.net @@ -27023,7 +27095,9 @@ 127.0.0.1 delivery9.trafficjunky.net 127.0.0.1 deliverymailsysytem.co.uk 127.0.0.1 deloo.de +127.0.0.1 delta210.rtb.appier.net 127.0.0.1 delta223.homestead.com +127.0.0.1 delta244.rtb.appier.net 127.0.0.1 deltaairlines.tt.omtrdc.net 127.0.0.1 deltarad.ivwbox.de 127.0.0.1 demandbase.com @@ -27031,7 +27105,6 @@ 127.0.0.1 demandmedia.s3.amazonaws.com 127.0.0.1 demarketing.go2cloud.org 127.0.0.1 demetria-tickle.us -127.0.0.1 demisoft.altervista.org 127.0.0.1 demo.adsender.us 127.0.0.1 demo.advertising.com 127.0.0.1 demo.idg.com.au @@ -27094,6 +27167,7 @@ 127.0.0.1 device-metrics-us-2.amazon.com 127.0.0.1 device.4seeresults.com 127.0.0.1 device.maxmind.com +127.0.0.1 device.zhiliaoapp.com 127.0.0.1 devil.go2cloud.org 127.0.0.1 devolapgt.com 127.0.0.1 devsalliemaecom.112.2o7.net @@ -27193,6 +27267,7 @@ 127.0.0.1 display.ugc.bazaarvoice.com 127.0.0.1 displayad.layer-ad.org 127.0.0.1 displayads.liveuniversenetwork.com +127.0.0.1 displayadserv.adsimilate.com 127.0.0.1 displayadsmedia.com 127.0.0.1 displayincloud.adk2.co 127.0.0.1 disqusads.com @@ -27455,6 +27530,7 @@ 127.0.0.1 dtkm4pd19nw6z.cloudfront.net 127.0.0.1 dtlilztwypawv.cloudfront.net 127.0.0.1 dtm.advertising.com +127.0.0.1 dts.akamai.startappexchange.com 127.0.0.1 dtta.ero-advertising.com 127.0.0.1 dtym7iokkjlif.cloudfront.net 127.0.0.1 du8783wkf05yr.cloudfront.net @@ -27494,6 +27570,7 @@ 127.0.0.1 dynamic.aol.com 127.0.0.1 dynamic.fmpub.net 127.0.0.1 dynamic.woolik.com +127.0.0.1 dync.c.appier.net 127.0.0.1 dyntraq.mtree.com 127.0.0.1 dypbo.voluumtrk.com 127.0.0.1 dzccl.voluumtrk.com @@ -27529,7 +27606,6 @@ 127.0.0.1 e.admob.com 127.0.0.1 e.ai.inmobi.com 127.0.0.1 e.analytics.yahoo.com -127.0.0.1 e.crashlytics.com 127.0.0.1 e.digitalnectar.co.uk 127.0.0.1 e.domob.cn 127.0.0.1 e.ilovethat.co.uk @@ -27594,6 +27670,7 @@ 127.0.0.1 easypolls.superstats.com 127.0.0.1 easyscopes.net 127.0.0.1 easyspace.com +127.0.0.1 eat-travel.apx.appier.net 127.0.0.1 eb0ej.voluumtrk.com 127.0.0.1 ebao.duba.net 127.0.0.1 ebay.ivwbox.de @@ -27610,7 +27687,6 @@ 127.0.0.1 ec-ns.sascdn.com 127.0.0.1 ec.atdmt.com 127.0.0.1 ec.tynt.com -127.0.0.1 ec.yimg.com 127.0.0.1 ec01c392919812c4f818-79afe539d963810002081e6e2a51e67e.ssl.cf2.rackcdn.com 127.0.0.1 ec1.hitbox.com 127.0.0.1 ec2-54-171-97-32.eu-west-1.compute.amazonaws.com @@ -27641,6 +27717,7 @@ 127.0.0.1 ed.koeln.de 127.0.0.1 eddie-theriot.us 127.0.0.1 edgar.ivwbox.de +127.0.0.1 edge.aperture.displaymarketplace.com 127.0.0.1 edge.ayboll.com 127.0.0.1 edge.bredg.com 127.0.0.1 edge.jeetyetmedia.com @@ -27879,7 +27956,6 @@ 127.0.0.1 embanet.vo.llnwd.net 127.0.0.1 embed.spokenlayer.com 127.0.0.1 embed.technorati.com -127.0.0.1 embed.wistia.com 127.0.0.1 emc-emccom.122.2o7.net 127.0.0.1 emc-southafrica.122.2o7.net 127.0.0.1 emd10.medianext.com @@ -27973,7 +28049,6 @@ 127.0.0.1 enterprisemediagroup.112.2o7.net 127.0.0.1 enterprisenewsmedia.122.2o7.net 127.0.0.1 entertai.ivwbox.de -127.0.0.1 entrepreneur.com 127.0.0.1 entrepreneur.us.intellitxt.com 127.0.0.1 entrepreneurpoc.122.2o7.net 127.0.0.1 environment.searchwho.com @@ -28002,12 +28077,17 @@ 127.0.0.1 erin-hartwell.us 127.0.0.1 erjbe.voluumtrk.com 127.0.0.1 ero-advertising.biz +127.0.0.1 ero-advertising.co.uk 127.0.0.1 ero-advertising.com +127.0.0.1 ero-advertising.de 127.0.0.1 ero-advertising.eu 127.0.0.1 ero-advertising.info +127.0.0.1 ero-advertising.lol 127.0.0.1 ero-advertising.net 127.0.0.1 ero-advertising.nl +127.0.0.1 ero-advertising.ooo 127.0.0.1 ero-advertising.org +127.0.0.1 ero-advertising.xyz 127.0.0.1 eroadvertising.biz 127.0.0.1 eroadvertising.com 127.0.0.1 eroadvertising.eu @@ -28067,6 +28147,7 @@ 127.0.0.1 esther-munsey.us 127.0.0.1 esther-strauss.us 127.0.0.1 esylx.voluumtrk.com +127.0.0.1 et-code.ru 127.0.0.1 et.grabnetworks.com 127.0.0.1 et.nytimes.com 127.0.0.1 et.twyn-group.com @@ -28074,6 +28155,7 @@ 127.0.0.1 etahub.com 127.0.0.1 ethicalads.net 127.0.0.1 ethn.io +127.0.0.1 etl.tindersparks.com 127.0.0.1 etlpa.voluumtrk.com 127.0.0.1 etonovosti.biz 127.0.0.1 etonovosti.net @@ -28135,6 +28217,7 @@ 127.0.0.1 events.tremorhub.com 127.0.0.1 events.walla.co.il 127.0.0.1 events30.adcolony.com +127.0.0.1 everstring.com 127.0.0.1 everydayhealth.demdex.net 127.0.0.1 everyfreegift.com 127.0.0.1 everyscape.com @@ -28223,9 +28306,11 @@ 127.0.0.1 extreme-dm.com 127.0.0.1 extremetracking.com 127.0.0.1 extremetracking.net +127.0.0.1 ey.c.appier.net 127.0.0.1 ey4uh.voluumtrk.com 127.0.0.1 eyaxf.voluumtrk.com 127.0.0.1 eyeblaster.com +127.0.0.1 eyescream-com-tw.b.appier.net 127.0.0.1 eyewond.hs.llnwd.net 127.0.0.1 ez-poll.superstats.com 127.0.0.1 ez-polls.superstats.com @@ -28360,7 +28445,9 @@ 127.0.0.1 feed.bizzclick.com 127.0.0.1 feed.peakclick.com 127.0.0.1 feed.snap.do +127.0.0.1 feed2allnow.me 127.0.0.1 feedblitz.com +127.0.0.1 feedfetch.c.appier.net 127.0.0.1 feedjit.com 127.0.0.1 feeds.global-intermedia.com 127.0.0.1 feeds.logicbuy.com @@ -28496,6 +28583,7 @@ 127.0.0.1 flex.msn.com 127.0.0.1 flexbanner.com 127.0.0.1 flexbeta.us.intellitxt.com +127.0.0.1 flexoffers.com 127.0.0.1 flickr.ivwbox.de 127.0.0.1 fliegen-sparen.de.intellitxt.com 127.0.0.1 flippermedia.go2cloud.org @@ -28541,7 +28629,6 @@ 127.0.0.1 followup.adlandpro.com 127.0.0.1 folloyu.com 127.0.0.1 foo.freelogs.com -127.0.0.1 fool.com 127.0.0.1 forbes.us.intellitxt.com 127.0.0.1 forbescom.112.2o7.net 127.0.0.1 forcemovement.go2cloud.org @@ -29157,6 +29244,7 @@ 127.0.0.1 friends.totallynsfw.com 127.0.0.1 fritz.asnetworks.de 127.0.0.1 frivol-ads.com +127.0.0.1 frl.c.appier.net 127.0.0.1 frog.wix.com 127.0.0.1 frogsthemes.go2cloud.org 127.0.0.1 from.rovion.com @@ -29198,6 +29286,7 @@ 127.0.0.1 fu7fb.voluumtrk.com 127.0.0.1 fuauq.voluumtrk.com 127.0.0.1 fucktubenetwork.com +127.0.0.1 fuel451.com 127.0.0.1 fugger.ipage.com 127.0.0.1 fullstory.com 127.0.0.1 fun-town.com @@ -29247,8 +29336,8 @@ 127.0.0.1 g.adspeed.net 127.0.0.1 g.atdmt.com 127.0.0.1 g.brothersoft.com +127.0.0.1 g.c.appier.net 127.0.0.1 g.delivery.net -127.0.0.1 g.live.com 127.0.0.1 g.msn.com 127.0.0.1 g.searchgist.com 127.0.0.1 g.seoparts.net @@ -29312,6 +29401,7 @@ 127.0.0.1 gateway.blamads.com 127.0.0.1 gateway.fortunelounge.com 127.0.0.1 gateways.s3.amazonaws.com +127.0.0.1 gatewaytracker.com 127.0.0.1 gather.hankyung.com 127.0.0.1 gator.com 127.0.0.1 gay.xxxcounter.com @@ -29331,7 +29421,6 @@ 127.0.0.1 ge1.ca 127.0.0.1 gear.ign.us.intellitxt.com 127.0.0.1 geekstogo.us.intellitxt.com -127.0.0.1 geigercount.net 127.0.0.1 gelzg.voluumtrk.com 127.0.0.1 gemgx.voluumtrk.com 127.0.0.1 geneme.go2cloud.org @@ -29352,6 +29441,7 @@ 127.0.0.1 geo.query.yahoo.com 127.0.0.1 geo.safelinktracker.com 127.0.0.1 geo.smaato.net +127.0.0.1 geo.startappservice.com 127.0.0.1 geo.yahoo.com 127.0.0.1 geo.ziffdavis.com 127.0.0.1 geo2.adobe.com @@ -29505,7 +29595,9 @@ 127.0.0.1 getdirect.ru 127.0.0.1 getexceptional.com 127.0.0.1 getfreebl.com +127.0.0.1 getglasses-com-au.b.appier.net 127.0.0.1 getlinksinaseconds.com +127.0.0.1 getmetrical.com 127.0.0.1 getmycell.com 127.0.0.1 getoffersdirect.go2cloud.org 127.0.0.1 getpaidtosurfthenetmoney.homestead.com @@ -29540,6 +29632,7 @@ 127.0.0.1 giftjap.justclick.ru 127.0.0.1 gifttracker.com 127.0.0.1 gifttree.track4.com +127.0.0.1 gili-lankanfushi-com.b.appier.net 127.0.0.1 gillian-boissonneault.us 127.0.0.1 gillian-leavens.us 127.0.0.1 girafa.com @@ -29562,6 +29655,9 @@ 127.0.0.1 gladys-theriot.us 127.0.0.1 gladys-viola.us 127.0.0.1 glam.ivwbox.de +127.0.0.1 glassesonline-com-ph.b.appier.net +127.0.0.1 glassesonline-com-sg.b.appier.net +127.0.0.1 glassesonline-com-tw.b.appier.net 127.0.0.1 glbad.adtech.de 127.0.0.1 glean.pop6.com 127.0.0.1 glieo.voluumtrk.com @@ -29650,6 +29746,7 @@ 127.0.0.1 go.theadsnet.com 127.0.0.1 go.toutapp.com 127.0.0.1 go.trackgold.net +127.0.0.1 go.tracking222.site 127.0.0.1 go.trafficshop.com 127.0.0.1 go.underclick.ru 127.0.0.1 go.voice2page.com @@ -29666,11 +29763,14 @@ 127.0.0.1 go34down.com 127.0.0.1 goadv.com 127.0.0.1 goalcom.ivwbox.de +127.0.0.1 gocm.c.appier.net +127.0.0.1 godrejproperties-com.b.appier.net 127.0.0.1 goetheinstitut01.webtrekk.net 127.0.0.1 gofugyourself.us.intellitxt.com 127.0.0.1 gogousenet.com 127.0.0.1 goingplatinum.com 127.0.0.1 goku.brightcove.com +127.0.0.1 gold-file.com 127.0.0.1 gold.weborama.fr 127.0.0.1 goldenticket.disconnect.me 127.0.0.1 goldisn.cu.cc @@ -29694,6 +29794,7 @@ 127.0.0.1 google-analytics.com 127.0.0.1 googleads.g.doubleclick.net 127.0.0.1 googleads2.g.doubleclick.net +127.0.0.1 googleads4.g.doubleclick.net 127.0.0.1 googleadservices.com 127.0.0.1 googlesyndication.com 127.0.0.1 googletagmanager.com @@ -29959,6 +30060,7 @@ 127.0.0.1 hastrk4.com 127.0.0.1 hata.ero-advertising.com 127.0.0.1 hatbo.voluumtrk.com +127.0.0.1 hatelive.site 127.0.0.1 hatmedia.go2cloud.org 127.0.0.1 hauptstadtmuttide.digidip.net 127.0.0.1 haus.ivwbox.de @@ -29981,6 +30083,7 @@ 127.0.0.1 hcu1u.voluumtrk.com 127.0.0.1 hd.jmp9.com 127.0.0.1 hdc3z.voluumtrk.com +127.0.0.1 hdlife-com-tw.b.appier.net 127.0.0.1 hdmoviesinc.com 127.0.0.1 hdplugindownload.com 127.0.0.1 heals.msgfocus.com @@ -30044,6 +30147,7 @@ 127.0.0.1 hindsight.com 127.0.0.1 hints.netflame.cc 127.0.0.1 hipcrime.home.dhs.org +127.0.0.1 hipersushiads.com 127.0.0.1 hippo.adultadworld.com 127.0.0.1 histats.com 127.0.0.1 hit-counter.5u.com @@ -30126,6 +30230,7 @@ 127.0.0.1 hkik.ru 127.0.0.1 hld.jmp9.com 127.0.0.1 hlgsolutions.go2cloud.org +127.0.0.1 hlok.qertewrt.com 127.0.0.1 hlrke.voluumtrk.com 127.0.0.1 hlt6o.voluumtrk.com 127.0.0.1 hm-analytics.com @@ -30176,6 +30281,7 @@ 127.0.0.1 homevisions.com 127.0.0.1 hondahookup.us.intellitxt.com 127.0.0.1 honeybadger.io +127.0.0.1 hongkongdisneyland-com.b.appier.net 127.0.0.1 hook.yieldbuild.com 127.0.0.1 hoopsvibe.us.intellitxt.com 127.0.0.1 hooqy.com @@ -30189,6 +30295,7 @@ 127.0.0.1 horizont.ivwbox.de 127.0.0.1 horse-racing-affiliate-program.co.uk 127.0.0.1 host-tracker.com +127.0.0.1 host.clicksor.com 127.0.0.1 host.leadbolt.com 127.0.0.1 host003.jag.vmsn.de 127.0.0.1 host006.jag.vmsn.de @@ -30311,6 +30418,7 @@ 127.0.0.1 hywae.voluumtrk.com 127.0.0.1 hz7.de 127.0.0.1 i-cdn.servedbyopenx.com +127.0.0.1 i-fit-com-tw.b.appier.net 127.0.0.1 i-lookup.com 127.0.0.1 i-mobile.co.jp 127.0.0.1 i-vengo.com @@ -30334,7 +30442,6 @@ 127.0.0.1 i.kissmetrics.com 127.0.0.1 i.ligatus.com 127.0.0.1 i.linkurysearch.me -127.0.0.1 i.mol.im 127.0.0.1 i.moreover.com 127.0.0.1 i.mxplayer.j2inter.com 127.0.0.1 i.n.jwpltx.com @@ -30482,6 +30589,7 @@ 127.0.0.1 icubes.go2cloud.org 127.0.0.1 icvdm.vo.llnwd.net 127.0.0.1 id.allegisgroup.com +127.0.0.1 id.google.com 127.0.0.1 id.tynt.com 127.0.0.1 iddiction.com 127.0.0.1 idg.dmdelivery.com @@ -30610,6 +30718,7 @@ 127.0.0.1 images-aud.slashdot.org 127.0.0.1 images-aud.sourceforge.net 127.0.0.1 images-geo.outbrain.com +127.0.0.1 images-mcdn.startappexchange.com 127.0.0.1 images-pw.secureserver.net 127.0.0.1 images.about.com 127.0.0.1 images.adkmob.com @@ -30677,6 +30786,7 @@ 127.0.0.1 images.specialnetoffer.com 127.0.0.1 images.specificclick.net 127.0.0.1 images.speedbit.com +127.0.0.1 images.startappexchange.com 127.0.0.1 images.startappservice.com 127.0.0.1 images.streamray.com 127.0.0.1 images.taboola.com @@ -30802,11 +30912,11 @@ 127.0.0.1 img22.ru.redtram.com 127.0.0.1 img3.giardinelli.com 127.0.0.1 img3.giardinelli.com.edgesuite.net -127.0.0.1 img30.360buyimg.com 127.0.0.1 imgcache.classesusa.com 127.0.0.1 imgcache.vmsn.de 127.0.0.1 imgclck.com 127.0.0.1 imgfarm.com +127.0.0.1 imgg.adskeeper.co.uk 127.0.0.1 imgg.marketgid.com 127.0.0.1 imgg.steepto.com 127.0.0.1 imgn.dt07.net @@ -30827,6 +30937,7 @@ 127.0.0.1 imp.constantcontact.com 127.0.0.1 imp.fetchback.com 127.0.0.1 imp.optaim.com +127.0.0.1 imp.startappexchange.com 127.0.0.1 imp.tradedoubler.com 127.0.0.1 impact.applifier.com 127.0.0.1 impact.staging.applifier.com @@ -30886,6 +30997,7 @@ 127.0.0.1 incoming.cloud-trax.com 127.0.0.1 indiads.com 127.0.0.1 indicate.to +127.0.0.1 indicative.com 127.0.0.1 indieclick.3janecdn.com 127.0.0.1 indocpa.go2cloud.org 127.0.0.1 industryclick.com @@ -30908,6 +31020,7 @@ 127.0.0.1 info.elba.at 127.0.0.1 info.evidon.com 127.0.0.1 info.skyhookwireless.com +127.0.0.1 info.static.startappservice.com 127.0.0.1 info.web.de 127.0.0.1 info4.a7.org 127.0.0.1 infoc1.duba.net @@ -30926,6 +31039,7 @@ 127.0.0.1 inimage.tr553.com 127.0.0.1 init.lingospot.com 127.0.0.1 init.phpwind.net +127.0.0.1 init.startappexchange.com 127.0.0.1 initgroup.com 127.0.0.1 inkshare.com 127.0.0.1 inline.playbryte.com @@ -30996,6 +31110,7 @@ 127.0.0.1 internettrafficreport.com 127.0.0.1 interpr.ru 127.0.0.1 interreklame.de +127.0.0.1 interstateanalytics.com 127.0.0.1 interstitial.glsp.netdna-cdn.com 127.0.0.1 interupload.com 127.0.0.1 interworksmedia.co.kr @@ -31042,6 +31157,11 @@ 127.0.0.1 ione.netmng.com 127.0.0.1 iopodx.de 127.0.0.1 ios.revmob.com +127.0.0.1 iosads20.adcolony.com +127.0.0.1 iosads22.adcolony.com +127.0.0.1 iosads24.adcolony.com +127.0.0.1 iota1.rtb.appier.net +127.0.0.1 iota5.rtb.appier.net 127.0.0.1 ip-api.com 127.0.0.1 ip.casalemedia.com 127.0.0.1 ip134.timesink.com @@ -31146,6 +31266,7 @@ 127.0.0.1 ixsjz.voluumtrk.com 127.0.0.1 iy3me.voluumtrk.com 127.0.0.1 iyczm.voluumtrk.com +127.0.0.1 iyfnzgb.com 127.0.0.1 iymaw.voluumtrk.com 127.0.0.1 izzonet.go2cloud.org 127.0.0.1 i_sbitinbsjs_info.tlscdn.com @@ -31219,6 +31340,8 @@ 127.0.0.1 jd-mail.co.uk 127.0.0.1 jd.revolvermaps.com 127.0.0.1 jd2yj.voluumtrk.com +127.0.0.1 jdelta2.rtb.appier.net +127.0.0.1 jdelta3.rtb.appier.net 127.0.0.1 jdn.monster.com 127.0.0.1 je.revolvermaps.com 127.0.0.1 je60z.voluumtrk.com @@ -31233,6 +31356,7 @@ 127.0.0.1 jeanne-hutcherson.us 127.0.0.1 jeannette-nauman.us 127.0.0.1 jeannie-mccord.us +127.0.0.1 jeanswest-com-au.b.appier.net 127.0.0.1 jeiup.voluumtrk.com 127.0.0.1 jen-lobdell.us 127.0.0.1 jena-murrill.us @@ -31301,6 +31425,7 @@ 127.0.0.1 jobs.leadbolt.com 127.0.0.1 jobs.revmob.com 127.0.0.1 jobs.zedo.com +127.0.0.1 jobscentral-com-sg.b.appier.net 127.0.0.1 jocelyn-pyatt.us 127.0.0.1 jodi-abrams.us 127.0.0.1 jody-leal.us @@ -31335,7 +31460,6 @@ 127.0.0.1 jrcdelcotimescom.122.2o7.net 127.0.0.1 jrjdn.voluumtrk.com 127.0.0.1 jrtux.com -127.0.0.1 js-agent.newrelic.com 127.0.0.1 js-sec.indexww.com 127.0.0.1 js-webt-lol.9cache.com 127.0.0.1 js.ad-stir.com @@ -31457,6 +31581,7 @@ 127.0.0.1 jxzmo.voluumtrk.com 127.0.0.1 jzgng.voluumtrk.com 127.0.0.1 k.collective-media.net +127.0.0.1 k.ilius.net 127.0.0.1 k.zeroredirect.com 127.0.0.1 k.zeroredirect1.com 127.0.0.1 k.zeroredirect2.com @@ -31504,6 +31629,8 @@ 127.0.0.1 kathryn-berens.us 127.0.0.1 kathryn-scheele.us 127.0.0.1 kati-birdsall.us +127.0.0.1 katie.dntrx.com +127.0.0.1 katie.tnctrx.com 127.0.0.1 katlyn-oday.us 127.0.0.1 katrina-rumbaugh.us 127.0.0.1 katrina-urias.us @@ -31794,6 +31921,7 @@ 127.0.0.1 lea-danielson.us 127.0.0.1 lea-riser.us 127.0.0.1 lead.adsender.us +127.0.0.1 leadads.go2jump.org 127.0.0.1 leadback.advertising.com 127.0.0.1 leadbolt.com 127.0.0.1 leadclick.com @@ -31815,6 +31943,7 @@ 127.0.0.1 leads.383media.com 127.0.0.1 leads.demandbase.com 127.0.0.1 leads.ohecampus.com +127.0.0.1 leadtrackgo.com 127.0.0.1 leadtracking.plumvoice.com 127.0.0.1 leann-faulk.us 127.0.0.1 leanne-atwood.us @@ -31836,6 +31965,7 @@ 127.0.0.1 level.turboads.de 127.0.0.1 level3com.d2.sc.omtrdc.net 127.0.0.1 lever.co +127.0.0.1 levexis.com 127.0.0.1 lexa3maus.justclick.ru 127.0.0.1 lfbot.voluumtrk.com 127.0.0.1 lfstmedia.com @@ -31923,6 +32053,7 @@ 127.0.0.1 link.betafr.fr 127.0.0.1 link.betalite.fr 127.0.0.1 link.betasoft.fr +127.0.0.1 link.connectoffer.com 127.0.0.1 link.deal-of-king.com 127.0.0.1 link.easy-courriel.com 127.0.0.1 link.email-boxes.net @@ -31966,6 +32097,7 @@ 127.0.0.1 link.sysmail.fr 127.0.0.1 link.tbtrack.com 127.0.0.1 link.tonoffre.fr +127.0.0.1 link.trackscity.com 127.0.0.1 link.transibase.fr 127.0.0.1 link.transiblue.fr 127.0.0.1 link.transibox.fr @@ -32038,6 +32170,7 @@ 127.0.0.1 list.ru 127.0.0.1 list2.bravenet.com 127.0.0.1 listbot.com +127.0.0.1 listenloop.com 127.0.0.1 lisyn.voluumtrk.com 127.0.0.1 litiumo.com 127.0.0.1 live-cams-1.livejasmin.com @@ -32049,6 +32182,7 @@ 127.0.0.1 live.sekindo.com 127.0.0.1 live1.logaholic.com 127.0.0.1 live2.logaholic.com +127.0.0.1 live3s.me 127.0.0.1 liveadexchanger.com 127.0.0.1 liveadvert.com 127.0.0.1 livecams.nl @@ -32084,6 +32218,7 @@ 127.0.0.1 ljteas.com 127.0.0.1 ljujm.voluumtrk.com 127.0.0.1 lkb.berlinermedienvertrieb.de +127.0.0.1 lkqd.net 127.0.0.1 lli.org 127.0.0.1 llivedotcom.2cnt.net 127.0.0.1 llivedotcomtest.2cnt.net @@ -32100,6 +32235,7 @@ 127.0.0.1 ln1-g669.intellitxt.com 127.0.0.1 lnkgo.com 127.0.0.1 lnkgt.com +127.0.0.1 lnkxfer8.com 127.0.0.1 lnwns.voluumtrk.com 127.0.0.1 lnx.lu 127.0.0.1 load.exelator.com @@ -32213,6 +32349,7 @@ 127.0.0.1 logc57.xiti.com 127.0.0.1 logc8.xiti.com 127.0.0.1 logc9.xiti.com +127.0.0.1 logentries.com 127.0.0.1 logger-01.vty.dailymotion.com 127.0.0.1 logger-02.vty.dailymotion.com 127.0.0.1 logger-03.vty.dailymotion.com @@ -32266,7 +32403,6 @@ 127.0.0.1 logs.live.tudou.com 127.0.0.1 logs.naukri.com 127.0.0.1 logs.nodejs.org -127.0.0.1 logs.omegle.com 127.0.0.1 logs.openstack.org 127.0.0.1 logs.ovh.net 127.0.0.1 logs.revmob.com @@ -32383,6 +32519,7 @@ 127.0.0.1 lslmetrics.djlmgdigital.com 127.0.0.1 lsut8.voluumtrk.com 127.0.0.1 lt.andomedia.com +127.0.0.1 lt.c.appier.net 127.0.0.1 lt.retargeter.com 127.0.0.1 ltassrv.com.s3.amazonaws.com 127.0.0.1 ltljm.voluumtrk.com @@ -32437,6 +32574,7 @@ 127.0.0.1 m.adnxs.com 127.0.0.1 m.adsymptotic.com 127.0.0.1 m.adtc.daum.net +127.0.0.1 m.ajxqiongbg.com 127.0.0.1 m.astrokolik.com 127.0.0.1 m.awesometracker.com 127.0.0.1 m.banner.linksynergy.com @@ -32525,6 +32663,7 @@ 127.0.0.1 madmax53.stellar.cpa.clicksure.com 127.0.0.1 madmimi.com 127.0.0.1 madnet.ru +127.0.0.1 mads.amazon-adsystem.com 127.0.0.1 mads.at.atwola.com 127.0.0.1 mads.bz 127.0.0.1 mads.cnet.com @@ -32543,6 +32682,7 @@ 127.0.0.1 magicfuture.go2cloud.org 127.0.0.1 magicmail.co.nz 127.0.0.1 magicmail.createsend.com +127.0.0.1 magifirst.com 127.0.0.1 magnify360-cdn.s3.amazonaws.com 127.0.0.1 mail-to-a-friend.com 127.0.0.1 mail.adsender.us @@ -32721,6 +32861,7 @@ 127.0.0.1 maxspeedcdn.com 127.0.0.1 maxtrust.ru 127.0.0.1 maxvr.112.2o7.net +127.0.0.1 mazda-com-tw.b.appier.net 127.0.0.1 mazetin.ru 127.0.0.1 mb.datingadzone.com 127.0.0.1 mb.gammae.com @@ -32869,6 +33010,7 @@ 127.0.0.1 mediacdn.discus.com 127.0.0.1 mediadomain.com 127.0.0.1 mediadome.com +127.0.0.1 mediaforce.com 127.0.0.1 mediafr.247realmedia.com 127.0.0.1 mediageneral.com 127.0.0.1 mediahorizons.com @@ -32895,6 +33037,7 @@ 127.0.0.1 mediavisor.doubleclick.net 127.0.0.1 mediciinternet.go2cloud.org 127.0.0.1 medicinenet.us.intellitxt.com +127.0.0.1 medio.com 127.0.0.1 medleyads.com 127.0.0.1 medrx.sensis.com.au 127.0.0.1 meethotties.mobi @@ -33137,6 +33280,7 @@ 127.0.0.1 mmtracking.com 127.0.0.1 mmtrkdb.com 127.0.0.1 mmtrkmc.com +127.0.0.1 mnetads.com 127.0.0.1 mnetads.net 127.0.0.1 mngiangibabest.112.2o7.net 127.0.0.1 mngidmn.112.2o7.net @@ -33245,6 +33389,8 @@ 127.0.0.1 mokono.com 127.0.0.1 mollie-patino.us 127.0.0.1 mom.freelogs.com +127.0.0.1 momomall-com-tw.b.appier.net +127.0.0.1 momoshop-com-tw.b.appier.net 127.0.0.1 mon.0f8.cdnfarm18.com 127.0.0.1 mon.2os.cdnfarm18.com 127.0.0.1 mon.2yf.cdnfarm18.com @@ -33306,6 +33452,7 @@ 127.0.0.1 mov-ie.biz 127.0.0.1 movieads.ero-advertising.com 127.0.0.1 moviepulp.eu +127.0.0.1 movise.site 127.0.0.1 moz.ivwbox.de 127.0.0.1 mozo-widgets.f2.com.au 127.0.0.1 mozoo.com @@ -33401,6 +33548,7 @@ 127.0.0.1 musculahq.appspot.com 127.0.0.1 musecdn.businesscatalyst.com 127.0.0.1 musiccounter.ru +127.0.0.1 muv.famousintactswitch.com 127.0.0.1 mv6we.voluumtrk.com 127.0.0.1 mvexg.voluumtrk.com 127.0.0.1 mvldn.voluumtrk.com @@ -33457,6 +33605,7 @@ 127.0.0.1 mydbb2.surf-town.net 127.0.0.1 mydbc1.surf-town.net 127.0.0.1 mydealz.ivwbox.de +127.0.0.1 mydress-com-tw.b.appier.net 127.0.0.1 myetracker.com 127.0.0.1 myfamilyancestry.112.2o7.net 127.0.0.1 myfamilysurvival.net @@ -33529,6 +33678,7 @@ 127.0.0.1 n.bodybuilding.com 127.0.0.1 n.gemini.yahoo.com 127.0.0.1 n.ladycash.ru +127.0.0.1 n.lcads.ru 127.0.0.1 n.pay-click.ru 127.0.0.1 n.targetdtracker.com 127.0.0.1 n.uimserv.net @@ -33556,9 +33706,29 @@ 127.0.0.1 n51.adshostnet.com 127.0.0.1 n52.adshostnet.com 127.0.0.1 n6.adshostnet.com +127.0.0.1 n60adserv.com +127.0.0.1 n61adserv.com +127.0.0.1 n62adserv.com +127.0.0.1 n63adserv.com +127.0.0.1 n64adserv.com +127.0.0.1 n65adserv.com +127.0.0.1 n66adserv.com +127.0.0.1 n67adserv.com +127.0.0.1 n68adserv.com 127.0.0.1 n69.com +127.0.0.1 n69adserv.com 127.0.0.1 n7.adshostnet.com +127.0.0.1 n70adserv.com +127.0.0.1 n71adserv.com 127.0.0.1 n72.adshostnet.com +127.0.0.1 n72adserv.com +127.0.0.1 n73adserv.com +127.0.0.1 n74adserv.com +127.0.0.1 n75adserv.com +127.0.0.1 n76adserv.com +127.0.0.1 n77adserv.com +127.0.0.1 n78adserv.com +127.0.0.1 n79adserv.com 127.0.0.1 n7yk4.voluumtrk.com 127.0.0.1 n8.adshostnet.com 127.0.0.1 n9.adshostnet.com @@ -33575,6 +33745,7 @@ 127.0.0.1 nanostats.nanopress.it 127.0.0.1 naomi-thorn.us 127.0.0.1 napster.searchwho.com +127.0.0.1 naruko-com-tw.b.appier.net 127.0.0.1 nastydollars.com 127.0.0.1 nata.ero-advertising.com 127.0.0.1 natalia-dimick.us @@ -33727,6 +33898,7 @@ 127.0.0.1 newpayload.yieldbuild.com 127.0.0.1 newprose.bravejournal.com 127.0.0.1 news-whistleout.s3.amazonaws.com +127.0.0.1 news.creapia.com 127.0.0.1 news.duba.net 127.0.0.1 news.idealmedia.com 127.0.0.1 news.mgid.com @@ -33744,6 +33916,7 @@ 127.0.0.1 nexac.demdex.net 127.0.0.1 nexage.com 127.0.0.1 nextlevel.com +127.0.0.1 nextmag.apx.appier.net 127.0.0.1 nexus.adspirit.de 127.0.0.1 nexus.ensighten.com 127.0.0.1 nexusads.adspirit.de @@ -33773,6 +33946,7 @@ 127.0.0.1 ninemsn.imrworldwide.com 127.0.0.1 nip.net 127.0.0.1 nitroclicks.com +127.0.0.1 nj.fo.startappservice.com 127.0.0.1 njashka.ru 127.0.0.1 njfy6.voluumtrk.com 127.0.0.1 njump.youmobistein.com @@ -34132,7 +34306,6 @@ 127.0.0.1 ocs.websponsors.com 127.0.0.1 odb-chidc2.outbrain.com 127.0.0.1 odb.outbrain.com -127.0.0.1 oddcast.com 127.0.0.1 odin.goo.mx 127.0.0.1 odmdr.voluumtrk.com 127.0.0.1 odzb5nkp.com @@ -34148,6 +34321,7 @@ 127.0.0.1 offer.alibaba.com 127.0.0.1 offerannex.go2cloud.org 127.0.0.1 offerdeliver.com +127.0.0.1 offeredby.net 127.0.0.1 offeroptimizer.com 127.0.0.1 offers.appnext.com 127.0.0.1 offers.avazuscd.net @@ -34222,6 +34396,7 @@ 127.0.0.1 on-mobi.com 127.0.0.1 on.linkexchange.com 127.0.0.1 on.maxspeedcdn.com +127.0.0.1 onceux.unicornmedia.com 127.0.0.1 onclasrv.com 127.0.0.1 onclickads.net 127.0.0.1 onclickads2.net @@ -34230,6 +34405,8 @@ 127.0.0.1 one.123counters.com 127.0.0.1 oneandonlynetwork.com 127.0.0.1 oneclickcash.com +127.0.0.1 onedrive-collection.device.mobileengagement.windows.net +127.0.0.1 onedrive-onerm-events-primary-cus.servicebus.windows.net 127.0.0.1 onefeed.co.uk 127.0.0.1 onelouder.com 127.0.0.1 onenetworkdirect.net @@ -34501,6 +34678,7 @@ 127.0.0.1 oyvir.voluumtrk.com 127.0.0.1 ozzhf.voluumtrk.com 127.0.0.1 o_thus.ero-advertising.com +127.0.0.1 p-bandai-hk.b.appier.net 127.0.0.1 p-log.ykimg.com 127.0.0.1 p.37lai.com 127.0.0.1 p.ace.advertising.com @@ -34608,6 +34786,7 @@ 127.0.0.1 pamela-wanamaker.us 127.0.0.1 pan.conanpartners.com 127.0.0.1 panachedesai.go2cloud.org +127.0.0.1 panasonic-jp.b.appier.net 127.0.0.1 pandaapp.us.intellitxt.com 127.0.0.1 panel-metrica.2cnt.net 127.0.0.1 panel.ioam.de @@ -34871,6 +35050,7 @@ 127.0.0.1 ping.getadblock.com 127.0.0.1 ping.jmp9.com 127.0.0.1 ping.rasset.ie +127.0.0.1 ping.taplytics.com 127.0.0.1 ping.westley.crowdscience.com 127.0.0.1 pingback.sogou.com 127.0.0.1 pinger.macromedia.com @@ -34951,6 +35131,7 @@ 127.0.0.1 pixel.trafficmp.com 127.0.0.1 pixel.tree.com 127.0.0.1 pixel.vmm-satellite2.com +127.0.0.1 pixel.watch 127.0.0.1 pixel.wp.com 127.0.0.1 pixel.wp.tv 127.0.0.1 pixel.xmladfeed.com @@ -34999,6 +35180,9 @@ 127.0.0.1 pl5225.bntags.com 127.0.0.1 pl5411.bntags.com 127.0.0.1 pl61x.voluumtrk.com +127.0.0.1 placed.com +127.0.0.1 placehold.it +127.0.0.1 placeholdit.imgix.net 127.0.0.1 planche.ovh 127.0.0.1 planet-source-code.us.intellitxt.com 127.0.0.1 planetactive.com @@ -35014,7 +35198,6 @@ 127.0.0.1 play.affmob.org 127.0.0.1 play.leadzu.com 127.0.0.1 play2mobi.com -127.0.0.1 play44.net 127.0.0.1 play4traffic.com 127.0.0.1 playads.applift.com 127.0.0.1 playboy.ivwbox.de @@ -35190,6 +35373,7 @@ 127.0.0.1 pr.blogflux.com 127.0.0.1 pr.pbp.vip.ir2.yahoo.com 127.0.0.1 pr.prchecker.info +127.0.0.1 pr.ybp.yahoo.com 127.0.0.1 praiseads.go2cloud.org 127.0.0.1 pranking12.ziyu.net 127.0.0.1 prchecker.info @@ -35303,6 +35487,7 @@ 127.0.0.1 promos.adlead.com 127.0.0.1 promos.fling.com 127.0.0.1 promos.gpniches.com +127.0.0.1 promote.buy-targeted-traffic.com 127.0.0.1 promote.pair.com 127.0.0.1 promotion.coreg.de 127.0.0.1 promotion.partnercash.com @@ -35512,10 +35697,12 @@ 127.0.0.1 pubnative.net 127.0.0.1 pubs.lemonde.fr 127.0.0.1 pubted.com +127.0.0.1 pubx.co 127.0.0.1 pud.cpulse.com 127.0.0.1 puhtml.com 127.0.0.1 pulharktheherald.112.2o7.net 127.0.0.1 pulpantagraph.112.2o7.net +127.0.0.1 pulsepoint.com 127.0.0.1 pulsetv.com 127.0.0.1 puma.vizu.com.51275.9332.302br.net 127.0.0.1 puma.vizu.com.51276.9332.302br.net @@ -35692,6 +35879,8 @@ 127.0.0.1 r.mobpartner.mobi 127.0.0.1 r.movad.de 127.0.0.1 r.msn.com +127.0.0.1 r.my.com +127.0.0.1 r.myadx.net 127.0.0.1 r.openx.net 127.0.0.1 r.pixel.trafficmp.com 127.0.0.1 r.radikal.ru @@ -35707,6 +35896,7 @@ 127.0.0.1 r.zeroredirect1.com 127.0.0.1 r.zeroredirect2.com 127.0.0.1 r0d2x.voluumtrk.com +127.0.0.1 r1---sn-vgqsen7z.googlevideo.com 127.0.0.1 r1.ace.advertising.com 127.0.0.1 r1.beta.ace.advertising.com 127.0.0.1 r1.computerbild.de @@ -35714,21 +35904,27 @@ 127.0.0.1 r1.fmpub.net 127.0.0.1 r1.pcwelt.de 127.0.0.1 r1.plugrush.com +127.0.0.1 r1.sn-vgqsen7z.googlevideo.com 127.0.0.1 r1.zedo.com 127.0.0.1 r10.cooleremail.com 127.0.0.1 r11.cooleremail.com -127.0.0.1 r2.computerbild.de +127.0.0.1 r17---sn-vgqsenes.googlevideo.com +127.0.0.1 r2---sn-vgqs7n7k.googlevideo.com 127.0.0.1 r2.cooleremail.com 127.0.0.1 r2.linksynergy.com 127.0.0.1 r2.plugrush.com +127.0.0.1 r20---sn-vgqs7ne7.googlevideo.com 127.0.0.1 r20.rs6.net +127.0.0.1 r20.sn-vgqs7ne7.googlevideo.com 127.0.0.1 r2fjs.voluumtrk.com 127.0.0.1 r2jmarketing.go2cloud.org 127.0.0.1 r2v3n.voluumtrk.com 127.0.0.1 r3.cooleremail.com 127.0.0.1 r3.plugrush.com +127.0.0.1 r4---sn-vgqs7nez.googlevideo.com 127.0.0.1 r4.cooleremail.com 127.0.0.1 r4.plugrush.com +127.0.0.1 r4.sn-vgqs7nez.googlevideo.com 127.0.0.1 r4zih.voluumtrk.com 127.0.0.1 r5.cooleremail.com 127.0.0.1 r5.plugrush.com @@ -35794,6 +35990,7 @@ 127.0.0.1 ravenstonedigital.go2cloud.org 127.0.0.1 rawdinner.justclick.ru 127.0.0.1 rawstory.us.intellitxt.com +127.0.0.1 raygun.io 127.0.0.1 raymond.uk.intellitxt.com 127.0.0.1 rb1.design.ru 127.0.0.1 rbb.ic.llnwd.net @@ -35814,6 +36011,7 @@ 127.0.0.1 rcm-images.amazon.com 127.0.0.1 rcm.amazon.com 127.0.0.1 rcm.go2cloud.org +127.0.0.1 rcp.c.appier.net 127.0.0.1 rcpmf.voluumtrk.com 127.0.0.1 rcsmetrics.it 127.0.0.1 rd-eu.a9.com @@ -35949,6 +36147,7 @@ 127.0.0.1 reklam.rfsl.se 127.0.0.1 reklama.internet.cz 127.0.0.1 reklama.reflektor.cz +127.0.0.1 relap.io 127.0.0.1 relatedweboffers.com 127.0.0.1 relay.cj.com 127.0.0.1 relay.livejasmin.com @@ -35973,6 +36172,7 @@ 127.0.0.1 report-zt.1rx.io 127.0.0.1 report.adsender.us 127.0.0.1 report.adview.cn +127.0.0.1 report.footprintdns.com 127.0.0.1 report.ivwbox.de 127.0.0.1 report.qq.com 127.0.0.1 report.the-path-gateway.com @@ -36010,6 +36210,7 @@ 127.0.0.1 req.adsmogo.com 127.0.0.1 req.appads.com 127.0.0.1 req.mojiva.com +127.0.0.1 req.startappexchange.com 127.0.0.1 req.startappservice.com 127.0.0.1 req1.appads.com 127.0.0.1 req2.appads.com @@ -36052,6 +36253,7 @@ 127.0.0.1 rev2pub.adk2x.com 127.0.0.1 revadsnetwork.com 127.0.0.1 revadstrk.com +127.0.0.1 revdepo.com 127.0.0.1 revealads.appspot.com 127.0.0.1 revelations.trovus.co.uk 127.0.0.1 revenue.net @@ -36099,7 +36301,6 @@ 127.0.0.1 rightonmediagroup.go2cloud.org 127.0.0.1 rightpundits.us.intellitxt.com 127.0.0.1 rightstats.com -127.0.0.1 rink.hockeyapp.net 127.0.0.1 ripbwing.com 127.0.0.1 rivasearch.com 127.0.0.1 rjfjx.voluumtrk.com @@ -36113,6 +36314,7 @@ 127.0.0.1 rlcxi.voluumtrk.com 127.0.0.1 rleeden.myby.co.uk 127.0.0.1 rll9v.voluumtrk.com +127.0.0.1 rlog-api.under9.co 127.0.0.1 rlog.9gag.com 127.0.0.1 rlyg7.voluumtrk.com 127.0.0.1 rm.yieldmanager.com @@ -36147,6 +36349,7 @@ 127.0.0.1 roia.hutchmedia.com 127.0.0.1 roiadtracker.com 127.0.0.1 roitracker.com +127.0.0.1 rollbar.com 127.0.0.1 romanticfm.2cnt.net 127.0.0.1 romview.atdmt.com.915.9004.302br.net 127.0.0.1 ronaldheft.com @@ -36177,7 +36380,6 @@ 127.0.0.1 roxio.112.2o7.net 127.0.0.1 roxionewroxio2006.112.2o7.net 127.0.0.1 royal-cannabis-seeds-nirvanashop.netdna-ssl.com -127.0.0.1 royal.pingdom.com 127.0.0.1 royalmial.112.207.net 127.0.0.1 rp.alcoholsoftcdn.com 127.0.0.1 rp.filefactscdn.com @@ -36232,6 +36434,7 @@ 127.0.0.1 rtrk.com 127.0.0.1 rts.fling.doublepimp.com 127.0.0.1 rts.lj.doublepimp.com +127.0.0.1 rts.mobula.sdk.duapps.com 127.0.0.1 rtsg.com 127.0.0.1 rtso.divolution.com 127.0.0.1 rtt.adrolays.de @@ -36252,7 +36455,10 @@ 127.0.0.1 rum-static.pingdom.net 127.0.0.1 rum.monitis.com 127.0.0.1 rum.turbobytes.com +127.0.0.1 run.dts.startappservice.com 127.0.0.1 run.dvdbeats.com +127.0.0.1 run.startappexchange.com +127.0.0.1 run.trackimpression.com 127.0.0.1 rundumsb.ivwbox.de 127.0.0.1 rungun.com 127.0.0.1 runner.mobpow.net @@ -36313,6 +36519,7 @@ 127.0.0.1 s.as997.de 127.0.0.1 s.ato.mx 127.0.0.1 s.btstatic.com +127.0.0.1 s.c.appier.net 127.0.0.1 s.click.aliexpress.com 127.0.0.1 s.click.alimama.com 127.0.0.1 s.click.taobao.com @@ -36344,7 +36551,6 @@ 127.0.0.1 s.renren.com 127.0.0.1 s.rev2pub.com 127.0.0.1 s.sharethis.com -127.0.0.1 s.shopify.com 127.0.0.1 s.skimresources.com 127.0.0.1 s.speednetwork2.com 127.0.0.1 s.ssacdn.com @@ -36506,7 +36712,6 @@ 127.0.0.1 saas.seewhy.com 127.0.0.1 sabela.com 127.0.0.1 sabin.free.fr -127.0.0.1 sabre.com 127.0.0.1 sabrina-rivers.us 127.0.0.1 sact.atdmt.com 127.0.0.1 sad1.adriver.ru @@ -36574,7 +36779,6 @@ 127.0.0.1 schumacher.adtech.fr 127.0.0.1 sciamglobal.112.2o7.net 127.0.0.1 scie.ovh -127.0.0.1 scimmiablu.altervista.org 127.0.0.1 sclick.baidu.com 127.0.0.1 scootloor.com 127.0.0.1 scorecard.wspisp.net @@ -36642,7 +36846,6 @@ 127.0.0.1 sdc.mcafee.com 127.0.0.1 sdk-b.apptornado.com 127.0.0.1 sdk.appbrain.com -127.0.0.1 sdk.hockeyapp.net 127.0.0.1 sdk.justad.mobi 127.0.0.1 sdk.testflightapp.com 127.0.0.1 sdkm.w.inmobi.com @@ -36707,6 +36910,7 @@ 127.0.0.1 secserv.adtech.de 127.0.0.1 secserv.adtech.fr 127.0.0.1 sectracking.com +127.0.0.1 secure-ads.pictela.net 127.0.0.1 secure-assets.rubiconproject.com 127.0.0.1 secure-au.imrworldwide.com 127.0.0.1 secure-cdn.mplxtms.com @@ -36792,9 +36996,11 @@ 127.0.0.1 selina-wimmer.us 127.0.0.1 sellads.eu 127.0.0.1 sem.shopexplorer.com +127.0.0.1 sematext.com 127.0.0.1 semrush.com 127.0.0.1 send.microad.jp 127.0.0.1 send4fun.com +127.0.0.1 seniorttub.bid 127.0.0.1 senseiproducts.com 127.0.0.1 sensor.org.ua 127.0.0.1 seoproofits.justclick.ru @@ -36948,6 +37154,7 @@ 127.0.0.1 service.clicksvenue.com 127.0.0.1 service.maxymiser.net 127.0.0.1 service.sponsorpay.com +127.0.0.1 service.srvmd60.com 127.0.0.1 service.urchin.com 127.0.0.1 service001.adtech.fr 127.0.0.1 service002.adtech.fr @@ -36969,6 +37176,7 @@ 127.0.0.1 serving-sys.com.36659.9244.302br.net 127.0.0.1 serving.adsrevenue.clicksor.net 127.0.0.1 serving.asdrevenue.clicksor.net +127.0.0.1 serving.demo.clicksor.net 127.0.0.1 serving.plexop.net 127.0.0.1 servlet.adten.eu 127.0.0.1 serw.clicksor.com @@ -36981,7 +37189,6 @@ 127.0.0.1 sett.i12.de 127.0.0.1 settings-sandbox.data.microsoft.com 127.0.0.1 settings-win.data.microsoft.com -127.0.0.1 settings.crashlytics.com 127.0.0.1 setup01.ixn.local.vmsn.de 127.0.0.1 seu.cleverreach.com 127.0.0.1 seventynine.go2cloud.org @@ -37001,6 +37208,9 @@ 127.0.0.1 sfw.adsafeprotected.com 127.0.0.1 sg-ssl.effectivemeasure.net 127.0.0.1 sg.adserver.yahoo.com +127.0.0.1 sg.akamai.startappservice.com +127.0.0.1 sg.c.appier.net +127.0.0.1 sg.origin.startappservice.com 127.0.0.1 sg.winmobi.me 127.0.0.1 sgcdn.duplomediaas.netdna-cdn.com 127.0.0.1 sgiz.mobi @@ -37047,9 +37257,11 @@ 127.0.0.1 shop.gnezdo.ru 127.0.0.1 shop.zedo.com 127.0.0.1 shopexplorer.com +127.0.0.1 shopping-udn-com.b.appier.net 127.0.0.1 shopping.dailycamera.com 127.0.0.1 shoppingpartners2.futurenet.com 127.0.0.1 shorte.st +127.0.0.1 show-jp1.c.appier.net 127.0.0.1 show.buzzcity.net 127.0.0.1 show.ctrmanager.com 127.0.0.1 show.textads.lv @@ -37078,6 +37290,34 @@ 127.0.0.1 sifyimg.edgesuite.net 127.0.0.1 sifyimg.speedera.net 127.0.0.1 sig.gamerdna.com +127.0.0.1 sigma0.rtb.appier.net +127.0.0.1 sigma1.rtb.appier.net +127.0.0.1 sigma10.rtb.appier.net +127.0.0.1 sigma100.rtb.appier.net +127.0.0.1 sigma11.rtb.appier.net +127.0.0.1 sigma111.rtb.appier.net +127.0.0.1 sigma12.rtb.appier.net +127.0.0.1 sigma126.rtb.appier.net +127.0.0.1 sigma132.rtb.appier.net +127.0.0.1 sigma22.rtb.appier.net +127.0.0.1 sigma23.rtb.appier.net +127.0.0.1 sigma26.rtb.appier.net +127.0.0.1 sigma27.rtb.appier.net +127.0.0.1 sigma51.rtb.appier.net +127.0.0.1 sigma52.rtb.appier.net +127.0.0.1 sigma63.rtb.appier.net +127.0.0.1 sigma67.rtb.appier.net +127.0.0.1 sigma69.rtb.appier.net +127.0.0.1 sigma72.rtb.appier.net +127.0.0.1 sigma73.rtb.appier.net +127.0.0.1 sigma74.rtb.appier.net +127.0.0.1 sigma76.rtb.appier.net +127.0.0.1 sigma79.rtb.appier.net +127.0.0.1 sigma84.rtb.appier.net +127.0.0.1 sigma85.rtb.appier.net +127.0.0.1 sigma89.rtb.appier.net +127.0.0.1 sigma94.rtb.appier.net +127.0.0.1 sigma97.rtb.appier.net 127.0.0.1 signaltrader.go2cloud.org 127.0.0.1 signpost.go2cloud.org 127.0.0.1 signup.clicksor.com @@ -37096,6 +37336,7 @@ 127.0.0.1 simyo.adclear.net 127.0.0.1 sin.ero-advertising.com 127.0.0.1 sinatra.addemam.eu +127.0.0.1 singaporeair-com.b.appier.net 127.0.0.1 sired.com 127.0.0.1 site-stats.com 127.0.0.1 site-stats.i8.com @@ -37244,6 +37485,7 @@ 127.0.0.1 socitm.govmetric.com 127.0.0.1 soclock.com 127.0.0.1 sofa.bankofamerica.com +127.0.0.1 sofia.ai 127.0.0.1 softcash.biz 127.0.0.1 softclick.com.br 127.0.0.1 softcore.xxxcounter.com @@ -37376,6 +37618,7 @@ 127.0.0.1 squarespace.evyy.net 127.0.0.1 sr.adrevolver.com 127.0.0.1 src.kitcode.net +127.0.0.1 srclickpro.ru 127.0.0.1 srf.wemfbox.ch 127.0.0.1 sronline.ivwbox.de 127.0.0.1 srs.targetpoint.com @@ -37423,6 +37666,7 @@ 127.0.0.1 srx.pl.ebayrtm.com 127.0.0.1 srx.sg.ebayrtm.com 127.0.0.1 srx.uk.ebayrtm.com +127.0.0.1 ss.c.appier.net 127.0.0.1 ss.crowdprocess.com 127.0.0.1 ss.linksynergy.com 127.0.0.1 ss.tiscali.it @@ -37433,6 +37677,7 @@ 127.0.0.1 ssdk.adkmob.com 127.0.0.1 ssh.kissmetrics.com 127.0.0.1 sshowads.pubmatic.com +127.0.0.1 sshtunnel.at 127.0.0.1 ssi.go2cloud.org 127.0.0.1 ssl-default.2cnt.net 127.0.0.1 ssl-error.2cnt.net @@ -37609,6 +37854,7 @@ 127.0.0.1 stat24.meta.ua 127.0.0.1 stat3.cybermonitor.com 127.0.0.1 stat4.edev.at +127.0.0.1 statcollector.sidearmsports.com 127.0.0.1 statcounter.com 127.0.0.1 statdb.pressflex.com 127.0.0.1 stateresolver.link @@ -37621,7 +37867,6 @@ 127.0.0.1 static-trackers.adtarget.me 127.0.0.1 static-www.ec.popcap.com 127.0.0.1 static.2mdn.net -127.0.0.1 static.360buyimg.com 127.0.0.1 static.acs86.com 127.0.0.1 static.addinto.com 127.0.0.1 static.addtoany.com @@ -37634,6 +37879,7 @@ 127.0.0.1 static.adzerk.net 127.0.0.1 static.adziff.com 127.0.0.1 static.affilae.com +127.0.0.1 static.akamai.startappexchange.com 127.0.0.1 static.alimama.com 127.0.0.1 static.ap.bittorrent.com 127.0.0.1 static.app.widdit.com @@ -37857,6 +38103,7 @@ 127.0.0.1 stats.g.doubleclick.net 127.0.0.1 stats.gamespy.com 127.0.0.1 stats.gammacash.com +127.0.0.1 stats.gbvanalytics.com 127.0.0.1 stats.geegain.com 127.0.0.1 stats.gohip.com 127.0.0.1 stats.greenpixels.com @@ -37869,7 +38116,6 @@ 127.0.0.1 stats.homestead.com 127.0.0.1 stats.homestead.net 127.0.0.1 stats.hosting24.com -127.0.0.1 stats.iihf.com 127.0.0.1 stats.ilius.net 127.0.0.1 stats.immense.net 127.0.0.1 stats.inciteminds.com @@ -38039,6 +38285,7 @@ 127.0.0.1 stream-online.net 127.0.0.1 stream.aff-id.com 127.0.0.1 stream.tribeca.vidavee.com +127.0.0.1 stream4u.me 127.0.0.1 streamagent.sensic.net 127.0.0.1 streamate.doublepimp.com 127.0.0.1 streamcastnetworks.com @@ -38312,6 +38559,7 @@ 127.0.0.1 t.zeroredirect.com 127.0.0.1 t.zeroredirect1.com 127.0.0.1 t.zeroredirect2.com +127.0.0.1 t0.c.appier.net 127.0.0.1 t0.extreme-dm.com 127.0.0.1 t0.formalyzer.com 127.0.0.1 t0.leadlander.com @@ -38409,6 +38657,7 @@ 127.0.0.1 tags.compuhot.com 127.0.0.1 tags.crwdcntrl.net 127.0.0.1 tags.expo9.exponential.com +127.0.0.1 tags.go2cloud.org 127.0.0.1 tags.grajteraz.pl 127.0.0.1 tags.h12-media.com 127.0.0.1 tags.jiwire.com @@ -38430,6 +38679,8 @@ 127.0.0.1 take5.real.com 127.0.0.1 talesoftheslayer.bravejournal.com 127.0.0.1 talkcity.realtracker.com +127.0.0.1 talkingdata.com +127.0.0.1 talkingdata.net 127.0.0.1 tamara-buchman.us 127.0.0.1 tammy-stgeorge.us 127.0.0.1 tantrack.info @@ -38450,6 +38701,7 @@ 127.0.0.1 tapjoy.com 127.0.0.1 tapjoy.go2cloud.org 127.0.0.1 tapjoyads.com +127.0.0.1 taplytics.com 127.0.0.1 tapone.jp 127.0.0.1 tapsense.com 127.0.0.1 tara-kyser.us @@ -38551,7 +38803,6 @@ 127.0.0.1 techmarkaffi.go2cloud.org 127.0.0.1 technewsworld.us.intellitxt.com 127.0.0.1 technology.searchwho.com -127.0.0.1 techpatterns.com 127.0.0.1 techreview.112.2o7.net 127.0.0.1 techspot.us.intellitxt.com 127.0.0.1 techtalks.enigma.revenuewire.net @@ -38570,6 +38821,7 @@ 127.0.0.1 telekom02.webtrekk.net 127.0.0.1 telemetry.appex.bing.net 127.0.0.1 telemetry.microsoft.com +127.0.0.1 telemetry.soundcloud.com 127.0.0.1 telemetry.urs.microsoft.com 127.0.0.1 telenor.112.2o7.net 127.0.0.1 telenorstartsiden.112.2o7.net @@ -38659,6 +38911,7 @@ 127.0.0.1 the-counter.net 127.0.0.1 the-path-gateway.com 127.0.0.1 theaffiliate.us +127.0.0.1 theaffiliatepeople.com 127.0.0.1 theaffiliateprogram.com 127.0.0.1 theanswerto.com 127.0.0.1 thebugs.ws @@ -38667,6 +38920,7 @@ 127.0.0.1 theeldergeek.us.intellitxt.com 127.0.0.1 thefashionspot.us.intellitxt.com 127.0.0.1 thehitsusa.com +127.0.0.1 theinterwebs.space 127.0.0.1 theoads.com 127.0.0.1 theoads.com. 127.0.0.1 theodosium.com @@ -38675,6 +38929,17 @@ 127.0.0.1 theresa-ellett.us 127.0.0.1 therese-jeon.us 127.0.0.1 theslice.go2cloud.org +127.0.0.1 theta49.rtb.appier.net +127.0.0.1 theta57.rtb.appier.net +127.0.0.1 theta75.rtb.appier.net +127.0.0.1 theta78.rtb.appier.net +127.0.0.1 theta79.rtb.appier.net +127.0.0.1 theta83.rtb.appier.net +127.0.0.1 theta84.rtb.appier.net +127.0.0.1 theta86.rtb.appier.net +127.0.0.1 theta88.rtb.appier.net +127.0.0.1 theta89.rtb.appier.net +127.0.0.1 theta91.rtb.appier.net 127.0.0.1 thetechzone.us.intellitxt.com 127.0.0.1 thetradedesk-tags.s3.amazonaws.com 127.0.0.1 thevanda.tk @@ -38778,6 +39043,7 @@ 127.0.0.1 tmscdn.coremetrics.com 127.0.0.1 tmz.vo.llnwd.net 127.0.0.1 tnjcars.go2cloud.org +127.0.0.1 tnl.apx.appier.net 127.0.0.1 tns-counter.ru 127.0.0.1 tns-cs.net 127.0.0.1 tns.simba.taobao.com @@ -38838,6 +39104,7 @@ 127.0.0.1 topbinaryaffiliates.ck-cdn.com 127.0.0.1 topfox.co.uk 127.0.0.1 topixc.net +127.0.0.1 toplist.cz 127.0.0.1 toplist.deluxestream.info 127.0.0.1 toplista.mw.hu 127.0.0.1 toppagefinder.com @@ -38869,6 +39136,7 @@ 127.0.0.1 tournevis.ovh 127.0.0.1 tours.imlive.com 127.0.0.1 towerrecords.track4.com +127.0.0.1 toyota-com-tw.b.appier.net 127.0.0.1 toyota.112.2o7.net 127.0.0.1 toyota.vo.llnwd.net 127.0.0.1 tpc.googlesyndication.com @@ -38888,6 +39156,7 @@ 127.0.0.1 tr.ilius.net 127.0.0.1 tr.interlake.net 127.0.0.1 tr.newsletter.capdecision.fr +127.0.0.1 tr.sjc.contextweb.com 127.0.0.1 tr.x-tk.net 127.0.0.1 tr1.myroitracking.com 127.0.0.1 tr10.myroitracking.com @@ -38950,6 +39219,7 @@ 127.0.0.1 track.ashley-george.com 127.0.0.1 track.atgstores.com 127.0.0.1 track.bannerbridge.net +127.0.0.1 track.bestoffertime.com 127.0.0.1 track.bidtrk.com 127.0.0.1 track.blamads.com 127.0.0.1 track.bluecompany.cl @@ -38982,6 +39252,7 @@ 127.0.0.1 track.emarketingandcommerce.com 127.0.0.1 track.engagesciences.com 127.0.0.1 track.enlinettrk.com +127.0.0.1 track.flexlinks.com 127.0.0.1 track.floppybank.com 127.0.0.1 track.ft.com 127.0.0.1 track.fxstreet.com @@ -39167,6 +39438,7 @@ 127.0.0.1 tracking.adserving.im 127.0.0.1 tracking.adsup.me 127.0.0.1 tracking.adtracker.ch +127.0.0.1 tracking.amazing-revenue.com 127.0.0.1 tracking.ancestry.com 127.0.0.1 tracking.applift.com 127.0.0.1 tracking.attractwomen.com @@ -39352,6 +39624,7 @@ 127.0.0.1 tradingmarkets.us.intellitxt.com 127.0.0.1 traf.visit-x.net 127.0.0.1 traffboost.net +127.0.0.1 traffdaq.com 127.0.0.1 traffic-delivery.com 127.0.0.1 traffic-delivery.org 127.0.0.1 traffic-exchange.com @@ -39359,6 +39632,7 @@ 127.0.0.1 traffic-hits.com 127.0.0.1 traffic-supremacy.com 127.0.0.1 traffic.acwebconnecting.com +127.0.0.1 traffic.adxprts.com 127.0.0.1 traffic.alexa.com 127.0.0.1 traffic.bannerator.com 127.0.0.1 traffic.bokecc.com @@ -39422,6 +39696,7 @@ 127.0.0.1 trans20120430.getjar.com 127.0.0.1 transact-can.cedexis.com 127.0.0.1 transact.justclick.ru +127.0.0.1 transferhit.com 127.0.0.1 transfermarkt01.wt-eu02.net 127.0.0.1 travel.netster.com 127.0.0.1 travel.travelocity.com @@ -39485,6 +39760,7 @@ 127.0.0.1 trk.kissmetrics.com 127.0.0.1 trk.m.libero.it 127.0.0.1 trk.mailtoward.com +127.0.0.1 trk.mobile-setting.com 127.0.0.1 trk.pswec.com 127.0.0.1 trk.rrcpm.com 127.0.0.1 trk.sele.co @@ -39957,12 +40233,14 @@ 127.0.0.1 ultimate-guitar.us.intellitxt.com 127.0.0.1 ultimategracelessness.info 127.0.0.1 ultimatelyreveal.com +127.0.0.1 ultraadserver.com 127.0.0.1 ultsearch.com 127.0.0.1 um-per.com 127.0.0.1 um.eqads.com 127.0.0.1 um.simpli.fi 127.0.0.1 umbel.com 127.0.0.1 umbs.ero-advertising.com +127.0.0.1 umeng.com 127.0.0.1 ums.adtech.de 127.0.0.1 unadvertising.info 127.0.0.1 uncoached.us.intellitxt.com @@ -39987,6 +40265,7 @@ 127.0.0.1 unrulymedia.com 127.0.0.1 unstat.baidu.com 127.0.0.1 unsubscribe.rmv.so +127.0.0.1 uob-com-sg.b.appier.net 127.0.0.1 uobsoe.com 127.0.0.1 up.cm.ksmobile.com 127.0.0.1 up.nytimes.com @@ -40093,6 +40372,7 @@ 127.0.0.1 uur.at 127.0.0.1 uv.terra.com.br 127.0.0.1 uzhegovandrey.justclick.ru +127.0.0.1 v.amazon-adsystem.com 127.0.0.1 v.chartboost.com 127.0.0.1 v.duba.net 127.0.0.1 v.effectivemeasure.net @@ -40123,7 +40403,10 @@ 127.0.0.1 v6exp3-v4.metric.gstatic.com 127.0.0.1 v75.xiti.com 127.0.0.1 v75l.xiti.com +127.0.0.1 v88.trade +127.0.0.1 va.akamai.startappservice.com 127.0.0.1 va.marketer.lpsnmedia.net +127.0.0.1 va.origin.startappservice.com 127.0.0.1 vad.e-messenger.net 127.0.0.1 vad.mainentrypoint.com 127.0.0.1 valarie-clack.us @@ -40216,6 +40499,7 @@ 127.0.0.1 video-loader.com 127.0.0.1 video-stats.video.google.com 127.0.0.1 video.begun.ru +127.0.0.1 video.cld.startappexchange.com 127.0.0.1 video.digidip.net 127.0.0.1 video.moatads.com 127.0.0.1 video.oms.eu @@ -43755,6 +44039,7 @@ 127.0.0.1 vipadshares.com 127.0.0.1 viplogin.553.clicksurecpa.com 127.0.0.1 vippay.c.duba.net +127.0.0.1 vipplaza-co-id.b.appier.net 127.0.0.1 virads.com 127.0.0.1 virtk01.dus.local.vmsn.de 127.0.0.1 virtual-person.com @@ -43803,6 +44088,7 @@ 127.0.0.1 vodafone.ivwbox.de 127.0.0.1 vogo-vogo.ru 127.0.0.1 voicenetplus.com +127.0.0.1 voluum.redirecting.site 127.0.0.1 voodooparking.com 127.0.0.1 vop.sundaysky.com 127.0.0.1 vorcu.go2cloud.org @@ -43842,6 +44128,7 @@ 127.0.0.1 vserv.mobi 127.0.0.1 vsevjednom.cz 127.0.0.1 vsii.spinbox.net +127.0.0.1 vst.c.appier.net 127.0.0.1 vstats.net 127.0.0.1 vstrk.com 127.0.0.1 vt.adition.com @@ -43983,6 +44270,7 @@ 127.0.0.1 wa.ui-portal.de 127.0.0.1 wac.658e.edgecastcdn.net 127.0.0.1 wac.a164.edgecastcdn.net +127.0.0.1 wac.a164.taucdn.net 127.0.0.1 wahoha.com 127.0.0.1 waiads.com 127.0.0.1 waiwidgets-1246822334.eu-west-1.elb.amazonaws.com @@ -44042,6 +44330,7 @@ 127.0.0.1 watch.teroti.com 127.0.0.1 watchever.bild.de 127.0.0.1 watchfree.flv.in +127.0.0.1 watchlivestream.me.uk 127.0.0.1 watson.live.com 127.0.0.1 watson.microsoft.com 127.0.0.1 watson.ppe.telemetry.microsoft.com @@ -44348,7 +44637,6 @@ 127.0.0.1 widget.siteheart.com 127.0.0.1 widget.stagram.com 127.0.0.1 widget.supercounters.com -127.0.0.1 widget.uservoice.com 127.0.0.1 widget.weibo.com 127.0.0.1 widget.yavli.com 127.0.0.1 widgetadvertising.biz @@ -44410,6 +44698,7 @@ 127.0.0.1 wizard.bannerforge.com 127.0.0.1 wizfitness.go2cloud.org 127.0.0.1 wks.ero-advertising.com +127.0.0.1 wlmfortunepartners.adsrv.eacdn.com 127.0.0.1 wlwonl.ivwbox.de 127.0.0.1 wlwt01.opentext.com 127.0.0.1 wm-space.youero.com @@ -44580,6 +44869,7 @@ 127.0.0.1 www-banner.chat.ru 127.0.0.1 www-beta.statcounter.com 127.0.0.1 www-cm.com +127.0.0.1 www-obdesign-com-tw.b.appier.net 127.0.0.1 www-shard02-a.justclick.ru 127.0.0.1 www-shard04-cef.justclick.ru 127.0.0.1 www-shard05-ghi.justclick.ru @@ -44592,6 +44882,8 @@ 127.0.0.1 www.008.free-counter.co.uk 127.0.0.1 www.0hna.com 127.0.0.1 www.100webads.com +127.0.0.1 www.123456.center +127.0.0.1 www.123456.click 127.0.0.1 www.123count.com 127.0.0.1 www.123counter.superstats.com 127.0.0.1 www.123spill.no @@ -44669,6 +44961,7 @@ 127.0.0.1 www.ad-text.com 127.0.0.1 www.ad-visor.com 127.0.0.1 www.ad-x.co.uk +127.0.0.1 www.ad.admitad.com 127.0.0.1 www.ad.doubleclick.net.60532.9279.302br.net 127.0.0.1 www.ad.doubleclick.net.68390.9544.302br.net 127.0.0.1 www.ad.doubleclick.net.73285.9423.302br.net @@ -44687,6 +44980,7 @@ 127.0.0.1 www.adbureau.net 127.0.0.1 www.adbutler.com 127.0.0.1 www.adbuyer.com +127.0.0.1 www.adcarem.co 127.0.0.1 www.adcash.com 127.0.0.1 www.adcdnx.com 127.0.0.1 www.adcenter.net @@ -44733,6 +45027,7 @@ 127.0.0.1 www.admarketplace.net 127.0.0.1 www.admarvel.com 127.0.0.1 www.admaya.in +127.0.0.1 www.admedo.com 127.0.0.1 www.admeld.com 127.0.0.1 www.admestate.ru 127.0.0.1 www.admitad.com @@ -44765,6 +45060,7 @@ 127.0.0.1 www.adsbrokermirror3.info 127.0.0.1 www.adsbrokermirror4.info 127.0.0.1 www.adscendmedia.com +127.0.0.1 www.adscoops.com 127.0.0.1 www.adsdelight.com 127.0.0.1 www.adsender.us 127.0.0.1 www.adsensecamp.com @@ -44774,12 +45070,14 @@ 127.0.0.1 www.adserver.cz.cc 127.0.0.1 www.adserverplus.com 127.0.0.1 www.adserverxxl.de +127.0.0.1 www.adservone.com 127.0.0.1 www.adshiftmedia.com 127.0.0.1 www.adshooter.com 127.0.0.1 www.adshost1.com 127.0.0.1 www.adshost2.com 127.0.0.1 www.adshot.de 127.0.0.1 www.adshuh.com +127.0.0.1 www.adskeeper.co.uk 127.0.0.1 www.adsmarket.co.il 127.0.0.1 www.adsmarketgroup.com 127.0.0.1 www.adsmarketlatam.com @@ -44793,12 +45091,15 @@ 127.0.0.1 www.adsplay.in 127.0.0.1 www.adspserving.com 127.0.0.1 www.adsserving.net +127.0.0.1 www.adstrx.com 127.0.0.1 www.adsuperstar.com 127.0.0.1 www.adsupplyads.com 127.0.0.1 www.adsview.com 127.0.0.1 www.adtech.com 127.0.0.1 www.adtegrity.com 127.0.0.1 www.adternal.com +127.0.0.1 www.adthrive.com +127.0.0.1 www.adti.me 127.0.0.1 www.adtilt.com 127.0.0.1 www.adtoll.com 127.0.0.1 www.adtrack1.pl @@ -44837,6 +45138,7 @@ 127.0.0.1 www.advm10.com 127.0.0.1 www.advolution.de 127.0.0.1 www.advombat.ru +127.0.0.1 www.advserver.xyz 127.0.0.1 www.adworkmedia.com 127.0.0.1 www.adworkmedia.net 127.0.0.1 www.adworks.com @@ -44868,6 +45170,7 @@ 127.0.0.1 www.afftrackr.com 127.0.0.1 www.affyield.com 127.0.0.1 www.afiliati.ro +127.0.0.1 www.afsanalytics.com 127.0.0.1 www.afterdownload.com 127.0.0.1 www.afterview.ru 127.0.0.1 www.agata-lillard.us @@ -44908,6 +45211,7 @@ 127.0.0.1 www.annika-tolleson.us 127.0.0.1 www.annuncio.com.do 127.0.0.1 www.anonymousads.com +127.0.0.1 www.answermedia.com 127.0.0.1 www.antoinette-meisner.us 127.0.0.1 www.any.gs 127.0.0.1 www.anymanga.com @@ -44951,6 +45255,7 @@ 127.0.0.1 www.aurora-wilhelm.us 127.0.0.1 www.auto-ping.com 127.0.0.1 www.automaticsystem.com +127.0.0.1 www.autopilothq.com 127.0.0.1 www.avatraffic.com 127.0.0.1 www.avazudsp.net 127.0.0.1 www.aweber.com @@ -44985,6 +45290,9 @@ 127.0.0.1 www.baryof.com 127.0.0.1 www.baypops.com 127.0.0.1 www.bazingandroid.com +127.0.0.1 www.bcast.pw +127.0.0.1 www.bdex.com +127.0.0.1 www.beanstockmedia.com 127.0.0.1 www.becontext.com 127.0.0.1 www.bee-ads.com 127.0.0.1 www.belstat.be @@ -45078,6 +45386,7 @@ 127.0.0.1 www.candi-nolen.us 127.0.0.1 www.candi-parman.us 127.0.0.1 www.canvas-advert.ru +127.0.0.1 www.carambo.la 127.0.0.1 www.caren-jerry.us 127.0.0.1 www.caren-sena.us 127.0.0.1 www.carina-galaviz.us @@ -45170,6 +45479,7 @@ 127.0.0.1 www.clicz.com 127.0.0.1 www.cliximages.com 127.0.0.1 www.clixsense.com +127.0.0.1 www.clk.im 127.0.0.1 www.clkads.com 127.0.0.1 www.clkdeals.com 127.0.0.1 www.clkerr.com @@ -45177,6 +45487,7 @@ 127.0.0.1 www.clkmon.com 127.0.0.1 www.clkmr.com 127.0.0.1 www.clkrev.com +127.0.0.1 www.clksite.com 127.0.0.1 www.clktag.com 127.0.0.1 www.cloudhot.net 127.0.0.1 www.cloudixconnection.com @@ -45217,6 +45528,7 @@ 127.0.0.1 www.content.applift.com 127.0.0.1 www.contentlockingnetworks.com 127.0.0.1 www.contextuads.com +127.0.0.1 www.contextweb.com 127.0.0.1 www.control.123banners.com 127.0.0.1 www.conversion-tracker.com 127.0.0.1 www.conversionruler.com @@ -45270,7 +45582,9 @@ 127.0.0.1 www.cpainfinity.com 127.0.0.1 www.cpaprohits.com 127.0.0.1 www.cpatrac.com +127.0.0.1 www.cpatrackkee.com 127.0.0.1 www.cpatrackr.com +127.0.0.1 www.cpayard.com 127.0.0.1 www.cpd8.net 127.0.0.1 www.cpm-plus.com 127.0.0.1 www.cpm.biz @@ -45293,6 +45607,7 @@ 127.0.0.1 www.crushads.com 127.0.0.1 www.crwdcntrl.net 127.0.0.1 www.cstrk.net +127.0.0.1 www.cuccu.me 127.0.0.1 www.cur.lv 127.0.0.1 www.customads.net 127.0.0.1 www.cutestuf.com @@ -45438,8 +45753,13 @@ 127.0.0.1 www.ericka-riffle.us 127.0.0.1 www.erin-hartwell.us 127.0.0.1 www.ero-adverising.com.ero-advertising.com +127.0.0.1 www.ero-advertising.co.uk 127.0.0.1 www.ero-advertising.com +127.0.0.1 www.ero-advertising.de +127.0.0.1 www.ero-advertising.lol +127.0.0.1 www.ero-advertising.ooo 127.0.0.1 www.ero-advertising.org +127.0.0.1 www.ero-advertising.xyz 127.0.0.1 www.eroadvertising.com 127.0.0.1 www.eroadvertising.info 127.0.0.1 www.eroadvertising.nl @@ -45449,6 +45769,7 @@ 127.0.0.1 www.escalatenetwork.com 127.0.0.1 www.estat.com 127.0.0.1 www.esther-strauss.us +127.0.0.1 www.et-code.ru 127.0.0.1 www.etahub.com 127.0.0.1 www.ethn.io 127.0.0.1 www.etrack51.com @@ -45461,6 +45782,7 @@ 127.0.0.1 www.eva-ryerson.us 127.0.0.1 www.eventi.co.il 127.0.0.1 www.everestjs.net +127.0.0.1 www.everstring.com 127.0.0.1 www.everyscape.com 127.0.0.1 www.evisitcs2.com 127.0.0.1 www.ewordofmouth.com @@ -45495,6 +45817,7 @@ 127.0.0.1 www.fasteasytraffic.com 127.0.0.1 www.fastlinkfinder.com 127.0.0.1 www.fastonlinefinder.com +127.0.0.1 www.feed2allnow.me 127.0.0.1 www.feedblitz.com 127.0.0.1 www.feedjit.com 127.0.0.1 www.ferdy.org @@ -45527,6 +45850,7 @@ 127.0.0.1 www.flash-counter.com 127.0.0.1 www.flashvortex.com 127.0.0.1 www.fleshlight.com +127.0.0.1 www.flexoffers.com 127.0.0.1 www.flixfacts.co.uk 127.0.0.1 www.flowgo.com 127.0.0.1 www.flurry.com @@ -45557,6 +45881,7 @@ 127.0.0.1 www.freewha.com 127.0.0.1 www.friendlyduck.com 127.0.0.1 www.fucktubenetwork.com +127.0.0.1 www.fuel451.com 127.0.0.1 www.fullqurandownload.com 127.0.0.1 www.fun-hits.de 127.0.0.1 www.fun-town.com @@ -45578,6 +45903,7 @@ 127.0.0.1 www.gamescpc.com 127.0.0.1 www.gamevui24.com 127.0.0.1 www.gamingblast.com +127.0.0.1 www.gatewaytracker.com 127.0.0.1 www.gbotvisit.com 127.0.0.1 www.geoplugin.net 127.0.0.1 www.georgiana-millwood.us @@ -45588,6 +45914,7 @@ 127.0.0.1 www.get-information.com 127.0.0.1 www.getdirect.ru 127.0.0.1 www.getfreebl.com +127.0.0.1 www.getmetrical.com 127.0.0.1 www.getmycell.com 127.0.0.1 www.gianna-lamothe.us 127.0.0.1 www.gianna-mcgee.us @@ -45646,6 +45973,7 @@ 127.0.0.1 www.hastrk2.com 127.0.0.1 www.hastrk3.com 127.0.0.1 www.hastrk4.com +127.0.0.1 www.hatelive.site 127.0.0.1 www.hayley-mund.us 127.0.0.1 www.hbytracker.com 127.0.0.1 www.hdplugindownload.com @@ -45660,6 +45988,7 @@ 127.0.0.1 www.highcpms.com 127.0.0.1 www.highspeedtesting.com 127.0.0.1 www.hillary-daughtery.us +127.0.0.1 www.hipersushiads.com 127.0.0.1 www.hipmarket.com 127.0.0.1 www.hit-counter.5u.com 127.0.0.1 www.hit-counter.info @@ -45699,6 +46028,7 @@ 127.0.0.1 www.hoptopboy.com 127.0.0.1 www.hopurl.org 127.0.0.1 www.host-tracker.com +127.0.0.1 www.host.clicksor.com 127.0.0.1 www.hostlnks.com 127.0.0.1 www.hostpost4.xyz 127.0.0.1 www.hotjar.com @@ -45750,6 +46080,7 @@ 127.0.0.1 www.inboxpounds.co.uk 127.0.0.1 www.inboxpounds.com 127.0.0.1 www.incentaclick.com +127.0.0.1 www.indicative.com 127.0.0.1 www.inedo.com 127.0.0.1 www.ineedhits.com 127.0.0.1 www.inetlog.com @@ -45774,6 +46105,7 @@ 127.0.0.1 www.internetmedia.com.au 127.0.0.1 www.internetworks.org 127.0.0.1 www.interpr.ru +127.0.0.1 www.interstateanalytics.com 127.0.0.1 www.interupload.com 127.0.0.1 www.intext.de 127.0.0.1 www.intextdirect.com @@ -45796,6 +46128,7 @@ 127.0.0.1 www.itrckr.com 127.0.0.1 www.ivwbox.de 127.0.0.1 www.iwebimg.net +127.0.0.1 www.iyfnzgb.com 127.0.0.1 www.jade-aultman.us 127.0.0.1 www.jadina-counter.de 127.0.0.1 www.jag.vmsn.de @@ -45917,6 +46250,7 @@ 127.0.0.1 www.leadformix.com 127.0.0.1 www.leadhound.com 127.0.0.1 www.leadlander.com +127.0.0.1 www.leadtrackgo.com 127.0.0.1 www.legitfreecounters.com 127.0.0.1 www.lfstmedia.com 127.0.0.1 www.lia-bartell.us @@ -45960,7 +46294,9 @@ 127.0.0.1 www.liqwid.net 127.0.0.1 www.lisa-giannini.us 127.0.0.1 www.listbot.com +127.0.0.1 www.listenloop.com 127.0.0.1 www.litiumo.com +127.0.0.1 www.live3s.me 127.0.0.1 www.liveadexchanger.com 127.0.0.1 www.livecounter.dk 127.0.0.1 www.liveinternet.ru @@ -45969,12 +46305,14 @@ 127.0.0.1 www.livestat.com 127.0.0.1 www.lizk.co 127.0.0.1 www.ljteas.com +127.0.0.1 www.lkqd.net 127.0.0.1 www.llnwd.net 127.0.0.1 www.lloogg.com 127.0.0.1 www.lm-pk.com 127.0.0.1 www.lmlttrack.com 127.0.0.1 www.lnkgo.com 127.0.0.1 www.lnkgt.com +127.0.0.1 www.lnkxfer8.com 127.0.0.1 www.lnx.lu 127.0.0.1 www.locktrk.com 127.0.0.1 www.lognormal.net @@ -46064,7 +46402,6 @@ 127.0.0.1 www.maura-teitelbaum.us 127.0.0.1 www.maureen-matheson.us 127.0.0.1 www.maxbounty.com -127.0.0.1 www.maxcdn.com 127.0.0.1 www.maxtrust.ru 127.0.0.1 www.mb01.com 127.0.0.1 www.mb103.com @@ -46079,11 +46416,13 @@ 127.0.0.1 www.media.net 127.0.0.1 www.media970.com 127.0.0.1 www.mediabreakaway.com +127.0.0.1 www.mediaforce.com 127.0.0.1 www.medialytics.com 127.0.0.1 www.mediamath.com 127.0.0.1 www.mediamind.com 127.0.0.1 www.mediaplex.com 127.0.0.1 www.mediasheva.com +127.0.0.1 www.medio.com 127.0.0.1 www.meethotties.mobi 127.0.0.1 www.megacounter.de 127.0.0.1 www.megan-farrier.us @@ -46123,6 +46462,7 @@ 127.0.0.1 www.mmotraffic.com 127.0.0.1 www.mmtracking.com 127.0.0.1 www.mmtrkmc.com +127.0.0.1 www.mnetads.com 127.0.0.1 www.mnetads.net 127.0.0.1 www.moatads.com 127.0.0.1 www.mobfox.com @@ -46155,6 +46495,7 @@ 127.0.0.1 www.motormarket.com 127.0.0.1 www.movieads.ero-advertising.com 127.0.0.1 www.moviepulp.eu +127.0.0.1 www.movise.site 127.0.0.1 www.mp-success.com 127.0.0.1 www.mpression.net 127.0.0.1 www.mprptrk.com @@ -46184,6 +46525,7 @@ 127.0.0.1 www.myseostats.com 127.0.0.1 www.mysuperpharm.com 127.0.0.1 www.mysweetdeals.org +127.0.0.1 www.myswitchads.com 127.0.0.1 www.mytds.pr.vc 127.0.0.1 www.mytiwi.com 127.0.0.1 www.mytogolinks.com @@ -46191,6 +46533,26 @@ 127.0.0.1 www.myvpn.pro 127.0.0.1 www.mywactrack.com 127.0.0.1 www.mywebstats.org +127.0.0.1 www.n60adserv.com +127.0.0.1 www.n61adserv.com +127.0.0.1 www.n62adserv.com +127.0.0.1 www.n63adserv.com +127.0.0.1 www.n64adserv.com +127.0.0.1 www.n65adserv.com +127.0.0.1 www.n66adserv.com +127.0.0.1 www.n67adserv.com +127.0.0.1 www.n68adserv.com +127.0.0.1 www.n69adserv.com +127.0.0.1 www.n70adserv.com +127.0.0.1 www.n71adserv.com +127.0.0.1 www.n72adserv.com +127.0.0.1 www.n73adserv.com +127.0.0.1 www.n74adserv.com +127.0.0.1 www.n75adserv.com +127.0.0.1 www.n76adserv.com +127.0.0.1 www.n77adserv.com +127.0.0.1 www.n78adserv.com +127.0.0.1 www.n79adserv.com 127.0.0.1 www.nadia-carlyle.us 127.0.0.1 www.naomi-thorn.us 127.0.0.1 www.naturalsearchtoolresults.com @@ -46229,9 +46591,9 @@ 127.0.0.1 www.oascentral.blogher.org.12470.9030.302br.net 127.0.0.1 www.ob1trk.com 127.0.0.1 www.oceango.net -127.0.0.1 www.oddcast.com 127.0.0.1 www.ofdtracker.com 127.0.0.1 www.offerdeliver.com +127.0.0.1 www.offeredby.net 127.0.0.1 www.offerx.co.uk 127.0.0.1 www.ojolink.com 127.0.0.1 www.ojrq.net @@ -46315,8 +46677,10 @@ 127.0.0.1 www.pinktrkn.com 127.0.0.1 www.pivotnetworks.com 127.0.0.1 www.pixazza.com +127.0.0.1 www.pixel.watch 127.0.0.1 www.pixeleze.com 127.0.0.1 www.pixetrk.com +127.0.0.1 www.placehold.it 127.0.0.1 www.platinscience.com 127.0.0.1 www.plocia.com 127.0.0.1 www.plug-media.com @@ -46372,6 +46736,7 @@ 127.0.0.1 www.ptp4ever.fr 127.0.0.1 www.ptrking.com 127.0.0.1 www.pubdirecte.com +127.0.0.1 www.pubx.co 127.0.0.1 www.pulse360.com 127.0.0.1 www.pureadexchange.com 127.0.0.1 www.pywatur.biz @@ -46401,6 +46766,7 @@ 127.0.0.1 www.rankseller.de 127.0.0.1 www.ranksider.com 127.0.0.1 www.rapleaf.com +127.0.0.1 www.raygun.io 127.0.0.1 www.rbmut.science 127.0.0.1 www.rddywd.com 127.0.0.1 www.real-marketing.com @@ -46417,6 +46783,7 @@ 127.0.0.1 www.reduxmediia.com 127.0.0.1 www.reformal.ru 127.0.0.1 www.rejectclick.com +127.0.0.1 www.relap.io 127.0.0.1 www.renata-winstead.us 127.0.0.1 www.renee-gratton.us 127.0.0.1 www.renee-neubauer.us @@ -46426,6 +46793,7 @@ 127.0.0.1 www.retargetpro.net 127.0.0.1 www.return.to 127.0.0.1 www.revadstrk.com +127.0.0.1 www.revdepo.com 127.0.0.1 www.revenue.net 127.0.0.1 www.revmob.com 127.0.0.1 www.revmobmobileadnetwork.com @@ -46445,6 +46813,7 @@ 127.0.0.1 www.robotreplay.com 127.0.0.1 www.roiadtracker.com 127.0.0.1 www.roitracker.com +127.0.0.1 www.rollbar.com 127.0.0.1 www.rotrk.com 127.0.0.1 www.roxyaffiliates.com 127.0.0.1 www.rsmrttracking.com @@ -46462,6 +46831,7 @@ 127.0.0.1 www.sarah-maurer.us 127.0.0.1 www.savethis.clickability.com 127.0.0.1 www.savings-galleria.com +127.0.0.1 www.saymedia-content.com 127.0.0.1 www.sc.pages02.net 127.0.0.1 www.scarlett-lorenzo.us 127.0.0.1 www.scorecardresearch.com @@ -46520,8 +46890,10 @@ 127.0.0.1 www.selina-krouse.us 127.0.0.1 www.selipuquoe.com 127.0.0.1 www.sellads.eu +127.0.0.1 www.sematext.com 127.0.0.1 www.semrush.com 127.0.0.1 www.send4fun.com +127.0.0.1 www.seniorttub.bid 127.0.0.1 www.senseiproducts.com 127.0.0.1 www.seotoolscentral.com 127.0.0.1 www.serpanel.com @@ -46582,6 +46954,7 @@ 127.0.0.1 www.sociomantic.com 127.0.0.1 www.soclock.com 127.0.0.1 www.sofia-lathem.us +127.0.0.1 www.sofia.ai 127.0.0.1 www.softcash.biz 127.0.0.1 www.somanyhits.info 127.0.0.1 www.sondra-donalson.us @@ -46604,6 +46977,7 @@ 127.0.0.1 www.spylog.com 127.0.0.1 www.spylog.ru 127.0.0.1 www.sq2trk2.com +127.0.0.1 www.srclickpro.ru 127.0.0.1 www.srv2trking.com 127.0.0.1 www.srver110.xyz 127.0.0.1 www.srvpub.com @@ -46629,6 +47003,7 @@ 127.0.0.1 www.stepstone.112.2o7.net 127.0.0.1 www.storedsearch.com 127.0.0.1 www.stream-online.net +127.0.0.1 www.stream4u.me 127.0.0.1 www.streamcastnetworks.com 127.0.0.1 www.su600.com 127.0.0.1 www.suddenlyfind.com @@ -46652,6 +47027,8 @@ 127.0.0.1 www.taggstar.com 127.0.0.1 www.tagjunction.com 127.0.0.1 www.talia-mettler.us +127.0.0.1 www.talkingdata.com +127.0.0.1 www.talkingdata.net 127.0.0.1 www.tangibledownload.com 127.0.0.1 www.tantrack.info 127.0.0.1 www.tapfortap.com @@ -46676,6 +47053,7 @@ 127.0.0.1 www.tgpmanager.com 127.0.0.1 www.thanksforinstalling.com 127.0.0.1 www.theaffiliate.us +127.0.0.1 www.theaffiliatepeople.com 127.0.0.1 www.thecounter.com 127.0.0.1 www.thehitsusa.com 127.0.0.1 www.theoads.com @@ -46713,6 +47091,7 @@ 127.0.0.1 www.top-ro.ro 127.0.0.1 www.topadvancedsearch.com 127.0.0.1 www.topixc.net +127.0.0.1 www.toplist.cz 127.0.0.1 www.toppagefinder.com 127.0.0.1 www.topstat.ru 127.0.0.1 www.toptrafficsource.com @@ -46731,6 +47110,7 @@ 127.0.0.1 www.trackermodules.com 127.0.0.1 www.trackflv.net 127.0.0.1 www.trackhost.com +127.0.0.1 www.trackimpression.com 127.0.0.1 www.tracking.mobitracker.info 127.0.0.1 www.tracking999.com 127.0.0.1 www.trackingbin.com @@ -46744,6 +47124,7 @@ 127.0.0.1 www.tradeadexchange.com 127.0.0.1 www.tradetraffic.com 127.0.0.1 www.trading.dianomi.com +127.0.0.1 www.traffdaq.com 127.0.0.1 www.traffe.eu 127.0.0.1 www.traffic-exchanger.net 127.0.0.1 www.traffic4you.de @@ -46767,6 +47148,7 @@ 127.0.0.1 www.trafic.ro 127.0.0.1 www.traficmax.fr 127.0.0.1 www.traktum.com +127.0.0.1 www.transferhit.com 127.0.0.1 www.trhzc.com 127.0.0.1 www.tribalfusion.com 127.0.0.1 www.trisha-meikle.us @@ -46799,7 +47181,9 @@ 127.0.0.1 www.ukbanners.com 127.0.0.1 www.ulock.it 127.0.0.1 www.ultimatelyreveal.com +127.0.0.1 www.ultraadserver.com 127.0.0.1 www.um-per.com +127.0.0.1 www.umeng.com 127.0.0.1 www.unadvertising.info 127.0.0.1 www.universal-traffic.com 127.0.0.1 www.unlck.net @@ -46854,6 +47238,7 @@ 127.0.0.1 www.wap.co.il 127.0.0.1 www.wapdollar.in 127.0.0.1 www.wapplanet.org +127.0.0.1 www.watchlivestream.me.uk 127.0.0.1 www.web-controlling.com 127.0.0.1 www.web-counter.5u.com 127.0.0.1 www.web-marketing.8m.com @@ -46931,6 +47316,7 @@ 127.0.0.1 www.ybotvisit.com 127.0.0.1 www.yceml.net 127.0.0.1 www.yeahmobi.com +127.0.0.1 www.yearcast.com 127.0.0.1 www.yepdigital.adk2x.com 127.0.0.1 www.yeppyepp.co.il 127.0.0.1 www.yesadvertising.com @@ -47286,6 +47672,7 @@ 127.0.0.1 yeahmobi.com 127.0.0.1 yeahmobi.go2cloud.org 127.0.0.1 yeahmobi.hasoffers.com +127.0.0.1 yearcast.com 127.0.0.1 yeas.yahoo.co.jp 127.0.0.1 yellgroup.122.2o7.net 127.0.0.1 yello-de01.webtrekk.net @@ -47372,7 +47759,17 @@ 127.0.0.1 z7ale.go2cloud.org 127.0.0.1 z8.zeroredirect1.com 127.0.0.1 z9.zeroredirect1.com +127.0.0.1 za.delta-boa.com 127.0.0.1 za.zeroredirect1.com +127.0.0.1 za1.delta-boa.com +127.0.0.1 za2.delta-boa.com +127.0.0.1 za3.delta-boa.com +127.0.0.1 za4.delta-boa.com +127.0.0.1 za5.delta-boa.com +127.0.0.1 za6.delta-boa.com +127.0.0.1 za7.delta-boa.com +127.0.0.1 za8.delta-boa.com +127.0.0.1 za9.delta-boa.com 127.0.0.1 zaga.ivwbox.de 127.0.0.1 zalando-at01.webtrekk.net 127.0.0.1 zalando-be01.webtrekk.net @@ -47504,4 +47901,4 @@ 127.0.0.1 zz.zeroredirect1.com 127.0.0.1 zzz.clickbank.net 127.0.0.1 _thums.ero-advertising.com -# Hosts: 47496 \ No newline at end of file +# Hosts: 47893 \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a1df8d8d9..80751bde2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,9 @@ - + diff --git a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java index a32a37660..b848b0a0f 100644 --- a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java @@ -4,8 +4,8 @@ package acr.browser.lightning.activity; -import android.annotation.TargetApi; import android.app.Activity; +import android.app.Dialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -17,7 +17,6 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.PorterDuff; -import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.media.MediaPlayer; @@ -26,7 +25,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.os.StrictMode; import android.provider.MediaStore; import android.support.annotation.ColorInt; import android.support.annotation.IdRes; @@ -43,6 +41,7 @@ import android.support.v7.app.AlertDialog; import android.support.v7.graphics.Palette; import android.support.v7.widget.Toolbar; +import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; @@ -54,14 +53,14 @@ import android.view.View.OnKeyListener; import android.view.View.OnLongClickListener; import android.view.View.OnTouchListener; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; +import android.view.ViewParent; import android.view.ViewTreeObserver; import android.view.Window; -import android.view.WindowInsets; import android.view.WindowManager; import android.view.animation.Animation; -import android.view.animation.DecelerateInterpolator; import android.view.animation.Transformation; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; @@ -71,9 +70,7 @@ import android.webkit.WebView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; -import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; @@ -83,7 +80,10 @@ import android.widget.TextView.OnEditorActionListener; import android.widget.VideoView; +import com.anthonycr.bonsai.Observable; +import com.anthonycr.bonsai.Schedulers; import com.anthonycr.grant.PermissionsManager; +import com.anthonycr.progress.AnimatedProgressBar; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; @@ -92,16 +92,14 @@ import javax.inject.Inject; -import acr.browser.lightning.BuildConfig; import acr.browser.lightning.R; import acr.browser.lightning.app.BrowserApp; +import acr.browser.lightning.browser.BookmarksView; import acr.browser.lightning.browser.BrowserPresenter; import acr.browser.lightning.browser.BrowserView; import acr.browser.lightning.browser.TabsView; import acr.browser.lightning.bus.BookmarkEvents; import acr.browser.lightning.bus.BrowserEvents; -import acr.browser.lightning.bus.NavigationEvents; -import acr.browser.lightning.bus.TabEvents; import acr.browser.lightning.constant.BookmarkPage; import acr.browser.lightning.constant.Constants; import acr.browser.lightning.constant.HistoryPage; @@ -109,22 +107,22 @@ import acr.browser.lightning.database.BookmarkManager; import acr.browser.lightning.database.HistoryDatabase; import acr.browser.lightning.database.HistoryItem; +import acr.browser.lightning.dialog.BrowserDialog; import acr.browser.lightning.dialog.LightningDialogBuilder; import acr.browser.lightning.fragment.BookmarksFragment; import acr.browser.lightning.fragment.TabsFragment; -import acr.browser.lightning.search.SuggestionsAdapter; -import acr.browser.lightning.react.Observable; -import acr.browser.lightning.react.Schedulers; +import acr.browser.lightning.interpolator.BezierDecelerateInterpolator; import acr.browser.lightning.receiver.NetworkReceiver; +import acr.browser.lightning.search.SuggestionsAdapter; import acr.browser.lightning.utils.DrawableUtils; -import acr.browser.lightning.utils.KeyboardHelper; import acr.browser.lightning.utils.ProxyUtils; import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.UrlUtils; import acr.browser.lightning.utils.Utils; import acr.browser.lightning.utils.WebUtils; -import acr.browser.lightning.view.AnimatedProgressBar; +import acr.browser.lightning.view.Handlers; import acr.browser.lightning.view.LightningView; +import acr.browser.lightning.view.SearchView; import butterknife.Bind; import butterknife.ButterKnife; @@ -138,7 +136,6 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements private static final String TAG_TABS_FRAGMENT = "TAG_TABS_FRAGMENT"; // Static Layout - @Bind(Window.ID_ANDROID_CONTENT) View mRoot; @Bind(R.id.drawer_layout) DrawerLayout mDrawerLayout; @Bind(R.id.content_frame) FrameLayout mBrowserFrame; @Bind(R.id.left_drawer) ViewGroup mDrawerLeft; @@ -150,9 +147,9 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements // Toolbar Views + @Bind(R.id.toolbar) Toolbar mToolbar; private View mSearchBackground; - private Toolbar mToolbar; - private AutoCompleteTextView mSearch; + private SearchView mSearch; private ImageView mArrowImage; // Current tab view being displayed @@ -177,11 +174,13 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements private boolean mIsFullScreen = false; private boolean mIsImmersive = false; private boolean mShowTabsInDrawer; + private boolean mSwapBookmarksAndTabs; private int mOriginalOrientation; private int mBackgroundColor; private int mIconColor; private int mDisabledIconColor; private int mCurrentUiColor = Color.BLACK; + private long mKeyDownStartTime; private String mSearchText; private String mUntitledTitle; private String mCameraPhotoPath; @@ -207,6 +206,7 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements private BrowserPresenter mPresenter; private TabsView mTabsView; + private BookmarksView mBookmarksView; // Proxy @Inject ProxyUtils mProxyUtils; @@ -215,9 +215,9 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements private static final int API = android.os.Build.VERSION.SDK_INT; private static final String NETWORK_BROADCAST_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; private static final LayoutParams MATCH_PARENT = new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT); + LayoutParams.MATCH_PARENT); private static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams( - LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); protected abstract boolean isIncognito(); @@ -229,21 +229,6 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements @Override protected void onCreate(Bundle savedInstanceState) { - - if (BuildConfig.DEBUG) { - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() - .detectDiskReads() - .detectDiskWrites() - .detectNetwork() - .penaltyLog() - .build()); - StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() - .detectLeakedClosableObjects() - .detectLeakedSqlLiteObjects() - .penaltyLog() - .build()); - } - super.onCreate(savedInstanceState); BrowserApp.getAppComponent().inject(this); setContentView(R.layout.activity_main); @@ -253,22 +238,9 @@ protected void onCreate(Bundle savedInstanceState) { mPresenter = new BrowserPresenter(this, isIncognito()); initialize(savedInstanceState); - - KeyboardHelper keyboardHelper = new KeyboardHelper(mRoot); - keyboardHelper.registerKeyboardListener(new KeyboardHelper.KeyboardListener() { - @Override - public void keyboardVisibilityChanged(boolean visible) { - if (visible) { - setTabHeightForKeyboard(); - } else { - setTabHeight(); - } - } - }); } private synchronized void initialize(Bundle savedInstanceState) { - mToolbar = (Toolbar) findViewById(R.id.toolbar); initializeToolbarHeight(getResources().getConfiguration()); setSupportActionBar(mToolbar); ActionBar actionBar = getSupportActionBar(); @@ -277,8 +249,9 @@ private synchronized void initialize(Bundle savedInstanceState) { mDarkTheme = mPreferences.getUseTheme() != 0 || isIncognito(); mIconColor = mDarkTheme ? ThemeUtils.getIconDarkThemeColor(this) : ThemeUtils.getIconLightThemeColor(this); mDisabledIconColor = mDarkTheme ? ContextCompat.getColor(this, R.color.icon_dark_theme_disabled) : - ContextCompat.getColor(this, R.color.icon_light_theme_disabled); + ContextCompat.getColor(this, R.color.icon_light_theme_disabled); mShowTabsInDrawer = mPreferences.getShowTabsInDrawer(!isTablet()); + mSwapBookmarksAndTabs = mPreferences.getBookmarksAndTabsSwapped(); // initialize background ColorDrawable int primaryColor = ThemeUtils.getPrimaryColor(this); @@ -321,23 +294,23 @@ public void onDrawerStateChanged(int newState) { final TabsFragment tabsFragment = new TabsFragment(); mTabsView = tabsFragment; - final int containerId = mShowTabsInDrawer ? R.id.left_drawer : R.id.tabs_toolbar_container; final Bundle tabsFragmentArguments = new Bundle(); tabsFragmentArguments.putBoolean(TabsFragment.IS_INCOGNITO, isIncognito()); tabsFragmentArguments.putBoolean(TabsFragment.VERTICAL_MODE, mShowTabsInDrawer); tabsFragment.setArguments(tabsFragmentArguments); final BookmarksFragment bookmarksFragment = new BookmarksFragment(); + mBookmarksView = bookmarksFragment; final Bundle bookmarksFragmentArguments = new Bundle(); bookmarksFragmentArguments.putBoolean(BookmarksFragment.INCOGNITO_MODE, isIncognito()); bookmarksFragment.setArguments(bookmarksFragmentArguments); final FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager - .beginTransaction() - .replace(containerId, tabsFragment, TAG_TABS_FRAGMENT) - .replace(R.id.right_drawer, bookmarksFragment, TAG_BOOKMARK_FRAGMENT) - .commit(); + .beginTransaction() + .replace(getTabsFragmentViewId(), tabsFragment, TAG_TABS_FRAGMENT) + .replace(getBookmarksFragmentViewId(), bookmarksFragment, TAG_BOOKMARK_FRAGMENT) + .commit(); if (mShowTabsInDrawer) { mToolbarLayout.removeView(findViewById(R.id.tabs_toolbar_container)); } @@ -365,14 +338,14 @@ public void onDrawerStateChanged(int newState) { } updateTabNumber(0); } else { - mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerLeft); + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, getTabDrawer()); mArrowImage.setImageResource(R.drawable.ic_action_home); mArrowImage.setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); } arrowButton.setOnClickListener(this); // create the search EditText in the ToolBar - mSearch = (AutoCompleteTextView) customView.findViewById(R.id.search); + mSearch = (SearchView) customView.findViewById(R.id.search); mSearchBackground = customView.findViewById(R.id.search_container); // initialize search background color @@ -386,17 +359,19 @@ public void onDrawerStateChanged(int newState) { mRefreshIcon = ThemeUtils.getThemedDrawable(this, R.drawable.ic_action_refresh, mDarkTheme); mClearIcon = ThemeUtils.getThemedDrawable(this, R.drawable.ic_action_delete, mDarkTheme); - int iconBounds = Utils.dpToPx(30); + int iconBounds = Utils.dpToPx(24); mDeleteIcon.setBounds(0, 0, iconBounds, iconBounds); mRefreshIcon.setBounds(0, 0, iconBounds, iconBounds); mClearIcon.setBounds(0, 0, iconBounds, iconBounds); mIcon = mRefreshIcon; SearchListenerClass search = new SearchListenerClass(); + mSearch.setCompoundDrawablePadding(Utils.dpToPx(3)); mSearch.setCompoundDrawables(null, null, mRefreshIcon, null); mSearch.setOnKeyListener(search); mSearch.setOnFocusChangeListener(search); mSearch.setOnEditorActionListener(search); mSearch.setOnTouchListener(search); + mSearch.setOnPreFocusListener(search); initializeSearchSuggestions(mSearch); @@ -408,15 +383,34 @@ public void onDrawerStateChanged(int newState) { WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath()); } + @SuppressWarnings("VariableNotUsedInsideIf") Intent intent = savedInstanceState == null ? getIntent() : null; + boolean launchedFromHistory = intent != null && (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0; + if (isPanicTrigger(intent)) { setIntent(null); panicClean(); } else { + if (launchedFromHistory) { + intent = null; + } mPresenter.setupTabs(intent); setIntent(null); - mProxyUtils.checkForProxy(BrowserActivity.this); + mProxyUtils.checkForProxy(this); + } + } + + @IdRes + private int getBookmarksFragmentViewId() { + return mSwapBookmarksAndTabs ? R.id.left_drawer : R.id.right_drawer; + } + + private int getTabsFragmentViewId() { + if (mShowTabsInDrawer) { + return mSwapBookmarksAndTabs ? R.id.right_drawer : R.id.left_drawer; + } else { + return R.id.tabs_toolbar_container; } } @@ -437,12 +431,13 @@ void panicClean() { System.exit(1); } - private class SearchListenerClass implements OnKeyListener, OnEditorActionListener, OnFocusChangeListener, OnTouchListener { + private class SearchListenerClass implements OnKeyListener, OnEditorActionListener, + OnFocusChangeListener, OnTouchListener, SearchView.PreFocusListener { @Override - public boolean onKey(View arg0, int arg1, KeyEvent arg2) { + public boolean onKey(View searchView, int keyCode, KeyEvent keyEvent) { - switch (arg1) { + switch (keyCode) { case KeyEvent.KEYCODE_ENTER: InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mSearch.getWindowToken(), 0); @@ -463,10 +458,10 @@ public boolean onEditorAction(TextView arg0, int actionId, KeyEvent arg2) { // hide the keyboard and search the web when the enter key // button is pressed if (actionId == EditorInfo.IME_ACTION_GO || actionId == EditorInfo.IME_ACTION_DONE - || actionId == EditorInfo.IME_ACTION_NEXT - || actionId == EditorInfo.IME_ACTION_SEND - || actionId == EditorInfo.IME_ACTION_SEARCH - || (arg2.getAction() == KeyEvent.KEYCODE_ENTER)) { + || actionId == EditorInfo.IME_ACTION_NEXT + || actionId == EditorInfo.IME_ACTION_SEND + || actionId == EditorInfo.IME_ACTION_SEARCH + || (arg2.getAction() == KeyEvent.KEYCODE_ENTER)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mSearch.getWindowToken(), 0); searchTheWeb(mSearch.getText().toString()); @@ -480,20 +475,15 @@ public boolean onEditorAction(TextView arg0, int actionId, KeyEvent arg2) { } @Override - public void onFocusChange(View v, final boolean hasFocus) { + public void onFocusChange(final View v, final boolean hasFocus) { final LightningView currentView = mTabsManager.getCurrentTab(); if (!hasFocus && currentView != null) { setIsLoading(currentView.getProgress() < 100); updateUrl(currentView.getUrl(), true); } else if (hasFocus && currentView != null) { - String url = currentView.getUrl(); - if (UrlUtils.isSpecialUrl(url)) { - mSearch.setText(""); - } else { - mSearch.setText(url); - } + // Hack to make sure the text gets selected - ((AutoCompleteTextView) v).selectAll(); + ((SearchView) v).selectAll(); mIcon = mClearIcon; mSearch.setCompoundDrawables(null, null, mClearIcon, null); } @@ -508,7 +498,7 @@ public void onFocusChange(View v, final boolean hasFocus) { public boolean onTouch(View v, MotionEvent event) { if (mSearch.getCompoundDrawables()[2] != null) { boolean tappedX = event.getX() > (mSearch.getWidth() - - mSearch.getPaddingRight() - mIcon.getIntrinsicWidth()); + - mSearch.getPaddingRight() - mIcon.getIntrinsicWidth()); if (tappedX) { if (event.getAction() == MotionEvent.ACTION_UP) { if (mSearch.hasFocus()) { @@ -522,6 +512,20 @@ public boolean onTouch(View v, MotionEvent event) { } return false; } + + @Override + public void onPreFocus() { + final LightningView currentView = mTabsManager.getCurrentTab(); + if (currentView == null) { + return; + } + String url = currentView.getUrl(); + if (UrlUtils.isSpecialUrl(url)) { + mSearch.setText(""); + } else { + mSearch.setText(url); + } + } } private class DrawerLocker implements DrawerListener { @@ -562,23 +566,23 @@ private void setNavigationDrawerWidth() { } if (width > maxWidth) { DrawerLayout.LayoutParams params = (android.support.v4.widget.DrawerLayout.LayoutParams) mDrawerLeft - .getLayoutParams(); + .getLayoutParams(); params.width = maxWidth; mDrawerLeft.setLayoutParams(params); mDrawerLeft.requestLayout(); DrawerLayout.LayoutParams paramsRight = (android.support.v4.widget.DrawerLayout.LayoutParams) mDrawerRight - .getLayoutParams(); + .getLayoutParams(); paramsRight.width = maxWidth; mDrawerRight.setLayoutParams(paramsRight); mDrawerRight.requestLayout(); } else { DrawerLayout.LayoutParams params = (android.support.v4.widget.DrawerLayout.LayoutParams) mDrawerLeft - .getLayoutParams(); + .getLayoutParams(); params.width = width; mDrawerLeft.setLayoutParams(params); mDrawerLeft.requestLayout(); DrawerLayout.LayoutParams paramsRight = (android.support.v4.widget.DrawerLayout.LayoutParams) mDrawerRight - .getLayoutParams(); + .getLayoutParams(); paramsRight.width = width; mDrawerRight.setLayoutParams(paramsRight); mDrawerRight.requestLayout(); @@ -612,30 +616,13 @@ private void initializePreferences() { // TODO layout transition causing memory leak // mBrowserFrame.setLayoutTransition(new LayoutTransition()); - mToolbarLayout.setTranslationY(0); - mBrowserFrame.setTranslationY(0); setFullscreen(mPreferences.getHideStatusBarEnabled(), false); - initializeTabHeight(); - - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { - // Sets the tab height correctly if the status bar is hidden - // Also ensures that tab is correct height on rotation - mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { - @TargetApi(Build.VERSION_CODES.KITKAT_WATCH) - @Override - public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { - initializeTabHeight(); - return mRoot.onApplyWindowInsets(insets); - } - }); - } - switch (mPreferences.getSearchChoice()) { case 0: mSearchText = mPreferences.getSearchUrl(); if (!mSearchText.startsWith(Constants.HTTP) - && !mSearchText.startsWith(Constants.HTTPS)) { + && !mSearchText.startsWith(Constants.HTTPS)) { mSearchText = Constants.GOOGLE_SEARCH; } break; @@ -675,6 +662,13 @@ public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { mProxyUtils.updateProxySettings(this); } + @Override + public void onWindowVisibleToUserAfterResume() { + super.onWindowVisibleToUserAfterResume(); + mToolbarLayout.setTranslationY(0); + setWebViewTranslation(mToolbarLayout.getHeight()); + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { @@ -682,22 +676,38 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { searchTheWeb(mSearch.getText().toString()); } } else if ((keyCode == KeyEvent.KEYCODE_MENU) - && (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) - && (Build.MANUFACTURER.compareTo("LGE") == 0)) { + && (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) + && (Build.MANUFACTURER.compareTo("LGE") == 0)) { // Workaround for stupid LG devices that crash return true; + } else if (keyCode == KeyEvent.KEYCODE_BACK) { + mKeyDownStartTime = System.currentTimeMillis(); + Handlers.MAIN.postDelayed(mLongPressBackRunnable, ViewConfiguration.getLongPressTimeout()); } return super.onKeyDown(keyCode, event); } + private final Runnable mLongPressBackRunnable = new Runnable() { + @Override + public void run() { + final LightningView currentTab = mTabsManager.getCurrentTab(); + showCloseDialog(mTabsManager.positionOf(currentTab)); + } + }; + @Override public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_MENU) - && (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) - && (Build.MANUFACTURER.compareTo("LGE") == 0)) { + && (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) + && (Build.MANUFACTURER.compareTo("LGE") == 0)) { // Workaround for stupid LG devices that crash openOptionsMenu(); return true; + } else if (keyCode == KeyEvent.KEYCODE_BACK) { + Handlers.MAIN.removeCallbacks(mLongPressBackRunnable); + if ((System.currentTimeMillis() - mKeyDownStartTime) > ViewConfiguration.getLongPressTimeout()) { + return true; + } } return super.onKeyUp(keyCode, event); } @@ -709,8 +719,8 @@ public boolean onOptionsItemSelected(MenuItem item) { // Handle action buttons switch (item.getItemId()) { case android.R.id.home: - if (mDrawerLayout.isDrawerOpen(mDrawerRight)) { - mDrawerLayout.closeDrawer(mDrawerRight); + if (mDrawerLayout.isDrawerOpen(getBookmarkDrawer())) { + mDrawerLayout.closeDrawer(getBookmarkDrawer()); } return true; case R.id.action_back: @@ -786,21 +796,53 @@ public boolean onOptionsItemSelected(MenuItem item) { // By using a manager, adds a bookmark and notifies third parties about that private void addBookmark(final String title, final String url) { final HistoryItem item = !mBookmarkManager.isBookmark(url) - ? new HistoryItem(url, title) - : null; + ? new HistoryItem(url, title) + : null; if (item != null && mBookmarkManager.addBookmark(item)) { mSuggestionsAdapter.refreshBookmarks(); - mEventBus.post(new BrowserEvents.BookmarkAdded(title, url)); + mBookmarksView.handleUpdatedUrl(url); } } private void deleteBookmark(final String title, final String url) { final HistoryItem item = mBookmarkManager.isBookmark(url) - ? new HistoryItem(url, title) - : null; + ? new HistoryItem(url, title) + : null; if (item != null && mBookmarkManager.deleteBookmark(item)) { mSuggestionsAdapter.refreshBookmarks(); - mEventBus.post(new BrowserEvents.CurrentPageUrl(url)); + mBookmarksView.handleUpdatedUrl(url); + } + } + + private void putToolbarInRoot() { + if (mToolbarLayout.getParent() != mUiLayout) { + if (mToolbarLayout.getParent() != null) { + ((ViewGroup) mToolbarLayout.getParent()).removeView(mToolbarLayout); + } + + mUiLayout.addView(mToolbarLayout, 0); + mUiLayout.requestLayout(); + } + setWebViewTranslation(0); + } + + private void overlayToolbarOnWebView() { + if (mToolbarLayout.getParent() != mBrowserFrame) { + if (mToolbarLayout.getParent() != null) { + ((ViewGroup) mToolbarLayout.getParent()).removeView(mToolbarLayout); + } + + mBrowserFrame.addView(mToolbarLayout); + mBrowserFrame.requestLayout(); + } + setWebViewTranslation(mToolbarLayout.getHeight()); + } + + private void setWebViewTranslation(float translation) { + if (mFullScreen && mCurrentView != null) { + mCurrentView.setTranslationY(translation); + } else if (mCurrentView != null) { + mCurrentView.setTranslationY(0); } } @@ -809,29 +851,21 @@ private void deleteBookmark(final String title, final String url) { * for. It highlights the text entered. */ private void findInPage() { - final AlertDialog.Builder finder = new AlertDialog.Builder(this); - finder.setTitle(getResources().getString(R.string.action_find)); - final EditText getHome = new EditText(this); - getHome.setHint(getResources().getString(R.string.search_hint)); - finder.setView(getHome); - finder.setPositiveButton(getResources().getString(R.string.search_hint), - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - String query = getHome.getText().toString(); - if (!query.isEmpty()) - showSearchInterfaceBar(query); + BrowserDialog.showEditText(this, + R.string.action_find, + R.string.search_hint, + R.string.search_hint, new BrowserDialog.EditorListener() { + @Override + public void onClick(String text) { + if (!TextUtils.isEmpty(text)) { + mPresenter.findInPage(text); + showFindInPageControls(text); } - }); - finder.show(); + } + }); } - private void showSearchInterfaceBar(String text) { - final LightningView currentView = mTabsManager.getCurrentTab(); - if (currentView != null) { - currentView.find(text); - } + private void showFindInPageControls(@NonNull String text) { mSearchBar.setVisibility(View.VISIBLE); TextView tw = (TextView) findViewById(R.id.search_query); @@ -857,32 +891,25 @@ public void showCloseDialog(final int position) { if (position < 0) { return; } - AlertDialog.Builder builder = new AlertDialog.Builder(this); - ArrayAdapter adapter = new ArrayAdapter<>(this, - android.R.layout.simple_list_item_1); - adapter.add(this.getString(R.string.close_all_tabs)); - adapter.add(this.getString(R.string.close_other_tabs)); - adapter.add(this.getString(R.string.close_tab)); - builder.setAdapter(adapter, new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case 0: - closeBrowser(); - break; - case 1: - mPresenter.closeAllOtherTabs(); - break; - case 2: - deleteTab(position); - break; - default: - break; + BrowserDialog.show(this, R.string.dialog_title_close_browser, + new BrowserDialog.Item(R.string.close_tab) { + @Override + public void onClick() { + mPresenter.deleteTab(position); } - } - }); - builder.show(); + }, + new BrowserDialog.Item(R.string.close_other_tabs) { + @Override + public void onClick() { + mPresenter.closeAllOtherTabs(); + } + }, + new BrowserDialog.Item(R.string.close_all_tabs) { + @Override + public void onClick() { + closeBrowser(); + } + }); } @Override @@ -903,6 +930,12 @@ public void notifyTabViewChanged(int position) { mTabsView.tabChanged(position); } + @Override + public void notifyTabViewInitialized() { + Log.d(TAG, "Notify Tabs Initialized"); + mTabsView.tabsInitialized(); + } + @Override public void tabChanged(LightningView tab) { mPresenter.tabChangeOccurred(tab); @@ -916,8 +949,6 @@ public void removeTabView() { // Set the background color so the color mode color doesn't show through mBrowserFrame.setBackgroundColor(mBackgroundColor); - mBrowserFrame.removeAllViews(); - removeViewFromParent(mCurrentView); mCurrentView = null; @@ -925,7 +956,7 @@ public void removeTabView() { // Use a delayed handler to make the transition smooth // otherwise it will get caught up with the showTab code // and cause a janky motion - mDrawerHandler.postDelayed(new Runnable() { + mDrawerHandler.postDelayed(new Runnable() { @Override public void run() { mDrawerLayout.closeDrawers(); @@ -945,12 +976,15 @@ public void setTabView(@NonNull final View view) { // Set the background color so the color mode color doesn't show through mBrowserFrame.setBackgroundColor(mBackgroundColor); - mBrowserFrame.removeAllViews(); - removeViewFromParent(view); removeViewFromParent(mCurrentView); - mBrowserFrame.addView(view, MATCH_PARENT); + mBrowserFrame.addView(view, 0, MATCH_PARENT); + if (mFullScreen) { + view.setTranslationY(mToolbarLayout.getHeight() + mToolbarLayout.getTranslationY()); + } else { + view.setTranslationY(0); + } view.requestFocus(); @@ -981,12 +1015,14 @@ public void run() { @Override public void showBlockedLocalFileDialog(DialogInterface.OnClickListener listener) { AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setCancelable(true) - .setTitle(R.string.title_warning) - .setMessage(R.string.message_blocked_local) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(R.string.action_open, listener) - .show(); + Dialog dialog = builder.setCancelable(true) + .setTitle(R.string.title_warning) + .setMessage(R.string.message_blocked_local) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.action_open, listener) + .show(); + + BrowserDialog.setDialogSize(this, dialog); } @Override @@ -994,6 +1030,63 @@ public void showSnackbar(@StringRes int resource) { Utils.showSnackbar(this, resource); } + @Override + public void tabCloseClicked(int position) { + mPresenter.deleteTab(position); + } + + @Override + public void tabClicked(int position) { + showTab(position); + } + + @Override + public void newTabButtonClicked() { + mPresenter.newTab(null, true); + } + + @Override + public void newTabButtonLongClicked() { + String url = mPreferences.getSavedUrl(); + if (url != null) { + newTab(url, true); + + Utils.showSnackbar(this, R.string.deleted_tab); + } + mPreferences.setSavedUrl(null); + } + + @Override + public void bookmarkButtonClicked() { + final LightningView currentTab = mTabsManager.getCurrentTab(); + final String url = currentTab != null ? currentTab.getUrl() : null; + final String title = currentTab != null ? currentTab.getTitle() : null; + if (url == null) { + return; + } + + if (!UrlUtils.isSpecialUrl(url)) { + if (!mBookmarkManager.isBookmark(url)) { + addBookmark(title, url); + } else { + deleteBookmark(title, url); + } + } + } + + @Override + public void bookmarkItemClicked(@NonNull HistoryItem item) { + mPresenter.loadUrlInCurrentView(item.getUrl()); + // keep any jank from happening when the drawer is closed after the + // URL starts to load + mDrawerHandler.postDelayed(new Runnable() { + @Override + public void run() { + closeDrawers(null); + } + }, 150); + } + /** * displays the WebView contained in the LightningView Also handles the * removal of previous views @@ -1009,9 +1102,9 @@ private static void removeViewFromParent(@Nullable View view) { if (view == null) { return; } - ViewGroup parent = ((ViewGroup) view.getParent()); - if (parent != null) { - parent.removeView(view); + ViewParent parent = view.getParent(); + if (parent instanceof ViewGroup) { + ((ViewGroup) parent).removeView(view); } } @@ -1021,21 +1114,16 @@ void handleNewIntent(Intent intent) { @Override public void closeEmptyTab() { - final WebView currentWebView = mTabsManager.getCurrentWebView(); - if (currentWebView != null && currentWebView.copyBackForwardList().getSize() == 0) { - closeCurrentTab(); - } - } - - private void closeCurrentTab() { - // don't delete the tab because the browser will close and mess stuff up + // Currently do nothing + // Possibly closing the current tab might close the browser + // and mess stuff up } @Override public void onTrimMemory(int level) { if (level > TRIM_MEMORY_MODERATE && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { Log.d(TAG, "Low Memory, Free Memory"); - mTabsManager.freeMemory(); + mPresenter.onAppLowMemory(); } } @@ -1044,16 +1132,6 @@ private synchronized boolean newTab(String url, boolean show) { return mPresenter.newTab(url, show); } - @Override - public void newTabClicked() { - mPresenter.newTab(null, true); - } - - // TODO move this to presenter - private synchronized void deleteTab(int position) { - mPresenter.deleteTab(position); - } - void performExitCleanUp() { final LightningView currentTab = mTabsManager.getCurrentTab(); if (mPreferences.getClearCacheExit() && currentTab != null && !isIncognito()) { @@ -1074,15 +1152,7 @@ void performExitCleanUp() { } else if (isIncognito()) { WebUtils.clearWebStorage(); // We want to make sure incognito mode is secure } - } - - @Override - public boolean onKeyLongPress(int keyCode, KeyEvent event) { - final LightningView currentTab = mTabsManager.getCurrentTab(); - if (keyCode == KeyEvent.KEYCODE_BACK) { - showCloseDialog(mTabsManager.positionOf(currentTab)); - } - return true; + mSuggestionsAdapter.clearCache(); } @Override @@ -1093,11 +1163,10 @@ public void onConfigurationChanged(final Configuration newConfig) { if (mFullScreen) { showActionBar(); - mBrowserFrame.setTranslationY(0); mToolbarLayout.setTranslationY(0); + setWebViewTranslation(mToolbarLayout.getHeight()); } - initializeTabHeight(); supportInvalidateOptionsMenu(); initializeToolbarHeight(newConfig); } @@ -1117,15 +1186,22 @@ public void run() { } mToolbar.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, toolbarSize)); mToolbar.setMinimumHeight(toolbarSize); + doOnLayout(mToolbar, new Runnable() { + @Override + public void run() { + setWebViewTranslation(mToolbarLayout.getHeight()); + } + }); mToolbar.requestLayout(); + } }); } public void closeBrowser() { mBrowserFrame.setBackgroundColor(mBackgroundColor); + removeViewFromParent(mCurrentView); performExitCleanUp(); - mBrowserFrame.removeAllViews(); int size = mTabsManager.size(); mTabsManager.shutdown(); mCurrentView = null; @@ -1138,10 +1214,10 @@ public void closeBrowser() { @Override public synchronized void onBackPressed() { final LightningView currentTab = mTabsManager.getCurrentTab(); - if (mDrawerLayout.isDrawerOpen(mDrawerLeft)) { - mDrawerLayout.closeDrawer(mDrawerLeft); - } else if (mDrawerLayout.isDrawerOpen(mDrawerRight)) { - mEventBus.post(new BrowserEvents.UserPressedBack()); + if (mDrawerLayout.isDrawerOpen(getTabDrawer())) { + mDrawerLayout.closeDrawer(getTabDrawer()); + } else if (mDrawerLayout.isDrawerOpen(getBookmarkDrawer())) { + mBookmarksView.navigateBack(); } else { if (currentTab != null) { Log.d(TAG, "onBackPressed"); @@ -1157,7 +1233,7 @@ public synchronized void onBackPressed() { if (mCustomView != null || mCustomViewCallback != null) { onHideCustomView(); } else { - deleteTab(mTabsManager.positionOf(currentTab)); + mPresenter.deleteTab(mTabsManager.positionOf(currentTab)); } } } else { @@ -1200,6 +1276,8 @@ protected void onStop() { protected void onDestroy() { Log.d(TAG, "onDestroy"); + mDrawerHandler.removeCallbacksAndMessages(null); + mPresenter.shutdown(); if (mHistoryDatabase != null) { @@ -1226,13 +1304,16 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) { protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); + if (mSwapBookmarksAndTabs != mPreferences.getBookmarksAndTabsSwapped()) { + restart(); + } + if (mSuggestionsAdapter != null) { mSuggestionsAdapter.refreshPreferences(); mSuggestionsAdapter.refreshBookmarks(); } - mTabsManager.resumeAll(); + mTabsManager.resumeAll(this); initializePreferences(); - mTabsManager.resume(this); supportInvalidateOptionsMenu(); @@ -1241,6 +1322,12 @@ protected void onResume() { BrowserApp.get(this).registerReceiver(mNetworkReceiver, filter); mEventBus.register(mBusEventListener); + + if (mFullScreen) { + overlayToolbarOnWebView(); + } else { + putToolbarInRoot(); + } } /** @@ -1289,7 +1376,6 @@ public void onGenerated(Palette palette) { finalColor = color; } - final Window window = getWindow(); if (!mShowTabsInDrawer) { window.setBackgroundDrawable(new ColorDrawable(Color.BLACK)); @@ -1304,14 +1390,19 @@ protected void applyTransformation(float interpolatedTime, Transformation t) { final int color = DrawableUtils.mixColor(interpolatedTime, mCurrentUiColor, finalColor); if (mShowTabsInDrawer) { mBackground.setColor(color); - window.setBackgroundDrawable(mBackground); + Handlers.MAIN.post(new Runnable() { + @Override + public void run() { + window.setBackgroundDrawable(mBackground); + } + }); } else if (tabBackground != null) { tabBackground.setColorFilter(color, PorterDuff.Mode.SRC_IN); } mCurrentUiColor = color; mToolbarLayout.setBackgroundColor(color); mSearchBackground.getBackground().setColorFilter(DrawableUtils.mixColor(interpolatedTime, - startSearchColor, finalSearchColor), PorterDuff.Mode.SRC_IN); + startSearchColor, finalSearchColor), PorterDuff.Mode.SRC_IN); } }; animation.setDuration(300); @@ -1345,7 +1436,7 @@ public void updateUrl(@Nullable String url, boolean shortUrl) { return; } final LightningView currentTab = mTabsManager.getCurrentTab(); - mEventBus.post(new BrowserEvents.CurrentPageUrl(url)); + mBookmarksView.handleUpdatedUrl(url); if (shortUrl && !UrlUtils.isSpecialUrl(url)) { switch (mPreferences.getUrlBoxContentChoice()) { case 0: // Default, show only the domain @@ -1376,7 +1467,7 @@ public void updateUrl(@Nullable String url, boolean shortUrl) { public void updateTabNumber(int number) { if (mArrowImage != null && mShowTabsInDrawer) { mArrowImage.setImageBitmap(DrawableUtils.getRoundedNumberImage(number, Utils.dpToPx(24), - Utils.dpToPx(24), ThemeUtils.getIconThemeColor(this, mDarkTheme), Utils.dpToPx(2.5f))); + Utils.dpToPx(24), ThemeUtils.getIconThemeColor(this, mDarkTheme), Utils.dpToPx(2.5f))); } } @@ -1426,7 +1517,7 @@ public void onItemClick(AdapterView adapterView, View view, int pos, long l) if (urlString != null) { url = urlString.toString(); } - if (url == null || url.startsWith(BrowserActivity.this.getString(R.string.suggestion))) { + if (url == null || url.startsWith(getString(R.string.suggestion))) { CharSequence searchString = ((TextView) view.findViewById(R.id.title)).getText(); if (searchString != null) { url = searchString.toString(); @@ -1439,10 +1530,7 @@ public void onItemClick(AdapterView adapterView, View view, int pos, long l) searchTheWeb(url); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getUrl.getWindowToken(), 0); - final LightningView currentTab = mTabsManager.getCurrentTab(); - if (currentTab != null) { - currentTab.requestFocus(); - } + mPresenter.onAutoCompleteItemPressed(); } }); @@ -1458,14 +1546,22 @@ private void openHistory() { new HistoryPage(mTabsManager.getCurrentTab(), getApplication(), mHistoryDatabase).load(); } + private View getBookmarkDrawer() { + return mSwapBookmarksAndTabs ? mDrawerLeft : mDrawerRight; + } + + private View getTabDrawer() { + return mSwapBookmarksAndTabs ? mDrawerRight : mDrawerLeft; + } + /** * helper function that opens the bookmark drawer */ private void openBookmarks() { - if (mDrawerLayout.isDrawerOpen(mDrawerLeft)) { + if (mDrawerLayout.isDrawerOpen(getTabDrawer())) { mDrawerLayout.closeDrawers(); } - mDrawerLayout.openDrawer(mDrawerRight); + mDrawerLayout.openDrawer(getBookmarkDrawer()); } /** @@ -1703,6 +1799,11 @@ public synchronized void onShowCustomView(final View view, CustomViewCallback ca } } + @Override + public void closeBookmarksDrawer() { + mDrawerLayout.closeDrawer(getBookmarkDrawer()); + } + @Override public void onHideCustomView() { final LightningView currentTab = mTabsManager.getCurrentTab(); @@ -1751,11 +1852,10 @@ public void onHideCustomView() { } mCustomViewCallback = null; setRequestedOrientation(mOriginalOrientation); - setTabHeight(); } private class VideoCompletionListener implements MediaPlayer.OnCompletionListener, - MediaPlayer.OnErrorListener { + MediaPlayer.OnErrorListener { @Override public boolean onError(MediaPlayer mp, int what, int extra) { @@ -1778,6 +1878,37 @@ public void onWindowFocusChanged(boolean hasFocus) { } } + @Override + public void onBackButtonPressed() { + final LightningView currentTab = mTabsManager.getCurrentTab(); + if (currentTab != null) { + if (currentTab.canGoBack()) { + currentTab.goBack(); + } else { + mPresenter.deleteTab(mTabsManager.positionOf(currentTab)); + } + } + } + + @Override + public void onForwardButtonPressed() { + final LightningView currentTab = mTabsManager.getCurrentTab(); + if (currentTab != null) { + if (currentTab.canGoForward()) { + currentTab.goForward(); + } + } + } + + @Override + public void onHomeButtonPressed() { + final LightningView currentTab = mTabsManager.getCurrentTab(); + if (currentTab != null) { + currentTab.loadHomepage(); + closeDrawers(null); + } + } + /** * This method sets whether or not the activity will display * in full-screen mode (i.e. the ActionBar will be hidden) and @@ -1797,16 +1928,16 @@ private void setFullscreen(boolean enabled, boolean immersive) { if (enabled) { if (immersive) { decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } else { decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); + WindowManager.LayoutParams.FLAG_FULLSCREEN); } else { window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); @@ -1849,7 +1980,7 @@ public synchronized void onCreateWindow(Message resultMsg) { */ @Override public void onCloseWindow(LightningView view) { - deleteTab(mTabsManager.positionOf(view)); + mPresenter.deleteTab(mTabsManager.positionOf(view)); } /** @@ -1868,13 +1999,13 @@ public void hideActionBar() { Animation show = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { - float trans = (1.0f - interpolatedTime) * height; - mToolbarLayout.setTranslationY(trans - height); - mBrowserFrame.setTranslationY(trans - height); + float trans = interpolatedTime * height; + mToolbarLayout.setTranslationY(-trans); + setWebViewTranslation(height - trans); } }; show.setDuration(250); - show.setInterpolator(new DecelerateInterpolator()); + show.setInterpolator(new BezierDecelerateInterpolator()); mBrowserFrame.startAnimation(show); } } @@ -1888,6 +2019,7 @@ protected void applyTransformation(float interpolatedTime, Transformation t) { @Override public void showActionBar() { if (mFullScreen) { + Log.d(TAG, "showActionBar"); if (mToolbarLayout == null) return; @@ -1897,10 +2029,6 @@ public void showActionBar() { height = mToolbarLayout.getMeasuredHeight(); } - final LightningView currentTab = mTabsManager.getCurrentTab(); - if (currentTab == null) - return; - final int totalHeight = height; if (mToolbarLayout.getTranslationY() < -(height - 0.01f)) { Animation show = new Animation() { @@ -1908,33 +2036,16 @@ public void showActionBar() { protected void applyTransformation(float interpolatedTime, Transformation t) { float trans = interpolatedTime * totalHeight; mToolbarLayout.setTranslationY(trans - totalHeight); - mBrowserFrame.setTranslationY(trans - totalHeight); + setWebViewTranslation(trans); } }; show.setDuration(250); - show.setInterpolator(new DecelerateInterpolator()); + show.setInterpolator(new BezierDecelerateInterpolator()); mBrowserFrame.startAnimation(show); } } } - /** - * This method initializes the height of the - * view that holds the current WebView. It waits - * for the root layout to be laid out before setting - * the height as it needs the root layout to be measured - * first. - */ - private void initializeTabHeight() { - Log.d(TAG, "initializeTabHeight"); - doOnLayout(mUiLayout, new Runnable() { - @Override - public void run() { - setTabHeight(); - } - }); - } - /** * Performs an action when the provided view is laid out. * @@ -1949,6 +2060,7 @@ public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { + //noinspection deprecation view.getViewTreeObserver().removeGlobalOnLayoutListener(this); } runnable.run(); @@ -1956,46 +2068,6 @@ public void onGlobalLayout() { }); } - /** - * This method sets the height of the browser - * frame view that holds the current WebView. - * It requires the root layout to be properly - * laid out in order to set the correct height. - */ - private void setTabHeight() { - Log.d(TAG, "setTabHeight"); - if (mRoot.getHeight() == 0) { - mRoot.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY); - } - - Log.d(TAG, "UI Layout top: " + mUiLayout.getTop()); - - if (mFullScreen) { - int height = mRoot.getHeight() - mUiLayout.getTop(); - mBrowserFrame.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height)); - } else { - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - params.weight = 1; - mBrowserFrame.setLayoutParams(params); - } - - mBrowserFrame.requestLayout(); - } - - private void setTabHeightForKeyboard() { - doOnLayout(mUiLayout, new Runnable() { - @Override - public void run() { - Rect rect = new Rect(); - mRoot.getWindowVisibleDisplayFrame(rect); - - int height = rect.bottom - mUiLayout.getTop(); - mBrowserFrame.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height)); - mBrowserFrame.requestLayout(); - } - }); - } - /** * This method lets the search bar know that the page is currently loading * and that it should display the stop icon to indicate to the user that @@ -2042,7 +2114,7 @@ public void onClick(View v) { if (mSearch != null && mSearch.hasFocus()) { currentTab.requestFocus(); } else if (mShowTabsInDrawer) { - mDrawerLayout.openDrawer(mDrawerLeft); + mDrawerLayout.openDrawer(getTabDrawer()); } else { currentTab.loadHomepage(); } @@ -2085,27 +2157,6 @@ public boolean onLongClick(View view) { return true; } - // TODO Check if all the calls are relative to TabsFragement - - /** - * A utility method that creates a FrameLayout button with the given ID and - * sets the image of the button to the given image ID. The OnClick and OnLongClick - * listeners are set to this class, so BrowserActivity should handle those events - * there. Additionally, it tints the images according to the current theme. - * This method only is a convenience so that this code does not have to be repeated - * for the several "Buttons" that use this. - * - * @param buttonId the view id of the button - * @param imageId the image to set as the button image - */ - private void setupFrameLayoutButton(@IdRes int buttonId, @IdRes int imageId) { - final View frameButton = findViewById(buttonId); - final ImageView buttonImage = (ImageView) findViewById(imageId); - frameButton.setOnClickListener(this); - frameButton.setOnLongClickListener(this); - buttonImage.setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); - } - /** * This NetworkReceiver notifies each of the WebViews in the browser whether * the network is currently connected or not. This is important because some @@ -2114,10 +2165,8 @@ private void setupFrameLayoutButton(@IdRes int buttonId, @IdRes int imageId) { */ private final NetworkReceiver mNetworkReceiver = new NetworkReceiver() { @Override - public void onReceive(Context context, Intent intent) { - super.onReceive(context, intent); - boolean isConnected = isConnected(context); - Log.d(TAG, "Network Connected: " + String.valueOf(isConnected)); + public void onConnectivityChange(boolean isConnected) { + Log.d(TAG, "Network Connected: " + isConnected); mTabsManager.notifyConnectionStatus(isConnected); } }; @@ -2139,26 +2188,6 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis private final Object mBusEventListener = new Object() { - /** - * Load the given url in the current tab, used by the the - * {@link acr.browser.lightning.fragment.BookmarksFragment} and by the - * {@link LightningDialogBuilder} - * - * @param event Bus event indicating that the user has clicked a bookmark - */ - @Subscribe - public void loadUrlInCurrentTab(final BrowserEvents.OpenUrlInCurrentTab event) { - mPresenter.loadUrlInCurrentView(event.url); - // keep any jank from happening when the drawer is closed after the - // URL starts to load - mDrawerHandler.postDelayed(new Runnable() { - @Override - public void run() { - mDrawerLayout.closeDrawer(mDrawerRight); - } - }, 150); - } - @Subscribe public void loadHistory(final BrowserEvents.OpenHistoryInCurrentTab event) { new HistoryPage(mTabsManager.getCurrentTab(), getApplication(), mHistoryDatabase).load(); @@ -2174,30 +2203,16 @@ public void loadHistory(final BrowserEvents.OpenHistoryInCurrentTab event) { */ @Subscribe public void loadUrlInNewTab(final BrowserEvents.OpenUrlInNewTab event) { - BrowserActivity.this.newTab(event.url, true); mDrawerLayout.closeDrawers(); - } - - /** - * When receive a {@link BookmarkEvents.ToggleBookmarkForCurrentPage} - * message this receiver answer firing the - * {@link BrowserEvents.BookmarkAdded} message - * - * @param event an event that the user wishes to bookmark the current page - */ - @Subscribe - public void bookmarkCurrentPage(final BookmarkEvents.ToggleBookmarkForCurrentPage event) { - final LightningView currentTab = mTabsManager.getCurrentTab(); - final String url = currentTab != null ? currentTab.getUrl() : null; - final String title = currentTab != null ? currentTab.getTitle() : null; - if (url == null) { - return; - } - - if (!mBookmarkManager.isBookmark(url)) { - addBookmark(title, url); - } else { - deleteBookmark(title, url); + if (event.location == BrowserEvents.OpenUrlInNewTab.Location.NEW_TAB) { + newTab(event.url, true); + } else if (event.location == BrowserEvents.OpenUrlInNewTab.Location.BACKGROUND) { + newTab(event.url, false); + } else if (event.location == BrowserEvents.OpenUrlInNewTab.Location.INCOGNITO) { + Intent intent = new Intent(BrowserActivity.this, IncognitoActivity.class); + intent.setData(Uri.parse(event.url)); + startActivity(intent); + overridePendingTransition(R.anim.slide_up_in, R.anim.fade_out_scale); } } @@ -2208,14 +2223,7 @@ public void bookmarkCurrentPage(final BookmarkEvents.ToggleBookmarkForCurrentPag */ @Subscribe public void bookmarkChanged(final BookmarkEvents.BookmarkChanged event) { - final LightningView currentTab = mTabsManager.getCurrentTab(); - if (currentTab != null && currentTab.getUrl().startsWith(Constants.FILE) - && currentTab.getUrl().endsWith(BookmarkPage.FILENAME)) { - currentTab.loadBookmarkpage(); - } - if (currentTab != null) { - mEventBus.post(new BrowserEvents.CurrentPageUrl(currentTab.getUrl())); - } + handleBookmarksChange(); } /** @@ -2225,133 +2233,19 @@ public void bookmarkChanged(final BookmarkEvents.BookmarkChanged event) { */ @Subscribe public void bookmarkDeleted(final BookmarkEvents.Deleted event) { - final LightningView currentTab = mTabsManager.getCurrentTab(); - if (currentTab != null && currentTab.getUrl().startsWith(Constants.FILE) - && currentTab.getUrl().endsWith(BookmarkPage.FILENAME)) { - currentTab.loadBookmarkpage(); - } - if (currentTab != null) { - mEventBus.post(new BrowserEvents.CurrentPageUrl(currentTab.getUrl())); - } - } - - /** - * The {@link acr.browser.lightning.fragment.BookmarksFragment} send this message on reply - * to {@link acr.browser.lightning.bus.BrowserEvents.UserPressedBack} message if the - * fragement is showing the boomarks root folder. - * - * @param event an event notifying the browser that the bookmark drawer - * should be closed. - */ - @Subscribe - public void closeBookmarks(final BookmarkEvents.CloseBookmarks event) { - mDrawerLayout.closeDrawer(mDrawerRight); - } - - /** - * The user wants to close a tab - * - * @param event contains the position inside the tabs adapter - */ - @Subscribe - public void closeTab(final TabEvents.CloseTab event) { - deleteTab(event.position); - } - - /** - * The user clicked on a tab, let's show it - * - * @param event contains the tab position in the tabs adapter - */ - @Subscribe - public void showTab(final TabEvents.ShowTab event) { - BrowserActivity.this.showTab(event.position); - } - - /** - * The user long pressed on a tab, ask him if he want to close the tab - * - * @param event contains the tab position in the tabs adapter - */ - @Subscribe - public void showCloseDialog(final TabEvents.ShowCloseDialog event) { - BrowserActivity.this.showCloseDialog(event.position); - } - - /** - * The user wants to create a new tab - * - * @param event a marker - */ - @Subscribe - public void newTab(final TabEvents.NewTab event) { - BrowserActivity.this.newTab(null, true); + handleBookmarksChange(); } - /** - * The user wants to go back on current tab - * - * @param event a marker - */ - @Subscribe - public void goBack(final NavigationEvents.GoBack event) { + private void handleBookmarksChange() { final LightningView currentTab = mTabsManager.getCurrentTab(); - if (currentTab != null) { - if (currentTab.canGoBack()) { - currentTab.goBack(); - } else { - deleteTab(mTabsManager.positionOf(currentTab)); - } - } - } - - /** - * The user wants to go forward on current tab - * - * @param event a marker - */ - @Subscribe - public void goForward(final NavigationEvents.GoForward event) { - final LightningView currentTab = mTabsManager.getCurrentTab(); - if (currentTab != null) { - if (currentTab.canGoForward()) { - currentTab.goForward(); - } + if (currentTab != null && currentTab.getUrl().startsWith(Constants.FILE) + && currentTab.getUrl().endsWith(BookmarkPage.FILENAME)) { + currentTab.loadBookmarkpage(); } - } - - @Subscribe - public void goHome(final NavigationEvents.GoHome event) { - final LightningView currentTab = mTabsManager.getCurrentTab(); if (currentTab != null) { - currentTab.loadHomepage(); - closeDrawers(null); - } - } - - /** - * The user long pressed the new tab button - * - * @param event a marker - */ - @Subscribe - public void newTabLongPress(final TabEvents.NewTabLongPress event) { - String url = mPreferences.getSavedUrl(); - if (url != null) { - BrowserActivity.this.newTab(url, true); - - Utils.showSnackbar(BrowserActivity.this, R.string.deleted_tab); + mBookmarksView.handleUpdatedUrl(currentTab.getUrl()); } - mPreferences.setSavedUrl(null); } - @Subscribe - public void displayInSnackbar(final BrowserEvents.ShowSnackBarMessage event) { - if (event.message != null) { - Utils.showSnackbar(BrowserActivity.this, event.message); - } else { - Utils.showSnackbar(BrowserActivity.this, event.stringRes); - } - } }; } diff --git a/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java b/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java index fa2460bd7..e939e5ad8 100644 --- a/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/IncognitoActivity.java @@ -9,9 +9,9 @@ import android.webkit.CookieSyncManager; import acr.browser.lightning.R; -import acr.browser.lightning.react.Action; -import acr.browser.lightning.react.Observable; -import acr.browser.lightning.react.Subscriber; +import com.anthonycr.bonsai.Action; +import com.anthonycr.bonsai.Observable; +import com.anthonycr.bonsai.Subscriber; @SuppressWarnings("deprecation") public class IncognitoActivity extends BrowserActivity { diff --git a/app/src/main/java/acr/browser/lightning/activity/MainActivity.java b/app/src/main/java/acr/browser/lightning/activity/MainActivity.java index 32ca6eb69..982bec75e 100644 --- a/app/src/main/java/acr/browser/lightning/activity/MainActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/MainActivity.java @@ -9,9 +9,9 @@ import android.webkit.CookieSyncManager; import acr.browser.lightning.R; -import acr.browser.lightning.react.Action; -import acr.browser.lightning.react.Observable; -import acr.browser.lightning.react.Subscriber; +import com.anthonycr.bonsai.Action; +import com.anthonycr.bonsai.Observable; +import com.anthonycr.bonsai.Subscriber; @SuppressWarnings("deprecation") public class MainActivity extends BrowserActivity { diff --git a/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java b/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java index 088ae2f7d..90b943edd 100644 --- a/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/ReadingActivity.java @@ -1,6 +1,7 @@ package acr.browser.lightning.activity; import android.animation.ObjectAnimator; +import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -27,13 +28,14 @@ import acr.browser.lightning.R; import acr.browser.lightning.app.BrowserApp; import acr.browser.lightning.constant.Constants; +import acr.browser.lightning.dialog.BrowserDialog; import acr.browser.lightning.preference.PreferenceManager; -import acr.browser.lightning.react.Action; -import acr.browser.lightning.react.Observable; -import acr.browser.lightning.react.OnSubscribe; -import acr.browser.lightning.react.Subscriber; -import acr.browser.lightning.react.Schedulers; -import acr.browser.lightning.react.Subscription; +import com.anthonycr.bonsai.Action; +import com.anthonycr.bonsai.Observable; +import com.anthonycr.bonsai.OnSubscribe; +import com.anthonycr.bonsai.Subscriber; +import com.anthonycr.bonsai.Schedulers; +import com.anthonycr.bonsai.Subscription; import acr.browser.lightning.reading.HtmlFetcher; import acr.browser.lightning.reading.JResult; import acr.browser.lightning.utils.ThemeUtils; @@ -159,6 +161,7 @@ public void onStart() { mProgressDialog.setIndeterminate(true); mProgressDialog.setMessage(getString(R.string.loading)); mProgressDialog.show(); + BrowserDialog.setDialogSize(ReadingActivity.this, mProgressDialog); } @Override @@ -321,7 +324,8 @@ public void onClick(DialogInterface arg0, int arg1) { } }); - builder.show(); + Dialog dialog = builder.show(); + BrowserDialog.setDialogSize(this, dialog); break; default: finish(); diff --git a/app/src/main/java/acr/browser/lightning/activity/SettingsActivity.java b/app/src/main/java/acr/browser/lightning/activity/SettingsActivity.java index f9c82ce6d..6fcdb29a9 100644 --- a/app/src/main/java/acr/browser/lightning/activity/SettingsActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/SettingsActivity.java @@ -15,13 +15,15 @@ import com.anthonycr.grant.PermissionsManager; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import acr.browser.lightning.R; +import acr.browser.lightning.app.BrowserApp; public class SettingsActivity extends ThemableSettingsActivity { - private static final List mFragments = new ArrayList<>(6); + private static final List mFragments = new ArrayList<>(7); @Override protected void onCreate(Bundle savedInstanceState) { @@ -45,12 +47,23 @@ protected void onCreate(Bundle savedInstanceState) { public void onBuildHeaders(List
target) { loadHeadersFromResource(R.xml.preferences_headers, target); mFragments.clear(); - for (Header header : target) { + Iterator
headerIterator = target.iterator(); + while (headerIterator.hasNext()) { + Header header = headerIterator.next(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // Workaround for bug in the AppCompat support library header.iconRes = R.drawable.empty; } - mFragments.add(header.fragment); + + if (header.titleRes == R.string.debug_title) { + if (BrowserApp.isRelease()) { + headerIterator.remove(); + } else { + mFragments.add(header.fragment); + } + } else { + mFragments.add(header.fragment); + } } } diff --git a/app/src/main/java/acr/browser/lightning/activity/TabsManager.java b/app/src/main/java/acr/browser/lightning/activity/TabsManager.java index 8efab1d92..622bcd23c 100644 --- a/app/src/main/java/acr/browser/lightning/activity/TabsManager.java +++ b/app/src/main/java/acr/browser/lightning/activity/TabsManager.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.app.Application; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -9,6 +10,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; +import android.text.TextUtils; import android.util.Log; import android.webkit.WebView; @@ -27,12 +29,15 @@ import acr.browser.lightning.constant.StartPage; import acr.browser.lightning.database.BookmarkManager; import acr.browser.lightning.database.HistoryDatabase; +import acr.browser.lightning.dialog.BrowserDialog; import acr.browser.lightning.preference.PreferenceManager; -import acr.browser.lightning.react.Action; -import acr.browser.lightning.react.Observable; -import acr.browser.lightning.react.OnSubscribe; -import acr.browser.lightning.react.Schedulers; -import acr.browser.lightning.react.Subscriber; + +import com.anthonycr.bonsai.Action; +import com.anthonycr.bonsai.Observable; +import com.anthonycr.bonsai.OnSubscribe; +import com.anthonycr.bonsai.Schedulers; +import com.anthonycr.bonsai.Subscriber; + import acr.browser.lightning.utils.FileUtils; import acr.browser.lightning.utils.UrlUtils; import acr.browser.lightning.view.LightningView; @@ -80,7 +85,7 @@ public void cancelPendingWork() { mPostInitializationWorkList.clear(); } - public void doAfterInitialization(@NonNull Runnable runnable) { + public synchronized void doAfterInitialization(@NonNull Runnable runnable) { if (mIsInitialized) { runnable.run(); } else { @@ -88,7 +93,7 @@ public void doAfterInitialization(@NonNull Runnable runnable) { } } - private void finishInitialization() { + private synchronized void finishInitialization() { mIsInitialized = true; for (Runnable runnable : mPostInitializationWorkList) { runnable.run(); @@ -113,18 +118,18 @@ public void onSubscribe(@NonNull final Subscriber subscriber) { // Make sure we start with a clean tab list shutdown(); - // If incognito, only create one tab, do not handle intent - // in order to protect user privacy + String url = null; + if (intent != null) { + url = intent.getDataString(); + } + + // If incognito, only create one tab if (incognito) { - newTab(activity, null, true); + newTab(activity, url, true); subscriber.onComplete(); return; } - String url = null; - if (intent != null) { - url = intent.getDataString(); - } Log.d(TAG, "URL from intent: " + url); mCurrentTab = null; if (mPreferenceManager.getRestoreLostTabsEnabled()) { @@ -144,7 +149,7 @@ private void restoreLostTabs(@Nullable final String url, @NonNull final Activity @NonNull final Subscriber subscriber) { restoreState().subscribeOn(Schedulers.io()) - .observeOn(Schedulers.main()).subscribe(new OnSubscribe() { + .observeOn(Schedulers.main()).subscribe(new OnSubscribe() { @Override public void onNext(Bundle item) { LightningView tab = newTab(activity, "", false); @@ -167,25 +172,42 @@ public void onComplete() { if (url != null) { if (url.startsWith(Constants.FILE)) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setCancelable(true) - .setTitle(R.string.title_warning) - .setMessage(R.string.message_blocked_local) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(R.string.action_open, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - newTab(activity, url, false); + Dialog dialog = builder.setCancelable(true) + .setTitle(R.string.title_warning) + .setMessage(R.string.message_blocked_local) + .setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + if (mTabList.isEmpty()) { + newTab(activity, null, false); } - }).show(); + finishInitialization(); + subscriber.onComplete(); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.action_open, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + newTab(activity, url, false); + } + }).show(); + BrowserDialog.setDialogSize(activity, dialog); } else { newTab(activity, url, false); + if (mTabList.isEmpty()) { + newTab(activity, null, false); + } + finishInitialization(); + subscriber.onComplete(); } + } else { + if (mTabList.isEmpty()) { + newTab(activity, null, false); + } + finishInitialization(); + subscriber.onComplete(); } - if (mTabList.size() == 0) { - newTab(activity, null, false); - } - finishInitialization(); - subscriber.onComplete(); } }); } @@ -196,8 +218,11 @@ public void onClick(DialogInterface dialog, int which) { * WebView when the app is open currently due to a * bug in the WebView, where calling onResume doesn't * consistently resume it. + * + * @param context the context needed to initialize + * the LightningView preferences. */ - public void resumeAll() { + public void resumeAll(@NonNull Context context) { LightningView current = getCurrentTab(); if (current != null) { current.resumeTimers(); @@ -205,6 +230,7 @@ public void resumeAll() { for (LightningView tab : mTabList) { if (tab != null) { tab.onResume(); + tab.initializePreferences(context); } } } @@ -274,19 +300,6 @@ public synchronized void shutdown() { mCurrentTab = null; } - /** - * Reinitializes the preferences for - * all the tabs in the list. - * - * @param context the context needed - * to initialize the preferences. - */ - public synchronized void resume(@NonNull final Context context) { - for (LightningView tab : mTabList) { - tab.initializePreferences(context); - } - } - /** * Forwards network connection status to the WebViews. * @@ -429,6 +442,9 @@ public void saveState() { Log.d(Constants.TAG, "Saving tab state"); for (int n = 0; n < mTabList.size(); n++) { LightningView tab = mTabList.get(n); + if (TextUtils.isEmpty(tab.getUrl())) { + continue; + } Bundle state = new Bundle(ClassLoader.getSystemClassLoader()); if (tab.getWebView() != null && !UrlUtils.isSpecialUrl(tab.getUrl())) { tab.getWebView().saveState(state); @@ -493,7 +509,7 @@ public synchronized WebView getCurrentWebView() { * @return Return the index of the current tab, or -1 if the * current tab is null. */ - public int indexOfCurrentTab() { + public synchronized int indexOfCurrentTab() { return mTabList.indexOf(mCurrentTab); } @@ -502,7 +518,7 @@ public int indexOfCurrentTab() { * * @return Return the index of the tab, or -1 if the tab isn't in the list. */ - public int indexOfTab(LightningView tab) { + public synchronized int indexOfTab(LightningView tab) { return mTabList.indexOf(tab); } diff --git a/app/src/main/java/acr/browser/lightning/activity/ThemableBrowserActivity.java b/app/src/main/java/acr/browser/lightning/activity/ThemableBrowserActivity.java index dc04c6c08..b4d112fdd 100644 --- a/app/src/main/java/acr/browser/lightning/activity/ThemableBrowserActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/ThemableBrowserActivity.java @@ -17,6 +17,7 @@ public abstract class ThemableBrowserActivity extends AppCompatActivity { private int mTheme; private boolean mShowTabsInDrawer; + private boolean mShouldRunOnResumeActions = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -33,9 +34,29 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus && mShouldRunOnResumeActions) { + mShouldRunOnResumeActions = false; + onWindowVisibleToUserAfterResume(); + } + } + + /** + * Called after the activity is resumed + * and the UI becomes visible to the user. + * Called by onWindowFocusChanged only if + * onResume has been called. + */ + void onWindowVisibleToUserAfterResume() { + + } + @Override protected void onResume() { super.onResume(); + mShouldRunOnResumeActions = true; int theme = mPreferences.getUseTheme(); boolean drawerTabs = mPreferences.getShowTabsInDrawer(!isTablet()); if (theme != mTheme || mShowTabsInDrawer != drawerTabs) { @@ -47,7 +68,7 @@ boolean isTablet() { return (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE; } - private void restart() { + void restart() { finish(); startActivity(new Intent(this, getClass())); } diff --git a/app/src/main/java/acr/browser/lightning/app/AppComponent.java b/app/src/main/java/acr/browser/lightning/app/AppComponent.java index 0f8187e49..c28da576e 100644 --- a/app/src/main/java/acr/browser/lightning/app/AppComponent.java +++ b/app/src/main/java/acr/browser/lightning/app/AppComponent.java @@ -13,6 +13,7 @@ import acr.browser.lightning.download.LightningDownloadListener; import acr.browser.lightning.fragment.BookmarkSettingsFragment; import acr.browser.lightning.fragment.BookmarksFragment; +import acr.browser.lightning.fragment.DebugSettingsFragment; import acr.browser.lightning.fragment.LightningPreferenceFragment; import acr.browser.lightning.fragment.PrivacySettingsFragment; import acr.browser.lightning.fragment.TabsFragment; @@ -33,8 +34,6 @@ public interface AppComponent { void inject(BookmarkSettingsFragment fragment); - void inject(SuggestionsAdapter adapter); - void inject(LightningDialogBuilder builder); void inject(TabsFragment fragment); @@ -67,4 +66,8 @@ public interface AppComponent { void inject(TabsManager manager); + void inject(DebugSettingsFragment fragment); + + void inject(SuggestionsAdapter suggestionsAdapter); + } diff --git a/app/src/main/java/acr/browser/lightning/app/BrowserApp.java b/app/src/main/java/acr/browser/lightning/app/BrowserApp.java index f0689d68e..6bf6d734c 100644 --- a/app/src/main/java/acr/browser/lightning/app/BrowserApp.java +++ b/app/src/main/java/acr/browser/lightning/app/BrowserApp.java @@ -1,9 +1,14 @@ package acr.browser.lightning.app; +import android.app.Activity; import android.app.Application; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.os.Build; +import android.os.StrictMode; import android.support.annotation.NonNull; +import android.util.Log; import android.webkit.WebView; import com.squareup.leakcanary.LeakCanary; @@ -15,24 +20,70 @@ import javax.inject.Inject; import acr.browser.lightning.BuildConfig; +import acr.browser.lightning.preference.PreferenceManager; +import acr.browser.lightning.utils.FileUtils; +import acr.browser.lightning.utils.MemoryLeakUtils; public class BrowserApp extends Application { + private static final String TAG = BrowserApp.class.getSimpleName(); + private static AppComponent mAppComponent; private static final Executor mIOThread = Executors.newSingleThreadExecutor(); private static final Executor mTaskThread = Executors.newCachedThreadPool(); @Inject Bus mBus; + @Inject PreferenceManager mPreferenceManager; @Override public void onCreate() { super.onCreate(); + if (BuildConfig.DEBUG) { + StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() + .detectAll() + .penaltyLog() + .build()); + StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() + .detectAll() + .penaltyLog() + .build()); + } + + final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); + + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread thread, Throwable ex) { + + if (BuildConfig.DEBUG) { + FileUtils.writeCrashToStorage(ex); + } + + if (defaultHandler != null) { + defaultHandler.uncaughtException(thread, ex); + } else { + System.exit(2); + } + } + }); + mAppComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build(); mAppComponent.inject(this); - LeakCanary.install(this); - if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + + if (mPreferenceManager.getUseLeakCanary() && !isRelease()) { + LeakCanary.install(this); + } + if (!isRelease() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } + + registerActivityLifecycleCallbacks(new MemoryLeakUtils.LifecycleAdapter() { + @Override + public void onActivityDestroyed(Activity activity) { + Log.d(TAG, "Cleaning up after the Android framework"); + MemoryLeakUtils.clearNextServedView(activity, BrowserApp.this); + } + }); } @NonNull @@ -58,4 +109,19 @@ public static Bus getBus(@NonNull Context context) { return get(context).mBus; } + /** + * Determines whether this is a release build. + * + * @return true if this is a release build, false otherwise. + */ + public static boolean isRelease() { + return !BuildConfig.DEBUG || BuildConfig.BUILD_TYPE.toLowerCase().equals("release"); + } + + public static void copyToClipboard(@NonNull Context context, @NonNull String string) { + ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("URL", string); + clipboard.setPrimaryClip(clip); + } + } diff --git a/app/src/main/java/acr/browser/lightning/async/ImageDownloadTask.java b/app/src/main/java/acr/browser/lightning/async/ImageDownloadTask.java index e229e8f25..60cd9bfd4 100644 --- a/app/src/main/java/acr/browser/lightning/async/ImageDownloadTask.java +++ b/app/src/main/java/acr/browser/lightning/async/ImageDownloadTask.java @@ -1,16 +1,16 @@ package acr.browser.lightning.async; -import android.app.Activity; -import android.content.Context; +import android.app.Application; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.util.Log; import android.widget.ImageView; +import com.anthonycr.bonsai.Schedulers; + import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; @@ -26,7 +26,7 @@ public class ImageDownloadTask extends AsyncTask { private static final String TAG = ImageDownloadTask.class.getSimpleName(); @NonNull private final WeakReference mFaviconImage; - @NonNull private final WeakReference mContextReference; + @NonNull private final Application mContext; @NonNull private final HistoryItem mWeb; private final String mUrl; @NonNull private final Bitmap mDefaultBitmap; @@ -34,7 +34,7 @@ public class ImageDownloadTask extends AsyncTask { public ImageDownloadTask(@NonNull ImageView bmImage, @NonNull HistoryItem web, @NonNull Bitmap defaultBitmap, - @NonNull Context context) { + @NonNull Application context) { // Set a tag on the ImageView so we know if the view // has gone out of scope and should not be used bmImage.setTag(web.getUrl().hashCode()); @@ -42,10 +42,10 @@ public ImageDownloadTask(@NonNull ImageView bmImage, this.mWeb = web; this.mUrl = web.getUrl(); this.mDefaultBitmap = defaultBitmap; - this.mContextReference = new WeakReference<>(context.getApplicationContext()); + this.mContext = context; } - @Nullable + @NonNull @Override protected Bitmap doInBackground(Void... params) { Bitmap mIcon = null; @@ -53,11 +53,7 @@ protected Bitmap doInBackground(Void... params) { if (mUrl == null) { return mDefaultBitmap; } - Context context = mContextReference.get(); - if (context == null) { - return mDefaultBitmap; - } - File cache = context.getCacheDir(); + File cache = mContext.getCacheDir(); final Uri uri = Uri.parse(mUrl); if (uri.getHost() == null || uri.getScheme() == null) { return mDefaultBitmap; @@ -65,6 +61,9 @@ protected Bitmap doInBackground(Void... params) { final String hash = String.valueOf(uri.getHost().hashCode()); final File image = new File(cache, hash + ".png"); final String urlDisplay = uri.getScheme() + "://" + uri.getHost() + "/favicon.ico"; + if (Constants.FILE.startsWith(uri.getScheme())) { + return mDefaultBitmap; + } // checks to see if the image exists if (!image.exists()) { FileOutputStream fos = null; @@ -144,17 +143,12 @@ protected void onPostExecute(Bitmap bitmap) { final Bitmap fav = Utils.padFavicon(bitmap); final ImageView view = mFaviconImage.get(); if (view != null && view.getTag().equals(mWeb.getUrl().hashCode())) { - Context context = view.getContext(); - if (context instanceof Activity) { - ((Activity) context).runOnUiThread(new Runnable() { - @Override - public void run() { - view.setImageBitmap(fav); - } - }); - } else { - view.setImageBitmap(fav); - } + Schedulers.main().execute(new Runnable() { + @Override + public void run() { + view.setImageBitmap(fav); + } + }); } mWeb.setBitmap(fav); } diff --git a/app/src/main/java/acr/browser/lightning/browser/BookmarksView.java b/app/src/main/java/acr/browser/lightning/browser/BookmarksView.java new file mode 100644 index 000000000..de578ca57 --- /dev/null +++ b/app/src/main/java/acr/browser/lightning/browser/BookmarksView.java @@ -0,0 +1,11 @@ +package acr.browser.lightning.browser; + +import android.support.annotation.NonNull; + +public interface BookmarksView { + + void navigateBack(); + + void handleUpdatedUrl(@NonNull String url); + +} diff --git a/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java b/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java index 7b792085e..2c19fbf31 100644 --- a/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java +++ b/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java @@ -7,6 +7,7 @@ import android.support.annotation.Nullable; import android.util.Log; +import com.anthonycr.bonsai.Schedulers; import com.squareup.otto.Bus; import javax.inject.Inject; @@ -17,7 +18,9 @@ import acr.browser.lightning.constant.Constants; import acr.browser.lightning.controller.UIController; import acr.browser.lightning.preference.PreferenceManager; -import acr.browser.lightning.react.OnSubscribe; + +import com.anthonycr.bonsai.OnSubscribe; + import acr.browser.lightning.utils.UrlUtils; import acr.browser.lightning.view.LightningView; @@ -61,14 +64,16 @@ public void tabNumberChanged(int newNumber) { */ public void setupTabs(@Nullable Intent intent) { mTabsModel.initializeTabs((Activity) mView, intent, mIsIncognito) - .subscribe(new OnSubscribe() { - @Override - public void onComplete() { - // At this point we always have at least a tab in the tab manager - tabChanged(mTabsModel.last()); - mView.updateTabNumber(mTabsModel.size()); - } - }); + .subscribeOn(Schedulers.main()) + .subscribe(new OnSubscribe() { + @Override + public void onComplete() { + // At this point we always have at least a tab in the tab manager + mView.notifyTabViewInitialized(); + mView.updateTabNumber(mTabsModel.size()); + tabChanged(mTabsModel.last()); + } + }); } /** @@ -162,8 +167,8 @@ public void deleteTab(int position) { boolean shouldClose = mShouldClose && isShown && Boolean.TRUE.equals(tabToDelete.getTag()); final LightningView currentTab = mTabsModel.getCurrentTab(); if (mTabsModel.size() == 1 && currentTab != null && - (UrlUtils.isSpecialUrl(currentTab.getUrl()) || - currentTab.getUrl().equals(mPreferences.getHomepage()))) { + (UrlUtils.isSpecialUrl(currentTab.getUrl()) || + currentTab.getUrl().equals(mPreferences.getHomepage()))) { mView.closeActivity(); return; } else { @@ -231,15 +236,20 @@ public void run() { @Override public void onClick(DialogInterface dialog, int which) { newTab(url, true); + mShouldClose = true; + LightningView tab = mTabsModel.lastTab(); + if (tab != null) { + tab.setTag(true); + } } }); } else { newTab(url, true); - } - mShouldClose = true; - LightningView tab = mTabsModel.lastTab(); - if (tab != null) { - tab.setTag(true); + mShouldClose = true; + LightningView tab = mTabsModel.lastTab(); + if (tab != null) { + tab.setTag(true); + } } } } @@ -331,4 +341,22 @@ public synchronized boolean newTab(@Nullable String url, boolean show) { return true; } + public void onAutoCompleteItemPressed() { + final LightningView currentTab = mTabsModel.getCurrentTab(); + if (currentTab != null) { + currentTab.requestFocus(); + } + } + + public void findInPage(@NonNull String query) { + final LightningView currentView = mTabsModel.getCurrentTab(); + if (currentView != null) { + currentView.find(query); + } + } + + public void onAppLowMemory() { + mTabsModel.freeMemory(); + } + } diff --git a/app/src/main/java/acr/browser/lightning/browser/BrowserView.java b/app/src/main/java/acr/browser/lightning/browser/BrowserView.java index 4ef45f59f..b701bbb9e 100644 --- a/app/src/main/java/acr/browser/lightning/browser/BrowserView.java +++ b/app/src/main/java/acr/browser/lightning/browser/BrowserView.java @@ -35,4 +35,6 @@ public interface BrowserView { void notifyTabViewChanged(int position); + void notifyTabViewInitialized(); + } diff --git a/app/src/main/java/acr/browser/lightning/browser/TabsView.java b/app/src/main/java/acr/browser/lightning/browser/TabsView.java index 8c4e64ee2..e0ecbe90d 100644 --- a/app/src/main/java/acr/browser/lightning/browser/TabsView.java +++ b/app/src/main/java/acr/browser/lightning/browser/TabsView.java @@ -8,4 +8,5 @@ public interface TabsView { void tabChanged(int position); + void tabsInitialized(); } diff --git a/app/src/main/java/acr/browser/lightning/bus/BookmarkEvents.java b/app/src/main/java/acr/browser/lightning/bus/BookmarkEvents.java index 20c10e595..a2f8ca3d2 100644 --- a/app/src/main/java/acr/browser/lightning/bus/BookmarkEvents.java +++ b/app/src/main/java/acr/browser/lightning/bus/BookmarkEvents.java @@ -19,20 +19,6 @@ public Deleted(final HistoryItem item) { } } - /** - * The user ask to add/del a bookmark to the currently displayed page - */ - public static class ToggleBookmarkForCurrentPage { - } - - /** - * Sended by the {@link acr.browser.lightning.fragment.BookmarksFragment} when it wants to close - * itself (generally in reply to a {@link acr.browser.lightning.bus.BrowserEvents.UserPressedBack} - * event. - */ - public static class CloseBookmarks { - } - /** * Sended when a bookmark is edited */ diff --git a/app/src/main/java/acr/browser/lightning/bus/BrowserEvents.java b/app/src/main/java/acr/browser/lightning/bus/BrowserEvents.java index 17dbe6664..e0a281f58 100644 --- a/app/src/main/java/acr/browser/lightning/bus/BrowserEvents.java +++ b/app/src/main/java/acr/browser/lightning/bus/BrowserEvents.java @@ -1,90 +1,37 @@ package acr.browser.lightning.bus; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; - public final class BrowserEvents { private BrowserEvents() { // No instances } - /** - * The {@link acr.browser.lightning.activity.BrowserActivity} signal a new bookmark was added - * (mainly to the {@link acr.browser.lightning.fragment.BookmarksFragment}). - */ - public static class BookmarkAdded { - public final String title, url; - - public BookmarkAdded(final String title, final String url) { - this.title = title; - this.url = url; - } - } - - /** - * Notify the current page has a new url. This is generally used to update the - * {@link acr.browser.lightning.fragment.BookmarksFragment} interface. - */ - public static class CurrentPageUrl { - public final String url; - - public CurrentPageUrl(final String url) { - this.url = url; - } - } - - /** - * Notify the BookmarksFragment and TabsFragment that the user pressed the back button - */ - public static class UserPressedBack { + public final static class OpenHistoryInCurrentTab { } /** - * - */ - - /** - * Notify the Browser to display a SnackBar in the main activity + * The user ask to open the given url as new tab */ - public static class ShowSnackBarMessage { - @Nullable public final String message; - @StringRes - public final int stringRes; - - public ShowSnackBarMessage(@Nullable final String message) { - this.message = message; - this.stringRes = -1; - } + public final static class OpenUrlInNewTab { - public ShowSnackBarMessage(@StringRes final int stringRes) { - this.message = null; - this.stringRes = stringRes; + public enum Location { + NEW_TAB, + BACKGROUND, + INCOGNITO } - } - public final static class OpenHistoryInCurrentTab { - } - - /** - * The user want to open the given url in the current tab - */ - public final static class OpenUrlInCurrentTab { public final String url; - public OpenUrlInCurrentTab(final String url) { + public final Location location; + + public OpenUrlInNewTab(final String url) { this.url = url; + this.location = Location.NEW_TAB; } - } - - /** - * The user ask to open the given url as new tab - */ - public final static class OpenUrlInNewTab { - public final String url; - public OpenUrlInNewTab(final String url) { + public OpenUrlInNewTab(final String url, Location location) { this.url = url; + this.location = location; } } } diff --git a/app/src/main/java/acr/browser/lightning/bus/NavigationEvents.java b/app/src/main/java/acr/browser/lightning/bus/NavigationEvents.java deleted file mode 100644 index 5f7519fa3..000000000 --- a/app/src/main/java/acr/browser/lightning/bus/NavigationEvents.java +++ /dev/null @@ -1,34 +0,0 @@ -package acr.browser.lightning.bus; - -/** - * Collections of navigation events, like go back or go forward - * - * @author Stefano Pacifici - * @date 2015/09/15 - */ -public class NavigationEvents { - private NavigationEvents() { - // No instances please - } - - /** - * Fired by {@link acr.browser.lightning.fragment.TabsFragment} when the user presses back - * button. - */ - public static class GoBack { - } - - /** - * Fired by {@link acr.browser.lightning.fragment.TabsFragment} when the user presses forward - * button. - */ - public static class GoForward { - } - - /** - * Fired by {@link acr.browser.lightning.fragment.TabsFragment} when the user presses the home - * button. - */ - public static class GoHome { - } -} diff --git a/app/src/main/java/acr/browser/lightning/bus/TabEvents.java b/app/src/main/java/acr/browser/lightning/bus/TabEvents.java deleted file mode 100644 index a2bac5c9d..000000000 --- a/app/src/main/java/acr/browser/lightning/bus/TabEvents.java +++ /dev/null @@ -1,65 +0,0 @@ -package acr.browser.lightning.bus; - -/** - * A collection of events been sent by {@link acr.browser.lightning.fragment.TabsFragment} - * - * @author Stefano Pacifici - * @date 2015/09/14 - */ -public final class TabEvents { - - private TabEvents() { - // No instances - } - - - /** - * Sended by {@link acr.browser.lightning.fragment.TabsFragment} when the user click on the - * tab exit button - */ - public static class CloseTab { - public final int position; - - public CloseTab(int position) { - this.position = position; - } - } - - /** - * Sended by {@link acr.browser.lightning.fragment.TabsFragment} when the user click on the - * tab itself. - */ - public static class ShowTab { - public final int position; - - public ShowTab(int position) { - this.position = position; - } - } - - /** - * Sended by {@link acr.browser.lightning.fragment.TabsFragment} when the user long press on the - * tab itself. - */ - public static class ShowCloseDialog { - public final int position; - - public ShowCloseDialog(int position) { - this.position = position; - } - } - - /** - * Sended by {@link acr.browser.lightning.fragment.TabsFragment} when the user want to create a - * new tab. - */ - public static class NewTab { - } - - /** - * Sended by {@link acr.browser.lightning.fragment.TabsFragment} when the user long presses on - * new tab button. - */ - public static class NewTabLongPress { - } -} diff --git a/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java b/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java index 6e4a02ae1..c6d64ddf0 100644 --- a/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java +++ b/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java @@ -34,25 +34,25 @@ public final class BookmarkPage extends AsyncTask { public static final String FILENAME = "bookmarks.html"; private static final String HEADING_1 = "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - ""; + "<head>\n" + + "<meta content=en-us http-equiv=Content-Language />\n" + + "<meta content='text/html; charset=utf-8' http-equiv=Content-Type />\n" + + "<meta name=viewport content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'>\n" + + "<title>"; private static final String HEADING_2 = "\n" + - "\n" + - "\n" + - "
"; + "\n" + + "\n" + + "
"; private static final String PART1 = "
\n" + - "
\n" + - "
\n" + - "

\n" + - " { private static final String END = "

"; + private static final String FOLDER_ICON = "folder.png"; + private File mFilesDir; private File mCacheDir; @@ -101,7 +103,7 @@ protected void onPostExecute(Void aVoid) { private void cacheDefaultFolderIcon() { FileOutputStream outputStream = null; - File image = new File(mCacheDir, "folder.png"); + File image = new File(mCacheDir, FOLDER_ICON); try { outputStream = new FileOutputStream(image); mFolderIcon.compress(Bitmap.CompressFormat.PNG, 100, outputStream); @@ -123,7 +125,7 @@ private void buildBookmarkPage(@Nullable final String folder, @NonNull final Boo } final StringBuilder bookmarkBuilder = new StringBuilder(HEADING_1 + mTitle + HEADING_2); - final String folderIconPath = Constants.FILE + mCacheDir + "/folder.png"; + final String folderIconPath = Constants.FILE + mCacheDir + '/' + FOLDER_ICON; for (int n = 0, size = list.size(); n < size; n++) { final HistoryItem item = list.get(n); bookmarkBuilder.append(PART1); diff --git a/app/src/main/java/acr/browser/lightning/constant/Constants.java b/app/src/main/java/acr/browser/lightning/constant/Constants.java index 3861a28e8..a6b47bd0a 100644 --- a/app/src/main/java/acr/browser/lightning/constant/Constants.java +++ b/app/src/main/java/acr/browser/lightning/constant/Constants.java @@ -3,6 +3,11 @@ */ package acr.browser.lightning.constant; +import android.support.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + import acr.browser.lightning.BuildConfig; public final class Constants { @@ -12,8 +17,11 @@ private Constants() { public static final boolean FULL_VERSION = BuildConfig.FULL_VERSION; + // Hardcoded user agents public static final String DESKTOP_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36"; public static final String MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; U; Android 4.4; en-us; Nexus 4 Build/JOP24G) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"; + + // Search query URLs public static final String YAHOO_SEARCH = "https://search.yahoo.com/search?p="; public static final String GOOGLE_SEARCH = "https://www.google.com/search?client=lightning&ie=UTF-8&oe=UTF-8&q="; public static final String BING_SEARCH = "https://www.bing.com/search?q="; @@ -21,46 +29,61 @@ private Constants() { public static final String DUCK_LITE_SEARCH = "https://duckduckgo.com/lite/?t=lightning&q="; public static final String STARTPAGE_MOBILE_SEARCH = "https://startpage.com/do/m/mobilesearch?language=english&query="; public static final String STARTPAGE_SEARCH = "https://startpage.com/do/search?language=english&query="; - public static final String ASK_SEARCH = "http://www.ask.com/web?qsrc=0&o=0&l=dir&qo=lightningBrowser&q="; - public static final String HOMEPAGE = "about:home"; + public static final String ASK_SEARCH = "http://www.ask.com/web?qsrc=0&o=0&l=dir&qo=LightningBrowser&q="; public static final String BAIDU_SEARCH = "https://www.baidu.com/s?wd="; public static final String YANDEX_SEARCH = "https://yandex.ru/yandsearch?lr=21411&text="; + + // Custom local page schemes + public static final String SCHEME_HOMEPAGE = "about:home"; + public static final String SCHEME_BLANK = "about:blank"; + public static final String SCHEME_BOOKMARKS = "about:bookmarks"; + + // Miscellaneous JavaScript public static final String JAVASCRIPT_INVERT_PAGE = "javascript:(function(){var e='img {-webkit-filter: invert(100%);'+'-moz-filter: invert(100%);'+'-o-filter: invert(100%);'+'-ms-filter: invert(100%); }',t=document.getElementsByTagName('head')[0],n=document.createElement('style');if(!window.counter){window.counter=1}else{window.counter++;if(window.counter%2==0){var e='html {-webkit-filter: invert(0%); -moz-filter: invert(0%); -o-filter: invert(0%); -ms-filter: invert(0%); }'}}n.type='text/css';if(n.styleSheet){n.styleSheet.cssText=e}else{n.appendChild(document.createTextNode(e))}t.appendChild(n)})();"; public static final String JAVASCRIPT_TEXT_REFLOW = "javascript:document.getElementsByTagName('body')[0].style.width=window.innerWidth+'px';"; public static final String JAVASCRIPT_THEME_COLOR = "(function () {\n" + - " \"use strict\";\n" + - " var metas, i, tag;\n" + - " metas = document.getElementsByTagName('meta');\n" + - " if (metas !== null) {\n" + - " for (i = 0; i < metas.length; i++) {\n" + - " tag = metas[i].getAttribute('name');\n" + - " if (tag !== null && tag.toLowerCase() === 'theme-color') {\n" + - " return metas[i].getAttribute('content');\n" + - " }\n" + - " console.log(tag);\n" + - " }\n" + - " }\n" + - '\n' + - " return '';\n" + - "}());"; + " \"use strict\";\n" + + " var metas, i, tag;\n" + + " metas = document.getElementsByTagName('meta');\n" + + " if (metas !== null) {\n" + + " for (i = 0; i < metas.length; i++) {\n" + + " tag = metas[i].getAttribute('name');\n" + + " if (tag !== null && tag.toLowerCase() === 'theme-color') {\n" + + " return metas[i].getAttribute('content');\n" + + " }\n" + + " console.log(tag);\n" + + " }\n" + + " }\n" + + '\n' + + " return '';\n" + + "}());"; public static final String LOAD_READING_URL = "ReadingUrl"; - public static final String SEPARATOR = "\\|\\$\\|SEPARATOR\\|\\$\\|"; + // URL Schemes public static final String HTTP = "http://"; public static final String HTTPS = "https://"; public static final String FILE = "file://"; + public static final String ABOUT = "about:"; public static final String FOLDER = "folder://"; + + // Application log tag public static final String TAG = "Lightning"; // These should match the order of @array/proxy_choices_array + @IntDef({NO_PROXY, PROXY_ORBOT, PROXY_I2P, PROXY_MANUAL}) + @Retention(RetentionPolicy.SOURCE) + public @interface PROXY {} + public static final int NO_PROXY = 0; public static final int PROXY_ORBOT = 1; public static final int PROXY_I2P = 2; public static final int PROXY_MANUAL = 3; + // Default text encoding we will use public static final String DEFAULT_ENCODING = "UTF-8"; + // Allowable text encodings for the WebView public static final String[] TEXT_ENCODINGS = {"ISO-8859-1", "UTF-8", "GBK", "Big5", "ISO-2022-JP", "SHIFT_JS", "EUC-JP", "EUC-KR"}; public static final String INTENT_ORIGIN = "URL_INTENT_ORIGIN"; diff --git a/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java b/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java index e628e8ac6..44c3ca8f3 100644 --- a/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java +++ b/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java @@ -7,6 +7,7 @@ import android.os.AsyncTask; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import java.io.File; import java.io.FileWriter; @@ -24,11 +25,13 @@ public class HistoryPage extends AsyncTask { + private static final String TAG = HistoryPage.class.getSimpleName(); + public static final String FILENAME = "history.html"; private static final String HEADING_1 = ""; - private static final String HEADING_2 = "
"; + private static final String HEADING_2 = "
"; private static final String PART1 = "
{ private static final String HEAD_2 = "" + "" - + " + \ No newline at end of file diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 64ad0eb9a..bb3d86776 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -1,71 +1,30 @@ - - - - - - - - + + + - - + + + + - - + + + + + + + + + diff --git a/app/src/main/res/xml/preference_debug.xml b/app/src/main/res/xml/preference_debug.xml new file mode 100644 index 000000000..b6b49f6f5 --- /dev/null +++ b/app/src/main/res/xml/preference_debug.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/preference_display.xml b/app/src/main/res/xml/preference_display.xml index 0a7f0a2c0..8aad3a311 100644 --- a/app/src/main/res/xml/preference_display.xml +++ b/app/src/main/res/xml/preference_display.xml @@ -2,33 +2,41 @@ + + + android:title="@string/fullScreenOption"/> + android:title="@string/fullscreen"/> + android:summary="@string/recommended" + android:title="@string/wideViewPort"/> + android:summary="@string/recommended" + android:title="@string/overViewMode"/> + android:title="@string/reflow"/> + android:title="@string/theme"/> + android:title="@string/title_text_size"/> \ No newline at end of file diff --git a/app/src/main/res/xml/preference_general.xml b/app/src/main/res/xml/preference_general.xml index 45cfb68af..e7635a016 100644 --- a/app/src/main/res/xml/preference_general.xml +++ b/app/src/main/res/xml/preference_general.xml @@ -2,10 +2,6 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/xml/preferences_headers.xml b/app/src/main/res/xml/preferences_headers.xml index 607000195..ebbae4163 100644 --- a/app/src/main/res/xml/preferences_headers.xml +++ b/app/src/main/res/xml/preferences_headers.xml @@ -30,4 +30,7 @@ android:value="SELF"/>
+
\ No newline at end of file diff --git a/build.gradle b/build.gradle index dcb49fc70..9f7466eaf 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7' classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.2.1' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c71e760d..9d020539c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 10 15:27:10 PDT 2013 +#Mon Aug 15 21:33:52 EDT 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/settings.gradle b/settings.gradle index 09a8a5da4..463d0c1bd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,8 @@ include ':app' include ':libnetcipher' +include ':bonsai' +include ':animated-progress-bar' project(':libnetcipher').projectDir = new File(rootProject.projectDir, 'external/netcipher/libnetcipher') +project(':bonsai').projectDir = new File(rootProject.projectDir, 'Bonsai/library') +project(':animated-progress-bar').projectDir = new File(rootProject.projectDir, 'AnimatedProgressBar/library') \ No newline at end of file