diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 37692bd..6138fd4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -267,3 +267,4 @@ jobs: uses: sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0 with: webhook: ${{ secrets.DISCORD_WEBHOOK }} + description: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/.gitignore b/.gitignore index 67e4e53..17997ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,23 @@ +# Generic .DS_Store - .idea/ *.iml - -**/build/ +.vscode/ +.*cache* +node_modules/ +build/ +dist/ +out/ +*.dll +*.exe .gradle/ .kotlin/ captures/ app/debug app/release - +# App local.properties *.keystore *.logcat **/google-services.json **/firebase-adminsdk.json - -**/dist/ diff --git a/.prettierignore b/.prettierignore index ce80d28..eb5ad57 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,10 +1,5 @@ -# IDE -.idea/ -.vscode/ - -# Build -**/dist/ -**/node_modules/ - -# App -app/src/main/assets/preview/** +.github/assets +.github/disabled +.github/pull_request_template.md +.github/assets +app/src/main/assets/preview diff --git a/README.md b/README.md index 2bfcba2..0c928d4 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -[![GitHub Downloads](https://img.shields.io/github/downloads/django-files/android-client/total?logo=android)](https://github.com/django-files/android-client/releases/latest/download/app-release.apk) +[![GitHub Downloads](https://img.shields.io/github/downloads/django-files/android-client/total?logo=android)](https://github.com/django-files/android-client/releases) [![GitHub Release Version](https://img.shields.io/github/v/release/django-files/android-client?logo=github)](https://github.com/django-files/android-client/releases/latest) -[![GitHub Last Commit](https://img.shields.io/github/last-commit/django-files/android-client?logo=github&label=updated)](https://github.com/django-files/android-client/pulse) -[![Lint](https://img.shields.io/github/actions/workflow/status/django-files/android-client/lint.yaml?logo=github&logoColor=white&label=lint)](https://github.com/django-files/android-client/actions/workflows/lint.yaml) -[![Release](https://img.shields.io/github/actions/workflow/status/django-files/android-client/release.yaml?logo=github&logoColor=white&label=release)](https://github.com/django-files/android-client/actions/workflows/release.yaml) +[![APK Size](https://badges.cssnr.com/gh/release/django-files/android-client/latest/asset/app-release.apk/size?label=apk&color=darkgreen)](https://github.com/django-files/remote-wallpaper-android/releases/latest/download/app-release.apk) [![AGP Version](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fraw.githubusercontent.com%2Fdjango-files%2Fandroid-client%2Frefs%2Fheads%2Fmaster%2Fgradle%2Flibs.versions.toml&query=%24.versions.agp&logo=gradle&label=AGP)](https://github.com/django-files/android-client/blob/master/gradle/libs.versions.toml#L2) +[![Workflow Lint](https://img.shields.io/github/actions/workflow/status/django-files/android-client/lint.yaml?logo=norton&logoColor=white&label=lint)](https://github.com/django-files/android-client/actions/workflows/lint.yaml) +[![Workflow Release](https://img.shields.io/github/actions/workflow/status/django-files/android-client/release.yaml?logo=norton&logoColor=white&label=release)](https://github.com/django-files/android-client/actions/workflows/release.yaml) [![GitHub Last Commit](https://img.shields.io/github/last-commit/django-files/android-client?logo=listenhub&label=updated)](https://github.com/django-files/android-client/pulse) [![GitHub Repo Size](https://img.shields.io/github/repo-size/django-files/android-client?logo=buffer&label=repo%20size)](https://github.com/django-files/android-client?tab=readme-ov-file#readme) [![GitHub Top Language](https://img.shields.io/github/languages/top/django-files/android-client?logo=devbox)](https://github.com/django-files/android-client?tab=readme-ov-file#readme) @@ -17,7 +17,8 @@ # Django Files Android App -[![GitHub Release](https://img.shields.io/github/v/release/django-files/android-client?style=for-the-badge&logo=android&label=Download%20Android%20APK&color=3ddc84)](https://github.com/django-files/android-client/releases/latest/download/app-release.apk) + +Django Files - [Install](#Install) - [Setup](#Setup) @@ -38,6 +39,8 @@ The URL to the file is automatically copied to the clipboard and the preview is Additional screenshots can be found on the website: https://django-files.github.io/android/ +[![GitHub Release](https://img.shields.io/github/v/release/django-files/android-client?style=for-the-badge&logo=android&label=Download%20Android%20APK&color=3ddc84)](https://github.com/django-files/android-client/releases/latest/download/app-release.apk) + | Django Files | Link | | ----------------- | :-------------------------------------------- | | Website | https://django-files.github.io/ | @@ -203,7 +206,6 @@ If you are experiencing an issue/bug or getting unexpected results, you can: - Report an Issue: https://github.com/django-files/android-client/issues - Chat with us on Discord: https://discord.gg/wXy6m2X8wY -- Provide General Feedback: [https://cssnr.github.io/feedback/](https://cssnr.github.io/feedback/?app=Django%20Files%20Android%20App) # Development @@ -342,10 +344,10 @@ You can also support other related projects: - [Django Files Android App](https://github.com/django-files/android-client) - [Django Files Web Extension](https://github.com/django-files/web-extension) - + - - - Star History Chart + + + Star History Chart diff --git a/Taskfile.yml b/Taskfile.yml index 3519170..999b5e4 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -13,8 +13,8 @@ tasks: format: desc: Format aliases: [fmt] - cmd: | - prettier --write . + cmds: + - prettier --write . build: desc: Build (recommended android studio) diff --git a/app/src/debug/java/com/djangofiles/djangofiles/DiscordApi.kt b/app/src/debug/java/com/djangofiles/djangofiles/DiscordApi.kt index 4656590..763ff74 100644 --- a/app/src/debug/java/com/djangofiles/djangofiles/DiscordApi.kt +++ b/app/src/debug/java/com/djangofiles/djangofiles/DiscordApi.kt @@ -1,7 +1,6 @@ package com.djangofiles.djangofiles import android.content.Context -import android.util.Log import com.google.gson.GsonBuilder import okhttp3.Cookie import okhttp3.CookieJar @@ -65,7 +64,7 @@ class DiscordApi( .build() } - inner class SimpleCookieJar : CookieJar { + class SimpleCookieJar : CookieJar { private val cookieStore = mutableMapOf>() override fun saveFromResponse(url: HttpUrl, cookies: List) { diff --git a/app/src/main/java/com/djangofiles/djangofiles/MainActivity.kt b/app/src/main/java/com/djangofiles/djangofiles/MainActivity.kt index d5ffc18..7f1882a 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/MainActivity.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/MainActivity.kt @@ -16,6 +16,7 @@ import android.util.Log import android.webkit.CookieManager import android.widget.TextView import android.widget.Toast +import androidx.activity.SystemBarStyle import androidx.activity.enableEdgeToEdge import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts @@ -101,7 +102,13 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d("Main[onCreate]", "savedInstanceState: ${savedInstanceState?.size()}") - enableEdgeToEdge() + enableEdgeToEdge( + //statusBarStyle = SystemBarStyle.dark(Color.TRANSPARENT), + statusBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT), + + //navigationBarStyle = SystemBarStyle.dark(Color.TRANSPARENT), + navigationBarStyle = SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT) + ) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) @@ -178,7 +185,7 @@ class MainActivity : AppCompatActivity() { //preferences.registerOnSharedPreferenceChangeListener(listener) // Update Status Bar - window.statusBarColor = Color.TRANSPARENT + //window.statusBarColor = Color.TRANSPARENT //WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = false // Set Global Left/Right System Insets @@ -194,7 +201,7 @@ class MainActivity : AppCompatActivity() { //window.decorView.setOnApplyWindowInsetsListener { view, insets -> insets } // Update Navigation Bar - window.navigationBarColor = Color.TRANSPARENT + //window.navigationBarColor = Color.TRANSPARENT if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { window.setNavigationBarContrastEnforced(false) } diff --git a/app/src/main/java/com/djangofiles/djangofiles/ServerApi.kt b/app/src/main/java/com/djangofiles/djangofiles/ServerApi.kt index 007c7ca..c944815 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ServerApi.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ServerApi.kt @@ -455,7 +455,7 @@ class ServerApi(val context: Context, host: String) { .build() } - inner class SimpleCookieJar : CookieJar { + class SimpleCookieJar : CookieJar { private val cookieStore = mutableMapOf>() override fun saveFromResponse(url: HttpUrl, cookies: List) { diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesBottomSheet.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesBottomSheet.kt index 5b8d37c..1fc6e65 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesBottomSheet.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesBottomSheet.kt @@ -4,7 +4,6 @@ import android.app.Dialog import android.app.DownloadManager import android.content.Context import android.content.res.ColorStateList -import android.graphics.Color import android.os.Build import android.os.Bundle import android.os.Environment @@ -18,6 +17,7 @@ import android.widget.LinearLayout import android.widget.Toast import androidx.core.content.ContextCompat import androidx.core.net.toUri +import androidx.core.view.WindowCompat import androidx.fragment.app.activityViewModels import androidx.fragment.app.setFragmentResultListener import androidx.lifecycle.lifecycleScope @@ -60,7 +60,7 @@ class FilesBottomSheet : BottomSheetDialogFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { _binding = FragmentFilesBottomBinding.inflate(inflater, container, false) val root: View = binding.root return root @@ -78,12 +78,12 @@ class FilesBottomSheet : BottomSheetDialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog dialog.setOnShowListener { - dialog.window?.navigationBarColor = Color.TRANSPARENT - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - dialog.window?.setNavigationBarContrastEnforced(false) + dialog.window?.let { window -> + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.setNavigationBarContrastEnforced(false) + } + WindowCompat.setDecorFitsSystemWindows(window, false) } - dialog.window?.decorView?.systemUiVisibility = - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_STABLE } return dialog } @@ -210,12 +210,10 @@ class FilesBottomSheet : BottomSheetDialogFragment() { // Image val radius = requireContext().resources.getDimension(R.dimen.image_preview_large) - binding.imagePreview.setShapeAppearanceModel( - binding.imagePreview.shapeAppearanceModel - .toBuilder() - .setAllCorners(CornerFamily.ROUNDED, radius) - .build() - ) + binding.imagePreview.shapeAppearanceModel = binding.imagePreview.shapeAppearanceModel + .toBuilder() + .setAllCorners(CornerFamily.ROUNDED, radius) + .build() if (isGlideMime(data.mime)) { Log.d("Bottom[onCreateView]", "isGlideMime") Glide.with(this) diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesFragment.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesFragment.kt index 7971484..8e48b80 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesFragment.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesFragment.kt @@ -28,7 +28,6 @@ import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener import com.bumptech.glide.Glide import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader import com.bumptech.glide.load.model.GlideUrl @@ -188,7 +187,7 @@ class FilesFragment : Fragment() { Log.i("File[onViewCreated]", "VIEW KEY MISMATCH - RESET DATA") viewModel.filesData.value = null viewModel.viewKey.value = key - viewModel.selected.value = mutableSetOf() + viewModel.selected.value = mutableSetOf() viewModel.atEnd.value = false resetAdapter = true } @@ -197,7 +196,7 @@ class FilesFragment : Fragment() { viewModel.viewKey.value = key } - val selected = viewModel.selected.value?.toMutableSet() ?: mutableSetOf() + val selected = viewModel.selected.value?.toMutableSet() ?: mutableSetOf() Log.d("File[onViewCreated]", "viewModel.selected -> selected.size: ${selected.size}") if (!::filesAdapter.isInitialized) { @@ -212,9 +211,11 @@ class FilesFragment : Fragment() { fun updateCheckButton() { val selectedSize = viewModel.selected.value?.size ?: 0 val filesSize = viewModel.filesData.value?.size ?: 0 - binding.filesTotalText.text = getString(R.string.files_total, filesSize) + binding.filesTotalText.text = resources.getQuantityString(R.plurals.files_total, filesSize, filesSize) binding.filesSelectedText.text = - getString(R.string.files_selected_total, selectedSize, filesSize) + resources.getQuantityString(R.plurals.files_selected_total, selectedSize, selectedSize, filesSize) + binding.filesSelectedText.text = + resources.getQuantityString(R.plurals.files_selected_total, filesSize, selectedSize, filesSize) if (selectedSize == filesSize) { //Log.i("filesData[updateCheckButton]", "ALL SELECTED") binding.filesSelectAll.setImageResource(R.drawable.md_check_box_24px) @@ -225,7 +226,7 @@ class FilesFragment : Fragment() { } Log.d("File[onViewCreated]", "viewModel.selectedUris.value: ${viewModel.selected.value}") - if (viewModel.selected.value != null && viewModel.selected.value!!.isEmpty() != true) { + if (viewModel.selected.value != null && !viewModel.selected.value!!.isEmpty()) { Log.d( "File[onViewCreated]", "viewModel.selectedUris.value: ${viewModel.selected.value}" @@ -308,54 +309,52 @@ class FilesFragment : Fragment() { }) // Setup refresh listener which triggers new data loading - binding.refreshLayout.setOnRefreshListener(object : OnRefreshListener { - override fun onRefresh() { - // TODO: This will be overhauled and possibly disabled until then... - Log.d("File[refreshLayout]", "onRefresh") - lifecycleScope.launch { - Log.d("File[refreshLayout]", "START") + binding.refreshLayout.setOnRefreshListener { + // TODO: This will be overhauled and possibly disabled until then... + Log.d("File[refreshLayout]", "onRefresh") + lifecycleScope.launch { + Log.d("File[refreshLayout]", "START") - Log.d("File[refreshLayout]", "Get Albums in the Background...") - launch(Dispatchers.IO) { - requireContext().getAlbums(savedUrl) - } + Log.d("File[refreshLayout]", "Get Albums in the Background...") + launch(Dispatchers.IO) { + requireContext().getAlbums(savedUrl) + } - //viewModel.selected.value?.clear() - viewModel.selected.value = mutableSetOf() - filesAdapter.selected.clear() - Log.i("File[refreshLayout]", "3 - getFiles: ON REFRESH") - getFiles(perPage, true) - _binding?.let { - it.refreshLayout.isRefreshing = false - it.refreshLayout.isEnabled = false - Log.d("File[refreshLayout]", "DONE") - // Fade In - it.refreshBanner.post { - it.refreshBanner.translationY = -it.refreshBanner.height.toFloat() - it.refreshBanner.visibility = View.VISIBLE - it.refreshBanner.animate() - .alpha(1f) - .translationY(0f) - .setDuration(400) - .start() - } - Handler(Looper.getMainLooper()).postDelayed({ - // Fade Out - it.refreshBanner.animate() - .alpha(0f) - .translationY(-it.refreshBanner.height.toFloat()) - .setDuration(400) - .withEndAction { - it.refreshBanner.visibility = View.GONE - } - .start() - }, 1600) + //viewModel.selected.value?.clear() + viewModel.selected.value = mutableSetOf() + filesAdapter.selected.clear() + Log.i("File[refreshLayout]", "3 - getFiles: ON REFRESH") + getFiles(perPage, true) + _binding?.let { + it.refreshLayout.isRefreshing = false + it.refreshLayout.isEnabled = false + Log.d("File[refreshLayout]", "DONE") + // Fade In + it.refreshBanner.post { + it.refreshBanner.translationY = -it.refreshBanner.height.toFloat() + it.refreshBanner.visibility = View.VISIBLE + it.refreshBanner.animate() + .alpha(1f) + .translationY(0f) + .setDuration(400) + .start() } + Handler(Looper.getMainLooper()).postDelayed({ + // Fade Out + it.refreshBanner.animate() + .alpha(0f) + .translationY(-it.refreshBanner.height.toFloat()) + .setDuration(400) + .withEndAction { + it.refreshBanner.visibility = View.GONE + } + .start() + }, 1600) } } - }) + } - val filesSelectAll: (View) -> Unit = { view -> + val filesSelectAll: (View) -> Unit = { _ -> val totalSize = viewModel.filesData.value?.size ?: 0 Log.d("File[filesSelectAll]", "totalSize: $totalSize") val currentSelected = viewModel.selected.value?.toSet() @@ -365,7 +364,7 @@ class FilesFragment : Fragment() { Log.d("File[filesSelectAll]", "size: ${viewModel.selected.value?.size}") binding.filesSelectedHeader.visibility = View.VISIBLE val positionIds: MutableSet = - viewModel.filesData.value?.indices?.toMutableSet() ?: mutableSetOf() + viewModel.filesData.value?.indices?.toMutableSet() ?: mutableSetOf() Log.d("deleteId[observe]", "positionIds: $positionIds") viewModel.selected.value = positionIds filesAdapter.selected.addAll(viewModel.selected.value!!) @@ -385,7 +384,7 @@ class FilesFragment : Fragment() { } } else { Log.i("File[filesSelectAll]", "UNSELECT ALL") - viewModel.selected.value = mutableSetOf() + viewModel.selected.value = mutableSetOf() filesAdapter.selected.clear() Log.d( "File[filesSelectAll]", diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesViewAdapter.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesViewAdapter.kt index b938370..70bca9d 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesViewAdapter.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/files/FilesViewAdapter.kt @@ -194,12 +194,10 @@ class FilesViewAdapter( // Image - Holder val radius = context.resources.getDimension(R.dimen.image_preview_small) - viewHolder.fileImage.setShapeAppearanceModel( - viewHolder.fileImage.shapeAppearanceModel - .toBuilder() - .setAllCorners(CornerFamily.ROUNDED, radius) - .build() - ) + viewHolder.fileImage.shapeAppearanceModel = viewHolder.fileImage.shapeAppearanceModel + .toBuilder() + .setAllCorners(CornerFamily.ROUNDED, radius) + .build() //viewHolder.fileImage.transitionName = data.id.toString() // Image - Glide Listener diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeFragment.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeFragment.kt index 069e110..45934f4 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeFragment.kt @@ -326,7 +326,6 @@ class HomeFragment : Fragment() { } } - @Suppress("unused") inner class WebAppInterface(private var context: Context) { @JavascriptInterface diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeViewModel.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeViewModel.kt index c622777..f0375c5 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/home/HomeViewModel.kt @@ -19,7 +19,7 @@ class HomeViewModel : ViewModel() { _urlToLoad.value = Event(url) } - inner class Event(private val content: T) { + class Event(private val content: T) { private var hasBeenHandled = false fun getContentIfNotHandled(): T? { diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginFragment.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginFragment.kt index 8d1f02c..2c84286 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginFragment.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginFragment.kt @@ -155,10 +155,8 @@ class LoginFragment : Fragment() { val methodsResponse = api.methods() Log.d("loginFunction", "methodsResponse: $methodsResponse") - val methodsData = methodsResponse.body() - if (methodsData == null) { - throw Exception("methodsData is null") - } + val methodsData = + methodsResponse.body() ?: throw Exception("methodsData is null") viewModel.hostname.value = host viewModel.siteName.value = methodsData.siteName viewModel.authMethods.value = methodsData.authMethods diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginTwoFragment.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginTwoFragment.kt index b024ca2..a92786a 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginTwoFragment.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/login/LoginTwoFragment.kt @@ -190,7 +190,7 @@ class LoginTwoFragment : Fragment() { Log.d("OnClickListener", "it: ${it.id}") val name = it.tag as? String Log.d("OnClickListener", "name: $name") - val url = authMethods.firstOrNull { it.name == name }?.url + val url = authMethods.firstOrNull { method -> method.name == name }?.url Log.d("OnClickListener", "url: $url") if (url == null) { diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/settings/SettingsFragment.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/settings/SettingsFragment.kt index 65c151f..95e4ae9 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/settings/SettingsFragment.kt @@ -7,8 +7,6 @@ import android.net.Uri import android.os.Bundle import android.os.PowerManager import android.provider.Settings -import android.text.Html -import android.text.method.LinkMovementMethod import android.util.Log import android.view.LayoutInflater import android.view.View @@ -16,6 +14,7 @@ import android.widget.EditText import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AlertDialog +import androidx.core.content.pm.PackageInfoCompat import androidx.core.net.toUri import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -467,7 +466,7 @@ class SettingsFragment : PreferenceFragmentCompat() { val formattedVersion = getString( R.string.version_code_string, packageInfo.versionName, - packageInfo.versionCode.toString() + PackageInfoCompat.getLongVersionCode(packageInfo).toString() ) Log.d("showAppInfoDialog", "formattedVersion: $formattedVersion") diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/settings/WidgetSettingsFragment.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/settings/WidgetSettingsFragment.kt index dc4db27..081a0fc 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/settings/WidgetSettingsFragment.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/settings/WidgetSettingsFragment.kt @@ -68,7 +68,7 @@ class WidgetSettingsFragment : PreferenceFragmentCompat() { seekBar?.apply { setOnPreferenceChangeListener { pref, newValue -> val intValue = (newValue as Int) - var stepped = ((intValue + 2) / 5) * 5 + val stepped = ((intValue + 2) / 5) * 5 Log.d("WidgetSettingsFragment", "stepped: $stepped") value = stepped pref.summary = "Current Value: $stepped" diff --git a/app/src/main/java/com/djangofiles/djangofiles/ui/upload/UploadMultiAdapter.kt b/app/src/main/java/com/djangofiles/djangofiles/ui/upload/UploadMultiAdapter.kt index 7947803..1873afd 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/ui/upload/UploadMultiAdapter.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/ui/upload/UploadMultiAdapter.kt @@ -40,7 +40,7 @@ class UploadMultiAdapter( } class ViewHolder(val view: View) : RecyclerView.ViewHolder(view) { - val imageHolder: FrameLayout = view.findViewById(R.id.image_holder) + //val imageHolder: FrameLayout = view.findViewById(R.id.image_holder) val itemSelect: FrameLayout = view.findViewById(R.id.item_select) val imageView: ImageView = view.findViewById(R.id.image_view) val fileText: TextView = view.findViewById(R.id.file_name) diff --git a/app/src/main/java/com/djangofiles/djangofiles/widget/WidgetProvider.kt b/app/src/main/java/com/djangofiles/djangofiles/widget/WidgetProvider.kt index 7242a15..9a2b093 100644 --- a/app/src/main/java/com/djangofiles/djangofiles/widget/WidgetProvider.kt +++ b/app/src/main/java/com/djangofiles/djangofiles/widget/WidgetProvider.kt @@ -85,8 +85,7 @@ class WidgetProvider : AppWidgetProvider() { val selectedTextColor = colorMap[textColor] ?: Color.WHITE Log.d("Widget[onUpdate]", "selectedTextColor: $selectedTextColor") - val opacityPercent = bgOpacity - val alpha = (opacityPercent * 255 / 100).coerceIn(1, 255) + val alpha = (bgOpacity * 255 / 100).coerceIn(1, 255) val finalBgColor = ColorUtils.setAlphaComponent(selectedBgColor, alpha) Log.d("Widget[onUpdate]", "finalBgColor: $finalBgColor") @@ -157,7 +156,7 @@ class WidgetProvider : AppWidgetProvider() { // Room Data CoroutineScope(SupervisorJob() + Dispatchers.IO).launch { - val dao: ServerDao = ServerDatabase.Companion.getInstance(context).serverDao() + val dao: ServerDao = ServerDatabase.getInstance(context).serverDao() Log.d("Widget[onUpdate]", "dao: $dao") val server = dao.getByUrl(savedUrl) Log.d("Widget[onUpdate]", "server: $server") diff --git a/app/src/main/res/drawable/fa_arrow_right_to_bracket.xml b/app/src/main/res/drawable/fa_arrow_right_to_bracket.xml deleted file mode 100644 index 95616b0..0000000 --- a/app/src/main/res/drawable/fa_arrow_right_to_bracket.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/fragment_files.xml b/app/src/main/res/layout/fragment_files.xml index 0ccd864..598bff0 100644 --- a/app/src/main/res/layout/fragment_files.xml +++ b/app/src/main/res/layout/fragment_files.xml @@ -86,7 +86,6 @@ android:gravity="center_vertical" android:clickable="true" android:textAppearance="@style/TextAppearance.AppCompat.Large" - android:text="@string/files_selected_total" tools:text="999 / 999 Files" /> + Django Files v%s %1$s (%2$s) @@ -20,9 +20,15 @@ File List App Settings - Upload %1$d Files - %1$d Files - %1$d / %2$d Files + Upload %1$d Files + + %1$d File + %1$d Files + + + %1$d / %2$d File + %1$d / %2$d Files + Delete Preview diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..2ef1b89 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,13 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/29ee363f71d060405f729a8f1b7f7aef/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/ecd23fd7707c683afbcd6052998cb6a9/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/29ee363f71d060405f729a8f1b7f7aef/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/ecd23fd7707c683afbcd6052998cb6a9/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/10fc3bf1ee0001078a473afe6e43cfdb/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/9c55677aff3966382f3d853c0959bfb2/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/29ee363f71d060405f729a8f1b7f7aef/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/ecd23fd7707c683afbcd6052998cb6a9/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/39846e8427e64a3824c13e399d7d813c/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/ac151d55def6b6a9a159dc4cb4642851/redirect +toolchainVendor=JETBRAINS +toolchainVersion=21 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 93635d2..e6a5e62 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,15 +20,15 @@ workRuntimeKtx = "2.11.1" room = "2.8.4" media3 = "1.9.2" -googleServices = "4.4.4" -firebaseBom = "34.9.0" -crashlyticsPlugin = "3.0.6" - okhttp = "5.3.2" retrofit = "3.0.0" moshiKotlinCodegen = "1.15.2" glide = "5.0.5" +googleServices = "4.4.4" +firebaseBom = "34.9.0" +crashlyticsPlugin = "3.0.6" + #navigationSafeargsVersion = "2.8.9" #roomRuntime = "2.6.1" #roomCompiler = "2.6.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c56fd5..0d32a70 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu Mar 27 10:12:37 PDT 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index d07c935..1108afb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,5 @@ +@file:Suppress("UnstableApiUsage") + pluginManagement { repositories { google { @@ -11,6 +13,9 @@ pluginManagement { gradlePluginPortal() } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories {