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