diff --git a/README.md b/README.md index 3fc7dcdb1bd313855270d9a1c2b0bb22361e3627..3c99d1e37396256da9fe1e5a74796a68868ecea1 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,61 @@ # IF3210-2024-Android-EXE +Aplikasi manajemen keuangan sederhana yang memungkinkan pengguna untuk mencatat, mengelola, dan menganalisis transaksi keuangan mereka. Pengguna dapat dengan mudah melakukan berbagai tindakan terkait keuangan, mulai dari mencatat transaksi hingga melihat rangkuman grafik transaksi. Aplikasi ini menggunakan SDK Android minimum versi 29 (Android 10), dengan SDK target versi 34. Selain itu, aplikasi ini dikompilasi dengan Java 1.8 dan menggunakan Kotlin sebagai bahasa utama pengembangan. +## Library +#### MPAndroidChart v3.1.0 +Library ini digunakan untuk membuat grafik, termasuk pie chart, dalam aplikasi Android. +#### Apache POI 5.2.5 +Apache POI digunakan untuk menyimpan file dalam format Excel (xls/xlsx) dari aplikasi. -## Getting started +#### JUnit 4.13.2 +framework pengujian unit untuk Java. Digunakan untuk menulis dan menjalankan unit test dalam pengembangan aplikasi. -To make it easy for you to get started with GitLab, here's a list of recommended next steps. +#### Espresso Core 3.5.1 +Espresso Core merupakan bagian dari AndroidX Test yang digunakan untuk menulis dan menjalankan tes otomatis antarmuka pengguna (UI) dalam pengembangan aplikasi Android. -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! +#### Room 2.6.1 +Room yaitu library persistence layer yang digunakan untuk mengakses basis data SQLite dengan lebih mudah dalam pengembangan aplikasi Android. -## Add your files +#### Retrofit 2.9.0 +library HTTP client yang digunakan untuk mengonsumsi layanan web RESTful dalam pengembangan aplikasi Android. -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: +#### CameraX 1.3.2 +library yang mempermudah pengembangan aplikasi Android yang menggunakan kamera. Digunakan untuk pemindaian (scan) dalam aplikasi. -``` -cd existing_repo -git remote add origin https://gitlab.informatika.org/if3210-2024-exe/if3210-2024-android-exe.git -git branch -M main -git push -uf origin main -``` +## Screenshot + -## Integrate with your tools -- [ ] [Set up project integrations](https://gitlab.informatika.org/if3210-2024-exe/if3210-2024-android-exe/-/settings/integrations) + -## Collaborate with your team + -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + -## Test and Deploy + -Use the built-in continuous integration in GitLab. + -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) +## Pembagian Tugas +| Spesifikasi | Christo | Haikal | Haidar | +| :---: | :---: | :---: | :---: | +| Header dan Navbar | ✔ | | | +| Login - Halaman Login | | | ✔ | +| Logout - Halaman Pengaturan | | | ✔ | +| Melakukan CRUD Transaksi | ✔ | | | +| Melihat Daftar Transaksi yang Sudah Dilakukan | ✔ | | | +| Melakukan Scan Nota | ✔ | | | +| Melihat Graf Rangkuman Transaksi | ✔ | | | +| Menyimpan Daftar Transaksi dalam Format .xlsx, .xls | ✔ | | | +| Intent GMail | | ✔ | ✔ | +| Mengecek expiry JWT | | | ✔ | +| Deteksi Sinyal | | | ✔ | +| Randomize Transaksi dari Pengaturan | ✔ | | ✔ | -*** +## Jumlah jam persiapan dan pengerjaan +| Jenis | Christo | Haikal | Haidar | +| :---: | :---: | :---: | :---: | +| Persiapan | | 15 | | +| Pengerjaan | | 3 | | -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README - -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/app/src/main/java/pbd/tubes/exe_android/ui/login/LoginActivity.kt b/app/src/main/java/pbd/tubes/exe_android/ui/login/LoginActivity.kt index c899832b1cb996acbfb35b4ebe92d5f568f23b2b..bd2a52d6fef0ea4ee9e5e2b648fa6b4e2bf04e18 100644 --- a/app/src/main/java/pbd/tubes/exe_android/ui/login/LoginActivity.kt +++ b/app/src/main/java/pbd/tubes/exe_android/ui/login/LoginActivity.kt @@ -51,11 +51,12 @@ class LoginActivity : AppCompatActivity() { passwordEditText = findViewById(R.id.passwordEditText) loginButton.setOnClickListener { -// val email = emailEditText.text.toString() -// val password = passwordEditText.text.toString() - val email = "1@std.stei.itb.ac.id" - val password = "password_1" + val email = emailEditText.text.toString() + val password = passwordEditText.text.toString() +// val email = "1@std.stei.itb.ac.id" +// val password = "password_1" val loginRequest = LoginRequest(email, password) + saveEmail(email) login(loginRequest) } @@ -112,6 +113,11 @@ class LoginActivity : AppCompatActivity() { sharedPreferences.edit().putLong("expiration_time", expirationTime).apply() } + private fun saveEmail(email: String) { + val sharedPreferences = getSharedPreferences("user_session", MODE_PRIVATE) + sharedPreferences.edit().putString("email", email).apply() + } + private fun showNoInternetPopup() { AlertDialog.Builder(this) .setTitle("No Internet Connection") diff --git a/app/src/main/java/pbd/tubes/exe_android/ui/scan/ScanFragment.kt b/app/src/main/java/pbd/tubes/exe_android/ui/scan/ScanFragment.kt index 1fa15afc16f4f210841ab0a2747cd8311e43bf68..1907e80bf1ef5b579199a908676967b9a51ca8e8 100644 --- a/app/src/main/java/pbd/tubes/exe_android/ui/scan/ScanFragment.kt +++ b/app/src/main/java/pbd/tubes/exe_android/ui/scan/ScanFragment.kt @@ -5,6 +5,8 @@ import android.content.ContentValues import android.content.Context import android.content.Context.MODE_PRIVATE import android.content.pm.PackageManager +import android.net.ConnectivityManager +import android.net.NetworkCapabilities import android.net.Uri import android.os.Bundle import android.provider.MediaStore @@ -87,17 +89,27 @@ class ScanFragment : Fragment() { ): View { _binding = FragmentScanBinding.inflate(inflater, container, false) + val root: View = binding.root - if (allPermissionsGranted()) { - startCamera() - } else { - requestPermissions() + if (!isNetworkAvailable()) { + isCameraExecutor = false + return inflater.inflate(R.layout.layout_no_internet_connection, container, false) + } + + else { + if (allPermissionsGranted()) { + startCamera() + } else { + requestPermissions() + } + + binding.imageCaptureButton.setOnClickListener { takePhoto() } + binding.pickImageButton.setOnClickListener{ imageChooser() } + cameraExecutor = Executors.newSingleThreadExecutor() + isCameraExecutor = true + return root } - binding.imageCaptureButton.setOnClickListener { takePhoto() } - binding.pickImageButton.setOnClickListener{ imageChooser() } - cameraExecutor = Executors.newSingleThreadExecutor() - return root } // Function to get the actual file path from URI fun getPathFromUri(context: Context, uri: Uri): String? { @@ -140,12 +152,17 @@ class ScanFragment : Fragment() { imagePart) if (uploadResponse.isSuccessful) { Log.d("MyApp", "Succeeded receiving response, adding transaction") + Toast.makeText(requireContext(), + "Adding transaction(s)...", + Toast.LENGTH_SHORT).show() } else { Log.d("MyApp", "Receiving response failed, ${uploadResponse.message()}") } Log.d("MyApp", uploadResponse.body()?.items?.items.toString()) viewModel.submitTransactions(uploadResponse.body()?.items?.items!!) - + Toast.makeText(requireContext(), + "Transaction(s) has been added", + Toast.LENGTH_SHORT).show() } catch (e : Exception) { Log.e("MyApp", "jir exception: $e") } @@ -322,9 +339,22 @@ class ScanFragment : Fragment() { override fun onDestroyView() { super.onDestroyView() _binding = null - cameraExecutor.shutdown() + if (isCameraExecutor) { + cameraExecutor.shutdown() + } } + + private fun isNetworkAvailable(): Boolean { + val connectivityManager = requireContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || + capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || + capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) + } + companion object { + private var isCameraExecutor :Boolean = false private const val BASE_URL = "https://pbd-backend-2024.vercel.app" private const val TAG = "MyApp" private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS" diff --git a/app/src/main/java/pbd/tubes/exe_android/ui/settings/SettingsFragment.kt b/app/src/main/java/pbd/tubes/exe_android/ui/settings/SettingsFragment.kt index 8fb01230815f1357eda374e56cf29b5ea1d4e06c..37d02fe259653972d841e0dc66ec87655d792802 100644 --- a/app/src/main/java/pbd/tubes/exe_android/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/pbd/tubes/exe_android/ui/settings/SettingsFragment.kt @@ -1,5 +1,6 @@ package pbd.tubes.exe_android.ui.settings +import android.content.Context import android.content.Context.MODE_PRIVATE import android.content.Intent import android.os.Bundle @@ -51,11 +52,51 @@ class SettingsFragment : Fragment() { } binding.confirmSaveButton.setOnClickListener{ when (binding.radioFormat.checkedRadioButtonId){ - R.id.xls_choice -> viewModel.saveXLS() - R.id.xlsx_choice -> viewModel.saveXLSX() + R.id.xls_choice -> { + viewModel.saveXLS() + Log.d("MasukXLS2", "XLS2") + } + R.id.xlsx_choice -> { + viewModel.saveXLSX() + Log.d("MasukXLSX2", "XLSX2") + } } Toast.makeText(requireContext(), "File is saved", Toast.LENGTH_SHORT).show() } + binding.sendButtonToggle.setOnCheckedChangeListener{ _, isChecked -> + if (isChecked){ + binding.formatSendTransaksi.visibility = View.VISIBLE + binding.radioFormat2.visibility = View.VISIBLE + binding.confirmSendButton.visibility = View.VISIBLE + } else{ + binding.formatSendTransaksi.visibility = View.GONE + binding.radioFormat2.visibility = View.GONE + binding.confirmSendButton.visibility = View.GONE + } + } + + val sharedPreferences = requireContext().getSharedPreferences("user_session", Context.MODE_PRIVATE) + val email = sharedPreferences.getString("email", "") ?: "" + val subject = "Daftar Transaksi" + val text = "List Transaksi yang telah dilakukan" + + binding.confirmSendButton.setOnClickListener{ + when (binding.radioFormat2.checkedRadioButtonId){ + R.id.xls_choice_send -> { + + viewModel.saveXLS() + sendTransactionsViaEmail(email, subject, text, "xls") + Log.d("MasukXLS", "XLS") + + } + R.id.xlsx_choice_send -> { + viewModel.saveXLSX() + sendTransactionsViaEmail(email, subject, text, "xlsx") + Log.d("MasukXLSX", "XLSX") + } + } + Toast.makeText(requireContext(), "Going to email", Toast.LENGTH_SHORT).show() + } return root } @@ -68,15 +109,15 @@ class SettingsFragment : Fragment() { } } - val sendButton = view.findViewById<Button>(R.id.send_button) - sendButton.setOnClickListener { - val email = "13521025@std.stei.itb.ac.id" - val subject = "Transaction Details" - val text = "Please find attached the transaction details." - - sendTransactionsViaEmail(email, subject, text) - - } +// val sendButton = view.findViewById<Button>(R.id.confirm_send_button) +// sendButton.setOnClickListener { +// val email = "13521025@std.stei.itb.ac.id" +// val subject = "Transaction Details" +// val text = "Please find attached the transaction details." +// +// sendTransactionsViaEmail(email, subject, text) +// +// } val randomize = view.findViewById<Button>(R.id.randomize_button) randomize.setOnClickListener { @@ -118,10 +159,10 @@ class SettingsFragment : Fragment() { requireActivity().finish() } - private fun sendTransactionsViaEmail(email: String, subject: String, text: String) { + private fun sendTransactionsViaEmail(email: String, subject: String, text: String, filetype: String) { val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) - val filePath = File(downloadsDir, "daftar_transaksi.xlsx") + val filePath = File(downloadsDir, "daftar_transaksi.$filetype") val fileUri = FileProvider.getUriForFile( requireContext(), requireContext().applicationContext.packageName + ".provider", diff --git a/app/src/main/res/drawable/no_internet.xml b/app/src/main/res/drawable/no_internet.xml new file mode 100644 index 0000000000000000000000000000000000000000..a32d766d3d6e48674e1b82dfb283bb85c8b24508 --- /dev/null +++ b/app/src/main/res/drawable/no_internet.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FF0000" + android:pathData="M0 0h24v24H0V0z" + android:fillAlpha="0.0"/> + <path + android:fillColor="#FF0000" + android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM11 7h2v7h-2zm0 8h2v2h-2z"/> +</vector> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 86f2a2300f62f6e866cfcb80082a1f66526f7028..7cafb3744b0d4704f7766ef5d16c84d6a3f6704e 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -53,6 +53,7 @@ android:layout_height="wrap_content" android:text=".xlsx"/> </RadioGroup> + <Button android:id="@+id/confirm_save_button" android:layout_width="wrap_content" @@ -66,19 +67,66 @@ android:visibility="gone" /> - <Button - android:id="@+id/send_button" - style="@style/Widget.Material3.Button" - android:textAppearance="@style/TextAppearance.AppCompat.Medium" - android:backgroundTint="@color/gray_200" + + <ToggleButton + android:id="@+id/send_button_toggle" android:textColor="@android:color/black" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:text="Kirim daftar transaksi" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="@+id/save_button" - app:layout_constraintTop_toBottomOf="@+id/confirm_save_button" /> + android:textOn="Kirim daftar transaksi" + android:textOff="Kirim daftar transaksi" + app:layout_constraintEnd_toEndOf="@id/save_button" + app:layout_constraintStart_toStartOf="@id/save_button" + app:layout_constraintTop_toBottomOf="@id/confirm_save_button" /> + + <TextView + android:id="@+id/format_send_transaksi" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Format Kirim transaksi:" + app:layout_constraintTop_toBottomOf="@id/send_button_toggle" + app:layout_constraintLeft_toLeftOf="@id/send_button_toggle" + app:layout_constraintRight_toRightOf="@id/send_button_toggle" + app:layout_constraintHorizontal_bias="0.15" + android:visibility="gone" + /> + + <RadioGroup + android:id="@+id/radio_format2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="start" + app:layout_constraintLeft_toLeftOf="@id/format_send_transaksi" + app:layout_constraintRight_toRightOf="@id/format_send_transaksi" + app:layout_constraintTop_toBottomOf="@id/format_send_transaksi" + android:orientation="vertical" + app:layout_constraintHorizontal_bias="0.15" + android:visibility="gone" + > + <RadioButton + android:id="@+id/xls_choice_send" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text=".xls"/> + <RadioButton + android:id="@+id/xlsx_choice_send" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text=".xlsx"/> + </RadioGroup> + + <Button + android:id="@+id/confirm_send_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="300dp" + style="@style/Widget.Material3.Button" + android:textAppearance="@style/TextAppearance.AppCompat.Medium" + android:text="SEND" + app:layout_constraintLeft_toLeftOf="@id/radio_format2" + app:layout_constraintTop_toBottomOf="@id/radio_format2" + android:visibility="gone" + /> <Button android:id="@+id/randomize_button" @@ -92,7 +140,7 @@ android:text="Randomize transaksi" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/save_button" - app:layout_constraintTop_toBottomOf="@+id/send_button" /> + app:layout_constraintTop_toBottomOf="@+id/confirm_send_button" /> <Button android:id="@+id/log_out_button" @@ -104,7 +152,8 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Keluar" - app:layout_constraintEnd_toEndOf="@+id/send_button" - app:layout_constraintStart_toStartOf="@+id/send_button" + app:layout_constraintEnd_toEndOf="@+id/send_button_toggle" + app:layout_constraintStart_toStartOf="@+id/send_button_toggle" app:layout_constraintTop_toBottomOf="@+id/randomize_button" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_no_internet_connection.xml b/app/src/main/res/layout/layout_no_internet_connection.xml new file mode 100644 index 0000000000000000000000000000000000000000..73f5b5cc673c492f4ddd09f26dee0ea508cdf552 --- /dev/null +++ b/app/src/main/res/layout/layout_no_internet_connection.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:gravity="center"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/no_internet" + android:layout_marginBottom="16dp"/> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/no_internet_connection" + android:textSize="18sp" + android:textColor="@android:color/black"/> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2142b2877ac9f18fc59aa115acf9bcce18c8b566..b5eacfb6c2b0bafa704cdf540dec74ff47e09e50 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,4 +16,5 @@ <string name="take_picture">Take Picture</string> <string name="pick_picture">Pick picture</string> <string name="photo_preview">Photo Preview</string> + <string name="no_internet_connection">No internet connection</string> </resources> \ No newline at end of file diff --git a/screenshot/Screenshot 2024-04-05 160205.png b/screenshot/Screenshot 2024-04-05 160205.png new file mode 100644 index 0000000000000000000000000000000000000000..87b84be7b136b169a6a4c482921047343ee705a6 Binary files /dev/null and b/screenshot/Screenshot 2024-04-05 160205.png differ diff --git a/screenshot/Screenshot 2024-04-05 160341.png b/screenshot/Screenshot 2024-04-05 160341.png new file mode 100644 index 0000000000000000000000000000000000000000..26cef9b286427ceb86137574cf0e5fbf2e72844d Binary files /dev/null and b/screenshot/Screenshot 2024-04-05 160341.png differ diff --git a/screenshot/Screenshot 2024-04-05 160444.png b/screenshot/Screenshot 2024-04-05 160444.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5b102795e7ddcb83a8cc5b0517eccc6abced10 Binary files /dev/null and b/screenshot/Screenshot 2024-04-05 160444.png differ diff --git a/screenshot/Screenshot 2024-04-05 160500.png b/screenshot/Screenshot 2024-04-05 160500.png new file mode 100644 index 0000000000000000000000000000000000000000..a08a81a15b54e83d5280ee3ba96677250e101755 Binary files /dev/null and b/screenshot/Screenshot 2024-04-05 160500.png differ diff --git a/screenshot/Screenshot 2024-04-05 160518.png b/screenshot/Screenshot 2024-04-05 160518.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7559ef11035c653a1f8a18735f703069bbbbab Binary files /dev/null and b/screenshot/Screenshot 2024-04-05 160518.png differ diff --git a/screenshot/Screenshot 2024-04-05 160555.png b/screenshot/Screenshot 2024-04-05 160555.png new file mode 100644 index 0000000000000000000000000000000000000000..420b24024b8841baac21c4d9762f43f88301b169 Binary files /dev/null and b/screenshot/Screenshot 2024-04-05 160555.png differ