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 android.support.design.widget.Snackbar
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.DividerItemDecoration
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.helper.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)
}
}
|