aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/utils/AdBlocker.kt
blob: 77c71aa9408f6e92b69608fed029811b5d26ff53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Copyright 2018 Allan Wang
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.pitchedapps.frost.utils

import android.content.Context
import android.text.TextUtils
import ca.allanwang.kau.utils.use
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull

/**
 * Created by Allan Wang on 2017-09-24.
 */
object FrostAdBlock : AdBlocker("adblock.txt")

object FrostPglAdBlock : AdBlocker("pgl.yoyo.org.txt")

/**
 * Base implementation of an AdBlocker
 * Wrap this in a singleton and initialize it to use it
 */
open class AdBlocker(val assetPath: String) {

    val data: MutableSet<String> = mutableSetOf()

    fun init(context: Context) {
        GlobalScope.launch {
            val content = context.assets.open(assetPath).bufferedReader().use { f ->
                f.readLines().filter { !it.startsWith("#") }
            }
            data.addAll(content)
            L.i { "Initialized adblock for $assetPath with ${data.size} hosts" }
        }
    }

    fun isAd(url: String?): Boolean {
        url ?: return false
        val httpUrl = url.toHttpUrlOrNull() ?: return false
        return isAdHost(httpUrl.host)
    }

    tailrec fun isAdHost(host: String): Boolean {
        if (TextUtils.isEmpty(host))
            return false
        val index = host.indexOf(".")
        if (index < 0 || index + 1 < host.length) return false
        if (data.contains(host)) return true
        return isAdHost(host.substring(index + 1))
    }
}