From 0aac77d2bbce0629f9522d0854bd7c8068ec5e8b Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Fri, 23 Jun 2017 21:53:50 -0700 Subject: Add keys and header reload --- .gitignore | 5 +- .../kotlin/com/pitchedapps/frost/MainActivity.kt | 26 +++-- .../com/pitchedapps/frost/SettingsActivity.kt | 120 +++++++++++++++++---- .../com/pitchedapps/frost/facebook/FeedSort.kt | 18 ++++ .../com/pitchedapps/frost/fragments/WebFragment.kt | 12 ++- .../kotlin/com/pitchedapps/frost/utils/Prefs.kt | 15 ++- .../kotlin/com/pitchedapps/frost/utils/Theme.kt | 3 +- .../kotlin/com/pitchedapps/frost/utils/Utils.kt | 4 + .../kotlin/com/pitchedapps/frost/utils/iab/IAB.kt | 13 ++- .../kotlin/com/pitchedapps/frost/utils/iab/Key.kt | 33 ++++++ app/src/main/res/values/strings.xml | 2 +- app/src/main/res/values/strings_preferences | 10 +- gradle.properties | 2 +- 13 files changed, 214 insertions(+), 49 deletions(-) create mode 100644 app/src/main/kotlin/com/pitchedapps/frost/facebook/FeedSort.kt create mode 100644 app/src/main/kotlin/com/pitchedapps/frost/utils/iab/Key.kt diff --git a/.gitignore b/.gitignore index 01d32345..55f44265 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,5 @@ /build /captures .externalNativeBuild -/app/src/main/res/values/strings_facebook.xml -/app/src/main/kotlin/com/pitchedapps/frost/facebook/Private.kt *.min.css -.sass-cache/ -PrivConstants.kt \ No newline at end of file +.sass-cache/ \ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt index ab3ffd09..b8feef0f 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/MainActivity.kt @@ -15,6 +15,7 @@ import android.support.v4.view.ViewPager import android.support.v7.widget.Toolbar import android.view.Menu import android.view.MenuItem +import ca.allanwang.kau.changelog.showChangelog import ca.allanwang.kau.utils.* import co.zsmb.materialdrawerkt.builders.Builder import co.zsmb.materialdrawerkt.builders.accountHeader @@ -36,7 +37,6 @@ import com.pitchedapps.frost.facebook.FbCookie.switchUser import com.pitchedapps.frost.facebook.FbTab import com.pitchedapps.frost.facebook.PROFILE_PICTURE_URL import com.pitchedapps.frost.fragments.WebFragment -import com.pitchedapps.frost.injectors.CssAssets import com.pitchedapps.frost.utils.* import com.pitchedapps.frost.views.BadgedIcon import io.reactivex.android.schedulers.AndroidSchedulers @@ -61,14 +61,20 @@ class MainActivity : BaseActivity() { companion object { const val FRAGMENT_REFRESH = 99 + /* + * Possible responses from the SettingsActivity + * after the configurations have changed + */ const val REQUEST_RESTART = 90909 + const val REQUEST_REFRESH = 80808 + const val REQUEST_NAV = 10101 } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (BuildConfig.VERSION_CODE > Prefs.versionCode) { Prefs.versionCode = BuildConfig.VERSION_CODE - showChangelog(R.xml.changelog, { theme() }) + showChangelog(R.xml.changelog, Prefs.textColor) { theme() } } setContentView(R.layout.activity_main) setSupportActionBar(toolbar) @@ -129,12 +135,12 @@ class MainActivity : BaseActivity() { }) headerBadgeObservable.throttleFirst(15, TimeUnit.SECONDS).subscribeOn(Schedulers.newThread()) .map { Jsoup.parse(it) } - .filter { it.select("[data-sigil=\"count\"]").size >= 0 } //ensure headers exist + .filter { it.select("[data-sigil=count]").size >= 0 } //ensure headers exist .map { - val feed = it.select("[data-sigil*=\"feed\"] [data-sigil=\"count\"]") - val requests = it.select("[data-sigil*=\"requests\"] [data-sigil=\"count\"]") - val messages = it.select("[data-sigil*=\"messages\"] [data-sigil=\"count\"]") - val notifications = it.select("[data-sigil*=\"notifications\"] [data-sigil=\"count\"]") + val feed = it.select("[data-sigil*=feed] [data-sigil=count]") + val requests = it.select("[data-sigil*=requests] [data-sigil=count]") + val messages = it.select("[data-sigil*=messages] [data-sigil=count]") + val notifications = it.select("[data-sigil*=notifications] [data-sigil=count]") return@map arrayOf(feed, requests, messages, notifications).map { it?.getOrNull(0)?.ownText() } } .observeOn(AndroidSchedulers.mainThread()) @@ -303,8 +309,10 @@ class MainActivity : BaseActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (resultCode == REQUEST_RESTART) { - restart() + when (requestCode) { + REQUEST_RESTART -> restart() + REQUEST_REFRESH -> webFragmentObservable.onNext(FRAGMENT_REFRESH) + REQUEST_NAV -> frostNavigationBar() } } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/SettingsActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/SettingsActivity.kt index 79e65621..cf20aa0f 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/SettingsActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/SettingsActivity.kt @@ -3,17 +3,22 @@ package com.pitchedapps.frost import android.os.Bundle import android.view.Menu import android.view.MenuItem +import ca.allanwang.kau.changelog.showChangelog import ca.allanwang.kau.email.sendEmail import ca.allanwang.kau.kpref.CoreAttributeContract import ca.allanwang.kau.kpref.KPrefActivity import ca.allanwang.kau.kpref.KPrefAdapterBuilder import ca.allanwang.kau.kpref.items.KPrefColorPicker +import ca.allanwang.kau.kpref.items.KPrefItemBase import ca.allanwang.kau.utils.* import ca.allanwang.kau.views.RippleCanvas +import com.mikepenz.community_material_typeface_library.CommunityMaterial import com.mikepenz.google_material_typeface_library.GoogleMaterial +import com.pitchedapps.frost.facebook.FeedSort import com.pitchedapps.frost.injectors.CssAssets import com.pitchedapps.frost.utils.* -import com.pitchedapps.frost.utils.iab.openPlayPurchase +import com.pitchedapps.frost.utils.iab.IS_FROST_PRO +import com.pitchedapps.frost.utils.iab.openPlayProPurchase import com.pitchedapps.frost.views.Keywords @@ -32,27 +37,39 @@ class SettingsActivity : KPrefActivity() { descRes = R.string.appearance_desc iicon = GoogleMaterial.Icon.gmd_palette } + + subItems(R.string.newsfeed, subPrefsFeed()) { + descRes = R.string.newsfeed_desc + iicon = CommunityMaterial.Icon.cmd_newspaper + } + subItems(R.string.notifications, subPrefsNotifications()) { descRes = R.string.notifications_desc iicon = GoogleMaterial.Icon.gmd_notifications } + if (BuildConfig.DEBUG) { + checkbox(R.string.custom_pro, { Prefs.debugPro }, { Prefs.debugPro = it }) + } } fun subPrefsAppearance(): KPrefAdapterBuilder.() -> Unit = { - header(R.string.base_customization) + header(R.string.theme_customization) text(R.string.theme, { Prefs.theme }, { Prefs.theme = it }) { onClick = { _, _, item -> this@SettingsActivity.materialDialogThemed { title(R.string.theme) - items(Theme.values().map { this@SettingsActivity.string(it.textRes) }) + items(Theme.values() + .map { if (it == Theme.CUSTOM && !IS_FROST_PRO) R.string.custom_pro else it.textRes } + .map { this@SettingsActivity.string(it) }) itemsCallbackSingleChoice(item.pref, { _, _, which, text -> if (item.pref != which) { - if (which == Theme.CUSTOM.ordinal) { - this@SettingsActivity.openPlayPurchase("asdf", 9) + if (which == Theme.CUSTOM.ordinal && !IS_FROST_PRO) { + this@SettingsActivity.openPlayProPurchase(9) + return@itemsCallbackSingleChoice true } item.pref = which shouldRestartMain() @@ -68,8 +85,7 @@ class SettingsActivity : KPrefActivity() { true } textGetter = { - this@SettingsActivity.string(if (it == Theme.CUSTOM.ordinal) - R.string.kau_custom else Theme(it).textRes) + this@SettingsActivity.string(Theme(it).textRes) } } @@ -83,21 +99,33 @@ class SettingsActivity : KPrefActivity() { CssAssets.CUSTOM.injector = null } - colorPicker(R.string.text_color, { Prefs.customTextColor }, { Prefs.customTextColor = it; reload(); invalidateCustomTheme() }) { + colorPicker(R.string.text_color, { Prefs.customTextColor }, { + Prefs.customTextColor = it + reload() + invalidateCustomTheme() + shouldRestartMain() + }) { dependsOnCustom() allowCustomAlpha = false } - colorPicker(R.string.background_color, { Prefs.customBackgroundColor }, - { Prefs.customBackgroundColor = it; bgCanvas.ripple(it, duration = 500L); invalidateCustomTheme() }) { + colorPicker(R.string.background_color, { Prefs.customBackgroundColor }, { + Prefs.customBackgroundColor = it + bgCanvas.ripple(it, duration = 500L) + invalidateCustomTheme() + setFrostTheme(true) + shouldRestartMain() + }) { dependsOnCustom() allowCustomAlpha = true } colorPicker(R.string.header_color, { Prefs.customHeaderColor }, { Prefs.customHeaderColor = it - this@SettingsActivity.navigationBarColor = it + if (Prefs.tintNavBar) this@SettingsActivity.frostNavigationBar() toolbarCanvas.ripple(it, RippleCanvas.MIDDLE, RippleCanvas.END, duration = 500L) + reload() + shouldRestartMain() }) { dependsOnCustom() allowCustomAlpha = true @@ -106,32 +134,82 @@ class SettingsActivity : KPrefActivity() { colorPicker(R.string.icon_color, { Prefs.customIconColor }, { Prefs.customIconColor = it invalidateOptionsMenu() + shouldRestartMain() }) { dependsOnCustom() allowCustomAlpha = false } - checkbox(R.string.rounded_icons, { Prefs.showRoundedIcons }, { Prefs.showRoundedIcons = it }) + header(R.string.global_customization) + + checkbox(R.string.rounded_icons, { Prefs.showRoundedIcons }, { + Prefs.showRoundedIcons = it + setResult(MainActivity.REQUEST_REFRESH) + }) { + descRes = R.string.rounded_icons_desc + } checkbox(R.string.fancy_animations, { Prefs.animate }, { Prefs.animate = it; animate = it }) { descRes = R.string.fancy_animations_desc } - header(R.string.feed_customization) + checkbox(R.string.tint_nav, { Prefs.tintNavBar }, { + Prefs.tintNavBar = it + this@SettingsActivity.frostNavigationBar() + setResult(MainActivity.REQUEST_NAV) + }) { + descRes = R.string.tint_nav_desc + } + } + + fun KPrefItemBase.BaseContract<*>.dependsOnPro() { + onDisabledClick = { _, _, _ -> openPlayProPurchase(0); true } + enabler = { IS_FROST_PRO } + } - checkbox(R.string.suggested_friends, { Prefs.showSuggestedFriends }, { Prefs.showSuggestedFriends = it }) { + fun subPrefsFeed(): KPrefAdapterBuilder.() -> Unit = { + + text(R.string.newsfeed_sort, { Prefs.feedSort }, { Prefs.feedSort = it }) { + descRes = R.string.newsfeed_sort_desc + onClick = { + _, _, item -> + this@SettingsActivity.materialDialogThemed { + title(R.string.newsfeed_sort) + items(FeedSort.values().map { this@SettingsActivity.string(it.textRes) }) + itemsCallbackSingleChoice(item.pref, { + _, _, which, text -> + if (item.pref != which) { + item.pref = which + shouldRestartMain() + } + true + }) + } + true + } + textGetter = { string(FeedSort(it).textRes) } + } + + checkbox(R.string.suggested_friends, { Prefs.showSuggestedFriends }, { + Prefs.showSuggestedFriends = it + setResult(MainActivity.REQUEST_REFRESH) + }) { descRes = R.string.suggested_friends_desc + dependsOnPro() } - checkbox(R.string.facebook_ads, { Prefs.showFacebookAds }, { Prefs.showFacebookAds = it }) { + checkbox(R.string.facebook_ads, { Prefs.showFacebookAds }, { + Prefs.showFacebookAds = it + setResult(MainActivity.REQUEST_REFRESH) + }) { descRes = R.string.facebook_ads_desc + dependsOnPro() } - } fun subPrefsNotifications(): KPrefAdapterBuilder.() -> Unit = { - text(R.string.notification_frequency, { Prefs.notificationFreq }, { Prefs.notificationFreq = it; reloadByTitle(R.string.notification_frequency) }) { + text(R.string.notification_frequency, { Prefs.notificationFreq }, { Prefs.notificationFreq = it }) { val options = longArrayOf(-1, 15, 30, 60, 120, 180, 300, 1440, 2880) val texts = options.map { this@SettingsActivity.minuteToText(it) } onClick = { @@ -140,7 +218,7 @@ class SettingsActivity : KPrefActivity() { title(R.string.notification_frequency) items(texts) itemsCallbackSingleChoice(options.indexOf(item.pref), { - _, _, which, text -> + _, _, which, _ -> item.pref = options[which] this@SettingsActivity.scheduleNotifications(item.pref) true @@ -151,7 +229,7 @@ class SettingsActivity : KPrefActivity() { textGetter = { this@SettingsActivity.minuteToText(it) } } - text(R.string.notification_keywords, { null }, { }) { + plainText(R.string.notification_keywords) { descRes = R.string.notification_keywords_desc onClick = { _, _, _ -> @@ -184,7 +262,7 @@ class SettingsActivity : KPrefActivity() { else bgCanvas.set(Prefs.bgColor) if (animate) toolbarCanvas.ripple(Prefs.headerColor, RippleCanvas.MIDDLE, RippleCanvas.END) else toolbarCanvas.set(Prefs.headerColor) - this.navigationBarColor = Prefs.headerColor + frostNavigationBar() } override fun onBackPressed() { @@ -208,7 +286,7 @@ class SettingsActivity : KPrefActivity() { R.id.action_email -> sendEmail(R.string.dev_email, R.string.frost_feedback) { addItem("Random Frost ID", Prefs.frostId) } - R.id.action_changelog -> showChangelog(R.xml.changelog, { theme() }) + R.id.action_changelog -> showChangelog(R.xml.changelog, Prefs.textColor) { theme() } else -> return super.onOptionsItemSelected(item) } return true diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FeedSort.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FeedSort.kt new file mode 100644 index 00000000..f3073f6d --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FeedSort.kt @@ -0,0 +1,18 @@ +package com.pitchedapps.frost.facebook + +import android.support.annotation.StringRes +import com.pitchedapps.frost.R + +/** + * Created by Allan Wang on 2017-06-23. + */ +enum class FeedSort(@StringRes val textRes: Int) { + DEFAULT(R.string.kau_default), + MOST_RECENT(R.string.most_recent), + TOP(R.string.top_stories); + + companion object { + val values = values() //save one instance + operator fun invoke(index: Int) = values[index] + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt index dfc3eaad..cd15c2c3 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/WebFragment.kt @@ -9,6 +9,8 @@ import android.view.ViewGroup import ca.allanwang.kau.utils.withBundle import com.pitchedapps.frost.MainActivity import com.pitchedapps.frost.facebook.FbTab +import com.pitchedapps.frost.facebook.FeedSort +import com.pitchedapps.frost.utils.Prefs import com.pitchedapps.frost.web.FrostWebView import com.pitchedapps.frost.web.FrostWebViewCore import io.reactivex.android.schedulers.AndroidSchedulers @@ -29,7 +31,15 @@ class WebFragment : Fragment() { operator fun invoke(data: FbTab, position: Int) = WebFragment().withBundle { putString(ARG_URL, data.url) putInt(ARG_POSITION, position) - putSerializable(ARG_URL_ENUM, data) + putSerializable(ARG_URL_ENUM, when (data) { + //If is feed, check if sorting method is specified + FbTab.FEED -> when (FeedSort(Prefs.feedSort)) { + FeedSort.DEFAULT -> data + FeedSort.MOST_RECENT -> FbTab.FEED_MOST_RECENT + FeedSort.TOP -> FbTab.FEED_TOP_STORIES + } + else -> data + }) } } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt index ab86724e..9b41d454 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/Prefs.kt @@ -6,6 +6,7 @@ import ca.allanwang.kau.kpref.StringSet import ca.allanwang.kau.kpref.kpref import ca.allanwang.kau.utils.isColorVisibleOn import ca.allanwang.kau.utils.lazyResettable +import com.pitchedapps.frost.facebook.FeedSort import com.pitchedapps.frost.injectors.InjectorContract /** @@ -23,11 +24,11 @@ object Prefs : KPref() { var theme: Int by kpref("theme", 0, postSetter = { _: Int -> loader.invalidate() }) - var customTextColor: Int by kpref("color_text", Color.BLACK) + var customTextColor: Int by kpref("color_text", Color.WHITE) - var customBackgroundColor: Int by kpref("color_bg", 0xfffafafa.toInt()) + var customBackgroundColor: Int by kpref("color_bg", 0xff37474f.toInt()) - var customHeaderColor: Int by kpref("color_header", 0xff3b5998.toInt()) + var customHeaderColor: Int by kpref("color_header", 0xff039be5.toInt()) var customIconColor: Int by kpref("color_icons", Color.WHITE) @@ -69,6 +70,10 @@ object Prefs : KPref() { val frostId: String get() = "${installDate}-${identifier}" + var tintNavBar: Boolean by kpref("tint_nav_bar", true) + + var feedSort: Int by kpref("feed_sort", FeedSort.DEFAULT.ordinal) + var showRoundedIcons: Boolean by kpref("rounded_icons", true) var showSuggestedFriends: Boolean by kpref("suggested_friends_feed", true) @@ -81,4 +86,8 @@ object Prefs : KPref() { //check if this is the first time launching the web overlay; show snackbar if true var firstWebOverlay: Boolean by kpref("first_web_overlay", true) + + var previouslyPro: Boolean by kpref("previously_pro", false) + + var debugPro: Boolean by kpref("debug_pro", false) } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/Theme.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/Theme.kt index 7535eaa2..b4162a66 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/utils/Theme.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/Theme.kt @@ -1,6 +1,7 @@ package com.pitchedapps.frost.utils import android.graphics.Color +import android.support.annotation.StringRes import com.pitchedapps.frost.R import com.pitchedapps.frost.injectors.CssAssets import com.pitchedapps.frost.injectors.InjectorContract @@ -9,7 +10,7 @@ import com.pitchedapps.frost.injectors.JsActions /** * Created by Allan Wang on 2017-06-14. */ -enum class Theme(val textRes: Int, val injector: InjectorContract, +enum class Theme(@StringRes val textRes: Int, val injector: InjectorContract, private val textColorGetter: () -> Int, private val backgroundColorGetter: () -> Int, private val headerColorGetter: () -> Int, private val iconColorGetter: () -> Int) { DEFAULT(R.string.kau_default, JsActions.EMPTY, { Color.BLACK }, { 0xfffafafa.toInt() }, { 0xff3b5998.toInt() }, { Color.WHITE }), diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/Utils.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/Utils.kt index 9322af3f..3fe33475 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/utils/Utils.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/Utils.kt @@ -163,4 +163,8 @@ fun View.frostSnackbar(@StringRes text: Int, builder: Snackbar.() -> Unit = {}) } show() } +} + +fun Activity.frostNavigationBar() { + navigationBarColor = if (Prefs.tintNavBar) Prefs.headerColor else Color.BLACK } \ No newline at end of file diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IAB.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IAB.kt index 007611c5..11fa1c4b 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IAB.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/IAB.kt @@ -7,10 +7,7 @@ import ca.allanwang.kau.utils.startPlayStoreLink import com.crashlytics.android.answers.PurchaseEvent import com.pitchedapps.frost.BuildConfig import com.pitchedapps.frost.R -import com.pitchedapps.frost.utils.L -import com.pitchedapps.frost.utils.frostAnswers -import com.pitchedapps.frost.utils.frostAnswersCustom -import com.pitchedapps.frost.utils.materialDialogThemed +import com.pitchedapps.frost.utils.* import org.jetbrains.anko.doAsync /** @@ -38,8 +35,10 @@ object IAB { } } -val Context.isFrostPro: Boolean - get() = BuildConfig.DEBUG || isFromGooglePlay +private const val FROST_PRO = "frost_pro" + +val IS_FROST_PRO: Boolean + get() = (BuildConfig.DEBUG && Prefs.debugPro) || (IAB.helper?.queryInventory()?.getSkuDetails(FROST_PRO) != null) private fun Context.checkFromPlay(): Boolean { val isPlay = isFromGooglePlay @@ -53,7 +52,7 @@ private fun Context.checkFromPlay(): Boolean { return isPlay } -fun Activity.openPlayProPurchase(code: Int) = openPlayPurchase("frost_pro", code) +fun Activity.openPlayProPurchase(code: Int) = openPlayPurchase(FROST_PRO, code) fun Activity.openPlayPurchase(key: String, code: Int) { if (!checkFromPlay()) return diff --git a/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/Key.kt b/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/Key.kt new file mode 100644 index 00000000..a21d8670 --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/utils/iab/Key.kt @@ -0,0 +1,33 @@ +package com.pitchedapps.frost.utils.iab + +/** + * Created by Allan Wang on 2017-06-23. + * + * NOTE + * + * Since this is an open source project and all other components are essentially public, + * I have decided to add the keys here too; + * they can be reverse engineered relatively easily since they are constants anyways. + * This is the public billing key from the play store + */ +private const val play_key_1 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgyTZS" +private const val play_key_2 = "K9Bd3ALpr9KJUsVGczP9CcPelWkdnJfNrrzu1EztJyrHRsGQ4" +private const val play_key_3 = "QVWY9NZwc6Nrk9qdJlEdr8AJAxJ+JiwUqsj3/TxxUYm/G7q8Z" +private const val play_key_4 = "7zo8jSkYZyzqwoAl2PDx2kleI4sZLkhCRLyE6dGQEZQmvJ6kk" +private const val play_key_5 = "W12Gz3FagAM5luRGsoWZj40pJItUrGJA9euMWq4rMhVZv4mVk" +private const val play_key_6 = "KFJB9/vhF/XGz7txpYlFxMESzXuKsbEDKmKCHzvySLq8Ki4N9" +private const val play_key_7 = "DzbgUiw+VzA2KpSVp66JH3GEU8egO8i9SvAWeCPikuolooRVh" +private const val play_key_8 = "jwfBV7gDxZztoLuvmQU6kXvCwRnRa+mkfUnBKKLkH1QIDAQAB" + +internal val PUBLIC_BILLING_KEY: String by lazy { + StringBuilder() + .append(play_key_1) + .append(play_key_2) + .append(play_key_3) + .append(play_key_4) + .append(play_key_5) + .append(play_key_6) + .append(play_key_7) + .append(play_key_8) + .toString() +} \ 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 ee113be2..a276962b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,7 +40,7 @@ Custom [Pro] Uh Oh - This app doesn\'t seem to be installed from the Play Store. Please reinstall if this is an issue. + This is a pro feature, but this app doesn\'t seem to be installed from the Play Store. Please reinstall if this is an issue. Something went wrong. Please try again later. Thank you! Thank you for your support! Enjoy the pro version. diff --git a/app/src/main/res/values/strings_preferences b/app/src/main/res/values/strings_preferences index 08603ab4..6c69f5a4 100644 --- a/app/src/main/res/values/strings_preferences +++ b/app/src/main/res/values/strings_preferences @@ -4,6 +4,8 @@ Theme, Items to display, etc Frequency, filters, etc + News Feed + Define what items appear in the newsfeed Theme @@ -13,8 +15,12 @@ Icon Color Rounded Icons - Base Customization + Profile photos and group conversation icons will be rounded + Theme Customization + Global Customization Feed Customization + Newsfeed Order + Defines the order in which the posts are shown Suggested Friends Show "People You May Know" in the feed Facebook Ads @@ -29,5 +35,7 @@ Fancy Animations Reveal webviews using ripples and animate transitions + Tint Nav Bar + Navigation bar will be the same color as the header \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 92c6ef28..f03d686b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ BUILD_TOOLS=26.0.0 VERSION_CODE=5 VERSION_NAME=0.5 -KAU=d6b4ebb938 +KAU=9e31fdd4f1 MATERIAL_DRAWER=5.9.2 MATERIAL_DRAWER_KT=1.0.2 IICON_GOOGLE=3.0.1.0 -- cgit v1.2.3