diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt index d00179091..f500e2a93 100644 --- a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt @@ -1,15 +1,14 @@ package com.simplemobiletools.commons.activities +import android.content.ActivityNotFoundException import android.content.Intent +import android.content.Intent.* import android.os.Build import android.os.Bundle -import android.text.Html -import android.text.method.LinkMovementMethod import android.view.Menu -import android.view.View +import androidx.core.net.toUri import com.simplemobiletools.commons.R import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog -import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.RateStarsDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* @@ -30,13 +29,24 @@ class AboutActivity : BaseSimpleActivity() { setContentView(R.layout.activity_about) appName = intent.getStringExtra(APP_NAME) ?: "" linkColor = getAdjustedPrimaryColor() + + arrayOf( + about_faq_icon, + about_rate_us_icon, + about_invite_icon, + about_contributors_icon, + about_more_apps_icon, + about_email_icon, + about_licenses_icon + ).forEach { + it.applyColorFilter(baseConfig.textColor) + } } override fun onResume() { super.onResume() updateTextColors(about_holder) - setupWebsite() setupEmail() setupFAQ() setupMoreApps() @@ -54,122 +64,109 @@ class AboutActivity : BaseSimpleActivity() { return super.onCreateOptionsMenu(menu) } - private fun setupWebsite() { - val websiteText = String.format(getString(R.string.two_string_placeholder), getString(R.string.website_label), getString(R.string.my_website)) - about_website.text = websiteText - } - private fun setupEmail() { - val label = getString(R.string.email_label) - val email = getString(R.string.my_email) - - val appVersion = String.format(getString(R.string.app_version, intent.getStringExtra(APP_VERSION_NAME))) - val deviceOS = String.format(getString(R.string.device_os), Build.VERSION.RELEASE) - val newline = "%0D%0A" - val separator = "------------------------------" - val body = "$appVersion$newline$deviceOS$newline$separator$newline$newline" - val href = "$label
$email" - about_email.text = Html.fromHtml(href) - - if (intent.getBooleanExtra(SHOW_FAQ_BEFORE_MAIL, false) && !baseConfig.wasBeforeAskingShown) { - about_email.setOnClickListener { + about_email_holder.setOnClickListener { + val msg = "${getString(R.string.before_asking_question_read_faq)}\n\n${getString(R.string.make_sure_latest)}" + if (intent.getBooleanExtra(SHOW_FAQ_BEFORE_MAIL, false) && !baseConfig.wasBeforeAskingShown) { baseConfig.wasBeforeAskingShown = true - about_email.movementMethod = LinkMovementMethod.getInstance() - about_email.setOnClickListener(null) - val msg = "${getString(R.string.before_asking_question_read_faq)}\n\n${getString(R.string.make_sure_latest)}" - ConfirmationDialog(this, msg, 0, R.string.read_faq, R.string.skip) { - about_faq_label.performClick() + ConfirmationAdvancedDialog(this, msg, 0, R.string.read_faq, R.string.skip) { success -> + if (success) { + about_faq_holder.performClick() + } else { + about_email_holder.performClick() + } + } + } else { + val appVersion = String.format(getString(R.string.app_version, intent.getStringExtra(APP_VERSION_NAME))) + val deviceOS = String.format(getString(R.string.device_os), Build.VERSION.RELEASE) + val newline = "\n" + val separator = "------------------------------" + val body = "$appVersion$newline$deviceOS$newline$separator$newline$newline" + + val address = getString(R.string.my_email) + val selectorIntent = Intent(ACTION_SENDTO) + .setData("mailto:$address".toUri()) + val emailIntent = Intent(ACTION_SEND).apply { + putExtra(EXTRA_EMAIL, arrayOf(address)) + putExtra(EXTRA_SUBJECT, appName) + putExtra(EXTRA_TEXT, body) + selector = selectorIntent + } + + try { + startActivity(emailIntent) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: Exception) { + showErrorToast(e) } } - } else { - about_email.movementMethod = LinkMovementMethod.getInstance() } } private fun setupFAQ() { val faqItems = intent.getSerializableExtra(APP_FAQ) as ArrayList - about_faq_label.beVisibleIf(faqItems.isNotEmpty()) - about_faq_label.setOnClickListener { - openFAQ(faqItems) - } - - about_faq.beVisibleIf(faqItems.isNotEmpty()) - about_faq.setOnClickListener { - openFAQ(faqItems) - } - - about_faq.setTextColor(linkColor) - about_faq.underlineText() - } - - private fun openFAQ(faqItems: ArrayList) { - Intent(applicationContext, FAQActivity::class.java).apply { - putExtra(APP_ICON_IDS, getAppIconIDs()) - putExtra(APP_LAUNCHER_NAME, getAppLauncherName()) - putExtra(APP_FAQ, faqItems) - startActivity(this) + about_faq_holder.beVisibleIf(faqItems.isNotEmpty()) + about_faq_holder.setOnClickListener { + Intent(applicationContext, FAQActivity::class.java).apply { + putExtra(APP_ICON_IDS, getAppIconIDs()) + putExtra(APP_LAUNCHER_NAME, getAppLauncherName()) + putExtra(APP_FAQ, faqItems) + startActivity(this) + } } } private fun setupMoreApps() { - about_more_apps.setOnClickListener { + about_more_apps_holder.setOnClickListener { launchViewIntent("https://play.google.com/store/apps/dev?id=9070296388022589266") } - about_more_apps.setTextColor(linkColor) } private fun setupInvite() { - about_invite.setOnClickListener { + about_invite_holder.setOnClickListener { val text = String.format(getString(R.string.share_text), appName, getStoreUrl()) Intent().apply { - action = Intent.ACTION_SEND - putExtra(Intent.EXTRA_SUBJECT, appName) - putExtra(Intent.EXTRA_TEXT, text) + action = ACTION_SEND + putExtra(EXTRA_SUBJECT, appName) + putExtra(EXTRA_TEXT, text) type = "text/plain" - startActivity(Intent.createChooser(this, getString(R.string.invite_via))) + startActivity(createChooser(this, getString(R.string.invite_via))) } } - about_invite.setTextColor(linkColor) } private fun setupContributors() { - about_contributors.setTextColor(linkColor) - about_contributors.underlineText() - about_contributors.setOnClickListener { + about_contributors_holder.setOnClickListener { val intent = Intent(applicationContext, ContributorsActivity::class.java) startActivity(intent) } } private fun setupRateUs() { - if (baseConfig.appRunCount < 5) { - about_rate_us.visibility = View.GONE - } else { - about_rate_us.setOnClickListener { - if (baseConfig.wasBeforeRateShown) { - if (baseConfig.wasAppRated) { - redirectToRateUs() - } else { - RateStarsDialog(this) - } + about_rate_us_holder.setOnClickListener { + if (baseConfig.wasBeforeRateShown) { + if (baseConfig.wasAppRated) { + redirectToRateUs() } else { - baseConfig.wasBeforeRateShown = true - val msg = "${getString(R.string.before_rate_read_faq)}\n\n${getString(R.string.make_sure_latest)}" - ConfirmationAdvancedDialog(this, msg, 0, R.string.read_faq, R.string.skip) { - if (it) { - about_faq_label.performClick() - } else { - about_rate_us.performClick() - } + RateStarsDialog(this) + } + } else { + baseConfig.wasBeforeRateShown = true + val msg = "${getString(R.string.before_rate_read_faq)}\n\n${getString(R.string.make_sure_latest)}" + ConfirmationAdvancedDialog(this, msg, 0, R.string.read_faq, R.string.skip) { success -> + if (success) { + about_faq_holder.performClick() + } else { + about_rate_us_holder.performClick() } } } } - about_rate_us.setTextColor(linkColor) } private fun setupLicense() { - about_license.setOnClickListener { + about_licenses_holder.setOnClickListener { Intent(applicationContext, LicenseActivity::class.java).apply { putExtra(APP_ICON_IDS, getAppIconIDs()) putExtra(APP_LAUNCHER_NAME, getAppLauncherName()) @@ -177,7 +174,6 @@ class AboutActivity : BaseSimpleActivity() { startActivity(this) } } - about_license.setTextColor(linkColor) } private fun setupFacebook() { diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt index c278a6ec9..b3e43d56b 100644 --- a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt @@ -1,10 +1,12 @@ package com.simplemobiletools.commons.activities import android.os.Bundle +import android.text.Html +import android.text.method.LinkMovementMethod import android.view.Menu import com.simplemobiletools.commons.R import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor -import com.simplemobiletools.commons.extensions.underlineText +import com.simplemobiletools.commons.extensions.removeUnderlines import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.helpers.APP_ICON_IDS import com.simplemobiletools.commons.helpers.APP_LAUNCHER_NAME @@ -21,12 +23,12 @@ class ContributorsActivity : BaseSimpleActivity() { setContentView(R.layout.activity_contributors) updateTextColors(contributors_holder) - contributors_development_label.setTextColor(getAdjustedPrimaryColor()) - contributors_development_label.underlineText() - contributors_translation_label.setTextColor(getAdjustedPrimaryColor()) - contributors_translation_label.underlineText() + + contributors_label.text = Html.fromHtml(getString(R.string.contributors_label)) + contributors_label.removeUnderlines() + contributors_label.movementMethod = LinkMovementMethod.getInstance() } override fun onCreateOptionsMenu(menu: Menu): Boolean { diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt index d71bb7e61..330b1d5a3 100644 --- a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt @@ -9,8 +9,10 @@ import android.provider.MediaStore import android.telephony.PhoneNumberUtils import android.text.Spannable import android.text.SpannableString +import android.text.TextPaint import android.text.TextUtils import android.text.style.ForegroundColorSpan +import android.text.style.URLSpan import android.widget.TextView import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.helpers.* @@ -46,7 +48,8 @@ fun String.isAValidFilename(): Boolean { return true } -fun String.getOTGPublicPath(context: Context) = "${context.baseConfig.OTGTreeUri}/document/${context.baseConfig.OTGPartition}%3A${substring(context.baseConfig.OTGPath.length).replace("/", "%2F")}" +fun String.getOTGPublicPath(context: Context) = + "${context.baseConfig.OTGTreeUri}/document/${context.baseConfig.OTGPartition}%3A${substring(context.baseConfig.OTGPath.length).replace("/", "%2F")}" fun String.isMediaFile() = isImageFast() || isVideoFast() || isGif() || isRawFast() || isSvg() || isPortrait() @@ -270,6 +273,26 @@ fun String.getDateTimeFromDateString(showYearsSince: Boolean, viewToUpdate: Text return date } +fun TextView.removeUnderlines() { + val spannable = SpannableString(text) + val spans = spannable.getSpans(0, spannable.length, URLSpan::class.java) + for (span in spans) { + val start = spannable.getSpanStart(span) + val end = spannable.getSpanEnd(span) + spannable.removeSpan(span) + val newSpan = URLSpanNoUnderline(span.url) + spannable.setSpan(newSpan, start, end, 0) + } + text = spannable +} + +private class URLSpanNoUnderline(url: String?) : URLSpan(url) { + override fun updateDrawState(textPaint: TextPaint) { + super.updateDrawState(textPaint) + textPaint.isUnderlineText = false + } +} + fun String.getMimeType(): String { val typesMap = HashMap().apply { put("323", "text/h323") diff --git a/commons/src/main/res/drawable/ic_article_vector.xml b/commons/src/main/res/drawable/ic_article_vector.xml new file mode 100644 index 000000000..91604efa9 --- /dev/null +++ b/commons/src/main/res/drawable/ic_article_vector.xml @@ -0,0 +1,12 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_email_vector.xml b/commons/src/main/res/drawable/ic_email_vector.xml index 199210923..2b606f8f4 100644 --- a/commons/src/main/res/drawable/ic_email_vector.xml +++ b/commons/src/main/res/drawable/ic_email_vector.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/commons/src/main/res/drawable/ic_face_vector.xml b/commons/src/main/res/drawable/ic_face_vector.xml new file mode 100644 index 000000000..fc9762668 --- /dev/null +++ b/commons/src/main/res/drawable/ic_face_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/commons/src/main/res/drawable/ic_heart_vector.xml b/commons/src/main/res/drawable/ic_heart_vector.xml new file mode 100644 index 000000000..54c45ad2b --- /dev/null +++ b/commons/src/main/res/drawable/ic_heart_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/commons/src/main/res/drawable/ic_question_mark_vector.xml b/commons/src/main/res/drawable/ic_question_mark_vector.xml new file mode 100644 index 000000000..03c1c8f13 --- /dev/null +++ b/commons/src/main/res/drawable/ic_question_mark_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/commons/src/main/res/layout/activity_about.xml b/commons/src/main/res/layout/activity_about.xml index 992a73e14..131d8917a 100644 --- a/commons/src/main/res/layout/activity_about.xml +++ b/commons/src/main/res/layout/activity_about.xml @@ -8,107 +8,233 @@ + android:layout_height="wrap_content"> - + android:background="?attr/selectableItemBackground" + android:padding="@dimen/medium_margin"> - + + + + + + + android:layout_below="@+id/about_faq_holder" + android:background="?attr/selectableItemBackground" + android:padding="@dimen/medium_margin"> - + + + + + + + android:layout_below="@+id/about_rate_us_holder" + android:background="?attr/selectableItemBackground" + android:padding="@dimen/medium_margin"> - + + + + + + + android:layout_below="@+id/about_invite_holder" + android:background="?attr/selectableItemBackground" + android:padding="@dimen/medium_margin"> - + + + + + + + android:layout_below="@+id/about_contributors_holder" + android:background="?attr/selectableItemBackground" + android:padding="@dimen/medium_margin"> - + + + + + + + android:layout_below="@+id/about_more_apps_holder" + android:background="?attr/selectableItemBackground" + android:padding="@dimen/medium_margin"> - + + + + + + + android:layout_below="@+id/about_email_holder" + android:background="?attr/selectableItemBackground" + android:padding="@dimen/medium_margin"> - + - + + + + android:layout_below="@+id/about_licenses_holder" + android:layout_margin="@dimen/activity_margin" + android:text="@string/follow_us" + android:textSize="@dimen/bigger_text_size" /> diff --git a/commons/src/main/res/layout/activity_contributors.xml b/commons/src/main/res/layout/activity_contributors.xml index 5e2a3bc5e..76882bcee 100644 --- a/commons/src/main/res/layout/activity_contributors.xml +++ b/commons/src/main/res/layout/activity_contributors.xml @@ -17,7 +17,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/development" - android:textColor="@color/color_primary" /> + android:textColor="@color/color_primary" + android:textFontWeight="600" /> + android:textColor="@color/color_primary" + android:textFontWeight="600" /> - + android:textColorLink="@color/color_primary" />