Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v0.19 upgrade #1277

Merged
merged 9 commits into from
Nov 28, 2023
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ android {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.3"
kotlinCompilerExtensionVersion = "1.5.4"
}
}

Expand Down Expand Up @@ -131,13 +131,16 @@ dependencies {
implementation("io.coil-kt:coil-gif:2.5.0")
implementation("io.coil-kt:coil-svg:2.5.0")
// Allows for proper subsampling of large images
implementation("me.saket.telephoto:zoomable-image-coil:0.7.0-20230922.054002-2")
implementation("me.saket.telephoto:zoomable-image-coil:0.7.1")
// Animated dropdowns
implementation("me.saket.cascade:cascade-compose:2.3.0")

// crash handling
implementation("com.github.FunkyMuse:Crashy:1.2.0")

// Versioning
implementation("io.github.z4kn4fein:semver:1.4.2")

// To use Kotlin annotation processing tool
ksp("androidx.room:room-compiler:2.6.0")

Expand Down Expand Up @@ -174,15 +177,15 @@ dependencies {
debugImplementation("androidx.compose.ui:ui-test-manifest:1.5.4")
implementation("androidx.compose.material:material-icons-extended:1.5.4")

implementation("androidx.activity:activity-compose:1.8.0")
implementation("androidx.activity:activity-compose:1.8.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")

testImplementation("org.mockito:mockito-core:5.7.0")
testImplementation("org.mockito.kotlin:mockito-kotlin:5.1.0")

implementation("androidx.browser:browser:1.6.0")
implementation("androidx.browser:browser:1.7.0")

implementation("androidx.profileinstaller:profileinstaller:1.3.1")
baselineProfile(project(":benchmarks"))
Expand Down
9 changes: 2 additions & 7 deletions app/src/main/java/com/jerboa/JerboaAppState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,9 @@ class JerboaAppState(

fun toSiteSideBar() = navController.navigate(Route.SITE_SIDEBAR)

fun toCommentReply(
replyItem: ReplyItem,
isModerator: Boolean,
) {
fun toCommentReply(replyItem: ReplyItem) {
sendReturnForwards(CommentReplyReturn.COMMENT_SEND, replyItem)
navController.navigate(Route.CommentReplyArgs.makeRoute(isModerator = "$isModerator"))
navController.navigate(Route.COMMENT_REPLY)
}

fun toComment(id: Int) {
Expand All @@ -119,8 +116,6 @@ class JerboaAppState(

fun toHome() = navController.navigate(Route.HOME) { popUpTo(navController.graph.id) }

fun toInbox() = navController.navigate(Route.INBOX)

fun toCommunity(id: Int) {
navController.navigate(Route.CommunityFromIdArgs.makeRoute(id = "$id"))
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/jerboa/JerboaApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.jerboa.util.downloadprogress.DownloadProgress
class JerboaApplication : Application(), ImageLoaderFactory {
lateinit var container: AppDBContainer
lateinit var imageViewerLoader: ImageLoader
lateinit var imageLoader: ImageLoader
private lateinit var imageLoader: ImageLoader
lateinit var imageGifLoader: ImageLoader

override fun onCreate() {
Expand Down
12 changes: 2 additions & 10 deletions app/src/main/java/com/jerboa/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ import com.jerboa.ui.components.settings.crashlogs.CrashLogsActivity
import com.jerboa.ui.components.settings.lookandfeel.LookAndFeelActivity
import com.jerboa.ui.theme.JerboaTheme
import com.jerboa.util.markwon.BetterLinkMovementMethod
import io.github.z4kn4fein.semver.toVersion

class MainActivity : AppCompatActivity() {
val siteViewModel by viewModels<SiteViewModel>(factoryProducer = { SiteViewModel.Factory })
Expand Down Expand Up @@ -173,7 +174,7 @@ class MainActivity : AppCompatActivity() {
when (val siteRes = siteViewModel.siteRes) {
is ApiState.Success -> {
val siteVersion = siteRes.data.version
if (compareVersions(siteVersion, MINIMUM_API_VERSION) < 0 && !serverVersionOutdatedViewed.value) {
if (siteVersion.toVersion() < MINIMUM_API_VERSION && !serverVersionOutdatedViewed.value) {
ShowOutdatedServerDialog(
siteVersion = siteVersion,
onConfirm = { serverVersionOutdatedViewed.value = true },
Expand Down Expand Up @@ -534,20 +535,11 @@ class MainActivity : AppCompatActivity() {

composable(
route = Route.COMMENT_REPLY,
arguments =
listOf(
navArgument(Route.CommentReplyArgs.IS_MODERATOR) {
type = Route.CommentReplyArgs.IS_MODERATOR_TYPE
},
),
) {
val args = Route.CommentReplyArgs(it)

CommentReplyActivity(
accountViewModel = accountViewModel,
appState = appState,
siteViewModel = siteViewModel,
isModerator = args.isModerator,
)
}

Expand Down
64 changes: 14 additions & 50 deletions app/src/main/java/com/jerboa/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,15 @@ import android.content.ContentValues
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.ImageDecoder
import android.media.MediaScannerConnection
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.Uri
import android.os.Build
import android.os.Build.VERSION.SDK_INT
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.util.TypedValue
import android.webkit.MimeTypeMap.getFileExtensionFromUrl
import android.widget.Toast
import androidx.activity.ComponentActivity
Expand Down Expand Up @@ -49,14 +47,15 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.CreationExtras
import androidx.navigation.NavController
import arrow.core.compareTo
import coil.annotation.ExperimentalCoilApi
import coil.imageLoader
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.jerboa.api.API
import com.jerboa.api.API.Companion.checkIfLemmyInstance
import com.jerboa.api.ApiState
import com.jerboa.datatypes.CommentSortType
import com.jerboa.datatypes.ListingType
import com.jerboa.datatypes.types.*
import com.jerboa.db.APP_SETTINGS_DEFAULT
import com.jerboa.db.entity.AppSettings
Expand Down Expand Up @@ -483,10 +482,15 @@ suspend fun openLink(
val communityUrl = looksLikeCommunityUrl(parsedUrl)

if (userUrl != null && (formatted || checkIfLemmyInstance(url))) {
val route = Route.ProfileFromUrlArgs.makeRoute(instance = userUrl.first, name = userUrl.second)
val route =
Route.ProfileFromUrlArgs.makeRoute(instance = userUrl.first, name = userUrl.second)
navController.navigate(route)
} else if (communityUrl != null && (formatted || checkIfLemmyInstance(url))) {
val route = Route.CommunityFromUrlArgs.makeRoute(instance = communityUrl.first, name = communityUrl.second)
val route =
Route.CommunityFromUrlArgs.makeRoute(
instance = communityUrl.first,
name = communityUrl.second,
)
navController.navigate(route)
} else {
openLinkRaw(url, navController, useCustomTab, usePrivateTab)
Expand Down Expand Up @@ -779,13 +783,6 @@ fun isPostCreator(commentView: CommentView): Boolean {
return commentView.creator.id == commentView.post.creator_id
}

fun isModerator(
person: Person,
moderators: List<CommunityModeratorView>,
): Boolean {
return moderators.map { it.moderator.id }.contains(person.id)
}

data class InputField(
val label: String,
val hasError: Boolean,
Expand Down Expand Up @@ -862,20 +859,6 @@ fun imageInputStreamFromUri(
return ctx.contentResolver.openInputStream(uri)!!
}

fun decodeUriToBitmap(
ctx: Context,
uri: Uri,
): Bitmap? {
Log.d("jerboa", "decodeUriToBitmap INPUT: $uri")
return if (SDK_INT < 28) {
@Suppress("DEPRECATION")
MediaStore.Images.Media.getBitmap(ctx.contentResolver, uri)
} else {
val source = ImageDecoder.createSource(ctx.contentResolver, uri)
ImageDecoder.decodeBitmap(source)
}
}

fun scrollToTop(
scope: CoroutineScope,
listState: LazyListState,
Expand Down Expand Up @@ -1115,7 +1098,7 @@ fun convertSpToPx(
sp: TextUnit,
ctx: Context,
): Int {
return (sp.value * ctx.resources.displayMetrics.scaledDensity).toInt()
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp.value, ctx.resources.displayMetrics).toInt()
}

/**
Expand Down Expand Up @@ -1146,6 +1129,7 @@ fun getLocalizedListingTypeName(
ListingType.All -> ctx.getString(R.string.home_all)
ListingType.Local -> ctx.getString(R.string.home_local)
ListingType.Subscribed -> ctx.getString(R.string.home_subscribed)
ListingType.ModeratorView -> ctx.getString(R.string.home_moderator_view)
}
return returnString
}
Expand Down Expand Up @@ -1413,27 +1397,6 @@ fun getHostFromInstanceString(input: String): String {
}
}

/**
* Compare two version strings.
*
* This attempts to do a natural comparison assuming it's a typical semver (e.g. x.y.z),
* but it ignores anything it doesn't understand. Since we're highly confident that these verisons
* will be properly formed, this is safe enough without overcomplicating it.
*/
fun compareVersions(
a: String,
b: String,
): Int {
val versionA: List<Int> = a.split('.').mapNotNull { it.toIntOrNull() }
val versionB: List<Int> = b.split('.').mapNotNull { it.toIntOrNull() }

val comparison = versionA.compareTo(versionB)
if (comparison == 0) {
return a.compareTo(b)
}
return comparison
}

/**
* Copy a given text to the clipboard, using the Kotlin context
*
Expand All @@ -1450,7 +1413,8 @@ fun copyToClipboard(
): Boolean {
val activity = context.findActivity()
activity?.let {
val clipboard: ClipboardManager = it.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipboard: ClipboardManager =
it.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText(clipLabel, textToCopy)
clipboard.setPrimaryClip(clip)
return true
Expand Down
Loading