From 726cdf0faeebd231ae159e3c108f826ef1db07a7 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Tue, 14 May 2019 18:48:33 +0900 Subject: [PATCH] Bug fixed --- .idea/misc.xml | 2 +- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 2 - .../java/xyz/quaver/pupil/MainActivity.kt | 110 ++++------------ .../java/xyz/quaver/pupil/ReaderActivity.kt | 13 +- .../java/xyz/quaver/pupil/SettingsActivity.kt | 124 ++++++++++++++++++ .../main/java/xyz/quaver/pupil/types/Tags.kt | 96 ++++++++++++++ .../main/java/xyz/quaver/pupil/util/update.kt | 9 -- app/src/main/res/drawable-anydpi/ic_email.xml | 10 ++ app/src/main/res/drawable-anydpi/ic_help.xml | 10 ++ app/src/main/res/drawable-hdpi/ic_email.png | Bin 0 -> 325 bytes app/src/main/res/drawable-hdpi/ic_help.png | Bin 0 -> 571 bytes app/src/main/res/drawable-mdpi/ic_email.png | Bin 0 -> 235 bytes app/src/main/res/drawable-mdpi/ic_help.png | Bin 0 -> 345 bytes app/src/main/res/drawable-xhdpi/ic_email.png | Bin 0 -> 383 bytes app/src/main/res/drawable-xhdpi/ic_help.png | Bin 0 -> 676 bytes app/src/main/res/drawable-xxhdpi/ic_email.png | Bin 0 -> 550 bytes app/src/main/res/drawable-xxhdpi/ic_help.png | Bin 0 -> 1000 bytes .../main/res/layout/dialog_default_query.xml | 111 ++++++++++++++++ .../main/res/menu/activity_main_drawer.xml | 17 +++ app/src/main/res/values-ja/strings.xml | 12 +- app/src/main/res/values-ko/strings.xml | 10 ++ app/src/main/res/values/strings.xml | 15 +++ app/src/main/res/xml/root_preferences.xml | 2 +- 24 files changed, 444 insertions(+), 103 deletions(-) create mode 100644 app/src/main/java/xyz/quaver/pupil/types/Tags.kt create mode 100644 app/src/main/res/drawable-anydpi/ic_email.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_help.xml create mode 100644 app/src/main/res/drawable-hdpi/ic_email.png create mode 100644 app/src/main/res/drawable-hdpi/ic_help.png create mode 100644 app/src/main/res/drawable-mdpi/ic_email.png create mode 100644 app/src/main/res/drawable-mdpi/ic_help.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_email.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_help.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_email.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_help.png create mode 100644 app/src/main/res/layout/dialog_default_query.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 84da703c..7631aec3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a0141594..64729574 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "xyz.quaver.pupil" minSdkVersion 16 targetSdkVersion 28 - versionCode 3 - versionName "1.2" + versionCode 4 + versionName "1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2a9ea385..0e380367 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,8 +3,6 @@ package="xyz.quaver.pupil"> - - >>() private var query = "" @@ -67,8 +57,6 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) - checkPermission() - checkUpdate() main_appbar_layout.addOnOffsetChangedListener( @@ -99,17 +87,33 @@ class MainActivity : AppCompatActivity() { CoroutineScope(Dispatchers.Main).launch { main_drawer_layout.closeDrawers() - cancelFetch() - clearGalleries() when(it.itemId) { R.id.main_drawer_home -> { + cancelFetch() + clearGalleries() query = query.replace("HISTORY", "") fetchGalleries(query) } R.id.main_drawer_history -> { + cancelFetch() + clearGalleries() query += "HISTORY" fetchGalleries(query) } + R.id.main_drawer_help -> { + + } + R.id.main_drawer_github -> { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.github)))) + } + R.id.main_drawer_homepage -> { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.home_page)))) + } + R.id.main_drawer_email -> { + AlertDialog.Builder(this@MainActivity).apply { + + }.show() + } } loadBlocks() } @@ -142,23 +146,6 @@ class MainActivity : AppCompatActivity() { super.onResume() } - private fun checkPermission() { - val permissions = arrayOf( - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) - - if (permissions.any { ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED }) { - if (permissions.any { ActivityCompat.shouldShowRequestPermissionRationale(this, it) }) - AlertDialog.Builder(this).apply { - setTitle(R.string.warning) - setMessage(R.string.permission_explain) - setPositiveButton(android.R.string.ok) { _, _ -> } - }.show() - else - ActivityCompat.requestPermissions(this, permissions, permissionRequestCode) - } - } - private fun checkUpdate() { fun extractReleaseNote(update: JsonObject, locale: String) : String { @@ -179,7 +166,7 @@ class MainActivity : AppCompatActivity() { val result = StringBuilder() - for(line in markdown.split('\n')) { + for(line in markdown.lines()) { if (releaseNote.matches(line)) { releaseNoteFlag = true continue @@ -203,57 +190,16 @@ class MainActivity : AppCompatActivity() { return getString(R.string.update_release_note, update["tag_name"]?.content, result.toString()) } - if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) - return - CoroutineScope(Dispatchers.Default).launch { val update = checkUpdate(getString(R.string.release_url), BuildConfig.VERSION_NAME) ?: return@launch - val (url, fileName) = getApkUrl(update, getString(R.string.release_name)) ?: return@launch - val dialog = AlertDialog.Builder(this@MainActivity).apply { setTitle(R.string.update_title) val msg = extractReleaseNote(update, Locale.getDefault().language) setMessage(Markwon.create(context).toMarkdown(msg)) setPositiveButton(android.R.string.yes) { _, _ -> - Toast.makeText( - context, getString(R.string.update_download_started), Toast.LENGTH_SHORT - ).show() - - val dest = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName) - val desturi = - FileProvider.getUriForFile( - applicationContext, - "xyz.quaver.pupil.provider", - dest - ) - - if (dest.exists()) - dest.delete() - - val request = DownloadManager.Request(Uri.parse(url)).apply { - setDescription(getString(R.string.update_notification_description)) - setTitle(getString(R.string.app_name)) - setDestinationUri(Uri.fromFile(dest)) - setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE) - } - - val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager - val id = manager.enqueue(request) - - registerReceiver(object: BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - val install = Intent(Intent.ACTION_VIEW).apply { - flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_GRANT_READ_URI_PERMISSION - setDataAndType(desturi, manager.getMimeTypeForDownloadedFile(id)) - } - - startActivity(install) - unregisterReceiver(this) - finish() - } - }, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.home_page)))) } setNegativeButton(android.R.string.no) { _, _ ->} } @@ -404,9 +350,11 @@ class MainActivity : AppCompatActivity() { if (query != this@MainActivity.query) { this@MainActivity.query = query - cancelFetch() - clearGalleries() - fetchGalleries(query) + CoroutineScope(Dispatchers.Main).launch { + cancelFetch() + clearGalleries() + fetchGalleries(query) + } } } }) diff --git a/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt index 260d8bdc..80471c11 100644 --- a/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ReaderActivity.kt @@ -1,6 +1,7 @@ package xyz.quaver.pupil import android.os.Bundle +import android.util.Log import android.view.* import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity @@ -112,13 +113,13 @@ class ReaderActivity : AppCompatActivity() { when(item?.itemId) { R.id.reader_menu_page_indicator -> { val view = LayoutInflater.from(this).inflate(R.layout.dialog_numberpicker, findViewById(android.R.id.content), false) + with(view.reader_dialog_number_picker) { + minValue=1 + maxValue=gallerySize + value=currentPage + } val dialog = AlertDialog.Builder(this).apply { setView(view) - with(view.reader_dialog_number_picker) { - minValue=1 - maxValue=gallerySize - value=currentPage - } }.create() view.reader_dialog_ok.setOnClickListener { (reader_recyclerview.layoutManager as LinearLayoutManager?)?.scrollToPositionWithOffset(view.reader_dialog_number_picker.value-1, 0) @@ -182,7 +183,7 @@ class ReaderActivity : AppCompatActivity() { reader_recyclerview.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) } - (reader_recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage, 0) + (reader_recyclerview.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(currentPage-1, 0) preferences.edit().putBoolean("reader_one_by_one", !oneByOne).apply() diff --git a/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt index d5c301ce..1640e5d5 100644 --- a/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/SettingsActivity.kt @@ -2,12 +2,22 @@ package xyz.quaver.pupil import android.os.Bundle import android.preference.PreferenceManager +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater import android.view.MenuItem +import android.view.View import android.view.WindowManager +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import kotlinx.android.synthetic.main.dialog_default_query.* +import kotlinx.android.synthetic.main.dialog_default_query.view.* +import xyz.quaver.pupil.types.Tags import xyz.quaver.pupil.util.Histories import java.io.File @@ -109,6 +119,120 @@ class SettingsActivity : AppCompatActivity() { true } } + + with(findPreference("default_query")) { + this ?: return@with + + val preferences = PreferenceManager.getDefaultSharedPreferences(context) + + summary = preferences.getString("default_query", "") ?: "" + + val languages = resources.getStringArray(R.array.languages).map { + it.split("|").let { split -> + Pair(split[0], split[1]) + } + }.toMap() + val reverseLanguages = languages.entries.associate { (k, v) -> v to k } + + val excludeBL = "-male:yaoi" + val excludeGuro = listOf("-female:guro", "-male:guro") + + setOnPreferenceClickListener { + val dialogView = LayoutInflater.from(context).inflate( + R.layout.dialog_default_query, + null + ) + + val tags = Tags.parse( + preferences.getString("default_query", "") ?: "" + ) + + summary = tags.toString() + + with(dialogView.default_query_dialog_language_selector) { + adapter = + ArrayAdapter( + context, + android.R.layout.simple_spinner_dropdown_item, + arrayListOf( + getString(R.string.default_query_dialog_language_selector_none) + ).apply { + addAll(languages.values) + } + ) + if (tags.any { it.area == "language" }) { + val tag = languages[tags.first { it.area == "language" }.tag] + if (tag != null) { + setSelection( + (adapter as ArrayAdapter).getPosition(tag) + ) + tags.removeByArea("language") + } + } + } + + with(dialogView.default_query_dialog_BL_checkbox) { + isChecked = tags.contains(excludeBL) + if (tags.contains(excludeBL)) + tags.remove(excludeBL) + } + + with(dialogView.default_query_dialog_guro_checkbox) { + isChecked = excludeGuro.all { tags.contains(it) } + if (excludeGuro.all { tags.contains(it) }) + excludeGuro.forEach { + tags.remove(it) + } + } + + with(dialogView.default_query_dialog_edittext) { + setText(tags.toString(), TextView.BufferType.EDITABLE) + addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + + override fun afterTextChanged(s: Editable?) { + s ?: return + + if (s.any { it.isUpperCase() }) + s.replace(0, s.length, s.toString().toLowerCase()) + } + }) + } + + val dialog = AlertDialog.Builder(context!!).apply { + setView(dialogView) + }.create() + + dialogView.default_query_dialog_ok.setOnClickListener { + val newTags = Tags.parse(dialogView.default_query_dialog_edittext.text.toString()) + + with(dialogView.default_query_dialog_language_selector) { + if (selectedItemPosition != 0) + newTags.add("language:${reverseLanguages[selectedItem]}") + } + + if (dialogView.default_query_dialog_BL_checkbox.isChecked) + newTags.add(excludeBL) + + if (dialogView.default_query_dialog_guro_checkbox.isChecked) + excludeGuro.forEach { tag -> + newTags.add(tag) + } + + preferenceManager.sharedPreferences.edit().putString("default_query", newTags.toString()).apply() + summary = preferences.getString("default_query", "") ?: "" + tags.clear() + tags.addAll(newTags) + dialog.dismiss() + } + + dialog.show() + + true + } + } } } diff --git a/app/src/main/java/xyz/quaver/pupil/types/Tags.kt b/app/src/main/java/xyz/quaver/pupil/types/Tags.kt new file mode 100644 index 00000000..7abc6c97 --- /dev/null +++ b/app/src/main/java/xyz/quaver/pupil/types/Tags.kt @@ -0,0 +1,96 @@ +package xyz.quaver.pupil.types + +data class Tag(val area: String?, val tag: String, val isNegative: Boolean = false) { + companion object { + fun parseTag(tag: String) : Tag { + if (tag.first() == '-') { + tag.substring(1).split(Regex(":"), 2).let { + return when(it.size) { + 2 -> Tag(it[0], it[1], true) + else -> Tag(null, tag, true) + } + } + } + tag.split(Regex(":"), 2).let { + return when(it.size) { + 2 -> Tag(it[0], it[1]) + else -> Tag(null, tag) + } + } + } + } + + override fun toString(): String { + return (if (isNegative) "-" else "") + when(area) { + null -> tag + else -> "$area:$tag" + } + } + + override fun equals(other: Any?): Boolean { + if (other !is Tag) + return false + + if (other.area == area && other.tag == tag) + return true + + return false + } + + override fun hashCode(): Int { + return super.hashCode() + } +} + +class Tags(tag: List?) : ArrayList() { + + companion object { + fun parse(tags: String) : Tags { + return Tags( + tags.split(' ').map { + if (it.isNotEmpty()) + Tag.parseTag(it) + else + null + } + ) + } + } + + init { + tag?.forEach { + if (it != null) + add(it) + } + } + + fun contains(element: String): Boolean { + forEach { + if (it.toString() == element) + return true + } + + return false + } + + fun add(element: String): Boolean { + return super.add(Tag.parseTag(element)) + } + + fun remove(element: String) { + filter { it.toString() == element }.forEach { + remove(it) + } + } + + fun removeByArea(area: String) { + filter { it.area == area }.forEach { + remove(it) + } + } + + override fun toString(): String { + return joinToString(" ") { it.toString() } + } + +} \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/util/update.kt b/app/src/main/java/xyz/quaver/pupil/util/update.kt index e5037094..b25e03e0 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -18,14 +18,5 @@ fun checkUpdate(url: String, currentVersion: String) : JsonObject? { if (currentVersion != releases[0].jsonObject["tag_name"]?.content) return releases[0].jsonObject - return null -} - -fun getApkUrl(releases: JsonObject, releaseName: String) : Pair? { - releases["assets"]?.jsonArray?.forEach { - if (Regex(releaseName).matches(it.jsonObject["name"]?.content ?: "")) - return Pair(it.jsonObject["browser_download_url"]?.content, it.jsonObject["name"]?.content) - } - return null } \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_email.xml b/app/src/main/res/drawable-anydpi/ic_email.xml new file mode 100644 index 00000000..4163eb94 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_email.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_help.xml b/app/src/main/res/drawable-anydpi/ic_help.xml new file mode 100644 index 00000000..785b2478 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_help.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable-hdpi/ic_email.png b/app/src/main/res/drawable-hdpi/ic_email.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf75e2a23a6e2bdbc6b1df2bb793c005ec79f8d GIT binary patch literal 325 zcmV-L0lNN)P)1ROvpT-zuM;pjaoDMQFGHRiNL(p+Mz7Tpi01kSJ&q2Ro z3V~7Q52PQ_zyXh-X2ZpZauA4bZEej9)Z7o`|Dl3I{(#H^nF+OvC(&EUT;CgB(wy2Paxmq8y)t{t}xgu_Ssz^8cyrAiNu4^P)QhsLG1k?IglEVTAH~+MMZ@jXi*u^!k0k&pGf=? zqz9yzs*V8~8Vof2Aqfsa#}7efP{S>ZK*O4W_#Xw1fnkst%^)+$b__5bEGJ;e51`Mt z1LACL9#G*6e1-r+K?W&Wj$l!91S#}n2xN*EcneRU0vjT-ZxhgG z^&pHRM}2~sr>(8cMud4b_#D(tX?X*5=uwz?W@cuJMCj?p=b(KQI_Mj68UpgmiO{nT zpM!2t;F#|~?1mINYC!&bBJ|zB=b%qyI_3{BM|r`_F)%Pt0E#^zQtu~PIH(q8hN-Ek z1dxB11ihcA9c6DVEiE}INQXD5ny5kb7Ft0`s)zPbJKMJ->CYlVe>bHCBRbv>D=2}X zwTBG-HWXDIRK_m|wz~;cuGGZDRIbD{KX67Fv=>5jJDaHH2aydlWM9@J>8mHUeNA)& zjo2nEB@QCF2}?pFpX4YbyOBQ_yFr7pqc}Lb(t~oaVH6A&002C;3NZ7~JIw$9002ov JPDHLkV1mHy;A#K> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_email.png b/app/src/main/res/drawable-mdpi/ic_email.png new file mode 100644 index 0000000000000000000000000000000000000000..d305e58426fe08ed3ac5bcef5e7ac408d44062b3 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjn><|{Ln>}1CrGe1vq?xw?v$36 zwr6|vU*yqohs`zyIt*TSmNz{#_`@-qwcc@(nwr`_1=c4LTvxfDJ>J4_WZSlF&seqI zv48q6koZAKw8Ufjg2Gshn*8N9$&s0u#OS4^Xf}0XGNWfjMbwA-6VV?!mbJ>R j=vbOrXv@XM!@yAX;`-d%Z-cpku4nLc^>bP0l+XkKg>F?d literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_help.png b/app/src/main/res/drawable-mdpi/ic_help.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b8c6361eec33dc23a10089301c0209cc91f4d2 GIT binary patch literal 345 zcmV-f0jBQhsZ$ZUEL2Ae{+{nl%5UBY!5dSBDZ-dm5Vm1>{Lnjdi zqhOF8kY0kO1HImb#ehdZ@kmosQwb0Tu|ZOgvl2^Mt2A6r^l3Zbh7iGk#>_#_Zt zgx<#DstBm%9#8`xgV<2tMqrB*tPu}Q5g1`>XlN(}l}8SeM<6kf9F8~%#b&`05+aq5 z1xv75aDzz0e*=TY9~x{0IMm$0X2B;S4F3znQBc=g0@+`2sQW~&1rwl=s{>?zz@zRH zSwRFeSRHD?9s+7_kQK?Hp`pxBwO4dozcj^w{e!RIEo55Msf_kLNAb< r!j32l2o`p9DX!^J;n1hb95Mg^d??g#e>GYd00000NkvXXu0mjfUn7IO literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_email.png b/app/src/main/res/drawable-xhdpi/ic_email.png new file mode 100644 index 0000000000000000000000000000000000000000..6854119df81638c05dcd1dbcf20c81158dbadfcb GIT binary patch literal 383 zcmV-_0f7FAP)|S0Q0CP!_ETOYKT-PHQuW>9Kv-M*R&?yK4NQJpY^Er+o z_|XQq%N|J6bOHGt#FfxE_O-*lzxXi&fH=l+yb;@B4(}0|*Xn-=fOLioiu_%qy8rM{ zfS+r0K#})~RJX=V0Za`TPk;(QZD9$JEkQ~E)gmN)3D^LT&M@_B*cO0vjZ=OIRRA88 zTLJ2=$QS^ di^cjYy#T|eJ3QV_j_X=c;qL+#ZPO0G>l)slYZJQmO2KaR)FJ5Y7TQ9OTp@9>U-p3{E5n zXE8x;Wx{K<+8P+?DiF@1i?(Ek%sLSFHHiN~A8pF)`2mM<572^eI5Z4n1A))@F8Ghi zGm!EnIKpNIxP&Iz1$0@g6VxSzQ``Z2K@|^m>m0mwsuQR|NPM|m-UR}mXrw97IZa~c z_^3rBbR25Tvtbh?I5)_^2sa{OWjV%#Ba&gMNvajmHY!g{SSNykO-goL85L%mBctQPfxGuKkaA34#hWiy@DNIlwF&vl& ztJtLu*s2^bP4kWkA(NBCrc7@=MGm~>^Z5hD)(sB_YNLDsPl5RNV<=4T@5B2~P9Bfq zfG<1lq32G*HsDKa!}~`8E}!DSRHFD9^z><%-?FSNc>f@}`O)eC4BD%RW%+%a-J8x3 zdTKNpt6^?%=r$&&uWb-R++Q=|&m{1A+NM#MbPUP8Po74lB(jJl#)|}ATia41g7-@T zuO)pkrxCQp9Pe^kBigDqG&(TlK7!=fQtE)CbW=|p#KOr-Xj9L5tfI^T;bRqngDn*f z#5>p$JX)0Hz(Cp|@4r6WO~mnfA}%-*bH$X1OTNThv!*322`JyslO;$|Ox-;I0000< KMNUMnLSTYJO*0<= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_email.png b/app/src/main/res/drawable-xxhdpi/ic_email.png new file mode 100644 index 0000000000000000000000000000000000000000..ed17daf258a93771d9ccd9934a048a2149d3cf44 GIT binary patch literal 550 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V0`Q8;uunK>+Ni7zrzj!ZOR{C zybu&pFL>&%WxkJbYQKZ%5}DS;Pq;!{oEn{%EGapBS|Dwa3)cgQ>^<`$kN;O+`)R|I zH+6CUZ|0P_D+5ghgL{I#sB z^x{Ozl_3x0k_=kYU(#T<`+ zdrA1nlgc`m_x`rhE=94+Vzzgcz2v$j84`Et<4pFVw3z9$%5HMpN|Jc=S|IO&UV76# zmGBb^N9tQPY-!&u5>nl--Tq^~z_hd_*^cM5Uud-~6KOn4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_help.png b/app/src/main/res/drawable-xxhdpi/ic_help.png new file mode 100644 index 0000000000000000000000000000000000000000..760e70d414bb5bb0528c9cfab54425d6fab66e6c GIT binary patch literal 1000 zcmV>P)l; zONBzA3ZI+6P2di25BM1Pm*HdcTgTk9X`Wg7FF{GC)7PPMb?D?Cd=968n3ab{Mjd6& zJuum9_7QYw2Rbw&fMVkj%EmV44wz!GxB?w$c>u-6Eo^fhfVlz6ZV3YOFK?j^L4pJ3 z{sa^pBnZwQ9-uD40Fz3ku7E=C0s!VOMx9W%M8PSS%U3~>-O#|90%;d@Ov*!D10}kl zf-}Wk)K%Pan84|q;klN}#nkvWNBLf%Fzad8D1!)+pAf(Vfs{CBn+VP{NEAyN zcnKzn5%Lk|Bx#()5hddGv9_8J6nb&Nq`v{&hWk#D@jLz&HL0RZf<6=0wHtBa*|&Ks zh)-_9^}~o~5AhzGcO!-XEw+>eWm1Hg=B>?g;QB!f83#5?LfI7ESW+b>pF{B)tCr5K z&j9keMYmO=ZaW;Az%fOMQmJ&`GHmx}kh6cD43td_JI18UB&Ig0VZP0KnF%?roYM$z zMqP%~DZ^_okOikVfUu9wyAQx;fdJI8yub$xvd^4$OUyP)D0!U?%S(L9B){rnL5)BF zvbuTd;&qA}E&w$H0OzwUPz2YXhU-6>+G)BBv3A1Xe1YY_t@CuNR4SJ_9SHW-#e#YX zg3|-bxgDX~d+zpJ06IwsoUaf7-ifg6*B;tDaRF$U060Iuavny2^U71Z!+8K`0u%4! zguLo-9){S*2+Mg!%tv_{Vv>{eIFrfTv*?kdE||Sc(vof-w`3yn&s~A`+o1=FFD*K( z3ANu0dZ_`Pt6k#y$at)RlO8I-itUH%YelJ5-S5{E+m%%s4IRXL60Kn zVHVaoNsmLt3<2~&U5sE-k7UMNyXm3cIH?jn79Kw{seddGceh0UnnFoQNl8gbf_?+m W6z$kIbHm910000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +