Updated on 2026-08-14

This commit is contained in:
Tangem 2020-04-23 13:20:46 +03:00
parent 5105528ddc
commit 0131e08b68
201 changed files with 600 additions and 693 deletions

View file

@ -0,0 +1,75 @@
package com.tangem.devkit._main
import android.content.res.Resources
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupWithNavController
import com.tangem.devkit.R
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
class MainActivity : AppCompatActivity() {
private val mainVM: MainViewModel by viewModels<MainViewModel>()
private lateinit var appBarConfiguration: AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.a_main)
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
val host: NavHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return
val navController = host.navController
appBarConfiguration = AppBarConfiguration(navController.graph)
toolbar.setupWithNavController(navController, appBarConfiguration)
navController.addOnDestinationChangedListener { _, destination, _ ->
val dest: String = try {
resources.getResourceName(destination.id)
} catch (e: Resources.NotFoundException) {
destination.id.toString()
}
Log.d(this, "Navigated to $dest")
}
}
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_activity_main, menu)
return true
}
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
val switchItem = menu.findItem(R.id.action_toggle_description_visibility)
switchItem.isChecked = mainVM.descriptionSwitchState
return super.onPrepareOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val result = when (item.itemId) {
R.id.action_toggle_description_visibility -> {
item.isChecked = !item.isChecked
mainVM.switchToggled(item.isChecked)
}
else -> null
}
return if (result == null) super.onOptionsItemSelected(item) else true
}
}

View file

@ -0,0 +1,28 @@
package com.tangem.devkit._main
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.tangem.commands.CommandResponse
import ru.dev.gbixahue.eu4d.lib.android.global.log.Log
/**
[REDACTED_AUTHOR]
*/
class MainViewModel : ViewModel() {
val ldDescriptionSwitch = MutableLiveData<Boolean>(false)
var descriptionSwitchState = false
var commandResponse: CommandResponse? = null
fun switchToggled(state: Boolean) {
descriptionSwitchState = state
ldDescriptionSwitch.postValue(state)
}
fun changeResponseEvent(commandResponse: CommandResponse?) {
Log.d(this, "changeResponseEvent")
val response = commandResponse ?: return
this.commandResponse = response
}
}

View file

@ -0,0 +1,77 @@
package com.tangem.devkit._main.entryPoint
import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.tangem.devkit.R
import com.tangem.devkit._main.MainViewModel
import com.tangem.devkit.extensions.view.beginDelayedTransition
import com.tangem.devkit.ucase.getDefaultNavigationOptions
import com.tangem.devkit.ucase.resources.ActionType
import com.tangem.devkit.ucase.resources.MainResourceHolder
import com.tangem.devkit.ucase.ui.BaseFragment
import kotlinx.android.synthetic.main.fg_entry_point.*
/**
[REDACTED_AUTHOR]
*/
class ActionListFragment : BaseFragment() {
private lateinit var rvActions: RecyclerView
private val mainActivityVM: MainViewModel by activityViewModels()
override fun getLayoutId(): Int = R.layout.fg_entry_point
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initRecyclerView()
}
private fun initRecyclerView() {
val layoutManager = LinearLayoutManager(activity)
rvActions = rv_actions
rvActions.layoutManager = layoutManager
rvActions.addItemDecoration(DividerItemDecoration(activity, layoutManager.orientation))
val vhDataWrapper = VhExDataWrapper(MainResourceHolder, false)
rvActions.adapter = RvActionsAdapter(vhDataWrapper) { type, position, data ->
navigateTo(data, options = getDefaultNavigationOptions())
}
mainActivityVM.ldDescriptionSwitch.observe(viewLifecycleOwner, Observer {
vhDataWrapper.descriptionIsVisible = it
rvActions.beginDelayedTransition()
rvActions.adapter?.notifyDataSetChanged()
})
}
override fun onResume() {
super.onResume()
val adapter: RvActionsAdapter = rvActions.adapter as? RvActionsAdapter ?: return
adapter.setItemList(getNavigateOptions())
adapter.notifyDataSetChanged()
}
private fun getNavigateOptions(): MutableList<ActionType> {
return mutableListOf(
ActionType.Scan,
ActionType.Sign,
ActionType.Personalize,
ActionType.Depersonalize
// ActionType.CreateWallet,
// ActionType.PurgeWallet,
// ActionType.ReadIssuerData,
// ActionType.WriteIssuerData,
// ActionType.ReadIssuerExData,
// ActionType.WriteIssuerExData,
// ActionType.ReadUserData,
// ActionType.WriteUserData
)
}
}

View file

@ -0,0 +1,67 @@
package com.tangem.devkit._main.entryPoint
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.recyclerview.widget.RecyclerView
import com.tangem.devkit.R
import com.tangem.devkit.ucase.resources.ActionRes
import com.tangem.devkit.ucase.resources.ActionType
import com.tangem.devkit.ucase.resources.MainResourceHolder
import ru.dev.gbixahue.eu4d.lib.android._android.views.inflate
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseAdapter
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvBaseVH
import ru.dev.gbixahue.eu4d.lib.android._android.views.recycler_view.RvCallback
/**
[REDACTED_AUTHOR]
*/
class RvActionsAdapter(
private val wrapper: VhExDataWrapper,
private val callback: RvCallback<Int>
) : RvBaseAdapter<RvActionsVH, ActionType>() {
override fun onBindViewHolder(holder: RvActionsVH, position: Int) {
holder.bindData(itemList[position])
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RvActionsVH {
val view = parent.inflate<View>(R.layout.vh_actions, false)
return RvActionsVH(view, wrapper, callback)
}
}
class VhExDataWrapper(
val resHolder: MainResourceHolder,
var descriptionIsVisible: Boolean
)
class RvActionsVH(
itemView: View,
private val wrapper: VhExDataWrapper,
private val callback: RvCallback<Int>?
) : RvBaseVH<ActionType>(itemView) {
private val tvAction = itemView.findViewById<TextView>(R.id.tv_title)
private val containerDescription = itemView.findViewById<ViewGroup>(R.id.container_description)
private val tvDescription = itemView.findViewById<TextView>(R.id.tv_description)
override fun bindData(data: ActionType) {
val res: ActionRes = wrapper.resHolder.safeGet(data)
tvAction.text = getString(res.resName)
tvDescription.text = getString(res.resDescription)
itemView.setOnClickListener {
res.resNavigation?.let { callback?.invoke(itemViewType, adapterPosition, it) }
}
containerDescription.visibility = if (wrapper.descriptionIsVisible) View.VISIBLE else View.GONE
}
}
fun RecyclerView.ViewHolder.getString(@StringRes id: Int?, ifNull: String = ""): String {
val reqId = id ?: return ifNull
return itemView.context.getString(reqId)
}