aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/activity/ManagePagesActivity.kt
blob: ee67d8a46230c6a405a67df2492076168351bc50 (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package net.lacolaco.smileessence.activity

import android.app.ActivityManager
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.ItemTouchHelper
import android.view.View
import android.view.ViewGroup

import kotlinx.android.synthetic.main.activity_manage_pages.*
import kotlinx.android.synthetic.main.list_item_page.view.*
import net.lacolaco.smileessence.R
import net.lacolaco.smileessence.World
import net.lacolaco.smileessence.data.PageInfo
import net.lacolaco.smileessence.view.dialog.EditTweetsPageDialogFragment

class ManagePagesActivity : AppCompatActivity() {
    private val world by lazy {
        World[intent.getLongExtra(INTENT_KEY_WORLD_ID, -1)]
    }
    private var mainActivityNeedsRestart = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setTheme(if (world.useDarkTheme) R.style.AppTheme_Dark else R.style.AppTheme_Light)
        setContentView(R.layout.activity_manage_pages)
        setSupportActionBar(toolbar)

        val label = getString(R.string.app_name) + " - @" + world.user.screenName
        setTaskDescription(ActivityManager.TaskDescription(label, null, world.themeColor))
        window.statusBarColor = world.themeColor
        toolbar.setBackgroundColor(world.themeColor)

        if (savedInstanceState != null)
            mainActivityNeedsRestart = savedInstanceState.getBoolean(KEY_IS_CHANGED)

        val helper = ItemTouchHelper(object : ItemTouchHelper.Callback() {
            override fun getMovementFlags(recyclerView: RecyclerView,
                                          viewHolder: RecyclerView.ViewHolder): Int {
                return makeMovementFlags(ItemTouchHelper.DOWN or ItemTouchHelper.UP,
                        ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT)
            }

            override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder,
                                target: RecyclerView.ViewHolder): Boolean {
                return (recycler_view.adapter as PagesAdapter)
                        .move(viewHolder.adapterPosition, target.adapterPosition)
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                (recycler_view.adapter as PagesAdapter).remove(viewHolder.adapterPosition)
            }
        })
        helper.attachToRecyclerView(recycler_view)
        recycler_view.addItemDecoration(helper)
        recycler_view.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
        recycler_view.adapter = PagesAdapter()

        fab.setOnClickListener { addNewItem() }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putBoolean(KEY_IS_CHANGED, mainActivityNeedsRestart)
    }

    override fun finish() {
        // MainActivity will restart itself on RESULT_OK
        setResult(if (mainActivityNeedsRestart) RESULT_OK else RESULT_CANCELED)
        super.finish()
    }

    private fun addNewItem() {
        val types = listOf(
                "Compose" to { PageInfo.ComposePageInfo() },
                "Tweets" to { PageInfo.TweetsPageInfo("Tweets", listOf()) },
                "Events" to { PageInfo.EventsPageInfo() },
                "Search" to { PageInfo.SearchPageInfo("") },
                "List" to { PageInfo.ListPageInfo(null) }
        )
        AlertDialog.Builder(this)
                .setTitle("Add a new page")
                .setItems(types.map { it.first }.toTypedArray()) { di, i ->
                    di.dismiss()
                    mainActivityNeedsRestart = true
                    val item = types[i].second()
                    world.pages.add(item)
                    recycler_view.adapter!!.notifyItemInserted(world.pages.size - 1)
                    openItemEditor(item)
                }.show()
    }

    private fun openItemEditor(item: PageInfo) {
        if (item is PageInfo.TweetsPageInfo) {
            EditTweetsPageDialogFragment.newInstance(world, item)
        } else
            Snackbar.make(fab, "Nothing to configure", Snackbar.LENGTH_SHORT).show()
    }

    companion object {
        const val INTENT_KEY_WORLD_ID = "WORLD_ID"
        private const val KEY_IS_CHANGED = "IS_CHANGED"
    }

    private inner class PagesAdapter : RecyclerView.Adapter<PagesAdapter.ViewHolder>() {
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val item = world.pages[position]
            val view = holder.itemView

            view.page_kind_text_view.text = item.name
            view.page_name_text_view.text = item.describe()
            view.setOnClickListener { openItemEditor(item) }
        }

        override fun getItemCount(): Int {
            return world.pages.size
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            return ViewHolder(layoutInflater.inflate(R.layout.list_item_page, parent, false))
        }

        fun move(before: Int, after: Int): Boolean {
            mainActivityNeedsRestart = true
            val item = world.pages.removeAt(before)
            world.pages.add(after, item)
            notifyItemMoved(before, after)
            return true
        }

        fun remove(position: Int) {
            mainActivityNeedsRestart = true
            world.pages.removeAt(position)
            notifyItemRemoved(position)
            notifyItemRangeChanged(position, world.pages.size)
        }

        private inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
    }
}