mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2024-09-30 08:50:44 +00:00
Starting a new module for app benchmarks
This commit is contained in:
parent
eb6e235f1b
commit
b13b832696
@ -162,6 +162,7 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(path: ':quartz')
|
implementation project(path: ':quartz')
|
||||||
|
implementation project(path: ':commons')
|
||||||
implementation "androidx.core:core-ktx:$core_ktx_version"
|
implementation "androidx.core:core-ktx:$core_ktx_version"
|
||||||
implementation 'androidx.activity:activity-compose:1.8.2'
|
implementation 'androidx.activity:activity-compose:1.8.2'
|
||||||
implementation "androidx.compose.ui:ui:$compose_ui_version"
|
implementation "androidx.compose.ui:ui:$compose_ui_version"
|
||||||
|
@ -44,6 +44,7 @@ import androidx.compose.ui.graphics.Color
|
|||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.vitorpamplona.amethyst.R
|
import com.vitorpamplona.amethyst.R
|
||||||
|
import com.vitorpamplona.amethyst.commons.ExpandableTextParser
|
||||||
import com.vitorpamplona.amethyst.ui.note.getGradient
|
import com.vitorpamplona.amethyst.ui.note.getGradient
|
||||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||||
import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
|
import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
|
||||||
@ -51,9 +52,6 @@ import com.vitorpamplona.amethyst.ui.theme.ButtonPadding
|
|||||||
import com.vitorpamplona.amethyst.ui.theme.secondaryButtonBackground
|
import com.vitorpamplona.amethyst.ui.theme.secondaryButtonBackground
|
||||||
import com.vitorpamplona.quartz.events.ImmutableListOfLists
|
import com.vitorpamplona.quartz.events.ImmutableListOfLists
|
||||||
|
|
||||||
const val SHORT_TEXT_LENGTH = 350
|
|
||||||
const val SHORTEN_AFTER_LINES = 10
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ExpandableRichTextViewer(
|
fun ExpandableRichTextViewer(
|
||||||
content: String,
|
content: String,
|
||||||
@ -66,30 +64,7 @@ fun ExpandableRichTextViewer(
|
|||||||
) {
|
) {
|
||||||
var showFullText by remember { mutableStateOf(false) }
|
var showFullText by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
val whereToCut =
|
val whereToCut = remember(content) { ExpandableTextParser().computeWhereToCutIfPostIsTooLong(content) }
|
||||||
remember(content) {
|
|
||||||
// Cuts the text in the first space or new line after SHORT_TEXT_LENGTH characters
|
|
||||||
val firstSpaceAfterCut =
|
|
||||||
content.indexOf(' ', SHORT_TEXT_LENGTH).let { if (it < 0) content.length else it }
|
|
||||||
val firstNewLineAfterCut =
|
|
||||||
content.indexOf('\n', SHORT_TEXT_LENGTH).let { if (it < 0) content.length else it }
|
|
||||||
|
|
||||||
// or after SHORTEN_AFTER_LINES lines
|
|
||||||
val numberOfLines = content.count { it == '\n' }
|
|
||||||
|
|
||||||
var charactersInLines = minOf(firstSpaceAfterCut, firstNewLineAfterCut)
|
|
||||||
|
|
||||||
if (numberOfLines > SHORTEN_AFTER_LINES) {
|
|
||||||
val shortContent = content.lines().take(SHORTEN_AFTER_LINES)
|
|
||||||
charactersInLines = 0
|
|
||||||
for (line in shortContent) {
|
|
||||||
// +1 because new line character is omitted from .lines
|
|
||||||
charactersInLines += (line.length + 1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
minOf(firstSpaceAfterCut, firstNewLineAfterCut, charactersInLines)
|
|
||||||
}
|
|
||||||
|
|
||||||
val text by
|
val text by
|
||||||
remember(content) {
|
remember(content) {
|
||||||
|
@ -54,6 +54,7 @@ dependencies {
|
|||||||
androidTestImplementation 'junit:junit:4.13.2'
|
androidTestImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.benchmark:benchmark-junit4:1.2.3'
|
androidTestImplementation 'androidx.benchmark:benchmark-junit4:1.2.3'
|
||||||
androidTestImplementation project(path: ':quartz')
|
androidTestImplementation project(path: ':quartz')
|
||||||
|
androidTestImplementation project(path: ':commons')
|
||||||
|
|
||||||
// Add your dependencies here. Note that you cannot benchmark code
|
// Add your dependencies here. Note that you cannot benchmark code
|
||||||
// in an app module this way - you will need to move any code you
|
// in an app module this way - you will need to move any code you
|
||||||
|
@ -0,0 +1,119 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2023 Vitor Pamplona
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||||
|
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.vitorpamplona.amethyst.benchmark
|
||||||
|
|
||||||
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
|
import androidx.benchmark.junit4.measureRepeated
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import com.vitorpamplona.amethyst.commons.ExpandableTextParser
|
||||||
|
import junit.framework.TestCase
|
||||||
|
import org.junit.Rule
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
class ExpandableViewComputationBenchmark {
|
||||||
|
@get:Rule
|
||||||
|
val benchmarkRule = BenchmarkRule()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun computeTestCase1() {
|
||||||
|
benchmarkRule.measureRepeated {
|
||||||
|
TestCase.assertEquals(
|
||||||
|
294,
|
||||||
|
ExpandableTextParser().computeWhereToCutIfPostIsTooLong(testCase1),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun computeTestCase2() {
|
||||||
|
benchmarkRule.measureRepeated {
|
||||||
|
TestCase.assertEquals(
|
||||||
|
355,
|
||||||
|
ExpandableTextParser().computeWhereToCutIfPostIsTooLong(testCase2),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val testCase1 = """
|
||||||
|
#Amethyst v0.83.10
|
||||||
|
|
||||||
|
تحديث جديد لـ Amethyst بإصدار 0.83.10 مع تعديلات وإضافات جديدة
|
||||||
|
|
||||||
|
: NIP-92 إصلاحات الأخطاء
|
||||||
|
|
||||||
|
الإضافات الجديدة:
|
||||||
|
- يتضمن رابط المنتج في الرسالة الأولى من المشتري في السوق
|
||||||
|
- يضيف دعمًا لـ NIP-92 في الرسائل العامة والرسائل المباشرة الجديدة (NIP-17). يبقى NIP-54 في NIP-04 DMs
|
||||||
|
- إضافة التمرير الأفقي إلى أزرار الإجراءات في شاشة النشر الجديد لإصلاح الأزرار المخفية جزئيًا في الشاشات الصغيرة/الرفيعة.
|
||||||
|
|
||||||
|
اصلاحات الشوائب:
|
||||||
|
- إصلاحات التعطل مع مبلغ Zap مخصص غير صالح
|
||||||
|
- يعمل على إصلاح مشكلات إعادة اتصال التتابع عندما يقوم المرحل بإغلاق الاتصال
|
||||||
|
- إصلاح الحشو العلوي للملاحظة المقتبسة في المنشور
|
||||||
|
- تحسين استخدام الذاكرة للمستخدم المرئي وعلامة URL في المشاركات الجديدة
|
||||||
|
|
||||||
|
الترجمات المحدثة:
|
||||||
|
- الفارسية بواسطة
|
||||||
|
- الفرنسية والإنجليزية، المملكة المتحدة بواسطة
|
||||||
|
- الأوكرانية
|
||||||
|
- الإسبانية والإسبانية والمكسيك والإسبانية والولايات المتحدة بواسطة
|
||||||
|
- العربية
|
||||||
|
|
||||||
|
تحسينات جودة الكود:
|
||||||
|
- تحديثات لنظام Android Studio 2023.1.1 Patch 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
nostr:nevent1qqszq7kl888sw0c5rpvepn8w373zt0jrw8864x8lkauxxw335s66rzgppemhxue69uhkummn9ekx7mp0qgsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqrqsqqqqqpaax7m2
|
||||||
|
"""
|
||||||
|
|
||||||
|
val testCase2 = """
|
||||||
|
#Amethyst v0.83.10: NIP-92 and Bug Fixes
|
||||||
|
|
||||||
|
New Additions:
|
||||||
|
- Includes a link to the product in the first message from the buyer in the marketplace
|
||||||
|
- Adds support for NIP-92 in public messages and new DMs (NIP-17). NIP-54 stays in NIP-04 DMs
|
||||||
|
- Adds Horizontal Scroll to the action buttons in the New Post screen to partially fix hidden buttons in small/thin screens.
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
- Fixes crash with an invalid custom Zap Amount
|
||||||
|
- Fixes relay re-connection issues when the relay closes a connection
|
||||||
|
- Fixes the top padding of the quoted note in a post
|
||||||
|
- Optimizes memory use of the visual user and url tagger in new posts
|
||||||
|
|
||||||
|
Updated translations:
|
||||||
|
- Persian by nostr:npub1cpazafytvafazxkjn43zjfwtfzatfz508r54f6z6a3rf2ws8223qc3xxpk
|
||||||
|
- French and English, United Kingdom by nostr:npub13qtw3yu0uc9r4yj5x0rhgy8nj5q0uyeq0pavkgt9ly69uuzxgkfqwvx23t
|
||||||
|
- Ukrainian by crowdin.com/profile/liizzzz
|
||||||
|
- Spanish, Spanish, Mexico and Spanish, United States by nostr:npub1luhyzgce7qtcs6r6v00ryjxza8av8u4dzh3avg0zks38tjktnmxspxq903
|
||||||
|
- Arabic by nostr:npub13qtw3yu0uc9r4yj5x0rhgy8nj5q0uyeq0pavkgt9ly69uuzxgkfqwvx23t
|
||||||
|
|
||||||
|
Code Quality Improvements:
|
||||||
|
- Updates to Android Studio 2023.1.1 Patch 2
|
||||||
|
|
||||||
|
Download:
|
||||||
|
- [Play Edition](https://github.com/vitorpamplona/amethyst/releases/download/v0.83.10/amethyst-googleplay-universal-v0.83.10.apk )
|
||||||
|
- [FOSS Edition - No translations](https://github.com/vitorpamplona/amethyst/releases/download/v0.83.10/amethyst-fdroid-universal-v0.83.10.apk )
|
||||||
|
"""
|
||||||
|
}
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
@ -18,7 +18,7 @@
|
|||||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.vitorpamplona.amethyst.benchmark
|
package com.vitorpamplona.quartz.benchmark
|
||||||
|
|
||||||
import androidx.benchmark.junit4.BenchmarkRule
|
import androidx.benchmark.junit4.BenchmarkRule
|
||||||
import androidx.benchmark.junit4.measureRepeated
|
import androidx.benchmark.junit4.measureRepeated
|
1
commons/.gitignore
vendored
Normal file
1
commons/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/build
|
41
commons/build.gradle
Normal file
41
commons/build.gradle
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
plugins {
|
||||||
|
id 'com.android.library'
|
||||||
|
id 'org.jetbrains.kotlin.android'
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace 'com.vitorpamplona.amethyst.commons'
|
||||||
|
compileSdk 34
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
minSdk 26
|
||||||
|
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
consumerProguardFiles "consumer-rules.pro"
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled true
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
create("benchmark") {
|
||||||
|
initWith(getByName("release"))
|
||||||
|
signingConfig signingConfigs.debug
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_17
|
||||||
|
targetCompatibility JavaVersion.VERSION_17
|
||||||
|
}
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = '17'
|
||||||
|
freeCompilerArgs += "-Xstring-concat=inline"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation 'junit:junit:4.13.2'
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||||
|
}
|
0
commons/consumer-rules.pro
Normal file
0
commons/consumer-rules.pro
Normal file
21
commons/proguard-rules.pro
vendored
Normal file
21
commons/proguard-rules.pro
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
4
commons/src/main/AndroidManifest.xml
Normal file
4
commons/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest>
|
||||||
|
|
||||||
|
</manifest>
|
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2023 Vitor Pamplona
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||||
|
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.vitorpamplona.amethyst.commons
|
||||||
|
|
||||||
|
class ExpandableTextParser {
|
||||||
|
companion object {
|
||||||
|
const val SHORT_TEXT_LENGTH = 350
|
||||||
|
const val SHORTEN_AFTER_LINES = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
fun computeWhereToCutIfPostIsTooLong(content: String): Int {
|
||||||
|
// Cuts the text in the first space or new line after SHORT_TEXT_LENGTH characters
|
||||||
|
val firstSpaceAfterCut =
|
||||||
|
content.indexOf(' ', SHORT_TEXT_LENGTH).let { if (it < 0) content.length else it }
|
||||||
|
val firstNewLineAfterCut =
|
||||||
|
content.indexOf('\n', SHORT_TEXT_LENGTH).let { if (it < 0) content.length else it }
|
||||||
|
|
||||||
|
// or after SHORTEN_AFTER_LINES lines
|
||||||
|
val numberOfLines = content.count { it == '\n' }
|
||||||
|
|
||||||
|
var charactersInLines = minOf(firstSpaceAfterCut, firstNewLineAfterCut)
|
||||||
|
|
||||||
|
if (numberOfLines > SHORTEN_AFTER_LINES) {
|
||||||
|
val shortContent = content.lines().take(SHORTEN_AFTER_LINES)
|
||||||
|
charactersInLines = 0
|
||||||
|
for (line in shortContent) {
|
||||||
|
// +1 because new line character is omitted from .lines
|
||||||
|
charactersInLines += (line.length + 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return minOf(firstSpaceAfterCut, firstNewLineAfterCut, charactersInLines)
|
||||||
|
}
|
||||||
|
}
|
@ -23,3 +23,4 @@ rootProject.name = "Amethyst"
|
|||||||
include ':app'
|
include ':app'
|
||||||
include ':benchmark'
|
include ':benchmark'
|
||||||
include ':quartz'
|
include ':quartz'
|
||||||
|
include ':commons'
|
||||||
|
Loading…
Reference in New Issue
Block a user