aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/utils/Changelog.kt
blob: 14a095a171669a466ef368bca802af63da2cd529 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.pitchedapps.frost.utils

import android.content.Context
import android.content.res.XmlResourceParser
import android.os.Handler
import android.support.annotation.LayoutRes
import android.support.annotation.NonNull
import android.support.annotation.XmlRes
import android.support.v4.app.FragmentActivity
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.afollestad.materialdialogs.MaterialDialog
import com.pitchedapps.frost.R
import org.xmlpull.v1.XmlPullParser
import java.util.*


/**
 * Created by Allan Wang on 2017-05-28.
 */
class Changelog {
    companion object {
        fun show(@NonNull activity: FragmentActivity, @XmlRes xmlRes: Int = R.xml.changelog) {
            val mHandler = Handler()
            Thread(Runnable {
                val items = parse(activity, xmlRes)
                mHandler.post(object : TimerTask() {
                    override fun run() {
                        MaterialDialog.Builder(activity)
                                .title(R.string.changelog)
                                .positiveText(R.string.great)
                                .adapter(ChangelogAdapter(items), null)
                                .show()
                    }
                })
            }).start()
        }
    }
}

private class ChangelogAdapter(val items: List<Pair<String, ChangelogType>>) : RecyclerView.Adapter<ChangelogAdapter.ChangelogVH>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ChangelogVH(LayoutInflater.from(parent.context)
            .inflate(getLayout(viewType), parent, false))

    private fun getLayout(position: Int) = items[position].second.layout

    override fun onBindViewHolder(holder: ChangelogVH, position: Int) {
        holder.text.text = items[position].first
    }

    override fun getItemId(position: Int) = position.toLong()

    override fun getItemViewType(position: Int) = position

    override fun getItemCount() = items.size

    internal class ChangelogVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val text: TextView = itemView.findViewById(R.id.changelog_text) as TextView
    }
}

private fun parse(context: Context, @XmlRes xmlRes: Int): List<Pair<String, ChangelogType>> {
    val items = mutableListOf<Pair<String, ChangelogType>>()
    context.resources.getXml(xmlRes).use {
        parser ->
        var eventType = parser.eventType
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG)
                ChangelogType.values.any { it.add(parser, items) }
            eventType = parser.next()
        }
    }
    return items
}

private enum class ChangelogType(val tag: String, val attr: String, @LayoutRes val layout: Int) {
    TITLE("title", "version", R.layout.changelog_title),
    ITEM("item", "text", R.layout.changelog_content);

    companion object {
        val values = values()
    }

    /**
     * Returns true if tag matches; false otherwise
     */
    fun add(parser: XmlResourceParser, list: MutableList<Pair<String, ChangelogType>>): Boolean {
        if (parser.name != tag) return false
        if (parser.getAttributeValue(null, attr).isNotBlank())
            list.add(Pair(parser.getAttributeValue(null, attr), this))
        return true
    }
}