aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/activities
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2017-12-11 17:52:24 -0500
committerGitHub <noreply@github.com>2017-12-11 17:52:24 -0500
commitdb262e95779e0a17275bdb94be2b0ac12819178e (patch)
tree42b89edf8796e85e362ca86dead1170cb38f6434 /app/src/main/kotlin/com/pitchedapps/frost/activities
parent1d4380cee77fc049a54d280a27dcefa3fa6ff1fd (diff)
downloadfrost-db262e95779e0a17275bdb94be2b0ac12819178e.tar.gz
frost-db262e95779e0a17275bdb94be2b0ac12819178e.tar.bz2
frost-db262e95779e0a17275bdb94be2b0ac12819178e.zip
Feature/tab customization (#522)
* Add initial tab customizing view * Add rest of content for now * Delete project file backups * Stash * Support full tab customization * Test activity animations * Update kau and fix sound uri * Try catch download, resolves #523
Diffstat (limited to 'app/src/main/kotlin/com/pitchedapps/frost/activities')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/BaseActivity.kt2
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt3
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt34
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/activities/TabCustomizerActivity.kt131
4 files changed, 161 insertions, 9 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseActivity.kt
index 97afd480..6ab65399 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseActivity.kt
@@ -2,6 +2,7 @@ package com.pitchedapps.frost.activities
import android.content.res.Configuration
import android.os.Bundle
+import android.transition.Fade
import ca.allanwang.kau.internal.KauBaseActivity
import ca.allanwang.kau.searchview.SearchViewHolder
import com.pitchedapps.frost.contracts.VideoViewHolder
@@ -28,6 +29,7 @@ abstract class BaseActivity : KauBaseActivity() {
super.onCreate(savedInstanceState)
if (this !is WebOverlayActivityBase) setFrostTheme()
}
+
//
// private var networkDisposable: Disposable? = null
// private var networkConsumer: ((Connectivity) -> Unit)? = null
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt
index 57cda44a..1ba7f4c3 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/MainActivity.kt
@@ -49,6 +49,7 @@ import com.pitchedapps.frost.contracts.ActivityWebContract
import com.pitchedapps.frost.contracts.FileChooserContract
import com.pitchedapps.frost.contracts.FileChooserDelegate
import com.pitchedapps.frost.contracts.VideoViewHolder
+import com.pitchedapps.frost.dbflow.TAB_COUNT
import com.pitchedapps.frost.dbflow.loadFbCookie
import com.pitchedapps.frost.dbflow.loadFbTabs
import com.pitchedapps.frost.enums.MainActivityLayout
@@ -134,7 +135,7 @@ class MainActivity : BaseActivity(),
setSupportActionBar(toolbar)
adapter = SectionsPagerAdapter(supportFragmentManager, loadFbTabs())
viewPager.adapter = adapter
- viewPager.offscreenPageLimit = 5
+ viewPager.offscreenPageLimit = TAB_COUNT
viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt
index 293be694..f17ccf20 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/SettingsActivity.kt
@@ -37,10 +37,16 @@ class SettingsActivity : KPrefActivity(), FrostBilling by IabSettings() {
private const val REQUEST_RINGTONE = 0b10111 shl 5
const val REQUEST_NOTIFICATION_RINGTONE = REQUEST_RINGTONE or 1
const val REQUEST_MESSAGE_RINGTONE = REQUEST_RINGTONE or 2
+ const val ACTIVITY_REQUEST_TABS = 29
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (fetchRingtone(requestCode, resultCode, data)) return
+ if (requestCode == ACTIVITY_REQUEST_TABS) {
+ if (resultCode == Activity.RESULT_OK)
+ shouldRestartMain()
+ return
+ }
if (!onActivityResultBilling(requestCode, resultCode, data))
super.onActivityResult(requestCode, resultCode, data)
reloadList()
@@ -52,14 +58,22 @@ class SettingsActivity : KPrefActivity(), FrostBilling by IabSettings() {
*/
private fun fetchRingtone(requestCode: Int, resultCode: Int, data: Intent?): Boolean {
if (requestCode and REQUEST_RINGTONE != REQUEST_RINGTONE || resultCode != Activity.RESULT_OK) return false
- val uri: String = data?.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)?.toString() ?: ""
+ val uri = data?.getParcelableExtra<Uri>(RingtoneManager.EXTRA_RINGTONE_PICKED_URI)
+ val uriString: String = uri?.toString() ?: ""
+ if (uri != null) {
+ try {
+ grantUriPermission("com.android.systemui", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ } catch (e: Exception) {
+ L.e(e, "grantUriPermission")
+ }
+ }
when (requestCode) {
REQUEST_NOTIFICATION_RINGTONE -> {
- Prefs.notificationRingtone = uri
+ Prefs.notificationRingtone = uriString
reloadByTitle(R.string.notification_ringtone)
}
REQUEST_MESSAGE_RINGTONE -> {
- Prefs.messageRingtone = uri
+ Prefs.messageRingtone = uriString
reloadByTitle(R.string.message_ringtone)
}
}
@@ -106,24 +120,28 @@ class SettingsActivity : KPrefActivity(), FrostBilling by IabSettings() {
descRes = R.string.get_pro_desc
iicon = GoogleMaterial.Icon.gmd_star
visible = { !IS_FROST_PRO }
- onClick = { _, _, _ -> restorePurchases(); true }
+ onClick = { restorePurchases() }
}
plainText(R.string.about_frost) {
descRes = R.string.about_frost_desc
iicon = GoogleMaterial.Icon.gmd_info
- onClick = { _, _, _ -> startActivityForResult(AboutActivity::class.java, 9, true); true }
+ onClick = {
+ startActivityForResult(AboutActivity::class.java, 9, bundleBuilder = {
+ withSceneTransitionAnimation(this@SettingsActivity)
+ })
+ }
}
plainText(R.string.help_translate) {
descRes = R.string.help_translate_desc
iicon = GoogleMaterial.Icon.gmd_translate
- onClick = { _, _, _ -> startLink(R.string.translation_url); true }
+ onClick = { startLink(R.string.translation_url) }
}
plainText(R.string.replay_intro) {
iicon = GoogleMaterial.Icon.gmd_replay
- onClick = { _, _, _ -> launchIntroActivity(cookies()); true }
+ onClick = { launchIntroActivity(cookies()) }
}
subItems(R.string.debug_frost, getDebugPrefs()) {
@@ -138,7 +156,7 @@ class SettingsActivity : KPrefActivity(), FrostBilling by IabSettings() {
}
fun KPrefItemBase.BaseContract<*>.dependsOnPro() {
- onDisabledClick = { _, _, _ -> purchasePro(); true }
+ onDisabledClick = { purchasePro() }
enabler = { IS_FROST_PRO }
}
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/TabCustomizerActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/TabCustomizerActivity.kt
new file mode 100644
index 00000000..bac352af
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/TabCustomizerActivity.kt
@@ -0,0 +1,131 @@
+package com.pitchedapps.frost.activities
+
+import android.app.Activity
+import android.content.res.ColorStateList
+import android.os.Bundle
+import android.support.design.widget.FloatingActionButton
+import android.support.v7.widget.GridLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.support.v7.widget.helper.ItemTouchHelper
+import android.view.View
+import android.view.animation.AnimationUtils
+import android.widget.TextView
+import ca.allanwang.kau.kotlin.lazyContext
+import ca.allanwang.kau.utils.bindView
+import ca.allanwang.kau.utils.scaleXY
+import ca.allanwang.kau.utils.setIcon
+import ca.allanwang.kau.utils.withAlpha
+import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter
+import com.mikepenz.fastadapter_extensions.drag.ItemTouchCallback
+import com.mikepenz.fastadapter_extensions.drag.SimpleDragCallback
+import com.mikepenz.google_material_typeface_library.GoogleMaterial
+import com.pitchedapps.frost.R
+import com.pitchedapps.frost.dbflow.TAB_COUNT
+import com.pitchedapps.frost.dbflow.loadFbTabs
+import com.pitchedapps.frost.dbflow.save
+import com.pitchedapps.frost.facebook.FbItem
+import com.pitchedapps.frost.iitems.TabIItem
+import com.pitchedapps.frost.utils.Prefs
+import com.pitchedapps.frost.utils.setFrostColors
+import java.util.*
+
+/**
+ * Created by Allan Wang on 26/11/17.
+ */
+class TabCustomizerActivity : BaseActivity() {
+
+ val toolbar: View by bindView(R.id.pseudo_toolbar)
+ val recycler: RecyclerView by bindView(R.id.tab_recycler)
+ val instructions: TextView by bindView(R.id.instructions)
+ val divider: View by bindView(R.id.divider)
+ val adapter = FastItemAdapter<TabIItem>()
+ val fabCancel: FloatingActionButton by bindView(R.id.fab_cancel)
+ val fabSave: FloatingActionButton by bindView(R.id.fab_save)
+
+ private val wobble = lazyContext { AnimationUtils.loadAnimation(it, R.anim.rotate_delta) }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_tab_customizer)
+
+ toolbar.setBackgroundColor(Prefs.headerColor)
+
+ recycler.layoutManager = GridLayoutManager(this, TAB_COUNT, GridLayoutManager.VERTICAL, false)
+ recycler.adapter = adapter
+ recycler.setHasFixedSize(true)
+
+ divider.setBackgroundColor(Prefs.textColor.withAlpha(30))
+ instructions.setTextColor(Prefs.textColor)
+
+ val tabs = loadFbTabs().toMutableList()
+ val remaining = FbItem.values().toMutableList()
+ remaining.removeAll(tabs)
+ tabs.addAll(remaining)
+
+ adapter.add(tabs.map(::TabIItem))
+ bindSwapper(adapter, recycler)
+
+ adapter.withOnClickListener { view, _, _, _ -> view.wobble(); true }
+
+ setResult(Activity.RESULT_CANCELED)
+
+ fabSave.setIcon(GoogleMaterial.Icon.gmd_check, Prefs.iconColor)
+ fabSave.backgroundTintList = ColorStateList.valueOf(Prefs.accentColor)
+ fabSave.setOnClickListener {
+ adapter.adapterItems.subList(0, TAB_COUNT).map(TabIItem::item).save()
+ setResult(Activity.RESULT_OK)
+ finish()
+ }
+ fabCancel.setIcon(GoogleMaterial.Icon.gmd_close, Prefs.iconColor)
+ fabCancel.backgroundTintList = ColorStateList.valueOf(Prefs.accentColor)
+ fabCancel.setOnClickListener { finish() }
+ setFrostColors(themeWindow = true)
+ }
+
+ private fun View.wobble() = startAnimation(wobble(context))
+
+ private fun bindSwapper(adapter: FastItemAdapter<*>, recycler: RecyclerView) {
+ val dragCallback = TabDragCallback(SimpleDragCallback.ALL, swapper(adapter))
+ ItemTouchHelper(dragCallback).attachToRecyclerView(recycler)
+ }
+
+ private fun swapper(adapter: FastItemAdapter<*>) = object : ItemTouchCallback {
+ override fun itemTouchOnMove(oldPosition: Int, newPosition: Int): Boolean {
+ Collections.swap(adapter.adapterItems, oldPosition, newPosition)
+ adapter.notifyAdapterDataSetChanged()
+ return true
+ }
+
+ override fun itemTouchDropped(oldPosition: Int, newPosition: Int) = Unit
+ }
+
+
+ private class TabDragCallback(
+ directions: Int, itemTouchCallback: ItemTouchCallback
+ ) : SimpleDragCallback(directions, itemTouchCallback) {
+
+ private var draggingView: TabIItem.ViewHolder? = null
+
+ override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
+ super.onSelectedChanged(viewHolder, actionState)
+ when (actionState) {
+ ItemTouchHelper.ACTION_STATE_DRAG -> {
+ (viewHolder as? TabIItem.ViewHolder)?.apply {
+ draggingView = this
+ itemView.animate().scaleXY(1.3f)
+ text.animate().alpha(0f)
+ }
+ }
+ ItemTouchHelper.ACTION_STATE_IDLE -> {
+ draggingView?.apply {
+ itemView.animate().scaleXY(1f)
+ text.animate().alpha(1f)
+ }
+ draggingView = null
+ }
+ }
+ }
+
+ }
+
+}