From 0fd96eeb368788c3e280bba61173b37088c2794c Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sat, 12 Apr 2025 18:51:38 -0700 Subject: [PATCH 01/18] Copy from DF Working --- app/build.gradle.kts | 4 ++ .../java/org/cssnr/zipline/MainActivity.kt | 37 ++++++++++++++++++- .../main/res/drawable/drawer_header_bg.xml | 11 ++++++ app/src/main/res/layout/activity_main.xml | 29 ++++++++++++--- app/src/main/res/layout/nav_header_main.xml | 37 +++++++++++++++++++ app/src/main/res/menu/drawer_menu.xml | 22 +++++++++++ .../main/res/navigation/mobile_navigation.xml | 22 +++++++++++ gradle/libs.versions.toml | 12 ++++++ 8 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/drawer_header_bg.xml create mode 100644 app/src/main/res/layout/nav_header_main.xml create mode 100644 app/src/main/res/menu/drawer_menu.xml create mode 100644 app/src/main/res/navigation/mobile_navigation.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7449edf..6ec971a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -45,6 +45,10 @@ dependencies { implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.preference.ktx) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.androidx.navigation.ui.ktx) implementation(libs.okhttp) implementation(libs.retrofit) implementation(libs.retrofit.gson) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 33cb914..dbd5b8c 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -9,6 +9,7 @@ import android.util.Log import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient +import android.widget.TextView import android.widget.Toast import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity @@ -16,13 +17,18 @@ import androidx.core.content.edit import androidx.core.net.toUri import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.navigation.NavController +import androidx.navigation.ui.AppBarConfiguration import org.cssnr.zipline.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding - @SuppressLint("SetJavaScriptEnabled") + private lateinit var navController: NavController + private lateinit var appBarConfiguration: AppBarConfiguration + + @SuppressLint("SetJavaScriptEnabled", "SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d("onCreate", "savedInstanceState: $savedInstanceState") @@ -31,6 +37,14 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) + val packageInfo = packageManager.getPackageInfo(this.packageName, 0) + val versionName = packageInfo.versionName + Log.d("onCreate", "versionName: $versionName") + + val headerView = binding.navigationView.getHeaderView(0) + val versionTextView = headerView.findViewById(R.id.header_version) + versionTextView.text = "v${versionName}" + ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) @@ -47,6 +61,27 @@ class MainActivity : AppCompatActivity() { settings.useWideViewPort = true // prevent loading images zoomed in } + // Handle Navigation Item Clicks + binding.navigationView.setNavigationItemSelectedListener { menuItem -> + Log.d("Drawer", "menuItem: $menuItem") + Log.d("Drawer", "itemId: ${menuItem.itemId}") + if (menuItem.itemId == R.id.nav_item_home) { + Log.d("Drawer", "GO HOME") + Toast.makeText(this, "Not Yet Implemented!", Toast.LENGTH_LONG).show() + } else if (menuItem.itemId == R.id.nav_item_upload) { + Log.d("Drawer", "UP LOAD") + Toast.makeText(this, "Not Yet Implemented!", Toast.LENGTH_LONG).show() + } else if (menuItem.itemId == R.id.nav_item_settings) { + Log.d("Drawer", "SETTINGS") + supportFragmentManager.beginTransaction() + .replace(R.id.main, SettingsFragment()) + .addToBackStack(null) + .commit() + binding.drawerLayout.closeDrawers() + true + } + false + } handleIntent(intent) } diff --git a/app/src/main/res/drawable/drawer_header_bg.xml b/app/src/main/res/drawable/drawer_header_bg.xml new file mode 100644 index 0000000..303e418 --- /dev/null +++ b/app/src/main/res/drawable/drawer_header_bg.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4a30501..1568b8c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,11 +1,28 @@ - + - + android:layout_height="match_parent"> - + + + + + + diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml new file mode 100644 index 0000000..a5a808d --- /dev/null +++ b/app/src/main/res/layout/nav_header_main.xml @@ -0,0 +1,37 @@ + + + + + + + + + + diff --git a/app/src/main/res/menu/drawer_menu.xml b/app/src/main/res/menu/drawer_menu.xml new file mode 100644 index 0000000..460b66d --- /dev/null +++ b/app/src/main/res/menu/drawer_menu.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml new file mode 100644 index 0000000..1effc0e --- /dev/null +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -0,0 +1,22 @@ + + + + + + + + + \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 642cce8..9de934a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,6 +9,12 @@ appcompat = "1.7.0" material = "1.12.0" activity = "1.10.1" preferenceKtx = "1.2.1" + +lifecycleLivedataKtx = "2.8.7" +lifecycleViewmodelKtx = "2.8.7" +navigationFragmentKtx = "2.8.9" +navigationUiKtx = "2.8.9" + okhttp = "4.12.0" retrofit = "2.9.0" @@ -21,6 +27,12 @@ androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version material = { group = "com.google.android.material", name = "material", version.ref = "material" } androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" } androidx-preference-ktx = { group = "androidx.preference", name = "preference-ktx", version.ref = "preferenceKtx" } + +androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycleLivedataKtx" } +androidx-lifecycle-viewmodel-ktx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } +androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigationFragmentKtx" } +androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigationUiKtx" } + okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } retrofit-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" } From cf6731f365c7338fe976233fbc26de8a873a178c Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sat, 12 Apr 2025 20:04:38 -0700 Subject: [PATCH 02/18] Cleanup --- app/src/main/java/org/cssnr/zipline/MainActivity.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index dbd5b8c..e96361f 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -17,17 +17,12 @@ import androidx.core.content.edit import androidx.core.net.toUri import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat -import androidx.navigation.NavController -import androidx.navigation.ui.AppBarConfiguration import org.cssnr.zipline.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding - private lateinit var navController: NavController - private lateinit var appBarConfiguration: AppBarConfiguration - @SuppressLint("SetJavaScriptEnabled", "SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) From 48cab9dbc3f6eecb599f8419d6cc5f72988e38ff Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sat, 12 Apr 2025 20:33:29 -0700 Subject: [PATCH 03/18] Make Navigation Clickable --- .../java/org/cssnr/zipline/MainActivity.kt | 30 +++++++++++++++++-- app/src/main/res/menu/drawer_menu.xml | 9 ++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index e96361f..dfbfb1f 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.os.Build import android.os.Bundle import android.util.Log +import android.view.View import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient @@ -17,6 +18,7 @@ import androidx.core.content.edit import androidx.core.net.toUri import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.fragment.app.FragmentManager import org.cssnr.zipline.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { @@ -56,13 +58,21 @@ class MainActivity : AppCompatActivity() { settings.useWideViewPort = true // prevent loading images zoomed in } - // Handle Navigation Item Clicks + // Navigation - On Click binding.navigationView.setNavigationItemSelectedListener { menuItem -> Log.d("Drawer", "menuItem: $menuItem") Log.d("Drawer", "itemId: ${menuItem.itemId}") if (menuItem.itemId == R.id.nav_item_home) { Log.d("Drawer", "GO HOME") - Toast.makeText(this, "Not Yet Implemented!", Toast.LENGTH_LONG).show() + val currentFragment = supportFragmentManager.findFragmentById(R.id.main) + if (currentFragment != null) { + supportFragmentManager.popBackStack( + null, + FragmentManager.POP_BACK_STACK_INCLUSIVE + ) + } + binding.drawerLayout.closeDrawers() + true } else if (menuItem.itemId == R.id.nav_item_upload) { Log.d("Drawer", "UP LOAD") Toast.makeText(this, "Not Yet Implemented!", Toast.LENGTH_LONG).show() @@ -77,6 +87,21 @@ class MainActivity : AppCompatActivity() { } false } + + // Navigation - Back Button + supportFragmentManager.addOnBackStackChangedListener { + val currentFragment = supportFragmentManager.findFragmentById(R.id.main) + val itemId = when (currentFragment) { + is SettingsFragment -> R.id.nav_item_settings + else -> R.id.nav_item_home + } + if (itemId != View.NO_ID) { + binding.navigationView.menu.findItem(itemId)?.isChecked = true + } else { + binding.navigationView.menu.setGroupCheckable(0, false, true) + } + } + handleIntent(intent) } @@ -143,6 +168,7 @@ class MainActivity : AppCompatActivity() { } else if (Intent.ACTION_MAIN == intent.action) { Log.d("handleIntent", "ACTION_MAIN") + binding.navigationView.menu.findItem(R.id.nav_item_home)?.isChecked = true binding.webView.loadUrl(ziplineUrl) } else if (Intent.ACTION_SEND == intent.action) { diff --git a/app/src/main/res/menu/drawer_menu.xml b/app/src/main/res/menu/drawer_menu.xml index 460b66d..c56ae4e 100644 --- a/app/src/main/res/menu/drawer_menu.xml +++ b/app/src/main/res/menu/drawer_menu.xml @@ -5,18 +5,21 @@ + android:title="Home" + android:checkable="true" /> + android:title="Upload" + android:checkable="true" /> + android:title="Settings" + android:checkable="true" /> From aa0e86746b7110aaa01121eb9e585773209af7f8 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sat, 12 Apr 2025 20:43:31 -0700 Subject: [PATCH 04/18] Update Menu --- app/src/main/res/menu/drawer_menu.xml | 11 ++++++----- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences_settings.xml | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/menu/drawer_menu.xml b/app/src/main/res/menu/drawer_menu.xml index c56ae4e..f9fcda7 100644 --- a/app/src/main/res/menu/drawer_menu.xml +++ b/app/src/main/res/menu/drawer_menu.xml @@ -4,21 +4,22 @@ + android:title="@string/upload" + android:checkable="true" + android:enabled="false"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ac538f5..cade067 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ Open Options File Name + Settings Random diff --git a/app/src/main/res/xml/preferences_settings.xml b/app/src/main/res/xml/preferences_settings.xml index 82542ac..63bb4d8 100644 --- a/app/src/main/res/xml/preferences_settings.xml +++ b/app/src/main/res/xml/preferences_settings.xml @@ -3,7 +3,7 @@ Date: Sat, 12 Apr 2025 21:27:47 -0700 Subject: [PATCH 05/18] Move WebView to HomeFragment.kt --- .../java/org/cssnr/zipline/HomeFragment.kt | 152 ++++++++++ .../java/org/cssnr/zipline/MainActivity.kt | 267 +++++++++--------- .../java/org/cssnr/zipline/PreviewFragment.kt | 13 +- .../java/org/cssnr/zipline/SetupFragment.kt | 15 +- app/src/main/res/layout/activity_main.xml | 5 - app/src/main/res/layout/fragment_home.xml | 13 + 6 files changed, 325 insertions(+), 140 deletions(-) create mode 100644 app/src/main/java/org/cssnr/zipline/HomeFragment.kt create mode 100644 app/src/main/res/layout/fragment_home.xml diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt new file mode 100644 index 0000000..af1c4b8 --- /dev/null +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -0,0 +1,152 @@ +package org.cssnr.zipline + + +import android.annotation.SuppressLint +import android.content.Context.MODE_PRIVATE +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.fragment.app.Fragment +import org.cssnr.zipline.databinding.FragmentHomeBinding + +class HomeFragment : Fragment() { + + private var _binding: FragmentHomeBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentHomeBinding.inflate(inflater, container, false) + val root: View = binding.root + + return root + } + + @SuppressLint("SetJavaScriptEnabled") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.webView.apply { + webViewClient = MyWebViewClient() + settings.domStorageEnabled = true + settings.javaScriptEnabled = true + settings.allowFileAccess = true + settings.allowContentAccess = true + settings.loadWithOverviewMode = true // prevent loading images zoomed in + settings.useWideViewPort = true // prevent loading images zoomed in + } + + val sharedPreferences = context?.getSharedPreferences("default_preferences", MODE_PRIVATE) + val ziplineUrl = sharedPreferences?.getString("ziplineUrl", null) + val ziplineToken = sharedPreferences?.getString("ziplineToken", null) + Log.d("onViewCreated", "ziplineUrl: $ziplineUrl") + Log.d("onViewCreated", "ziplineToken: $ziplineToken") + + //val webView = view.findViewById(R.id.web_view) + //webView.loadUrl(ziplineUrl.toString()) + binding.webView.loadUrl(ziplineUrl.toString()) + + // Restore WebView state if available + if (savedInstanceState != null) { + Log.d("onViewCreated", "restoreState: $savedInstanceState") + binding.webView.restoreState(savedInstanceState) + } else { + Log.d("onViewCreated", "webView.loadUrl: $ziplineUrl") + binding.webView.loadUrl(ziplineUrl.toString()) + } + } + + fun loadUrl(url: String) { + Log.d("loadUrl", "binding.webView.loadUrl: $url") + binding.webView.loadUrl(url) + } + + override fun onSaveInstanceState(outState: Bundle) { + Log.d("onSaveInstanceState", "outState: $outState") + super.onSaveInstanceState(outState) + binding.webView.saveState(outState) + } + +// override fun onRestoreInstanceState(savedInstanceState: Bundle) { +// Log.d("onRestoreInstanceState", "savedInstanceState: $savedInstanceState") +// super.onRestoreInstanceState(savedInstanceState) +// binding.webView.restoreState(savedInstanceState) +// } + + override fun onPause() { + Log.d("onPause", "ON PAUSE") + super.onPause() + binding.webView.onPause() + binding.webView.pauseTimers() + } + + override fun onResume() { + Log.d("onResume", "ON RESUME") + super.onResume() + binding.webView.onResume() + binding.webView.resumeTimers() + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + inner class MyWebViewClient : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { + val url = request.url.toString() + Log.d("shouldOverrideUrlLoading", "url: $url") + + //val preferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE) + //val savedUrl = sharedPreferences.getString(URL_KEY, null) + //Log.d("shouldOverrideUrlLoading", "savedUrl: $savedUrl") + + //if ((savedUrl != null && + // url.startsWith(savedUrl) && !url.startsWith("$savedUrl/r/") && !url.startsWith( + // "$savedUrl/raw/" + // )) || + // url.startsWith("https://discord.com/oauth2") || + // url.startsWith("https://github.com/sessions/two-factor/") || + // url.startsWith("https://github.com/login") || + // url.startsWith("https://accounts.google.com/v3/signin") || + // url.startsWith("https://accounts.google.com/o/oauth2/v2/auth") + //) { + // Log.d("shouldOverrideUrlLoading", "FALSE - in app") + // return false + //} + + //val intent = Intent(Intent.ACTION_VIEW, url.toUri()) + //view.context.startActivity(intent) + //Log.d("shouldOverrideUrlLoading", "TRUE - in browser") + //return true + + return false + } + + override fun onReceivedError( + view: WebView, + request: WebResourceRequest, + errorResponse: WebResourceError + ) { + Log.d("onReceivedError", "ERROR: " + errorResponse.errorCode) + } + + override fun onReceivedHttpError( + view: WebView, + request: WebResourceRequest, + errorResponse: WebResourceResponse + ) { + Log.d("onReceivedHttpError", "ERROR: " + errorResponse.statusCode) + } + } +} diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index dfbfb1f..650afe1 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -48,52 +48,54 @@ class MainActivity : AppCompatActivity() { insets } - binding.webView.apply { - webViewClient = MyWebViewClient() - settings.domStorageEnabled = true - settings.javaScriptEnabled = true - settings.allowFileAccess = true - settings.allowContentAccess = true - settings.loadWithOverviewMode = true // prevent loading images zoomed in - settings.useWideViewPort = true // prevent loading images zoomed in - } +// binding.webView.apply { +// webViewClient = MyWebViewClient() +// settings.domStorageEnabled = true +// settings.javaScriptEnabled = true +// settings.allowFileAccess = true +// settings.allowContentAccess = true +// settings.loadWithOverviewMode = true // prevent loading images zoomed in +// settings.useWideViewPort = true // prevent loading images zoomed in +// } // Navigation - On Click binding.navigationView.setNavigationItemSelectedListener { menuItem -> - Log.d("Drawer", "menuItem: $menuItem") - Log.d("Drawer", "itemId: ${menuItem.itemId}") - if (menuItem.itemId == R.id.nav_item_home) { - Log.d("Drawer", "GO HOME") - val currentFragment = supportFragmentManager.findFragmentById(R.id.main) - if (currentFragment != null) { - supportFragmentManager.popBackStack( - null, - FragmentManager.POP_BACK_STACK_INCLUSIVE - ) + when (menuItem.itemId) { + R.id.nav_item_home -> { + val currentFragment = supportFragmentManager.findFragmentById(R.id.main) + if (currentFragment !is HomeFragment) { + supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) + supportFragmentManager.beginTransaction() + .replace(R.id.main, HomeFragment()) + .commit() + } + binding.navigationView.setCheckedItem(R.id.nav_item_home) + binding.drawerLayout.closeDrawers() + true + } + + R.id.nav_item_settings -> { + supportFragmentManager.beginTransaction() + .replace(R.id.main, SettingsFragment()) + .addToBackStack(null) + .commit() + binding.navigationView.setCheckedItem(R.id.nav_item_settings) + binding.drawerLayout.closeDrawers() + true } - binding.drawerLayout.closeDrawers() - true - } else if (menuItem.itemId == R.id.nav_item_upload) { - Log.d("Drawer", "UP LOAD") - Toast.makeText(this, "Not Yet Implemented!", Toast.LENGTH_LONG).show() - } else if (menuItem.itemId == R.id.nav_item_settings) { - Log.d("Drawer", "SETTINGS") - supportFragmentManager.beginTransaction() - .replace(R.id.main, SettingsFragment()) - .addToBackStack(null) - .commit() - binding.drawerLayout.closeDrawers() - true + + else -> false } - false } + // Navigation - Back Button supportFragmentManager.addOnBackStackChangedListener { val currentFragment = supportFragmentManager.findFragmentById(R.id.main) val itemId = when (currentFragment) { is SettingsFragment -> R.id.nav_item_settings - else -> R.id.nav_item_home + is HomeFragment -> R.id.nav_item_home + else -> View.NO_ID } if (itemId != View.NO_ID) { binding.navigationView.menu.findItem(itemId)?.isChecked = true @@ -105,31 +107,31 @@ class MainActivity : AppCompatActivity() { handleIntent(intent) } - override fun onSaveInstanceState(outState: Bundle) { - Log.d("onSaveInstanceState", "outState: $outState") - super.onSaveInstanceState(outState) - binding.webView.saveState(outState) - } - - override fun onRestoreInstanceState(savedInstanceState: Bundle) { - Log.d("onRestoreInstanceState", "savedInstanceState: $savedInstanceState") - super.onRestoreInstanceState(savedInstanceState) - binding.webView.restoreState(savedInstanceState) - } - - override fun onPause() { - Log.d("onPause", "ON PAUSE") - super.onPause() - binding.webView.onPause() - binding.webView.pauseTimers() - } - - override fun onResume() { - Log.d("onResume", "ON RESUME") - super.onResume() - binding.webView.onResume() - binding.webView.resumeTimers() - } +// override fun onSaveInstanceState(outState: Bundle) { +// Log.d("onSaveInstanceState", "outState: $outState") +// super.onSaveInstanceState(outState) +// binding.webView.saveState(outState) +// } +// +// override fun onRestoreInstanceState(savedInstanceState: Bundle) { +// Log.d("onRestoreInstanceState", "savedInstanceState: $savedInstanceState") +// super.onRestoreInstanceState(savedInstanceState) +// binding.webView.restoreState(savedInstanceState) +// } +// +// override fun onPause() { +// Log.d("onPause", "ON PAUSE") +// super.onPause() +// binding.webView.onPause() +// binding.webView.pauseTimers() +// } +// +// override fun onResume() { +// Log.d("onResume", "ON RESUME") +// super.onResume() +// binding.webView.onResume() +// binding.webView.resumeTimers() +// } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) @@ -168,8 +170,13 @@ class MainActivity : AppCompatActivity() { } else if (Intent.ACTION_MAIN == intent.action) { Log.d("handleIntent", "ACTION_MAIN") - binding.navigationView.menu.findItem(R.id.nav_item_home)?.isChecked = true - binding.webView.loadUrl(ziplineUrl) +// binding.navigationView.menu.findItem(R.id.nav_item_home)?.isChecked = true +// binding.webView.loadUrl(ziplineUrl) + + supportFragmentManager.beginTransaction() + .replace(R.id.main, HomeFragment()) + .commit() + binding.navigationView.setCheckedItem(R.id.nav_item_home) } else if (Intent.ACTION_SEND == intent.action) { Log.d("handleIntent", "ACTION_SEND") @@ -229,73 +236,73 @@ class MainActivity : AppCompatActivity() { .commit() } - fun loadUrl(url: String) { - Log.d("loadUrl", "binding.webView.loadUrl: $url") - binding.webView.loadUrl(url) - } - - inner class MyWebViewClient : WebViewClient() { - override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { - val url = request.url.toString() - Log.d("shouldOverrideUrlLoading", "url: $url") - - val preferences = getSharedPreferences("default_preferences", MODE_PRIVATE) - val ziplineUrl = preferences.getString("ziplineUrl", null) - Log.d("shouldOverrideUrlLoading", "ziplineUrl: $ziplineUrl") - - if (ziplineUrl.isNullOrEmpty()) { - Log.w("shouldOverrideUrlLoading", "ziplineUrl.isNullOrEmpty()") - Log.d("shouldOverrideUrlLoading", "TRUE - in browser") - return true - } - - if (url.startsWith(ziplineUrl)) { - Log.d("shouldOverrideUrlLoading", "FALSE - in app") - return false - } - - val intent = Intent(Intent.ACTION_VIEW, url.toUri()) - view.context.startActivity(intent) - Log.d("shouldOverrideUrlLoading", "TRUE - in browser") - return true - } - - override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) { - Log.d("doUpdateVisitedHistory", "url: $url") - if (url.endsWith("/auth/login") == true) { - Log.d("doUpdateVisitedHistory", "LOGOUT: url: $url") - - val sharedPreferences = - view.context.getSharedPreferences("default_preferences", MODE_PRIVATE) - //sharedPreferences.edit { putString("ziplineToken", "") } - sharedPreferences.edit { remove("ziplineToken") } - Log.d("doUpdateVisitedHistory", "REMOVE: ziplineToken") - - //view.destroy() - view.loadUrl("about:blank") - - supportFragmentManager.beginTransaction() - .replace(R.id.main, SetupFragment()) - .commit() - } - } - - //override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { - // Log.d("onPageStarted", "url: $url") - //} - - //override fun onLoadResource(view: WebView?, url: String?) { - // //Log.d("onLoadResource", "url: $url") - // if (url?.endsWith("/api/auth/logout") == true) { - // Log.d("onLoadResource", "LOGOUT: url: $url") - // } - //} - - //override fun onPageFinished(view: WebView?, url: String?) { - // Log.d("onPageFinished", "url: $url") - // Log.d("onPageFinished", "view?.url: ${view?.url}") - // //view?.loadUrl("") - //} - - } +// fun loadUrl(url: String) { +// Log.d("loadUrl", "binding.webView.loadUrl: $url") +// binding.webView.loadUrl(url) +// } + +// inner class MyWebViewClient : WebViewClient() { +// override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { +// val url = request.url.toString() +// Log.d("shouldOverrideUrlLoading", "url: $url") +// +// val preferences = getSharedPreferences("default_preferences", MODE_PRIVATE) +// val ziplineUrl = preferences.getString("ziplineUrl", null) +// Log.d("shouldOverrideUrlLoading", "ziplineUrl: $ziplineUrl") +// +// if (ziplineUrl.isNullOrEmpty()) { +// Log.w("shouldOverrideUrlLoading", "ziplineUrl.isNullOrEmpty()") +// Log.d("shouldOverrideUrlLoading", "TRUE - in browser") +// return true +// } +// +// if (url.startsWith(ziplineUrl)) { +// Log.d("shouldOverrideUrlLoading", "FALSE - in app") +// return false +// } +// +// val intent = Intent(Intent.ACTION_VIEW, url.toUri()) +// view.context.startActivity(intent) +// Log.d("shouldOverrideUrlLoading", "TRUE - in browser") +// return true +// } +// +// override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) { +// Log.d("doUpdateVisitedHistory", "url: $url") +// if (url.endsWith("/auth/login") == true) { +// Log.d("doUpdateVisitedHistory", "LOGOUT: url: $url") +// +// val sharedPreferences = +// view.context.getSharedPreferences("default_preferences", MODE_PRIVATE) +// //sharedPreferences.edit { putString("ziplineToken", "") } +// sharedPreferences.edit { remove("ziplineToken") } +// Log.d("doUpdateVisitedHistory", "REMOVE: ziplineToken") +// +// //view.destroy() +// view.loadUrl("about:blank") +// +// supportFragmentManager.beginTransaction() +// .replace(R.id.main, SetupFragment()) +// .commit() +// } +// } +// +// //override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { +// // Log.d("onPageStarted", "url: $url") +// //} +// +// //override fun onLoadResource(view: WebView?, url: String?) { +// // //Log.d("onLoadResource", "url: $url") +// // if (url?.endsWith("/api/auth/logout") == true) { +// // Log.d("onLoadResource", "LOGOUT: url: $url") +// // } +// //} +// +// //override fun onPageFinished(view: WebView?, url: String?) { +// // Log.d("onPageFinished", "url: $url") +// // Log.d("onPageFinished", "view?.url: ${view?.url}") +// // //view?.loadUrl("") +// //} +// +// } } diff --git a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt index 83a3db3..ce8f079 100644 --- a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt @@ -168,8 +168,17 @@ class PreviewFragment : Fragment() { if (result != null) { Log.d("processUpload", "result.url: ${result.url}") copyToClipboard(result.url) - val main = activity as MainActivity - main.loadUrl(result.url) + +// val main = activity as MainActivity +// main.loadUrl(result.url) + + val fragment = requireActivity() + .supportFragmentManager + .findFragmentById(R.id.main) + if (fragment is HomeFragment) { + fragment.loadUrl(result.url) + } + Log.d("processUpload", "parentFragmentManager.popBackStack()") parentFragmentManager.beginTransaction() .remove(this@PreviewFragment) diff --git a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt index 7e4fc89..d807ef4 100644 --- a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt @@ -99,9 +99,18 @@ class SetupFragment : Fragment() { Log.d("getSharedPreferences", "ziplineUrl: $host") sharedPreferences?.edit { putString("ziplineToken", token) } Log.d("getSharedPreferences", "ziplineToken: $token") - val mainActivity = activity as MainActivity - Log.d("lifecycleScope.launch", "mainActivity.loadUrl: $host") - mainActivity.loadUrl(host) + +// val mainActivity = activity as MainActivity +// Log.d("lifecycleScope.launch", "mainActivity.loadUrl: $host") +// mainActivity.loadUrl(host) + + val fragment = requireActivity() + .supportFragmentManager + .findFragmentById(R.id.main) + if (fragment is HomeFragment) { + fragment.loadUrl(host) + } + activity?.supportFragmentManager?.beginTransaction() ?.remove(this@SetupFragment) ?.commit() diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1568b8c..5a20c0a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,11 +10,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + + + + + From 9563b51b9864afe3626b84637289c9d3a09d6ebf Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sat, 12 Apr 2025 22:30:14 -0700 Subject: [PATCH 06/18] Cleanup Save State --- .../java/org/cssnr/zipline/HomeFragment.kt | 68 ++++++---- .../java/org/cssnr/zipline/MainActivity.kt | 128 +----------------- 2 files changed, 48 insertions(+), 148 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index af1c4b8..c23a473 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -21,6 +21,8 @@ class HomeFragment : Fragment() { private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! + private var webViewState: Bundle = Bundle() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -35,16 +37,15 @@ class HomeFragment : Fragment() { @SuppressLint("SetJavaScriptEnabled") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + Log.d("onViewCreated", "savedInstanceState: $savedInstanceState") - binding.webView.apply { - webViewClient = MyWebViewClient() - settings.domStorageEnabled = true - settings.javaScriptEnabled = true - settings.allowFileAccess = true - settings.allowContentAccess = true - settings.loadWithOverviewMode = true // prevent loading images zoomed in - settings.useWideViewPort = true // prevent loading images zoomed in + Log.d("onViewCreated", "webViewState.size: ${webViewState.size()}") + // TODO: Not sure when this method is triggered... + if (savedInstanceState != null) { + Log.i("onViewCreated", "SETTING webViewState FROM savedInstanceState") + webViewState = savedInstanceState.getBundle("webViewState") ?: Bundle() // Ensure non-null } + Log.d("onViewCreated", "webViewState.size: ${webViewState.size()}") val sharedPreferences = context?.getSharedPreferences("default_preferences", MODE_PRIVATE) val ziplineUrl = sharedPreferences?.getString("ziplineUrl", null) @@ -52,18 +53,34 @@ class HomeFragment : Fragment() { Log.d("onViewCreated", "ziplineUrl: $ziplineUrl") Log.d("onViewCreated", "ziplineToken: $ziplineToken") - //val webView = view.findViewById(R.id.web_view) - //webView.loadUrl(ziplineUrl.toString()) - binding.webView.loadUrl(ziplineUrl.toString()) + binding.webView.apply { + webViewClient = MyWebViewClient() + settings.domStorageEnabled = true + settings.javaScriptEnabled = true + settings.allowFileAccess = true + settings.allowContentAccess = true + settings.loadWithOverviewMode = true // prevent loading images zoomed in + settings.useWideViewPort = true // prevent loading images zoomed in - // Restore WebView state if available - if (savedInstanceState != null) { - Log.d("onViewCreated", "restoreState: $savedInstanceState") - binding.webView.restoreState(savedInstanceState) - } else { - Log.d("onViewCreated", "webView.loadUrl: $ziplineUrl") - binding.webView.loadUrl(ziplineUrl.toString()) + if (webViewState.size() > 0) { + Log.d("webView.apply", "RESTORE STATE") + restoreState(webViewState) + } else { + Log.d("webView.apply", "LOAD URL RETARD") + loadUrl(ziplineUrl.toString()) + } } + +// //val webView = view.findViewById(R.id.web_view) +// //webView.loadUrl(ziplineUrl.toString()) +// //binding.webView.loadUrl(ziplineUrl.toString()) +// if (savedInstanceState != null) { +// Log.d("onViewCreated", "restoreState: $savedInstanceState") +// binding.webView.restoreState(savedInstanceState) +// } else { +// Log.d("onViewCreated", "webView.loadUrl: $ziplineUrl") +// binding.webView.loadUrl(ziplineUrl.toString()) +// } } fun loadUrl(url: String) { @@ -75,19 +92,22 @@ class HomeFragment : Fragment() { Log.d("onSaveInstanceState", "outState: $outState") super.onSaveInstanceState(outState) binding.webView.saveState(outState) - } -// override fun onRestoreInstanceState(savedInstanceState: Bundle) { -// Log.d("onRestoreInstanceState", "savedInstanceState: $savedInstanceState") -// super.onRestoreInstanceState(savedInstanceState) -// binding.webView.restoreState(savedInstanceState) -// } + // TODO: Not sure when this method is triggered... + webViewState.let { + outState.putBundle("webViewState", it) + } + } override fun onPause() { Log.d("onPause", "ON PAUSE") super.onPause() binding.webView.onPause() binding.webView.pauseTimers() + + Log.d("onPause", "webViewState.size: ${webViewState.size()}") + binding.webView.saveState(webViewState) + Log.d("onPause", "webViewState.size: ${webViewState.size()}") } override fun onResume() { diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 650afe1..11ac6f1 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -7,15 +7,10 @@ import android.os.Build import android.os.Bundle import android.util.Log import android.view.View -import android.webkit.WebResourceRequest -import android.webkit.WebView -import android.webkit.WebViewClient import android.widget.TextView import android.widget.Toast import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.edit -import androidx.core.net.toUri import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.FragmentManager @@ -48,23 +43,16 @@ class MainActivity : AppCompatActivity() { insets } -// binding.webView.apply { -// webViewClient = MyWebViewClient() -// settings.domStorageEnabled = true -// settings.javaScriptEnabled = true -// settings.allowFileAccess = true -// settings.allowContentAccess = true -// settings.loadWithOverviewMode = true // prevent loading images zoomed in -// settings.useWideViewPort = true // prevent loading images zoomed in -// } - // Navigation - On Click binding.navigationView.setNavigationItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_item_home -> { val currentFragment = supportFragmentManager.findFragmentById(R.id.main) if (currentFragment !is HomeFragment) { - supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) + supportFragmentManager.popBackStack( + null, + FragmentManager.POP_BACK_STACK_INCLUSIVE + ) supportFragmentManager.beginTransaction() .replace(R.id.main, HomeFragment()) .commit() @@ -88,7 +76,6 @@ class MainActivity : AppCompatActivity() { } } - // Navigation - Back Button supportFragmentManager.addOnBackStackChangedListener { val currentFragment = supportFragmentManager.findFragmentById(R.id.main) @@ -107,32 +94,6 @@ class MainActivity : AppCompatActivity() { handleIntent(intent) } -// override fun onSaveInstanceState(outState: Bundle) { -// Log.d("onSaveInstanceState", "outState: $outState") -// super.onSaveInstanceState(outState) -// binding.webView.saveState(outState) -// } -// -// override fun onRestoreInstanceState(savedInstanceState: Bundle) { -// Log.d("onRestoreInstanceState", "savedInstanceState: $savedInstanceState") -// super.onRestoreInstanceState(savedInstanceState) -// binding.webView.restoreState(savedInstanceState) -// } -// -// override fun onPause() { -// Log.d("onPause", "ON PAUSE") -// super.onPause() -// binding.webView.onPause() -// binding.webView.pauseTimers() -// } -// -// override fun onResume() { -// Log.d("onResume", "ON RESUME") -// super.onResume() -// binding.webView.onResume() -// binding.webView.resumeTimers() -// } - override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) Log.d("onNewIntent", "intent: $intent") @@ -155,14 +116,6 @@ class MainActivity : AppCompatActivity() { if (ziplineUrl.isNullOrEmpty() || ziplineToken.isNullOrEmpty()) { Log.w("handleIntent", "Missing Zipline URL or Token...") - //val fragmentTransaction = supportFragmentManager.beginTransaction() - //val fragment = YourFragment() - //fragmentTransaction.replace(R.id.fragmentContainer, fragment) - //fragmentTransaction.commit() - - //binding.webView.loadUrl("about:blank") - //binding.webView.visibility = View.INVISIBLE - supportFragmentManager.beginTransaction() .replace(R.id.main, SetupFragment()) .commit() @@ -170,9 +123,6 @@ class MainActivity : AppCompatActivity() { } else if (Intent.ACTION_MAIN == intent.action) { Log.d("handleIntent", "ACTION_MAIN") -// binding.navigationView.menu.findItem(R.id.nav_item_home)?.isChecked = true -// binding.webView.loadUrl(ziplineUrl) - supportFragmentManager.beginTransaction() .replace(R.id.main, HomeFragment()) .commit() @@ -235,74 +185,4 @@ class MainActivity : AppCompatActivity() { .replace(R.id.main, fragment) .commit() } - -// fun loadUrl(url: String) { -// Log.d("loadUrl", "binding.webView.loadUrl: $url") -// binding.webView.loadUrl(url) -// } - -// inner class MyWebViewClient : WebViewClient() { -// override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { -// val url = request.url.toString() -// Log.d("shouldOverrideUrlLoading", "url: $url") -// -// val preferences = getSharedPreferences("default_preferences", MODE_PRIVATE) -// val ziplineUrl = preferences.getString("ziplineUrl", null) -// Log.d("shouldOverrideUrlLoading", "ziplineUrl: $ziplineUrl") -// -// if (ziplineUrl.isNullOrEmpty()) { -// Log.w("shouldOverrideUrlLoading", "ziplineUrl.isNullOrEmpty()") -// Log.d("shouldOverrideUrlLoading", "TRUE - in browser") -// return true -// } -// -// if (url.startsWith(ziplineUrl)) { -// Log.d("shouldOverrideUrlLoading", "FALSE - in app") -// return false -// } -// -// val intent = Intent(Intent.ACTION_VIEW, url.toUri()) -// view.context.startActivity(intent) -// Log.d("shouldOverrideUrlLoading", "TRUE - in browser") -// return true -// } -// -// override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) { -// Log.d("doUpdateVisitedHistory", "url: $url") -// if (url.endsWith("/auth/login") == true) { -// Log.d("doUpdateVisitedHistory", "LOGOUT: url: $url") -// -// val sharedPreferences = -// view.context.getSharedPreferences("default_preferences", MODE_PRIVATE) -// //sharedPreferences.edit { putString("ziplineToken", "") } -// sharedPreferences.edit { remove("ziplineToken") } -// Log.d("doUpdateVisitedHistory", "REMOVE: ziplineToken") -// -// //view.destroy() -// view.loadUrl("about:blank") -// -// supportFragmentManager.beginTransaction() -// .replace(R.id.main, SetupFragment()) -// .commit() -// } -// } -// -// //override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { -// // Log.d("onPageStarted", "url: $url") -// //} -// -// //override fun onLoadResource(view: WebView?, url: String?) { -// // //Log.d("onLoadResource", "url: $url") -// // if (url?.endsWith("/api/auth/logout") == true) { -// // Log.d("onLoadResource", "LOGOUT: url: $url") -// // } -// //} -// -// //override fun onPageFinished(view: WebView?, url: String?) { -// // Log.d("onPageFinished", "url: $url") -// // Log.d("onPageFinished", "view?.url: ${view?.url}") -// // //view?.loadUrl("") -// //} -// -// } } From 0ca21ecb00219678623047931f27e6b5032c9142 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sat, 12 Apr 2025 23:33:44 -0700 Subject: [PATCH 07/18] Fix Setup Home Load Partially --- .../java/org/cssnr/zipline/SetupFragment.kt | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt index d807ef4..9944349 100644 --- a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt @@ -100,20 +100,15 @@ class SetupFragment : Fragment() { sharedPreferences?.edit { putString("ziplineToken", token) } Log.d("getSharedPreferences", "ziplineToken: $token") -// val mainActivity = activity as MainActivity -// Log.d("lifecycleScope.launch", "mainActivity.loadUrl: $host") -// mainActivity.loadUrl(host) - - val fragment = requireActivity() - .supportFragmentManager - .findFragmentById(R.id.main) - if (fragment is HomeFragment) { - fragment.loadUrl(host) - } - - activity?.supportFragmentManager?.beginTransaction() - ?.remove(this@SetupFragment) - ?.commit() + Log.d("fragment", "START") + //activity?.supportFragmentManager?.beginTransaction() + // ?.replace(R.id.main, HomeFragment()) + // ?.commit() + parentFragmentManager.beginTransaction() + .replace(R.id.main, HomeFragment()) + //.addToBackStack(null) + .commit() + Log.d("fragment", "DONE") } } From 1245cc84eeca982d16a6442c63e09d684716d293 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 00:19:01 -0700 Subject: [PATCH 08/18] Attempt to improve State, Navigation, and Setup->Home --- .../java/org/cssnr/zipline/HomeFragment.kt | 25 +++++++++++++++++-- .../java/org/cssnr/zipline/MainActivity.kt | 6 ++++- .../java/org/cssnr/zipline/PreviewFragment.kt | 1 - .../org/cssnr/zipline/SettingsFragment.kt | 1 - .../java/org/cssnr/zipline/SetupFragment.kt | 18 +++++++++---- 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index c23a473..5355a1d 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -1,6 +1,5 @@ package org.cssnr.zipline - import android.annotation.SuppressLint import android.content.Context.MODE_PRIVATE import android.os.Bundle @@ -13,6 +12,7 @@ import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView import android.webkit.WebViewClient +import androidx.core.content.edit import androidx.fragment.app.Fragment import org.cssnr.zipline.databinding.FragmentHomeBinding @@ -43,7 +43,8 @@ class HomeFragment : Fragment() { // TODO: Not sure when this method is triggered... if (savedInstanceState != null) { Log.i("onViewCreated", "SETTING webViewState FROM savedInstanceState") - webViewState = savedInstanceState.getBundle("webViewState") ?: Bundle() // Ensure non-null + webViewState = + savedInstanceState.getBundle("webViewState") ?: Bundle() // Ensure non-null } Log.d("onViewCreated", "webViewState.size: ${webViewState.size()}") @@ -153,6 +154,26 @@ class HomeFragment : Fragment() { return false } + override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) { + Log.d("doUpdateVisitedHistory", "url: $url") + if (url.endsWith("/auth/login") == true) { + Log.d("doUpdateVisitedHistory", "LOGOUT: url: $url") + + val sharedPreferences = + view.context.getSharedPreferences("default_preferences", MODE_PRIVATE) + //sharedPreferences.edit { putString("ziplineToken", "") } + sharedPreferences.edit { remove("ziplineToken") } + Log.d("doUpdateVisitedHistory", "REMOVE: ziplineToken") + + //view.destroy() + view.loadUrl("about:blank") + + parentFragmentManager.beginTransaction() + .replace(R.id.main, SetupFragment()) + .commit() + } + } + override fun onReceivedError( view: WebView, request: WebResourceRequest, diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 11ac6f1..f2f0aba 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -18,7 +18,7 @@ import org.cssnr.zipline.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding + internal lateinit var binding: ActivityMainBinding @SuppressLint("SetJavaScriptEnabled", "SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { @@ -47,8 +47,11 @@ class MainActivity : AppCompatActivity() { binding.navigationView.setNavigationItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_item_home -> { + Log.d("setNavigationItemSelectedListener", "nav_item_home") val currentFragment = supportFragmentManager.findFragmentById(R.id.main) + Log.d("setNavigationItemSelectedListener", "currentFragment: $currentFragment") if (currentFragment !is HomeFragment) { + Log.d("setNavigationItemSelectedListener", "NOT HomeFragment") supportFragmentManager.popBackStack( null, FragmentManager.POP_BACK_STACK_INCLUSIVE @@ -63,6 +66,7 @@ class MainActivity : AppCompatActivity() { } R.id.nav_item_settings -> { + Log.d("setNavigationItemSelectedListener", "nav_item_settings") supportFragmentManager.beginTransaction() .replace(R.id.main, SettingsFragment()) .addToBackStack(null) diff --git a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt index ce8f079..af0f9fc 100644 --- a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt @@ -25,7 +25,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.cssnr.zipline.databinding.FragmentPreviewBinding - class PreviewFragment : Fragment() { private var _binding: FragmentPreviewBinding? = null diff --git a/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt b/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt index 0667ff7..5764b9a 100644 --- a/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt @@ -9,7 +9,6 @@ import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import com.google.android.material.color.MaterialColors - class SettingsFragment : PreferenceFragmentCompat() { override fun onCreateView( inflater: LayoutInflater, diff --git a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt index 9944349..7fa2728 100644 --- a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt @@ -100,14 +100,22 @@ class SetupFragment : Fragment() { sharedPreferences?.edit { putString("ziplineToken", token) } Log.d("getSharedPreferences", "ziplineToken: $token") - Log.d("fragment", "START") //activity?.supportFragmentManager?.beginTransaction() // ?.replace(R.id.main, HomeFragment()) // ?.commit() - parentFragmentManager.beginTransaction() - .replace(R.id.main, HomeFragment()) - //.addToBackStack(null) - .commit() + + Log.d("fragment", "START") + //parentFragmentManager.beginTransaction() + // .replace(R.id.main, HomeFragment()) + // //.addToBackStack(null) + // .commitNow() + //(requireActivity() as MainActivity).binding.navigationView.setCheckedItem(R.id.nav_item_home) + (activity as? MainActivity)?.let { main -> + main.supportFragmentManager.beginTransaction() + .replace(R.id.main, HomeFragment()) + .commit() + main.binding.navigationView.setCheckedItem(R.id.nav_item_home) + } Log.d("fragment", "DONE") } } From 8944234a91b20d5383f358d4d9443e6cc4dfaaca Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 12:26:47 -0700 Subject: [PATCH 09/18] Logging Mostly --- .../java/org/cssnr/zipline/HomeFragment.kt | 23 ++++++++++--------- .../java/org/cssnr/zipline/MainActivity.kt | 4 ++++ .../java/org/cssnr/zipline/PreviewFragment.kt | 9 +++++--- .../org/cssnr/zipline/SettingsFragment.kt | 3 ++- .../java/org/cssnr/zipline/SetupFragment.kt | 9 +++++--- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index 5355a1d..d5461ac 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -28,16 +28,22 @@ class HomeFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { + Log.d("HomeFragment", "onCreateView: $savedInstanceState") _binding = FragmentHomeBinding.inflate(inflater, container, false) val root: View = binding.root - return root } + override fun onDestroyView() { + Log.d("HomeFragment", "onDestroyView") + super.onDestroyView() + _binding = null + } + @SuppressLint("SetJavaScriptEnabled") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - Log.d("onViewCreated", "savedInstanceState: $savedInstanceState") + Log.d("HomeFragment", "onViewCreated: $savedInstanceState") Log.d("onViewCreated", "webViewState.size: ${webViewState.size()}") // TODO: Not sure when this method is triggered... @@ -85,12 +91,12 @@ class HomeFragment : Fragment() { } fun loadUrl(url: String) { - Log.d("loadUrl", "binding.webView.loadUrl: $url") + Log.d("HomeFragment", "binding.webView.loadUrl: $url") binding.webView.loadUrl(url) } override fun onSaveInstanceState(outState: Bundle) { - Log.d("onSaveInstanceState", "outState: $outState") + Log.d("HomeFragment", "onSaveInstanceState: $outState") super.onSaveInstanceState(outState) binding.webView.saveState(outState) @@ -101,7 +107,7 @@ class HomeFragment : Fragment() { } override fun onPause() { - Log.d("onPause", "ON PAUSE") + Log.d("HomeFragment", "ON PAUSE") super.onPause() binding.webView.onPause() binding.webView.pauseTimers() @@ -112,17 +118,12 @@ class HomeFragment : Fragment() { } override fun onResume() { - Log.d("onResume", "ON RESUME") + Log.d("HomeFragment", "ON RESUME") super.onResume() binding.webView.onResume() binding.webView.resumeTimers() } - override fun onDestroyView() { - super.onDestroyView() - _binding = null - } - inner class MyWebViewClient : WebViewClient() { override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { val url = request.url.toString() diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index f2f0aba..8b6c374 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -45,6 +45,10 @@ class MainActivity : AppCompatActivity() { // Navigation - On Click binding.navigationView.setNavigationItemSelectedListener { menuItem -> + Log.d("setNavigationItemSelectedListener", "menuItem: $menuItem") + val currentFragment = supportFragmentManager.findFragmentById(R.id.main) + Log.d("setNavigationItemSelectedListener", "currentFragment: $currentFragment") + when (menuItem.itemId) { R.id.nav_item_home -> { Log.d("setNavigationItemSelectedListener", "nav_item_home") diff --git a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt index af0f9fc..17150bd 100644 --- a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt @@ -31,15 +31,18 @@ class PreviewFragment : Fragment() { private val binding get() = _binding!! override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle? ): View { - Log.d("onCreateView", "savedInstanceState: $savedInstanceState") + Log.d("PreviewFragment", "onCreateView: $savedInstanceState") _binding = FragmentPreviewBinding.inflate(inflater, container, false) - return binding.root + val root: View = binding.root + return root } override fun onDestroyView() { + Log.d("PreviewFragment", "onDestroyView") super.onDestroyView() _binding = null } diff --git a/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt b/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt index 5764b9a..b8cd950 100644 --- a/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt @@ -15,7 +15,8 @@ class SettingsFragment : PreferenceFragmentCompat() { container: ViewGroup?, savedInstanceState: Bundle?, ): View { - val view = super.onCreateView(inflater, container, savedInstanceState) + Log.d("SettingsFragment", "onCreateView: $savedInstanceState") + val view: View = super.onCreateView(inflater, container, savedInstanceState) val color = MaterialColors.getColor(view, android.R.attr.colorBackground) view.setBackgroundColor(color) return view diff --git a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt index 7fa2728..022a8ce 100644 --- a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt @@ -24,15 +24,18 @@ class SetupFragment : Fragment() { private val binding get() = _binding!! override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, + inflater: LayoutInflater, + container: ViewGroup?, savedInstanceState: Bundle?, ): View { - Log.d("onCreateView", "savedInstanceState: $savedInstanceState") + Log.d("SetupFragment", "onCreateView: $savedInstanceState") _binding = FragmentSetupBinding.inflate(inflater, container, false) - return binding.root + val root: View = binding.root + return root } override fun onDestroyView() { + Log.d("SetupFragment", "onDestroyView") super.onDestroyView() _binding = null } From 3616dd94099525850320c684e1754f912191a86d Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 13:11:45 -0700 Subject: [PATCH 10/18] Tweak Navigation --- .../java/org/cssnr/zipline/MainActivity.kt | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 8b6c374..7327005 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -56,13 +56,24 @@ class MainActivity : AppCompatActivity() { Log.d("setNavigationItemSelectedListener", "currentFragment: $currentFragment") if (currentFragment !is HomeFragment) { Log.d("setNavigationItemSelectedListener", "NOT HomeFragment") - supportFragmentManager.popBackStack( - null, - FragmentManager.POP_BACK_STACK_INCLUSIVE - ) - supportFragmentManager.beginTransaction() - .replace(R.id.main, HomeFragment()) - .commit() + + if (supportFragmentManager.backStackEntryCount > 0) { + Log.i("MainActivity", "popping backstack") + supportFragmentManager.popBackStack() + } else { + Log.i("MainActivity", "nothing on backstack, calling super") + supportFragmentManager.beginTransaction() + .replace(R.id.main, HomeFragment()) + .commitNow() + } + + //supportFragmentManager.popBackStack( + // null, + // FragmentManager.POP_BACK_STACK_INCLUSIVE + //) + //supportFragmentManager.beginTransaction() + // .replace(R.id.main, HomeFragment()) + // .commit() } binding.navigationView.setCheckedItem(R.id.nav_item_home) binding.drawerLayout.closeDrawers() From 59b0dd0ae25ca33c2a004a6fc22c9304bb52e139 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 14:43:49 -0700 Subject: [PATCH 11/18] Add Drawer Lock to SetupFragment.kt --- .../java/org/cssnr/zipline/MainActivity.kt | 13 ++++++++++- .../java/org/cssnr/zipline/SetupFragment.kt | 5 +++++ .../main/res/navigation/mobile_navigation.xml | 22 ------------------- 3 files changed, 17 insertions(+), 23 deletions(-) delete mode 100644 app/src/main/res/navigation/mobile_navigation.xml diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 7327005..7fc50b4 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -13,7 +13,7 @@ import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat -import androidx.fragment.app.FragmentManager +import androidx.drawerlayout.widget.DrawerLayout import org.cssnr.zipline.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { @@ -91,6 +91,11 @@ class MainActivity : AppCompatActivity() { true } +// R.id.nav_item_settings -> { +// Log.d("setNavigationItemSelectedListener", "nav_item_settings") +// false +// } + else -> false } } @@ -113,6 +118,12 @@ class MainActivity : AppCompatActivity() { handleIntent(intent) } + fun setDrawerLockMode(enabled: Boolean) { + val lockMode = + if (enabled) DrawerLayout.LOCK_MODE_UNLOCKED else DrawerLayout.LOCK_MODE_LOCKED_CLOSED + binding.drawerLayout.setDrawerLockMode(lockMode) + } + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) Log.d("onNewIntent", "intent: $intent") diff --git a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt index 022a8ce..66260cc 100644 --- a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt @@ -38,11 +38,16 @@ class SetupFragment : Fragment() { Log.d("SetupFragment", "onDestroyView") super.onDestroyView() _binding = null + // Unlock Navigation Drawer + (requireActivity() as MainActivity).setDrawerLockMode(true) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { Log.d("onViewCreated", "savedInstanceState: $savedInstanceState") + // Lock Navigation Drawer + (requireActivity() as MainActivity).setDrawerLockMode(false) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { binding.root.setOnApplyWindowInsetsListener { _, insets -> val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()) diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml deleted file mode 100644 index 1effc0e..0000000 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - \ No newline at end of file From 02c84fd2c47a665ed7a0c7ce101caa0e6cf65c6f Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 15:26:38 -0700 Subject: [PATCH 12/18] Update HomeFragment.kt onSaveInstanceState --- .../java/org/cssnr/zipline/HomeFragment.kt | 27 ++++++++++++++----- .../java/org/cssnr/zipline/MainActivity.kt | 13 ++++++++- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index d5461ac..06c05e1 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -96,16 +96,31 @@ class HomeFragment : Fragment() { } override fun onSaveInstanceState(outState: Bundle) { - Log.d("HomeFragment", "onSaveInstanceState: $outState") + Log.d("HomeFragment", "onSaveInstanceState1: $outState") super.onSaveInstanceState(outState) - binding.webView.saveState(outState) + Log.d("HomeFragment", "onSaveInstanceState2: $outState") - // TODO: Not sure when this method is triggered... - webViewState.let { - outState.putBundle("webViewState", it) - } + _binding?.webView?.saveState(outState) + Log.d("HomeFragment", "onSaveInstanceState3: $outState") + + outState.putBundle("webViewState", webViewState) + Log.d("HomeFragment", "DONE") } +// override fun onSaveInstanceState(outState: Bundle) { +// Log.d("HomeFragment", "onSaveInstanceState1: $outState") +// super.onSaveInstanceState(outState) +// Log.d("HomeFragment", "onSaveInstanceState2: $outState") +// binding.webView?.saveState(outState) +// Log.d("HomeFragment", "onSaveInstanceState3: $outState") +// +// webViewState.let { +// Log.d("HomeFragment", "outState.putBundle: $it") +// outState.putBundle("webViewState", it) +// } +// Log.d("HomeFragment", "DONE") +// } + override fun onPause() { Log.d("HomeFragment", "ON PAUSE") super.onPause() diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 7fc50b4..d2c79a9 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -15,6 +15,8 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.drawerlayout.widget.DrawerLayout import org.cssnr.zipline.databinding.ActivityMainBinding +import androidx.core.view.size +import androidx.core.view.get class MainActivity : AppCompatActivity() { @@ -103,15 +105,24 @@ class MainActivity : AppCompatActivity() { // Navigation - Back Button supportFragmentManager.addOnBackStackChangedListener { val currentFragment = supportFragmentManager.findFragmentById(R.id.main) + Log.d("addOnBackStackChangedListener", "currentFragment: $currentFragment") val itemId = when (currentFragment) { is SettingsFragment -> R.id.nav_item_settings is HomeFragment -> R.id.nav_item_home + is PreviewFragment -> View.NO_ID else -> View.NO_ID } + Log.d("addOnBackStackChangedListener", "itemId: $itemId") if (itemId != View.NO_ID) { + Log.d("addOnBackStackChangedListener", "SET isChecked") binding.navigationView.menu.findItem(itemId)?.isChecked = true } else { - binding.navigationView.menu.setGroupCheckable(0, false, true) + Log.d("addOnBackStackChangedListener", "NOT Checkable") + //binding.navigationView.menu.setGroupCheckable(0, false, true) + binding.navigationView.menu.setGroupCheckable(0, true, true) + for (i in 0 until binding.navigationView.menu.size) { + binding.navigationView.menu[i].isChecked = false + } } } From 810361101ec8bf3c75f82664894e54f78be39481 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 15:36:10 -0700 Subject: [PATCH 13/18] Cleanup --- app/src/main/java/org/cssnr/zipline/HomeFragment.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index 06c05e1..5447ac3 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -98,13 +98,8 @@ class HomeFragment : Fragment() { override fun onSaveInstanceState(outState: Bundle) { Log.d("HomeFragment", "onSaveInstanceState1: $outState") super.onSaveInstanceState(outState) - Log.d("HomeFragment", "onSaveInstanceState2: $outState") - _binding?.webView?.saveState(outState) - Log.d("HomeFragment", "onSaveInstanceState3: $outState") - outState.putBundle("webViewState", webViewState) - Log.d("HomeFragment", "DONE") } // override fun onSaveInstanceState(outState: Bundle) { From 4d70b6beb281fea46f16b9993e36916166808549 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 16:24:24 -0700 Subject: [PATCH 14/18] Enable shouldOverrideUrlLoading --- .../java/org/cssnr/zipline/HomeFragment.kt | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index 5447ac3..c88adf1 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -5,6 +5,8 @@ import android.content.Context.MODE_PRIVATE import android.os.Bundle import android.util.Log import android.view.LayoutInflater +import android.content.Intent +import androidx.core.net.toUri import android.view.View import android.view.ViewGroup import android.webkit.WebResourceError @@ -22,6 +24,7 @@ class HomeFragment : Fragment() { private val binding get() = _binding!! private var webViewState: Bundle = Bundle() + private lateinit var ziplineUrl: String override fun onCreateView( inflater: LayoutInflater, @@ -55,7 +58,7 @@ class HomeFragment : Fragment() { Log.d("onViewCreated", "webViewState.size: ${webViewState.size()}") val sharedPreferences = context?.getSharedPreferences("default_preferences", MODE_PRIVATE) - val ziplineUrl = sharedPreferences?.getString("ziplineUrl", null) + ziplineUrl = sharedPreferences?.getString("ziplineUrl", "").toString() val ziplineToken = sharedPreferences?.getString("ziplineToken", null) Log.d("onViewCreated", "ziplineUrl: $ziplineUrl") Log.d("onViewCreated", "ziplineToken: $ziplineToken") @@ -74,7 +77,7 @@ class HomeFragment : Fragment() { restoreState(webViewState) } else { Log.d("webView.apply", "LOAD URL RETARD") - loadUrl(ziplineUrl.toString()) + loadUrl(ziplineUrl) } } @@ -138,31 +141,17 @@ class HomeFragment : Fragment() { override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { val url = request.url.toString() Log.d("shouldOverrideUrlLoading", "url: $url") + Log.d("shouldOverrideUrlLoading", "ziplineUrl: $ziplineUrl") - //val preferences = getSharedPreferences(PREFS_NAME, MODE_PRIVATE) - //val savedUrl = sharedPreferences.getString(URL_KEY, null) - //Log.d("shouldOverrideUrlLoading", "savedUrl: $savedUrl") - - //if ((savedUrl != null && - // url.startsWith(savedUrl) && !url.startsWith("$savedUrl/r/") && !url.startsWith( - // "$savedUrl/raw/" - // )) || - // url.startsWith("https://discord.com/oauth2") || - // url.startsWith("https://github.com/sessions/two-factor/") || - // url.startsWith("https://github.com/login") || - // url.startsWith("https://accounts.google.com/v3/signin") || - // url.startsWith("https://accounts.google.com/o/oauth2/v2/auth") - //) { - // Log.d("shouldOverrideUrlLoading", "FALSE - in app") - // return false - //} - - //val intent = Intent(Intent.ACTION_VIEW, url.toUri()) - //view.context.startActivity(intent) - //Log.d("shouldOverrideUrlLoading", "TRUE - in browser") - //return true - - return false + if (ziplineUrl.isNotEmpty() && url.startsWith(ziplineUrl) ) { + Log.d("shouldOverrideUrlLoading", "FALSE - in app") + return false + } + + val intent = Intent(Intent.ACTION_VIEW, url.toUri()) + view.context.startActivity(intent) + Log.d("shouldOverrideUrlLoading", "TRUE - in browser") + return true } override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) { From 60e4a741378f7cec3310b1a9dd0001af464a6255 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 16:47:11 -0700 Subject: [PATCH 15/18] Destroy webView in onDestroyView --- app/src/main/java/org/cssnr/zipline/HomeFragment.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index c88adf1..5daddf9 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -39,6 +39,14 @@ class HomeFragment : Fragment() { override fun onDestroyView() { Log.d("HomeFragment", "onDestroyView") + // Destroy WebView + binding.webView.apply { + loadUrl("about:blank") + stopLoading() + clearHistory() + removeAllViews() + destroy() + } super.onDestroyView() _binding = null } From d92314528e549e364da230ec82e4e38540c50a31 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 17:03:21 -0700 Subject: [PATCH 16/18] Cleanup --- app/proguard-rules.pro | 2 +- app/src/main/java/org/cssnr/zipline/HomeFragment.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index bbfd53a..166160d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -8,7 +8,7 @@ # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: --keepclassmembers class org.cssnr.zipline.MainActivity$MyWebViewClient { +-keepclassmembers class org.cssnr.zipline.HomeFragment$MyWebViewClient { public *; } diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index 5daddf9..c60002e 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -84,7 +84,7 @@ class HomeFragment : Fragment() { Log.d("webView.apply", "RESTORE STATE") restoreState(webViewState) } else { - Log.d("webView.apply", "LOAD URL RETARD") + Log.d("webView.apply", "LOAD URL: $ziplineUrl") loadUrl(ziplineUrl) } } From 5d2b24cdfe5884c16670b60817c2849c928af19a Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 17:07:56 -0700 Subject: [PATCH 17/18] Add Fix for Theme Change and ACTION_MAIN savedInstanceState Check for null --- .../java/org/cssnr/zipline/MainActivity.kt | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index d2c79a9..05543ca 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -126,7 +126,7 @@ class MainActivity : AppCompatActivity() { } } - handleIntent(intent) + handleIntent(intent, savedInstanceState) } fun setDrawerLockMode(enabled: Boolean) { @@ -138,10 +138,10 @@ class MainActivity : AppCompatActivity() { override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) Log.d("onNewIntent", "intent: $intent") - handleIntent(intent) + handleIntent(intent, null) } - private fun handleIntent(intent: Intent) { + private fun handleIntent(intent: Intent, savedInstanceState: Bundle?) { Log.d("handleIntent", "intent: $intent") Log.d("handleIntent", "intent.data: ${intent.data}") @@ -162,12 +162,15 @@ class MainActivity : AppCompatActivity() { .commit() } else if (Intent.ACTION_MAIN == intent.action) { - Log.d("handleIntent", "ACTION_MAIN") - - supportFragmentManager.beginTransaction() - .replace(R.id.main, HomeFragment()) - .commit() - binding.navigationView.setCheckedItem(R.id.nav_item_home) + Log.d("handleIntent", "ACTION_MAIN: $savedInstanceState") + + // TODO: Verify this does not cause any issues + if (savedInstanceState == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.main, HomeFragment()) + .commit() + binding.navigationView.setCheckedItem(R.id.nav_item_home) + } } else if (Intent.ACTION_SEND == intent.action) { Log.d("handleIntent", "ACTION_SEND") From 16ef940293202f92c2a303bfc8e03fc5b70f5813 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Sun, 13 Apr 2025 17:20:15 -0700 Subject: [PATCH 18/18] Cleanup --- app/src/main/java/org/cssnr/zipline/HomeFragment.kt | 6 +++--- app/src/main/java/org/cssnr/zipline/MainActivity.kt | 9 ++------- app/src/main/java/org/cssnr/zipline/PreviewFragment.kt | 3 --- app/src/main/java/org/cssnr/zipline/ZiplineApi.kt | 1 - 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index c60002e..8da9453 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -2,11 +2,10 @@ package org.cssnr.zipline import android.annotation.SuppressLint import android.content.Context.MODE_PRIVATE +import android.content.Intent import android.os.Bundle import android.util.Log import android.view.LayoutInflater -import android.content.Intent -import androidx.core.net.toUri import android.view.View import android.view.ViewGroup import android.webkit.WebResourceError @@ -15,6 +14,7 @@ import android.webkit.WebResourceResponse import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.content.edit +import androidx.core.net.toUri import androidx.fragment.app.Fragment import org.cssnr.zipline.databinding.FragmentHomeBinding @@ -151,7 +151,7 @@ class HomeFragment : Fragment() { Log.d("shouldOverrideUrlLoading", "url: $url") Log.d("shouldOverrideUrlLoading", "ziplineUrl: $ziplineUrl") - if (ziplineUrl.isNotEmpty() && url.startsWith(ziplineUrl) ) { + if (ziplineUrl.isNotEmpty() && url.startsWith(ziplineUrl)) { Log.d("shouldOverrideUrlLoading", "FALSE - in app") return false } diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 05543ca..a52f974 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -13,10 +13,10 @@ import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.get +import androidx.core.view.size import androidx.drawerlayout.widget.DrawerLayout import org.cssnr.zipline.databinding.ActivityMainBinding -import androidx.core.view.size -import androidx.core.view.get class MainActivity : AppCompatActivity() { @@ -93,11 +93,6 @@ class MainActivity : AppCompatActivity() { true } -// R.id.nav_item_settings -> { -// Log.d("setNavigationItemSelectedListener", "nav_item_settings") -// false -// } - else -> false } } diff --git a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt index 17150bd..1d2052e 100644 --- a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt @@ -171,9 +171,6 @@ class PreviewFragment : Fragment() { Log.d("processUpload", "result.url: ${result.url}") copyToClipboard(result.url) -// val main = activity as MainActivity -// main.loadUrl(result.url) - val fragment = requireActivity() .supportFragmentManager .findFragmentById(R.id.main) diff --git a/app/src/main/java/org/cssnr/zipline/ZiplineApi.kt b/app/src/main/java/org/cssnr/zipline/ZiplineApi.kt index ae8db8d..9e74c39 100644 --- a/app/src/main/java/org/cssnr/zipline/ZiplineApi.kt +++ b/app/src/main/java/org/cssnr/zipline/ZiplineApi.kt @@ -186,7 +186,6 @@ class ZiplineApi(private val context: Context) { val url: String, ) - data class LoginRequest( val username: String, val password: String,