- simplified access to MainActivity - fixed bug where the 'unread' tag wasn't updated - aboutlibraries version bump
211 lines
8.2 KiB
Kotlin
211 lines
8.2 KiB
Kotlin
/*
|
|
* Copyright 2015 Christian Basler
|
|
*
|
|
* 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 ch.dissem.apps.abit
|
|
|
|
import android.app.AlertDialog
|
|
import android.content.Intent
|
|
import android.os.Bundle
|
|
import android.support.v4.app.Fragment
|
|
import android.text.Editable
|
|
import android.text.TextWatcher
|
|
import android.view.*
|
|
import android.widget.Toast
|
|
import ch.dissem.apps.abit.service.Singleton
|
|
import ch.dissem.apps.abit.util.Drawables
|
|
import ch.dissem.bitmessage.entity.BitmessageAddress
|
|
import ch.dissem.bitmessage.wif.WifExporter
|
|
import com.mikepenz.community_material_typeface_library.CommunityMaterial
|
|
import com.mikepenz.google_material_typeface_library.GoogleMaterial
|
|
import kotlinx.android.synthetic.main.fragment_address_detail.*
|
|
|
|
|
|
/**
|
|
* A fragment representing a single Message detail screen.
|
|
* This fragment is either contained in a [MainActivity]
|
|
* in two-pane mode (on tablets) or a [MessageDetailActivity]
|
|
* on handsets.
|
|
*/
|
|
class AddressDetailFragment : Fragment() {
|
|
|
|
/**
|
|
* The content this fragment is presenting.
|
|
*/
|
|
private var item: BitmessageAddress? = null
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
|
|
arguments?.let { arguments ->
|
|
if (arguments.containsKey(ARG_ITEM)) {
|
|
item = arguments.getSerializable(ARG_ITEM) as BitmessageAddress
|
|
}
|
|
}
|
|
setHasOptionsMenu(true)
|
|
}
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
|
inflater.inflate(R.menu.address, menu)
|
|
|
|
val ctx = activity!!
|
|
Drawables.addIcon(ctx, menu, R.id.write_message, GoogleMaterial.Icon.gmd_mail)
|
|
Drawables.addIcon(ctx, menu, R.id.share, GoogleMaterial.Icon.gmd_share)
|
|
Drawables.addIcon(ctx, menu, R.id.delete, GoogleMaterial.Icon.gmd_delete)
|
|
Drawables.addIcon(ctx, menu, R.id.export, CommunityMaterial.Icon.cmd_export).isVisible = item?.privateKey != null
|
|
|
|
super.onCreateOptionsMenu(menu, inflater)
|
|
}
|
|
|
|
override fun onOptionsItemSelected(menuItem: MenuItem): Boolean {
|
|
val item = item ?: return false
|
|
val ctx = activity ?: return false
|
|
when (menuItem.itemId) {
|
|
R.id.write_message -> {
|
|
val identity = Singleton.getIdentity(ctx)
|
|
if (identity == null) {
|
|
Toast.makeText(ctx, R.string.no_identity_warning, Toast.LENGTH_LONG).show()
|
|
} else {
|
|
val intent = Intent(ctx, ComposeMessageActivity::class.java)
|
|
intent.putExtra(ComposeMessageActivity.EXTRA_IDENTITY, identity)
|
|
intent.putExtra(ComposeMessageActivity.EXTRA_RECIPIENT, item)
|
|
startActivity(intent)
|
|
}
|
|
return true
|
|
}
|
|
R.id.delete -> {
|
|
val warning = if (item.privateKey != null)
|
|
R.string.delete_identity_warning
|
|
else
|
|
R.string.delete_contact_warning
|
|
AlertDialog.Builder(ctx)
|
|
.setMessage(warning)
|
|
.setPositiveButton(android.R.string.yes) { _, _ ->
|
|
Singleton.getAddressRepository(ctx).remove(item)
|
|
MainActivity.apply {
|
|
if (item.privateKey != null) {
|
|
removeIdentityEntry(item)
|
|
}
|
|
}
|
|
this.item = null
|
|
ctx.onBackPressed()
|
|
}
|
|
.setNegativeButton(android.R.string.no, null)
|
|
.show()
|
|
return true
|
|
}
|
|
R.id.export -> {
|
|
AlertDialog.Builder(ctx)
|
|
.setMessage(R.string.confirm_export)
|
|
.setPositiveButton(android.R.string.yes) { _, _ ->
|
|
val shareIntent = Intent(Intent.ACTION_SEND).apply {
|
|
type = "text/plain"
|
|
putExtra(
|
|
Intent.EXTRA_TITLE,
|
|
"$item$EXPORT_POSTFIX"
|
|
)
|
|
putExtra(
|
|
Intent.EXTRA_TEXT,
|
|
WifExporter(Singleton.getBitmessageContext(ctx)).apply {
|
|
addIdentity(item)
|
|
}.toString()
|
|
)
|
|
}
|
|
startActivity(Intent.createChooser(shareIntent, null))
|
|
}
|
|
.setNegativeButton(android.R.string.no, null)
|
|
.show()
|
|
return true
|
|
}
|
|
R.id.share -> {
|
|
val shareIntent = Intent(Intent.ACTION_SEND)
|
|
shareIntent.type = "text/plain"
|
|
shareIntent.putExtra(Intent.EXTRA_TEXT, item.address)
|
|
startActivity(Intent.createChooser(shareIntent, null))
|
|
return true
|
|
}
|
|
else -> return false
|
|
}
|
|
}
|
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View
|
|
= inflater.inflate(R.layout.fragment_address_detail, container, false)
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
super.onViewCreated(view, savedInstanceState)
|
|
// Show the dummy content as text in a TextView.
|
|
item?.let { item ->
|
|
activity?.let { activity ->
|
|
when {
|
|
item.isChan -> activity.setTitle(R.string.title_chan_detail)
|
|
item.privateKey != null -> activity.setTitle(R.string.title_identity_detail)
|
|
item.isSubscribed -> activity.setTitle(R.string.title_subscription_detail)
|
|
else -> activity.setTitle(R.string.title_contact_detail)
|
|
}
|
|
}
|
|
|
|
avatar.setImageDrawable(Identicon(item))
|
|
name.setText(item.toString())
|
|
name.addTextChangedListener(object : TextWatcher {
|
|
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit // Nothing to do
|
|
|
|
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) = Unit // Nothing to do
|
|
|
|
override fun afterTextChanged(s: Editable) {
|
|
item.alias = s.toString()
|
|
}
|
|
})
|
|
address.text = item.address
|
|
address.isSelected = true
|
|
stream_number.text = getString(R.string.stream_number, item.stream)
|
|
if (item.privateKey == null) {
|
|
active.isChecked = item.isSubscribed
|
|
active.setOnCheckedChangeListener { _, checked -> item.isSubscribed = checked }
|
|
|
|
if (item.pubkey == null) {
|
|
pubkey_available.alpha = 0.3f
|
|
pubkey_available_desc.setText(R.string.pubkey_not_available)
|
|
}
|
|
} else {
|
|
active.visibility = View.GONE
|
|
pubkey_available.visibility = View.GONE
|
|
pubkey_available_desc.visibility = View.GONE
|
|
}
|
|
|
|
// QR code
|
|
qr_code.setImageBitmap(Drawables.qrCode(item))
|
|
}
|
|
}
|
|
|
|
override fun onPause() {
|
|
item?.let { item ->
|
|
Singleton.getAddressRepository(context!!).save(item)
|
|
if (item.privateKey != null) {
|
|
MainActivity.apply { updateIdentityEntry(item) }
|
|
}
|
|
}
|
|
super.onPause()
|
|
}
|
|
|
|
companion object {
|
|
/**
|
|
* The fragment argument representing the item ID that this fragment
|
|
* represents.
|
|
*/
|
|
val ARG_ITEM = "item"
|
|
val EXPORT_POSTFIX = ".keys.dat"
|
|
}
|
|
}
|