diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt b/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt index d92a552..00caa7f 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt @@ -118,7 +118,7 @@ class MainActivity : AppCompatActivity(), ConnectivityReceiver.ConnectivityRecei toggle.syncState() tvAbout.text = Html.fromHtml(""" -

© 2019 — Kurozero | v${Api.version} (${Api.versionCode})
+

© 2020 — Kurozero | v${Api.version} (${Api.versionCode})
Made possible with nekos.moe

""".trimIndent(), Html.FROM_HTML_MODE_LEGACY) tvAbout.movementMethod = LinkMovementMethod.getInstance() @@ -177,6 +177,7 @@ class MainActivity : AppCompatActivity(), ConnectivityReceiver.ConnectivityRecei Fresco.initialize(this, config) GlobalScope.launch { + @Suppress("BlockingMethodInNonBlockingContext") Thread.sleep(5_000) init = false } diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt b/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt index 1b209e1..035e6f0 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt @@ -15,8 +15,8 @@ class ProfileActivity : AppCompatActivity() { tvLikes.text = user!!.likesReceived.toString() tvFavorites.text = user!!.favoritesReceived.toString() tvJoined.text = timestamp(user!!.createdAt) - tvPosted.text = "${user!!.uploads} ${if (user!!.uploads == 1) "image" else "images"}" - tvGiven.text = "Has given ${user!!.likes.size} likes and ${user!!.favorites.size} favorites" + tvPosted.text = getString(R.string.posted2, user!!.uploads, if (user!!.uploads == 1) "image" else "images") + tvGiven.text = getString(R.string.given, user!!.likes.size, user!!.favorites.size) } } \ No newline at end of file diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt index 7f40141..bb28d26 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt @@ -5,7 +5,6 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import xyz.kurozero.nekosmoe.R import xyz.kurozero.nekosmoe.model.Neko -import xyz.kurozero.nekosmoe.model.Nekos class NekosGridRecyclerAdapter : RecyclerView.Adapter() { private var listOfNekos = listOf() diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt index a0b0b42..41f5f7a 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt @@ -121,12 +121,12 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { user?.likes?.add(neko.id) sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply() Snackbar.make(view, "Liked", Snackbar.LENGTH_SHORT).show() - GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = "Unlike" } + GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = view.context.getString(R.string.unlike) } } else { user?.likes?.remove(neko.id) sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply() Snackbar.make(view, "Unliked", Snackbar.LENGTH_SHORT).show() - GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = "Like" } + GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = view.context.getString(R.string.like) } } } response.close() @@ -171,12 +171,12 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { user?.favorites?.add(neko.id) sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply() Snackbar.make(view, "Favorited", Snackbar.LENGTH_SHORT).show() - GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = "Unfavorite" } + GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = view.context.getString(R.string.unfav) } } else { user?.favorites?.remove(neko.id) sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply() Snackbar.make(view, "Unfavorited", Snackbar.LENGTH_SHORT).show() - GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = "Favorite" } + GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = view.context.getString(R.string.fav) } } } response.close() @@ -193,8 +193,8 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { nekoDialog.dismiss() } - view.btnShareNeko.onClick { - if (!connected || !isConnected(itemView.context)) return@onClick + view.btnShareNeko.onClick shareNeko@ { + if (!connected || !isConnected(itemView.context)) return@shareNeko picasso.load(neko.getImageUrl()).into { onFailed { e, _ -> @@ -236,8 +236,8 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { } } - view.btnSaveNeko.onClick { - if (!connected || ! isConnected(view.context)) return@onClick + view.btnSaveNeko.onClick saveNeko@ { + if (!connected || ! isConnected(view.context)) return@saveNeko if (!hasPermissions(view.context, permissions)) { ActivityCompat.requestPermissions(view.context as MainActivity, permissions, 999) @@ -260,7 +260,7 @@ private fun downloadAndSave(neko: Neko, view: View) { val fos: OutputStream if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val resolver = view.context.contentResolver; + val resolver = view.context.contentResolver val values = ContentValues() values.put(MediaStore.MediaColumns.DISPLAY_NAME, neko.id) values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg") diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt b/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt index 35da7ec..31b4229 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt @@ -15,6 +15,7 @@ class ConnectivityReceiver : BroadcastReceiver() { } } + @Suppress("DEPRECATION") private fun isConnectedOrConnecting(context: Context): Boolean { val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connMgr.activeNetworkInfo diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt b/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt index 92e1ac6..db5d4ad 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt @@ -5,8 +5,8 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.StaggeredGridLayoutManager - -abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener { +abstract class EndlessRecyclerViewScrollListener(layoutManager: GridLayoutManager) : + RecyclerView.OnScrollListener() { // The minimum amount of items to have below your current scroll position // before loading more. private var visibleThreshold = 5 @@ -19,23 +19,14 @@ abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener // Sets the starting page index private val startingPageIndex = 0 - private var mLayoutManager: RecyclerView.LayoutManager - - constructor(layoutManager: LinearLayoutManager) { - this.mLayoutManager = layoutManager - } - - constructor(layoutManager: GridLayoutManager) { - this.mLayoutManager = layoutManager - visibleThreshold *= layoutManager.spanCount - } + private var mLayoutManager: RecyclerView.LayoutManager = layoutManager - constructor(layoutManager: StaggeredGridLayoutManager) { - this.mLayoutManager = layoutManager + init { visibleThreshold *= layoutManager.spanCount } - fun getLastVisibleItem(lastVisibleItemPositions: IntArray): Int { + @Suppress("unused") + private fun getLastVisibleItem(lastVisibleItemPositions: IntArray): Int { var maxSize = 0 for (i in lastVisibleItemPositions.indices) { if (i == 0) { @@ -113,6 +104,7 @@ abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener this.loading = true } + @Suppress("unused") fun setLoading(state: Boolean) = run { loading = state } // Defines the process for actually loading more data based on page diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt b/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt index b2fc090..5c65c16 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt @@ -1,16 +1,7 @@ package xyz.kurozero.nekosmoe.helper - -import android.annotation.SuppressLint -import android.content.ContentUris import android.content.Context import android.content.pm.PackageManager -import android.database.Cursor -import android.net.Uri -import android.os.Build -import android.os.Environment -import android.provider.DocumentsContract -import android.provider.MediaStore import android.graphics.Typeface import android.net.ConnectivityManager import android.text.format.DateUtils @@ -18,100 +9,6 @@ import androidx.core.app.ActivityCompat import java.text.SimpleDateFormat import java.util.* -object FilePickUtils { - private fun getPathDeprecated(ctx: Context, uri: Uri?): String? { - if (uri == null) { - return null - } - val projection = arrayOf(MediaStore.Images.Media.DATA) - val cursor = ctx.contentResolver.query(uri, projection, null, null, null) - if (cursor != null) { - val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) - cursor.moveToFirst() - val returnVal = cursor.getString(columnIndex) - cursor.close() - return returnVal - } - return uri.path - } - - @SuppressLint("ObsoleteSdkInt") - fun getSmartFilePath(ctx: Context, uri: Uri): String? { - if (Build.VERSION.SDK_INT < 19) { - return getPathDeprecated(ctx, uri) - } - return getPath(ctx, uri) - } - - private fun getPath(context: Context, uri: Uri): String? { - if (DocumentsContract.isDocumentUri(context, uri)) { - if (isExternalStorageDocument(uri)) { - val docId = DocumentsContract.getDocumentId(uri) - val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() - val type = split[0] - - if ("primary".equals(type, ignoreCase = true)) { - return Environment.getExternalStorageDirectory().toString() + "/" + split[1] - } - } else if (isDownloadsDocument(uri)) { - val id = DocumentsContract.getDocumentId(uri) - val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)!!) - return getDataColumn(context, contentUri, null, null) - } else if (isMediaDocument(uri)) { - val docId = DocumentsContract.getDocumentId(uri) - val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() - val type = split[0] - - var contentUri: Uri? = null - when (type) { - "image" -> contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI - "video" -> contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI - "audio" -> contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI - } - - val selection = "_id=?" - val selectionArgs = arrayOf(split[1]) - - return contentUri?.let { getDataColumn(context, it, selection, selectionArgs) } - } - } else if ("content".equals(uri.scheme, ignoreCase = true)) { - return getDataColumn(context, uri, null, null) - } else if ("file".equals(uri.scheme, ignoreCase = true)) { - return uri.path - } - return null - } - - private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array?): String? { - var cursor: Cursor? = null - val column = "_data" - val projection = arrayOf(column) - - try { - cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) - if (cursor != null && cursor.moveToFirst()) { - val columnIndex = cursor.getColumnIndexOrThrow(column) - return cursor.getString(columnIndex) - } - } finally { - cursor?.close() - } - return null - } - - private fun isExternalStorageDocument(uri: Uri): Boolean { - return "com.android.externalstorage.documents" == uri.authority - } - - private fun isDownloadsDocument(uri: Uri): Boolean { - return "com.android.providers.downloads.documents" == uri.authority - } - - private fun isMediaDocument(uri: Uri): Boolean { - return "com.android.providers.media.documents" == uri.authority - } -} - object FontsOverride { fun setDefaultFont(context: Context, staticTypefaceFieldName: String, fontAssetName: String) { val regular = Typeface.createFromAsset(context.assets, fontAssetName) @@ -134,7 +31,7 @@ object FontsOverride { fun timestamp(timeCreated: String): String { val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH) - val timeCreatedDate = dateFormat.parse(timeCreated) + val timeCreatedDate = dateFormat.parse(timeCreated)!! return DateUtils.getRelativeTimeSpanString(timeCreatedDate.time, System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS) as String } @@ -149,6 +46,7 @@ fun hasPermissions(context: Context?, permissions: Array): Boolean { return true } +@Suppress("DEPRECATION") fun isConnected(context: Context): Boolean { val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork = cm.activeNetworkInfo diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt b/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt index bf91f40..796f554 100644 --- a/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt +++ b/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt @@ -1,3 +1,5 @@ +@file:Suppress("unused") + package xyz.kurozero.nekosmoe.model data class Nekos( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0d170de..ed19e69 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -51,4 +51,9 @@ /post/… Nekos.moe Profile + Unlike + Like + Unfavorite + Favorite + %1$d %2$s