BayernMessenger/vector/src/main/java/im/vector/riotredesign/features/reactions/EmojiReactionPickerActivity.kt

182 lines
6.2 KiB
Kotlin
Raw Normal View History

2019-04-29 08:50:40 +00:00
/*
* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.riotredesign.features.reactions
2019-04-29 08:50:40 +00:00
2019-05-07 12:02:15 +00:00
import android.content.Context
import android.content.Intent
import android.graphics.Typeface
import android.os.Handler
import android.os.HandlerThread
import android.util.TypedValue
2019-04-29 08:50:40 +00:00
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.widget.SearchView
2019-05-07 12:02:15 +00:00
import androidx.appcompat.widget.Toolbar
import androidx.core.provider.FontRequest
import androidx.core.provider.FontsContractCompat
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
2019-04-29 08:50:40 +00:00
import com.google.android.material.tabs.TabLayout
import im.vector.riotredesign.R
import im.vector.riotredesign.core.platform.VectorBaseActivity
2019-05-07 12:02:15 +00:00
import timber.log.Timber
2019-04-29 08:50:40 +00:00
2019-05-07 12:02:15 +00:00
/**
*
* TODO: Loading indicator while getting emoji data source?
* TODO: migrate to maverick
* TODO: Finish Refactor to vector base activity
* TODO: Move font request to app
2019-05-07 12:02:15 +00:00
*/
class EmojiReactionPickerActivity : VectorBaseActivity() {
2019-04-29 08:50:40 +00:00
2019-05-07 12:02:15 +00:00
private lateinit var tabLayout: TabLayout
lateinit var viewModel: EmojiChooserViewModel
private var mHandler: Handler? = null
override fun getMenuRes(): Int = R.menu.menu_emoji_reaction_picker
override fun getLayoutRes(): Int = R.layout.activity_emoji_reaction_picker
override fun getTitleRes(): Int = R.string.title_activity_emoji_reaction_picker
2019-05-07 12:02:15 +00:00
private var tabLayoutSelectionListener = object : TabLayout.BaseOnTabSelectedListener<TabLayout.Tab> {
override fun onTabReselected(p0: TabLayout.Tab) {
}
override fun onTabUnselected(p0: TabLayout.Tab) {
}
override fun onTabSelected(p0: TabLayout.Tab) {
viewModel.scrollToSection(p0.position)
}
}
private fun getFontThreadHandler(): Handler {
if (mHandler == null) {
val handlerThread = HandlerThread("fonts")
handlerThread.start()
mHandler = Handler(handlerThread.looper)
}
return mHandler!!
}
2019-04-29 08:50:40 +00:00
override fun initUiAndData() {
2019-05-07 12:02:15 +00:00
configureToolbar()
2019-05-07 12:02:15 +00:00
requestEmojivUnicode10CompatibleFont()
2019-04-29 08:50:40 +00:00
tabLayout = findViewById(R.id.tabs)
2019-05-07 12:02:15 +00:00
viewModel = ViewModelProviders.of(this).get(EmojiChooserViewModel::class.java)
2019-04-29 08:50:40 +00:00
2019-05-07 12:02:15 +00:00
viewModel.emojiSourceLiveData.observe(this, Observer {
it.rawData?.categories?.let { categories ->
for (category in categories) {
val s = category.emojis[0]
tabLayout.addTab(tabLayout.newTab().setText(it.rawData!!.emojis[s]!!.emojiString()))
}
tabLayout.addOnTabSelectedListener(tabLayoutSelectionListener)
}
})
viewModel.currentSection.observe(this, Observer { section ->
section?.let {
tabLayout.removeOnTabSelectedListener(tabLayoutSelectionListener)
tabLayout.getTabAt(it)?.select()
tabLayout.addOnTabSelectedListener(tabLayoutSelectionListener)
}
})
2019-04-29 08:50:40 +00:00
}
2019-05-07 12:02:15 +00:00
private fun requestEmojivUnicode10CompatibleFont() {
val fontRequest = FontRequest(
"com.google.android.gms.fonts",
"com.google.android.gms",
"Noto Color Emoji Compat",
R.array.com_google_android_gms_fonts_certs
)
EmojiDrawView.configureTextPaint(this, null)
val callback = object : FontsContractCompat.FontRequestCallback() {
override fun onTypefaceRetrieved(typeface: Typeface) {
EmojiDrawView.configureTextPaint(this@EmojiReactionPickerActivity, typeface)
}
override fun onTypefaceRequestFailed(reason: Int) {
Timber.e("Failed to load Emoji Compatible font, reason:$reason")
}
}
FontsContractCompat.requestFont(this, fontRequest, callback, getFontThreadHandler())
}
2019-04-29 08:50:40 +00:00
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater: MenuInflater = menuInflater
inflater.inflate(getMenuRes(), menu)
2019-04-29 08:50:40 +00:00
val searchItem = menu.findItem(R.id.search)
(searchItem.actionView as? SearchView)?.let {
searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionExpand(p0: MenuItem?): Boolean {
it.isIconified = false
it.requestFocusFromTouch()
2019-05-07 12:02:15 +00:00
//we want to force the tool bar as visible even if hidden with scroll flags
findViewById<Toolbar>(R.id.toolbar)?.minimumHeight = getActionBarSize()
2019-04-29 08:50:40 +00:00
return true
}
override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean {
// when back, clear all search
2019-05-07 12:02:15 +00:00
findViewById<Toolbar>(R.id.toolbar)?.minimumHeight = 0
2019-04-29 08:50:40 +00:00
it.setQuery("", true)
return true
}
})
}
return true
}
2019-05-07 12:02:15 +00:00
//TODO move to ThemeUtils when core module is created
private fun getActionBarSize(): Int {
return try {
val typedValue = TypedValue()
theme.resolveAttribute(R.attr.actionBarSize, typedValue, true)
TypedValue.complexToDimensionPixelSize(typedValue.data, resources.displayMetrics)
} catch (e: Exception) {
//Timber.e(e, "Unable to get color")
TypedValue.complexToDimensionPixelSize(56, resources.displayMetrics)
}
}
2019-04-29 08:50:40 +00:00
2019-05-07 12:02:15 +00:00
companion object {
fun intent(context: Context): Intent {
val intent = Intent(context, EmojiReactionPickerActivity::class.java)
// intent.putExtra(EXTRA_MATRIX_ID, matrixID)
return intent
}
}
2019-04-29 08:50:40 +00:00
}