parent
1a4535ae59
commit
f290b21a31
@ -0,0 +1,38 @@ |
|||||||
|
package net.pokeranalytics.android.ui.activity.components |
||||||
|
|
||||||
|
import android.content.Context |
||||||
|
import android.content.Intent |
||||||
|
import androidx.fragment.app.Fragment |
||||||
|
import net.pokeranalytics.android.calculus.Report |
||||||
|
|
||||||
|
abstract class ReportActivity : PokerAnalyticsActivity() { |
||||||
|
|
||||||
|
companion object { |
||||||
|
|
||||||
|
const val DEFAULT_REQUEST_CODE = 999 |
||||||
|
|
||||||
|
// Unparcel fails when setting a custom Parcelable object on Entry so we use a static reference to passe objects |
||||||
|
var report: Report? = null |
||||||
|
var reportTitle: String = "" |
||||||
|
|
||||||
|
/** |
||||||
|
* Default constructor |
||||||
|
*/ |
||||||
|
fun newInstance(context: Context, report: Report, reportTitle: String) { |
||||||
|
this.report = report |
||||||
|
this.reportTitle = reportTitle |
||||||
|
val intent = Intent(context, this::class.java) |
||||||
|
context.startActivity(intent) |
||||||
|
} |
||||||
|
|
||||||
|
fun newInstanceForResult(fragment: Fragment, clazz: Class<*>, report: Report, reportTitle: String) { |
||||||
|
this.report = report |
||||||
|
this.reportTitle = reportTitle |
||||||
|
|
||||||
|
val intent = Intent(fragment.requireContext(), clazz) |
||||||
|
fragment.startActivityForResult(intent, DEFAULT_REQUEST_CODE) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,154 @@ |
|||||||
|
package net.pokeranalytics.android.ui.fragment.data |
||||||
|
|
||||||
|
import android.app.Activity |
||||||
|
import android.content.Intent |
||||||
|
import android.os.Bundle |
||||||
|
import android.view.Menu |
||||||
|
import android.view.MenuInflater |
||||||
|
import android.view.MenuItem |
||||||
|
import android.view.View |
||||||
|
import androidx.appcompat.app.AlertDialog |
||||||
|
import io.realm.RealmObject |
||||||
|
import net.pokeranalytics.android.R |
||||||
|
import net.pokeranalytics.android.exceptions.ConfigurationException |
||||||
|
import net.pokeranalytics.android.model.LiveData |
||||||
|
import net.pokeranalytics.android.model.interfaces.Deletable |
||||||
|
import net.pokeranalytics.android.model.interfaces.Savable |
||||||
|
import net.pokeranalytics.android.model.interfaces.SaveValidityStatus |
||||||
|
import net.pokeranalytics.android.ui.activity.DataListActivity |
||||||
|
import net.pokeranalytics.android.ui.activity.EditableDataActivity |
||||||
|
import net.pokeranalytics.android.ui.fragment.components.RealmFragment |
||||||
|
|
||||||
|
open class DataManagerFragment : RealmFragment() { |
||||||
|
|
||||||
|
lateinit var item: RealmObject |
||||||
|
|
||||||
|
lateinit var liveDataType: LiveData |
||||||
|
protected var primaryKey: String? = null |
||||||
|
|
||||||
|
var deleteButtonShouldAppear = false |
||||||
|
set(value) { |
||||||
|
field = value |
||||||
|
this.updateMenuUI() |
||||||
|
} |
||||||
|
|
||||||
|
var saveButtonShouldAppear = true |
||||||
|
set(value) { |
||||||
|
field = value |
||||||
|
this.updateMenuUI() |
||||||
|
} |
||||||
|
|
||||||
|
protected var dataType: Int? = null |
||||||
|
|
||||||
|
private var editableMenu: Menu? = null |
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
||||||
|
super.onViewCreated(view, savedInstanceState) |
||||||
|
initData() |
||||||
|
} |
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) { |
||||||
|
menu?.clear() |
||||||
|
inflater?.inflate(R.menu.toolbar_editable_data, menu) |
||||||
|
this.editableMenu = menu |
||||||
|
updateMenuUI() |
||||||
|
super.onCreateOptionsMenu(menu, inflater) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Update menu UI |
||||||
|
*/ |
||||||
|
private fun updateMenuUI() { |
||||||
|
editableMenu?.findItem(R.id.delete)?.isVisible = this.deleteButtonShouldAppear |
||||||
|
editableMenu?.findItem(R.id.save)?.isVisible = this.saveButtonShouldAppear |
||||||
|
} |
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem?): Boolean { |
||||||
|
when (item!!.itemId) { |
||||||
|
R.id.save -> saveData() |
||||||
|
R.id.delete -> deleteData() |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Init data |
||||||
|
*/ |
||||||
|
protected open fun initData() { |
||||||
|
|
||||||
|
this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Save data |
||||||
|
*/ |
||||||
|
protected open fun saveData() { |
||||||
|
|
||||||
|
val savable = this.item |
||||||
|
when (savable) { |
||||||
|
is Savable -> { |
||||||
|
val status = savable.getSaveValidityStatus(realm = this.getRealm()) |
||||||
|
when (status) { |
||||||
|
SaveValidityStatus.VALID -> { |
||||||
|
this.getRealm().executeTransaction { |
||||||
|
val managedItem = it.copyToRealmOrUpdate(this.item) |
||||||
|
if (managedItem is Savable) { |
||||||
|
val uniqueIdentifier = (managedItem as Savable).id |
||||||
|
finishActivityWithResult(uniqueIdentifier) |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
else -> { |
||||||
|
val message = savable.getFailedSaveMessage(status) |
||||||
|
val builder = AlertDialog.Builder(requireContext()) |
||||||
|
.setMessage(message) |
||||||
|
.setNegativeButton(R.string.ok, null) |
||||||
|
builder.show() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} else -> { |
||||||
|
throw ConfigurationException("Save action called on un-Savable object") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Delete data |
||||||
|
*/ |
||||||
|
protected open fun deleteData() { |
||||||
|
|
||||||
|
val deletable = this.item as Deletable |
||||||
|
val realm = this.getRealm() |
||||||
|
|
||||||
|
if (deletable.isValidForDelete(realm)) { |
||||||
|
val intent = Intent() |
||||||
|
intent.putExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, deletable.id) |
||||||
|
activity?.setResult(Activity.RESULT_OK, intent) |
||||||
|
activity?.finish() |
||||||
|
} else { |
||||||
|
val status = deletable.getDeleteStatus(realm) |
||||||
|
val message = deletable.getFailedDeleteMessage(status) |
||||||
|
val builder = AlertDialog.Builder(requireContext()) |
||||||
|
.setMessage(message) |
||||||
|
.setNegativeButton(R.string.ok, null) |
||||||
|
builder.show() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Finish the activity with a result |
||||||
|
*/ |
||||||
|
private fun finishActivityWithResult(uniqueIdentifier: String) { |
||||||
|
val intent = Intent() |
||||||
|
intent.putExtra(EditableDataActivity.IntentKey.DATA_TYPE.keyName, dataType) |
||||||
|
intent.putExtra(EditableDataActivity.IntentKey.PRIMARY_KEY.keyName, uniqueIdentifier) |
||||||
|
activity?.setResult(Activity.RESULT_OK, intent) |
||||||
|
activity?.finish() |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,21 @@ |
|||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
android:orientation="vertical" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:padding="24dp"> |
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatTextView |
||||||
|
android:text="@string/save_report" |
||||||
|
style="@style/PokerAnalyticsTheme.TextView.Title" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" /> |
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText |
||||||
|
android:id="@+id/reportName" |
||||||
|
style="@style/PokerAnalyticsTheme.EditText" |
||||||
|
android:layout_width="240dp" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginTop="4dp" |
||||||
|
android:hint="@string/name" /> |
||||||
|
|
||||||
|
</LinearLayout> |
||||||
Loading…
Reference in new issue