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() { 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) } }