Ändere Datenbank von Firebase zu Parse (inkl. Adminsystem)

master
Niko Diamadis 5 years ago
parent 71c43fbfe0
commit 924af613c4

@ -65,9 +65,9 @@ dependencies {
implementation 'com.github.cyb3rko:about-icons:1.2.1'
implementation 'com.github.GrenderG:Toasty:1.5.0'
implementation 'com.github.medyo:android-about-page:1.3'
implementation "com.github.parse-community.Parse-SDK-Android:parse:1.26.0"
implementation 'com.google.android.material:material:1.3.0-alpha03'
implementation 'com.google.firebase:firebase-crashlytics-ktx:17.3.0'
implementation 'com.google.firebase:firebase-database-ktx:19.5.1'
implementation "com.mikepenz:aboutlibraries:$about_libraries_version"
implementation "com.mikepenz:aboutlibraries-core:$about_libraries_version"
implementation 'me.ibrahimyilmaz:kiel:1.1.0'

@ -14,7 +14,8 @@
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/DarkActionbar"
tools:ignore="AllowBackup">
tools:ignore="AllowBackup"
android:name=".App">
<activity android:name="com.cyb3rko.techniklogger.MainActivity"
android:screenOrientation="portrait">
<intent-filter>

@ -0,0 +1,16 @@
package com.cyb3rko.techniklogger
import android.app.Application
import com.parse.Parse
class App : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) Parse.setLogLevel(Parse.LOG_LEVEL_DEBUG) else Parse.setLogLevel(Parse.LOG_LEVEL_NONE)
Parse.initialize(Parse.Configuration.Builder(this)
.applicationId("technik-logger")
.server("https://parse.cyb3rko.de:1338/technik-logger/parse/")
.build())
}
}

@ -12,8 +12,7 @@ import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.timepicker.MaterialTimePicker
import com.google.android.material.timepicker.TimeFormat
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase
import com.parse.ParseObject
import es.dmoral.toasty.Toasty
import kotlinx.android.synthetic.main.activity_einsatz_pusher.*
import java.sql.Time
@ -24,9 +23,8 @@ import java.util.*
class EinsatzPusher : AppCompatActivity() {
private lateinit var childKey: String
private lateinit var databaseReference: DatabaseReference
private lateinit var databaseReferenceNew: DatabaseReference
private var date = ""
private lateinit var entry: ParseObject
private var time = ""
private lateinit var time1: Time
private lateinit var time2: Time
@ -41,8 +39,6 @@ class EinsatzPusher : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_einsatz_pusher)
databaseReference = FirebaseDatabase.getInstance().getReference("einsätze")
restoreInformation()
supportActionBar?.setDisplayHomeAsUpEnabled(true)
@ -111,9 +107,7 @@ class EinsatzPusher : AppCompatActivity() {
.show {
message(0, "Möchtest du diesen Einsatz entfernen?")
positiveButton(0, "Ja") {
databaseReferenceNew.removeValue()
finish()
startActivity(Intent(applicationContext, MainActivity::class.java))
entry.deleteInBackground()
}
negativeButton(0, "Abbrechen")
}
@ -125,15 +119,21 @@ class EinsatzPusher : AppCompatActivity() {
val location = locationEditText.text.toString()
if (name != "" && location != "" && time != "null") {
databaseReferenceNew.child("name").setValue(name)
databaseReferenceNew.child("location").setValue(location)
databaseReferenceNew.child("date").setValue(date)
databaseReferenceNew.child("time").setValue(time)
databaseReferenceNew.child("duration").setValue(duration)
entry.put("name", name)
entry.put("ort", location)
val dateTimes = date.split(".")
var dateTime = "${dateTimes[2]}.${dateTimes[1]}.${dateTimes[0]}"
if (time != "") dateTime += ",$time"
entry.put("datum", dateTime)
entry.put("dauer", duration.toFloat())
if (childKey == "null") {
entry.put("techniker", listOf<String>())
}
entry.saveInBackground()
finish()
startActivity(Intent(applicationContext, MainActivity::class.java))
} else {
Toasty.error(applicationContext, "Fülle alle Felder aus").show()
Toasty.error(applicationContext, "Fülle zuerst alle Felder aus").show()
}
}
}
@ -164,9 +164,9 @@ class EinsatzPusher : AppCompatActivity() {
}
if (childKey == "null") {
databaseReferenceNew = databaseReference.push()
entry = ParseObject("Einsatz")
} else {
databaseReferenceNew = databaseReference.child(childKey)
entry = ParseObject.createWithoutData("Einsatz", childKey)
}
}

@ -8,7 +8,6 @@ import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog
@ -20,7 +19,8 @@ import com.androidnetworking.interfaces.StringRequestListener
import com.cyb3rko.techniklogger.recycler.ProjectEntryViewHolder
import com.cyb3rko.techniklogger.recycler.ProjectViewState
import com.cyb3rko.techniklogger.utils.About
import com.google.firebase.database.*
import com.parse.ParseObject
import com.parse.ParseQuery
import es.dmoral.toasty.Toasty
import kotlinx.android.synthetic.main.activity_main.*
import me.ibrahimyilmaz.kiel.adapter.RecyclerViewAdapter
@ -33,7 +33,6 @@ class MainActivity : AppCompatActivity() {
private var adminMode = false
private val data: MutableList<ProjectViewState.ProjectEntry> = mutableListOf()
private lateinit var databaseReference: DatabaseReference
private lateinit var sharedPref: SharedPreferences
private lateinit var sharedPrefEditor: SharedPreferences.Editor
@ -46,21 +45,14 @@ class MainActivity : AppCompatActivity() {
sharedPrefEditor = sharedPref.edit()
sharedPrefEditor.apply()
databaseReference = FirebaseDatabase.getInstance().reference
databaseReference.keepSynced(true)
if (sharedPref.getString("name", "") == "") {
showNameDialog()
} else {
updateAdminStatus()
}
loading_animation.playAnimation()
if (sharedPref.getBoolean("admin", false)) {
adminMode = true
floatingActionButton.show()
Toasty.info(applicationContext, "Admin-Zugriff", Toasty.LENGTH_SHORT).show()
}
val adapter = adapterOf<ProjectViewState> {
register(
layoutResource = R.layout.item_recycler_projects,
@ -78,8 +70,8 @@ class MainActivity : AppCompatActivity() {
.setKey(text.childKey)
.start()
}
if (adminMode) {
vh.itemView.setOnLongClickListener {
vh.itemView.setOnLongClickListener {
if (adminMode) {
val intent = Intent(applicationContext, EinsatzPusher::class.java)
intent.putExtra("childKey", text.childKey)
intent.putExtra("name", text.text)
@ -90,7 +82,7 @@ class MainActivity : AppCompatActivity() {
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)
true
}
} else false
}
}
)
@ -103,12 +95,7 @@ class MainActivity : AppCompatActivity() {
recycler_view.layoutManager = linearLayoutManager
recycler_view.adapter = adapter
databaseReference.child("einsätze").addChildEventListener(loadEntries(adapter))
floatingActionButton.setOnClickListener {
startActivity(Intent(applicationContext, EinsatzPusher::class.java))
finish()
}
loadEntries(adapter)
updateCheck()
}
@ -130,100 +117,39 @@ class MainActivity : AppCompatActivity() {
positiveButton(0, "Speichern") {
sharedPref.edit().putString("name", inputName.toString()).apply()
updateAdminStatus()
}
}
}
}
private fun toggleAdminMode() {
if (!adminMode) {
var adminKey = ""
private fun loadEntries(adapter: RecyclerViewAdapter<ProjectViewState, RecyclerViewHolder<ProjectViewState>>) {
val query = ParseQuery.getQuery<ParseObject>("Einsatz")
query.limit = 100000
val listener = object: ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
if (snapshot.key == "admin_key") {
adminKey = snapshot.value.toString()
}
query.findInBackground { objects, e ->
if (e == null) {
objects.forEach {
val dates = it["datum"].toString().split(",")
val time = if (dates.size > 1) dates[1] else ""
data.add(data.size, ProjectViewState.ProjectEntry(
it.objectId,
it["name"].toString(),
it["ort"].toString(),
SimpleDateFormat("yyyy.MM.dd", Locale.GERMANY).parse(dates[0])!!,
time,
it["dauer"].toString()
))
}
override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onChildRemoved(snapshot: DataSnapshot) {}
override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onCancelled(error: DatabaseError) {}
}
databaseReference.addChildEventListener(listener)
MaterialDialog(this)
.title(0, "Bitte gib den Admin-Key ein")
.show {
input(hint = "Admin-Key", waitForPositiveButton = false) { _, inputKey ->
positiveButton {
if (inputKey.toString() == adminKey) {
sharedPref.edit().putBoolean("admin", true).apply()
val intent = Intent(applicationContext, MainActivity::class.java)
startActivity(intent)
finishAffinity()
} else {
Toasty.error(applicationContext, "Ungültiger Key").show()
}
}
}
positiveButton(0, "Speichern")
}
} else {
sharedPref.edit().putBoolean("admin", false).apply()
val intent = Intent(applicationContext, MainActivity::class.java)
startActivity(intent)
finishAffinity()
}
}
private fun loadEntries(adapter: RecyclerViewAdapter<ProjectViewState, RecyclerViewHolder<ProjectViewState>>): ChildEventListener {
return object: ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
try {
val element = ProjectViewState.ProjectEntry(
snapshot.key!!,
snapshot.child("name").value.toString(),
snapshot.child("location").value.toString(),
SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY).parse(snapshot.child("date").value.toString())!!,
snapshot.child("time").value.toString(),
snapshot.child("duration").value.toString()
)
data.add(data.size, element)
data.sortBy { it.date }
hideProgress()
adapter.notifyDataSetChanged()
recycler_view.scheduleLayoutAnimation()
recycler_view.scrollBy(0, -10000)
} catch (exception: Exception) {
}
}
override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onChildRemoved(snapshot: DataSnapshot) {
try {
val element = ProjectViewState.ProjectEntry(
snapshot.key!!,
snapshot.child("name").value.toString(),
snapshot.child("location").value.toString(),
SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY).parse(snapshot.child("date").value.toString())!!,
snapshot.child("time").value.toString(),
snapshot.child("duration").value.toString()
)
data.remove(element)
adapter.notifyDataSetChanged()
recycler_view.scheduleLayoutAnimation()
recycler_view.scrollBy(0, -10000)
} catch (exception: Exception) {
}
}
override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onCancelled(error: DatabaseError) {
Toast.makeText(applicationContext, "Abruf fehlgeschlagen", Toast.LENGTH_SHORT).show()
data.sortBy { it.date }
hideProgress()
adapter.notifyDataSetChanged()
recycler_view.scheduleLayoutAnimation()
recycler_view.scrollBy(0, -10000)
} else {
Toasty.error(applicationContext, "Abruf fehlgeschlagen", Toasty.LENGTH_SHORT).show()
Log.e("TechnikLogger.EinsSuche", e.message.toString())
}
}
}
@ -233,12 +159,38 @@ class MainActivity : AppCompatActivity() {
loading_animation.cancelAnimation()
}
private fun updateAdminStatus() {
val query = ParseQuery.getQuery<ParseObject>("Techniker")
query.whereEqualTo("name", sharedPref.getString("name", ""))
query.getFirstInBackground { techniker, e ->
if (e == null) {
if (techniker.getBoolean("admin")) {
adminMode = true
sharedPrefEditor.putBoolean("admin", adminMode)
sharedPrefEditor.putString("technikerId", techniker.objectId).apply()
floatingActionButton.show()
floatingActionButton.setOnClickListener {
startActivity(Intent(applicationContext, EinsatzPusher::class.java))
finish()
}
} else {
adminMode = false
sharedPrefEditor.putBoolean("admin", adminMode).apply()
floatingActionButton.hide()
}
} else {
floatingActionButton.hide()
adminMode = false
sharedPrefEditor.putBoolean("admin", adminMode).apply()
Toasty.error(applicationContext, "Adminstatus unbekannt", Toasty.LENGTH_SHORT).show()
Log.e("TechnikLogger.TechSuche", e.message.toString())
}
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
if (adminMode) {
menu.findItem(R.id.action_admin).title = "Admin-Zugriff deaktivieren"
}
return true
}
@ -254,7 +206,7 @@ class MainActivity : AppCompatActivity() {
}
override fun onError(anError: ANError?) {
Log.d(this@MainActivity.toString(), "Update-Abfrage fehlgeschlagen: ${anError!!.errorBody.trimIndent()}")
Log.d("TechnikLogger.Update", "Update-Abfrage fehlgeschlagen: ${anError!!.errorBody.trimIndent()}")
}
})
}
@ -265,7 +217,7 @@ class MainActivity : AppCompatActivity() {
// as you specify a parent activity in AndroidManifest.xml.
when (item.itemId) {
R.id.action_rename -> showNameDialog()
R.id.action_admin -> toggleAdminMode()
R.id.action_admin -> updateAdminStatus()
R.id.action_about -> startActivity(Intent(applicationContext, About::class.java))
// R.id.action_privacy_policy ->
// R.id.action_terms_of_use ->

@ -1,14 +1,12 @@
package com.cyb3rko.techniklogger
import android.annotation.SuppressLint
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog
@ -19,49 +17,56 @@ import com.afollestad.materialdialogs.list.listItemsMultiChoice
import com.afollestad.materialdialogs.list.uncheckItems
import com.cyb3rko.techniklogger.recycler.ProjectTechnikerViewHolder
import com.cyb3rko.techniklogger.recycler.ProjectTechnikerViewState
import com.google.firebase.database.*
import com.parse.ParseObject
import com.parse.ParseQuery
import es.dmoral.toasty.Toasty
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.IndexOutOfBoundsException
import me.ibrahimyilmaz.kiel.adapter.RecyclerViewAdapter.Companion.adapterOf
import kotlinx.android.synthetic.main.activity_project.*
import kotlinx.android.synthetic.main.activity_project.recycler_view
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import me.ibrahimyilmaz.kiel.adapter.RecyclerViewAdapter
import me.ibrahimyilmaz.kiel.core.RecyclerViewHolder
@SuppressLint("SetTextI18n")
class ProjectActivity : AppCompatActivity() {
private var addTechniker = mutableListOf<String>()
private lateinit var adapter: RecyclerViewAdapter<ProjectTechnikerViewState, RecyclerViewHolder<ProjectTechnikerViewState>>
private var adminMode = false
private var childKey = ""
private lateinit var databaseReference: DatabaseReference
private lateinit var einsatz: ParseObject
private lateinit var sharedPref: SharedPreferences
private val techniker: MutableList<ProjectTechnikerViewState.ProjectTechniker> = mutableListOf()
override fun onCreate(savedInstanceState: Bundle?) {
childKey = intent.extras?.getString("childKey").toString()
einsatz = ParseObject.createWithoutData("Einsatz", childKey)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_project)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
sharedPref = getSharedPreferences("Safe", 0)
if (sharedPref.getBoolean("admin", false)) adminMode = true
adminMode = sharedPref.getBoolean("admin", false)
databaseReference = FirebaseDatabase.getInstance().getReference("einsätze").child(childKey)
val adapter = adapterOf<ProjectTechnikerViewState> {
adapter = adapterOf {
register(
layoutResource = R.layout.item_recycler_techniker,
viewHolder = ::ProjectTechnikerViewHolder,
onBindBindViewHolder = { vh, _, text ->
vh.textView.text = text.name
if (adminMode) {
vh.itemView.setOnClickListener {
vh.itemView.setOnClickListener {
if (adminMode) {
MaterialDialog(this@ProjectActivity)
.show {
message(text = "Möchtest du \'${text.name}\' entfernen?")
positiveButton(text = "Ja") {
databaseReference.child("techniker").child(text.key).removeValue()
techniker.remove(text)
einsatz.put("techniker", techniker)
einsatz.saveInBackground()
adapter.notifyDataSetChanged()
this@ProjectActivity.recycler_view.scheduleLayoutAnimation()
this@ProjectActivity.techniker_view.text = "Techniker: ${techniker.size}"
if (techniker.size == 0) showDivider(false)
}
negativeButton(text = "Abbrechen")
}
@ -71,32 +76,47 @@ class ProjectActivity : AppCompatActivity() {
)
}
val listener = object: ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
techniker.add(techniker.size, ProjectTechnikerViewState.ProjectTechniker(snapshot.value.toString(), snapshot.key!!))
techniker.sortBy { it.name }
recycler_view.scheduleLayoutAnimation()
adapter.notifyDataSetChanged()
showDivider()
techniker_view.text = "Techniker: ${techniker.size}"
}
val query = ParseQuery.getQuery<ParseObject>("Einsatz")
query.getInBackground(childKey) { einsatz, e ->
if (e == null) {
val technikerIds = einsatz.getList<String>("techniker")!!
override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {
}
val queries = mutableListOf<ParseQuery<ParseObject>>()
technikerIds.forEach {
val tempQuery = ParseQuery.getQuery<ParseObject>("Techniker")
tempQuery.whereEqualTo("objectId", it.toString())
queries.add(tempQuery)
}
override fun onChildRemoved(snapshot: DataSnapshot) {
techniker.remove(ProjectTechnikerViewState.ProjectTechniker(snapshot.value.toString(), snapshot.key!!))
recycler_view.scheduleLayoutAnimation()
adapter.notifyDataSetChanged()
emptyCheck()
techniker_view.text = "Techniker: ${techniker.size}"
}
if (queries.isNotEmpty()) {
val query2 = ParseQuery.or(queries)
query2.findInBackground { objects2, e2 ->
if (e2 == null) {
objects2.forEach {
techniker.add(ProjectTechnikerViewState.ProjectTechniker(it.getString("name")!!, it.objectId))
}
techniker.sortBy { it.name }
recycler_view.scheduleLayoutAnimation()
adapter.notifyDataSetChanged()
techniker_view.text = "Techniker: ${techniker.size}"
showDivider()
} else {
Toasty.error(applicationContext, "Fehler bei Id-Abfrage", Toasty.LENGTH_SHORT).show()
Log.e("TechnikLogger.TechSuche", e2.message.toString())
}
}
}
override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {
}
override fun onCancelled(error: DatabaseError) {
Toast.makeText(applicationContext, "Abruf fehlgeschlagen", Toast.LENGTH_SHORT).show()
title_view.text = einsatz["name"].toString()
location_view.text = einsatz["ort"].toString()
val dates = einsatz["datum"].toString().split(",")
val dateParts = dates[0].split(".")
val date = "${dateParts[2]}.${dateParts[1]}.${dateParts[0]}"
val time = if (dates.size > 1) ", ${dates[1]}" else ""
date_view.text = date + time
} else {
Toasty.error(applicationContext, "Abruf fehlgeschlagen", Toasty.LENGTH_SHORT).show()
Log.e("TechnikLogger.TechSuche", e.message.toString())
}
}
@ -104,15 +124,8 @@ class ProjectActivity : AppCompatActivity() {
recycler_view.layoutManager = LinearLayoutManager(applicationContext)
recycler_view.adapter = adapter
databaseReference.child("techniker").addChildEventListener(listener)
setValueEventListener("name", title_view)
setValueEventListener("location", location_view)
setValueEventListener("date", date_view)
setTimeEventListener()
add_button.setOnClickListener {
val name = getSharedPreferences("Safe", 0).getString("name", "invalid")!!
val name = sharedPref.getString("name", "invalid")!!
if (!adminMode) selfAdd(name) else bothAdd(name)
}
@ -124,7 +137,12 @@ class ProjectActivity : AppCompatActivity() {
MaterialDialog(this).show {
message(text = "Möchtest du alle eingetragenen Techniker entfernen?")
positiveButton(text = "Ja") {
databaseReference.child("techniker").removeValue()
einsatz.put("techniker", listOf<String>())
einsatz.saveInBackground()
techniker.clear()
adapter.notifyDataSetChanged()
showDivider(false)
this@ProjectActivity.techniker_view.text = "Techniker: ${techniker.size}"
}
negativeButton(text = "Abbrechen")
}
@ -160,12 +178,28 @@ class ProjectActivity : AppCompatActivity() {
MaterialDialog(this).show {
message(text = "Möchtest du dich als involvierter Techniker eintragen?")
positiveButton(text = "Ja") {
databaseReference.child("techniker").push().setValue(name)
val entry = ParseObject.createWithoutData("Einsatz", childKey)
entry.add("techniker", sharedPref.getString("technikerId", "")!!)
entry.saveInBackground()
techniker.add(ProjectTechnikerViewState.ProjectTechniker(name, sharedPref.getString("technikerId", "")!!))
techniker.sortBy { it.name }
adapter.notifyDataSetChanged()
showDivider(true)
this@ProjectActivity.recycler_view.scheduleLayoutAnimation()
this@ProjectActivity.techniker_view.text = "Techniker: ${techniker.size}"
}
negativeButton(text = "Abbrechen")
}
} else {
databaseReference.child("techniker").push().setValue(name)
val entry = ParseObject.createWithoutData("Einsatz", childKey)
entry.add("techniker", sharedPref.getString("technikerId", "")!!)
entry.saveInBackground()
techniker.add(ProjectTechnikerViewState.ProjectTechniker(name, sharedPref.getString("technikerid", "")!!))
techniker.sortBy { it.name }
adapter.notifyDataSetChanged()
showDivider(true)
this@ProjectActivity.recycler_view.scheduleLayoutAnimation()
this@ProjectActivity.techniker_view.text = "Techniker: ${techniker.size}"
}
} else {
MaterialDialog(this)
@ -177,96 +211,59 @@ class ProjectActivity : AppCompatActivity() {
}
private fun otherAdd() {
val technikerReference = FirebaseDatabase.getInstance().reference.child("techniker")
val childReadListener = getReadListener(technikerReference)
val query = ParseQuery.getQuery<ParseObject>("Techniker")
val addTechniker = mutableListOf<ProjectTechnikerViewState.ProjectTechniker>()
addTechniker.clear()
technikerReference.addChildEventListener(childReadListener)
query.findInBackground { objects, e ->
if (e == null) {
objects.forEach {
addTechniker.add(ProjectTechnikerViewState.ProjectTechniker(it.getString("name")!!, it.objectId))
}
addTechniker.sortBy { it.name }
technikerReference.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
technikerReference.removeEventListener(childReadListener)
technikerReference.removeEventListener(this)
addTechniker.sort()
val currentSelection = mutableListOf<Int>()
addTechniker.forEachIndexed { index, s ->
techniker.forEach {
if (s == it.name) currentSelection.add(index)
}
val currentSelection = mutableListOf<Int>()
val names = mutableListOf<String>()
addTechniker.forEachIndexed { index, s ->
names.add(s.name)
techniker.forEach {
if (s.name == it.name) currentSelection.add(index)
}
val intArray = currentSelection.toIntArray()
MaterialDialog(this@ProjectActivity).show {
listItemsMultiChoice(items = addTechniker, initialSelection = intArray, disabledIndices = intArray)
positiveButton(text = "Hinzufügen") {
it.uncheckItems(intArray)
GlobalScope.launch {
addTechniker.forEachIndexed { index, s ->
if (it.isItemChecked(index)) {
databaseReference.child("techniker").push().setValue(s)
}
}
addTechniker.clear()
}
val intArray = currentSelection.toIntArray()
MaterialDialog(this@ProjectActivity).show {
listItemsMultiChoice(items = names, initialSelection = intArray, disabledIndices = intArray)
positiveButton(text = "Hinzufügen") {
it.uncheckItems(intArray)
val checkedNameKeys = mutableListOf<String>()
addTechniker.forEachIndexed { index, s ->
if (it.isItemChecked(index)) {
checkedNameKeys.add(s.key)
techniker.add(s)
}
}
negativeButton(text = "Abbrechen") {
addTechniker.clear()
}
einsatz.addAll("techniker", checkedNameKeys)
einsatz.saveInBackground()
addTechniker.clear()
techniker.sortBy { it.name }
adapter.notifyDataSetChanged()
showDivider(true)
this@ProjectActivity.recycler_view.scheduleLayoutAnimation()
this@ProjectActivity.techniker_view.text = "Techniker: ${techniker.size}"
}
negativeButton(text = "Abbrechen") {
addTechniker.clear()
}
}
}
override fun onCancelled(error: DatabaseError) {
technikerReference.removeEventListener(childReadListener)
technikerReference.removeEventListener(this)
}
})
}
private fun getReadListener(databaseRef: DatabaseReference): ChildEventListener {
return object : ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
addTechniker.add(snapshot.value.toString())
}
override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onChildRemoved(snapshot: DataSnapshot) {}
override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onCancelled(error: DatabaseError) {
databaseRef.removeEventListener(this)
} else {
Toasty.error(applicationContext, "Fehler bei Id-Abfrage", Toasty.LENGTH_SHORT).show()
Log.e("TechnikLogger.TechSuche", e.message.toString())
}
}
}
private fun setValueEventListener(childName: String, textView: TextView) {
val valueEventListener = object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
textView.text = snapshot.value.toString()
}
override fun onCancelled(error: DatabaseError) {
}
}
databaseReference.child(childName).addListenerForSingleValueEvent(valueEventListener)
}
private fun setTimeEventListener() {
val valueEventListener = object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val time = snapshot.value.toString()
if (time != "null") {
date_view.text = "${date_view.text}, $time Uhr"
}
}
override fun onCancelled(error: DatabaseError) {
}
}
databaseReference.child("time").addListenerForSingleValueEvent(valueEventListener)
}
private fun showDivider() {
divider.visibility = View.VISIBLE
private fun showDivider(show: Boolean = true) {
divider.visibility = if (show) View.VISIBLE else View.GONE
}
private fun emptyCheck() {
@ -298,55 +295,9 @@ class ProjectActivity : AppCompatActivity() {
}
}
private fun toggleAdminMode() {
if (!adminMode) {
var adminKey = ""
val listener = object: ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
if (snapshot.key == "admin_key") {
adminKey = snapshot.value.toString()
}
}
override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onChildRemoved(snapshot: DataSnapshot) {}
override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {}
override fun onCancelled(error: DatabaseError) {}
}
FirebaseDatabase.getInstance().reference.addChildEventListener(listener)
MaterialDialog(this)
.title(text = "Bitte gebe den Admin-Key ein")
.show {
input(hint = "Admin-Key", waitForPositiveButton = false) { _, inputKey ->
positiveButton {
if (inputKey.toString() == adminKey) {
sharedPref.edit().putBoolean("admin", true).apply()
val intent = Intent(applicationContext, MainActivity::class.java)
startActivity(intent)
finishAffinity()
} else {
Toasty.error(applicationContext, "Ungültiger Key").show()
}
}
}
positiveButton(text = "Speichern")
}
} else {
sharedPref.edit().putBoolean("admin", false).apply()
val intent = Intent(applicationContext, MainActivity::class.java)
startActivity(intent)
finishAffinity()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.menu_main, menu)
if (adminMode) {
menu.findItem(R.id.action_admin).title = "Admin-Zugriff deaktivieren"
}
return true
}
@ -357,7 +308,6 @@ class ProjectActivity : AppCompatActivity() {
when (item.itemId) {
android.R.id.home -> finish()
R.id.action_rename -> showNameDialog()
R.id.action_admin -> toggleAdminMode()
// R.id.action_icons -> setContentView(AboutIcons(applicationContext, R.drawable::class.java).setTitle("Benutzte Icons").get())
// R.id.action_libraries -> LibsBuilder().start(this)
// R.id.action_privacy_policy ->

@ -9,7 +9,7 @@
<item
android:id="@+id/action_admin"
android:title="Admin-Zugang aktivieren"
android:title="Adminstatus abrufen"
app:showAsAction="never" />
<item

Loading…
Cancel
Save