diff --git a/app/src/main/java/gallery/memories/MainActivity.kt b/app/src/main/java/gallery/memories/MainActivity.kt index cf6ecbf0..d78a5401 100644 --- a/app/src/main/java/gallery/memories/MainActivity.kt +++ b/app/src/main/java/gallery/memories/MainActivity.kt @@ -10,6 +10,7 @@ import android.view.KeyEvent import android.view.View import android.view.WindowInsetsController import android.webkit.* +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.media3.common.MediaItem import androidx.media3.common.util.UnstableApi @@ -46,6 +47,9 @@ import gallery.memories.databinding.ActivityMainBinding // Initialize services mNativeX = NativeX(this) + // Ensure storage permissions + ensureStoragePermissions() + // Load JavaScript initializeWebView() @@ -160,15 +164,31 @@ import gallery.memories.databinding.ActivityMainBinding // Load accounts val authHeader = mNativeX.mAccountService.authHeader val memoriesUrl = mNativeX.mAccountService.memoriesUrl + + // Load app interface if authenticated if (authHeader != null && memoriesUrl != null) { binding.webview.loadUrl(memoriesUrl, mapOf( "Authorization" to authHeader )) return true - } else { - binding.webview.loadUrl("file:///android_asset/welcome.html"); - return false } + + // Load welcome page + binding.webview.loadUrl("file:///android_asset/welcome.html"); + return false + } + + fun ensureStoragePermissions() { + val requestPermissionLauncher = + registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (isGranted && !hasMediaPermission()) { + mNativeX.mQuery.syncFullDb() + } + setHasMediaPermission(isGranted) + } + requestPermissionLauncher.launch(android.Manifest.permission.READ_EXTERNAL_STORAGE) } fun initializePlayer(uri: Uri, uid: String) { @@ -268,4 +288,15 @@ import gallery.memories.databinding.ActivityMainBinding window.decorView.systemUiVisibility = if (isDark) 0 else View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR } } + + fun hasMediaPermission(): Boolean { + return getSharedPreferences(getString(R.string.preferences_key), 0) + .getBoolean(getString(R.string.preferences_has_media_permission), false) + } + + private fun setHasMediaPermission(v: Boolean) { + getSharedPreferences(getString(R.string.preferences_key), 0).edit() + .putBoolean(getString(R.string.preferences_has_media_permission), v) + .apply() + } } \ No newline at end of file diff --git a/app/src/main/java/gallery/memories/NativeX.kt b/app/src/main/java/gallery/memories/NativeX.kt index e64e76cc..13102cbf 100644 --- a/app/src/main/java/gallery/memories/NativeX.kt +++ b/app/src/main/java/gallery/memories/NativeX.kt @@ -20,8 +20,8 @@ import java.net.URLDecoder val TAG = "NativeX" private var themeStored = false - private val mImageService = ImageService(mActivity) - private val mQuery = TimelineQuery(mActivity) + val mImageService = ImageService(mActivity) + val mQuery = TimelineQuery(mActivity) val mAccountService = AccountService(mActivity) object API { @@ -41,8 +41,10 @@ import java.net.URLDecoder init { mDlService = DownloadService(mActivity) - // Synchronize the database - mQuery.syncDeltaDb() + // Synchronize the database if possible + if (mActivity.hasMediaPermission()) { + mQuery.syncDeltaDb() + } } companion object { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0b7f0897..eab26231 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ themeColor themeDark lastDbSyncTime + hasMediaPermission "Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.76 Mobile Safari/537.36"