From e5659e8908b1c0556cb21bf22d4a0cbac1d2c91a Mon Sep 17 00:00:00 2001 From: Niko Diamadis Date: Fri, 9 Jul 2021 22:26:26 +0200 Subject: [PATCH] =?UTF-8?q?F=C3=BCge=20Funktion=20zum=20Exportieren=20der?= =?UTF-8?q?=20Liste=20als=20PDF-Datei=20hinzu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../com/cyb3rko/techniklogger/MainActivity.kt | 16 +-- .../fragments/ListingFragment.kt | 55 +++++++++- .../techniklogger/table/ColumnHeaderCell.kt | 18 +++ .../techniklogger/table/ExportBuilder.kt | 103 ++++++++++++++++++ .../cyb3rko/techniklogger/table/HeaderCell.kt | 22 ++++ .../cyb3rko/techniklogger/table/NormalCell.kt | 18 +++ .../cyb3rko/techniklogger/table/TimeCell.kt | 23 ++++ .../main/res/drawable-v24/_icon_dot_menu.webp | Bin 0 -> 1558 bytes app/src/main/res/drawable/_icon_export.webp | Bin 0 -> 3776 bytes app/src/main/res/layout/fragment_listing.xml | 92 ++++++++++++++-- app/src/main/res/values/about-icons.xml | 12 ++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/dimens.xml | 3 + 14 files changed, 346 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/com/cyb3rko/techniklogger/table/ColumnHeaderCell.kt create mode 100644 app/src/main/java/com/cyb3rko/techniklogger/table/ExportBuilder.kt create mode 100644 app/src/main/java/com/cyb3rko/techniklogger/table/HeaderCell.kt create mode 100644 app/src/main/java/com/cyb3rko/techniklogger/table/NormalCell.kt create mode 100644 app/src/main/java/com/cyb3rko/techniklogger/table/TimeCell.kt create mode 100644 app/src/main/res/drawable-v24/_icon_dot_menu.webp create mode 100644 app/src/main/res/drawable/_icon_export.webp diff --git a/app/build.gradle b/app/build.gradle index d989b41..3f2c0c6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,6 +79,7 @@ dependencies { 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.itextpdf:itextpdf:5.5.13.2' implementation "com.mikepenz:aboutlibraries:$about_libraries_version" implementation "com.mikepenz:aboutlibraries-core:$about_libraries_version" implementation 'me.ibrahimyilmaz:kiel:1.1.0' diff --git a/app/src/main/java/com/cyb3rko/techniklogger/MainActivity.kt b/app/src/main/java/com/cyb3rko/techniklogger/MainActivity.kt index c6b8201..ed06675 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/MainActivity.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/MainActivity.kt @@ -1,5 +1,6 @@ package com.cyb3rko.techniklogger +import android.Manifest import android.annotation.SuppressLint import android.content.Intent import android.content.SharedPreferences @@ -8,6 +9,7 @@ import android.util.Log import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController @@ -18,12 +20,7 @@ import com.androidnetworking.AndroidNetworking import com.androidnetworking.error.ANError import com.androidnetworking.interfaces.StringRequestListener import com.cyb3rko.techniklogger.databinding.ActivityMainBinding -import com.cyb3rko.techniklogger.databinding.FragmentListingBinding -import com.cyb3rko.techniklogger.fragments.EinsatzPusherFragment import com.cyb3rko.techniklogger.utils.About -import com.parse.ParseObject -import com.parse.ParseQuery -import es.dmoral.toasty.Toasty import java.util.* class MainActivity : AppCompatActivity() { @@ -59,6 +56,13 @@ class MainActivity : AppCompatActivity() { updateCheck() } + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + ActivityCompat.requestPermissions( + this, arrayOf(Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE), 1 + ) + } + private fun showNameDialog() { val currentName = getSharedPreferences("Safe", 0).getString("name", "") @@ -118,8 +122,6 @@ class MainActivity : AppCompatActivity() { when (item.itemId) { R.id.action_rename -> showNameDialog() R.id.action_about -> startActivity(Intent(applicationContext, About::class.java)) -// R.id.action_privacy_policy -> -// R.id.action_terms_of_use -> } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt index 07057e7..f06b0a0 100644 --- a/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt +++ b/app/src/main/java/com/cyb3rko/techniklogger/fragments/ListingFragment.kt @@ -1,5 +1,6 @@ package com.cyb3rko.techniklogger.fragments +import android.animation.Animator import android.content.Context import android.content.SharedPreferences import android.os.Bundle @@ -14,6 +15,7 @@ import com.cyb3rko.techniklogger.R import com.cyb3rko.techniklogger.databinding.FragmentListingBinding import com.cyb3rko.techniklogger.recycler.ProjectEntryViewHolder import com.cyb3rko.techniklogger.recycler.ProjectViewState +import com.cyb3rko.techniklogger.table.ExportBuilder import com.parse.ParseObject import com.parse.ParseQuery import es.dmoral.toasty.Toasty @@ -28,6 +30,7 @@ class ListingFragment : Fragment() { private var adminMode = false private val data: MutableList = mutableListOf() + private var isFABOpen = false private lateinit var sharedPref: SharedPreferences private lateinit var sharedPrefEditor: SharedPreferences.Editor @@ -97,6 +100,14 @@ class ListingFragment : Fragment() { loadEntries(adapter) } + binding.fab.setOnClickListener { + if (!isFABOpen) showFABMenu() else closeFABMenu() + } + + binding.fabBgLayout.setOnClickListener { + closeFABMenu() + } + return root } @@ -150,19 +161,23 @@ class ListingFragment : Fragment() { if (techniker.getBoolean("admin")) { adminMode = true sharedPrefEditor.putBoolean("admin", adminMode) - binding.floatingActionButton.show() - binding.floatingActionButton.setOnClickListener { + binding.fabContainer.visibility = View.VISIBLE + binding.fab1.setOnClickListener { val action = ListingFragmentDirections.navigateToPusher() findNavController().navigate(action) } + binding.fab2.setOnClickListener { + closeFABMenu() + ExportBuilder(myContext, data) + } } else { adminMode = false sharedPrefEditor.putBoolean("admin", adminMode) - binding.floatingActionButton.hide() + binding.fabContainer.visibility = View.INVISIBLE } sharedPrefEditor.putString("technikerId", techniker.objectId).apply() } else { - binding.floatingActionButton.hide() + binding.fabContainer.visibility = View.INVISIBLE adminMode = false sharedPrefEditor.putBoolean("admin", adminMode).apply() Toasty.error(myContext, "Adminstatus unbekannt", Toasty.LENGTH_SHORT).show() @@ -170,4 +185,36 @@ class ListingFragment : Fragment() { } } } + + private fun showFABMenu() { + isFABOpen = true + binding.fabLayout1.visibility = View.VISIBLE + binding.fabLayout2.visibility = View.VISIBLE + binding.fabBgLayout.visibility = View.VISIBLE + binding.fab.animate().rotationBy(180f) + binding.fabLayout1.animate().translationY(-resources.getDimension(R.dimen.first_fab)) + binding.fabLayout2.animate().translationY(-resources.getDimension(R.dimen.second_fab)) + } + + private fun closeFABMenu() { + isFABOpen = false + binding.fabBgLayout.visibility = View.GONE + binding.fab.animate().rotation(0f) + binding.fabLayout1.animate().translationY(0f) + binding.fabLayout2.animate().translationY(0f) + binding.fabLayout2.animate().translationY(0f).setListener(object: Animator.AnimatorListener { + override fun onAnimationStart(animation: Animator?) {} + + override fun onAnimationEnd(animation: Animator?) { + if (!isFABOpen) { + binding.fabLayout1.visibility = View.GONE + binding.fabLayout2.visibility = View.GONE + } + } + + override fun onAnimationCancel(animation: Animator?) {} + + override fun onAnimationRepeat(animation: Animator?) {} + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/cyb3rko/techniklogger/table/ColumnHeaderCell.kt b/app/src/main/java/com/cyb3rko/techniklogger/table/ColumnHeaderCell.kt new file mode 100644 index 0000000..5038b4d --- /dev/null +++ b/app/src/main/java/com/cyb3rko/techniklogger/table/ColumnHeaderCell.kt @@ -0,0 +1,18 @@ +package com.cyb3rko.techniklogger.table + +import com.itextpdf.text.Element +import com.itextpdf.text.Font +import com.itextpdf.text.Phrase +import com.itextpdf.text.pdf.PdfPCell + +class ColumnHeaderCell(title: String) : PdfPCell() { + init { + setPhrase(Phrase( + title, + Font(Font.FontFamily.HELVETICA, 14f, Font.BOLD) + )) + setPadding(8f) + verticalAlignment = Element.ALIGN_MIDDLE + horizontalAlignment = Element.ALIGN_CENTER + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cyb3rko/techniklogger/table/ExportBuilder.kt b/app/src/main/java/com/cyb3rko/techniklogger/table/ExportBuilder.kt new file mode 100644 index 0000000..e0bbcc2 --- /dev/null +++ b/app/src/main/java/com/cyb3rko/techniklogger/table/ExportBuilder.kt @@ -0,0 +1,103 @@ +package com.cyb3rko.techniklogger.table + +import android.content.Context +import android.os.Environment +import android.util.Log +import com.cyb3rko.techniklogger.recycler.ProjectViewState +import com.itextpdf.text.* +import com.itextpdf.text.pdf.PdfPTable +import com.itextpdf.text.pdf.PdfWriter +import com.parse.ParseObject +import com.parse.ParseQuery +import es.dmoral.toasty.Toasty +import java.io.File +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.* + +class ExportBuilder(val myContext: Context, data: MutableList) : Document(PageSize.A4.rotate()) { + private val destination = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/" + private val directory = File(destination) + private val data = data.reversed() + private val table = PdfPTable(4) + private val techniker = mutableListOf>() + private val time = SimpleDateFormat("dd.MM.yyyy, HH:mm", Locale.GERMANY).format(Date()) + + init { + if (!directory.exists()) { + directory.mkdirs() + } + + try { + val file = File(destination, "Arbeitseinsätze Technik - ${time.split(",")[0]}.pdf") + file.createNewFile() + val fOut = FileOutputStream(file, false) + PdfWriter.getInstance(this, fOut) + } catch (e: DocumentException) { + e.printStackTrace() + Log.e("TechnikLogger.Export", e.toString()) + } catch (e: FileNotFoundException) { + e.printStackTrace() + Log.e("TechnikLogger.Export", e.toString()) + } catch (e: IOException) { + e.printStackTrace() + } + + this.setMargins(0f, 0f, 36f, 36f) + table.totalWidth = PageSize.A4.rotate().width + + try { + this.open() + table.addCell(TimeCell(time)) + table.addCell(HeaderCell()) + val columnHeaderTexts = listOf("Datum", "Veranstaltung", "Techniker", "Dauer insgesamt (h)") + repeat(4) { + table.addCell(ColumnHeaderCell(columnHeaderTexts[it])) + } + fetchTechniker(0) + } catch (e: DocumentException) { + e.printStackTrace() + Log.e("TechnikLogger.Export", e.toString()) + } + } + + private fun fetchTechniker(index: Int) { + if (index < data.size) { + val query = ParseQuery.getQuery("Teilnahme") + query.whereEqualTo("an", ParseObject.createWithoutData("Einsatz", data[index].childKey)) + query.include("von") + query.findInBackground { objects, e -> + if (e == null) { + val tempList = mutableListOf() + var aktuellerTechniker: ParseObject + objects.forEach { + aktuellerTechniker = it.getParseObject("von")!! + tempList.add(aktuellerTechniker.getString("name")!!) + } + techniker.add(tempList.sorted()) + fetchTechniker(index + 1) + } + } + } else { + export() + } + } + + private fun export() { + data.forEachIndexed { index, projectEntry -> + val information = listOf( + SimpleDateFormat("dd.MM.yyyy", Locale.GERMANY).format(projectEntry.date), + projectEntry.text, + techniker[index].joinToString("\n"), + projectEntry.duration) + information.forEachIndexed { index2, string -> + table.addCell(NormalCell(string, index2 != 2)) + } + } + this.add(table) + this.close() + Toasty.success(myContext, "Liste in Downloads gespeichert").show() + } +} diff --git a/app/src/main/java/com/cyb3rko/techniklogger/table/HeaderCell.kt b/app/src/main/java/com/cyb3rko/techniklogger/table/HeaderCell.kt new file mode 100644 index 0000000..c124eea --- /dev/null +++ b/app/src/main/java/com/cyb3rko/techniklogger/table/HeaderCell.kt @@ -0,0 +1,22 @@ +package com.cyb3rko.techniklogger.table + +import com.itextpdf.text.BaseColor +import com.itextpdf.text.Element +import com.itextpdf.text.Font +import com.itextpdf.text.Phrase +import com.itextpdf.text.pdf.PdfPCell + +class HeaderCell : PdfPCell() { + init { + setPhrase(Phrase( + "\nAutomatisch erstellt über die Technik-Logger App\n(Entwickler: Niko Diamadis)\n ", + Font(Font.FontFamily.HELVETICA, 12f, Font.BOLD) + )) + borderWidth = 0.2f + borderColor = BaseColor.GRAY + colspan = 4 + rowspan = 3 + verticalAlignment = Element.ALIGN_MIDDLE + horizontalAlignment = Element.ALIGN_CENTER + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cyb3rko/techniklogger/table/NormalCell.kt b/app/src/main/java/com/cyb3rko/techniklogger/table/NormalCell.kt new file mode 100644 index 0000000..cde3dc6 --- /dev/null +++ b/app/src/main/java/com/cyb3rko/techniklogger/table/NormalCell.kt @@ -0,0 +1,18 @@ +package com.cyb3rko.techniklogger.table + +import com.itextpdf.text.Element +import com.itextpdf.text.Font +import com.itextpdf.text.Phrase +import com.itextpdf.text.pdf.PdfPCell + +class NormalCell(title: String, centered: Boolean) : PdfPCell() { + init { + setPhrase(Phrase( + title, + Font(Font.FontFamily.HELVETICA, 13f) + )) + setPadding(6f) + verticalAlignment = Element.ALIGN_MIDDLE + if (centered) horizontalAlignment = Element.ALIGN_CENTER + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cyb3rko/techniklogger/table/TimeCell.kt b/app/src/main/java/com/cyb3rko/techniklogger/table/TimeCell.kt new file mode 100644 index 0000000..84f479f --- /dev/null +++ b/app/src/main/java/com/cyb3rko/techniklogger/table/TimeCell.kt @@ -0,0 +1,23 @@ +package com.cyb3rko.techniklogger.table + +import com.itextpdf.text.BaseColor +import com.itextpdf.text.Element +import com.itextpdf.text.Font +import com.itextpdf.text.Phrase +import com.itextpdf.text.pdf.PdfPCell + +class TimeCell(time: String) : PdfPCell() { + init { + setPhrase(Phrase( + "Erstellung: $time Uhr", + Font(Font.FontFamily.HELVETICA, 12f, Font.BOLD) + )) + setPadding(8f) + borderWidth = 0.2f + borderColor = BaseColor.GRAY + colspan = 4 + rowspan = 3 + verticalAlignment = Element.ALIGN_MIDDLE + horizontalAlignment = Element.ALIGN_CENTER + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/_icon_dot_menu.webp b/app/src/main/res/drawable-v24/_icon_dot_menu.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2e34fef1ee0ef0c41a8a7e8a3af74310b8b31e2 GIT binary patch literal 1558 zcmV+x2I=`yNk&Ev1^@t8MM6+kP&iBi1^@sr|G|F{zoZ~-11A1;?^uXX(6*5qd-wMs z@u{$NLO?`l4=~t*4xj=)N3}FU1%nh+(Lm*k5CRya4hVqawr%Iz?2gLWwvq<3U2C?P zIvA_1=C5OtKL7BT-}`*~-Jjlw{ySpZ#*voS%iKRxZU_G1&ur1 zR8x%`z$9PnNkNLP@Tdwjil)USuaEk`p!iF1QI^0DY=0&$d%6wODL?mBT$jJZTqzIYLQABcgTEd)=Ny$~a1 zmVzZKdc{zKtHF`A!(y!AwP469gRdgvYrv1C{bICt%fXJy7hiBr1H~4px-+ixRzMAjKt7<03c_ofkCiTH@1>~of{Zzdhee@7ph8*{;^HnQDp65v_ z>j486DMS_cR)C#pH{{+5bzi{bh07Ug!r^E)fb5ikk8 zR+OuT=XY0>y93X!O_WQ*^Gk_x1oS-gi*kMN{KiGOF?fEnqTCETzptX)S9pH>AN)Vz z|0Dc2#DCq1|GM)XQSLT8zZy~QJUqWMqTDHXe*BL+`wJL%>is#QngarKh-&R10RQvO z_@8&WASa6D7lHw*dmg$$fo4&x5fq4vVlhx4qO zz=9@Gsvb1hp!I(z)`JI+M5X&6LY1f#1`|}SJ=_B-91?{NfC|2>sFU%53t>?w3N}0u zWgdbK+msDI`ML#ss25dgK#1}oQRIC&7!graeJ+H-iHo8}D@ak+CrZ361uHgv6cs)* zb1L%3M1`YZMyn{$0&4j0iSZr>z>Ug`7%s)nDd;aT|GabgVfJ|^53K}4)*5^nS__V> zcq@h)Tn&~iHMFr5QybGOGxFc)?p1&({uVLKe6t^9Ir2e_^641(vc;(8-)shBOxkzS zrBaY4V#rXm_j|yb@^fFrb-7EGpw1T8=OaAa4Ej{LIwdU~28E(M;*wWKePB`Kp&R>7 zy}t)kTHi2P+(#4j>p-W#-fKl$pmOF)JOECGVolxo-+eFF)ff$eT9vVy_Fw*)+4kya zB{;Tt$EoT&$yD#K^W}>(+?z_?K7VS*BG~`g|Jnc9|Jnc9|Jnc9{}Jum+yOHEqfRd8 zjP_gYa|f{W=MG@;&mF+(pF4ovKX(Ajf9?R*|J(uW|G5M3fAIf=|BvwB5dU>2{_D=R zkK6%lf4KwL#B&F*0_F~2%gi0Xo}N2^fd!}*KgeQQ?f{>UgD+c++I_^^Entjc`%WTF zl_3>~p)h#!cR=m{TV0=z@MsI@6Lobb8kq)sCwkazEdBBL8T3iQ^kEW z*{~jT3hcY?6zi4QtBC+O6^b|a{QkbPyPIM`P-{WFw&Rz7#_6buRf1zncAlxZlT7!0 zyYKwIbn;I1>79#V|7ZVa|7ZVa|7ZVa|7ZV4v~P0<$PSD-`MfhWV71R3z|x;PfW<#| z0IPrQ0CxY}0WANy16coa2eAL=4#5Ax{}cW{!hb{j*PZyUJKH{T2eAF+4qy|{9l#2h zJAf@ScK~~O?f@-fn)zlw$YNUV0H2P5FI$Xi{>^4E#-x2GT`C1>B8Ch_d%p*~`8yzY zfGw`iM|ijy^r>=nN?JM$3PpRw9aQEH5P9gvzEkh-0hQJ_OcwXiMEyF@DX{li(H5wj zxe^b6Q=wQ>cm8+Z%XKwIgP>Mrtfu{!e`dD5I$8;iE#7ge`c5*{JM4V<;tcnulDE&F I+OY_KW;xyUxBvhE literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/_icon_export.webp b/app/src/main/res/drawable/_icon_export.webp new file mode 100644 index 0000000000000000000000000000000000000000..b94c083352538e8afbe272574a6df9ebd19e82b7 GIT binary patch literal 3776 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 - + + + app:layout_constraintEnd_toEndOf="parent" + android:padding="12dp" + android:clipToPadding="false" + android:layout_marginEnd="23dp" + android:gravity="center_vertical" + android:layout_marginBottom="23dp" + android:layout_gravity="bottom|end" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/about-icons.xml b/app/src/main/res/values/about-icons.xml index daeb490..c8408d7 100644 --- a/app/src/main/res/values/about-icons.xml +++ b/app/src/main/res/values/about-icons.xml @@ -12,6 +12,18 @@ https://www.flaticon.com/free-icon/calendar_609356 + + Those Icons + flaticon.com + https://www.flaticon.com/free-icon/menu_2089793 + + + + Freepik + flaticon.com + https://www.flaticon.com/premium-icon/export_2356643 + + Freepik flaticon.com diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 31e916b..9ea5c8c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -4,4 +4,5 @@ #055A9C @color/colorPrimary #FFFFFF + #92000000 \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 125df87..0f2b1c1 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,3 +1,6 @@ 16dp + + 60dp + 120dp \ No newline at end of file