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/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 new file mode 100644 index 0000000..8da9453 --- /dev/null +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -0,0 +1,201 @@ +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.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.core.content.edit +import androidx.core.net.toUri +import androidx.fragment.app.Fragment +import org.cssnr.zipline.databinding.FragmentHomeBinding + +class HomeFragment : Fragment() { + + private var _binding: FragmentHomeBinding? = null + private val binding get() = _binding!! + + private var webViewState: Bundle = Bundle() + private lateinit var ziplineUrl: String + + override fun onCreateView( + inflater: LayoutInflater, + 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") + // Destroy WebView + binding.webView.apply { + loadUrl("about:blank") + stopLoading() + clearHistory() + removeAllViews() + destroy() + } + super.onDestroyView() + _binding = null + } + + @SuppressLint("SetJavaScriptEnabled") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + Log.d("HomeFragment", "onViewCreated: $savedInstanceState") + + 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) + ziplineUrl = sharedPreferences?.getString("ziplineUrl", "").toString() + val ziplineToken = sharedPreferences?.getString("ziplineToken", null) + Log.d("onViewCreated", "ziplineUrl: $ziplineUrl") + Log.d("onViewCreated", "ziplineToken: $ziplineToken") + + 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 + + if (webViewState.size() > 0) { + Log.d("webView.apply", "RESTORE STATE") + restoreState(webViewState) + } else { + Log.d("webView.apply", "LOAD URL: $ziplineUrl") + loadUrl(ziplineUrl) + } + } + +// //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) { + Log.d("HomeFragment", "binding.webView.loadUrl: $url") + binding.webView.loadUrl(url) + } + + override fun onSaveInstanceState(outState: Bundle) { + Log.d("HomeFragment", "onSaveInstanceState1: $outState") + super.onSaveInstanceState(outState) + _binding?.webView?.saveState(outState) + outState.putBundle("webViewState", webViewState) + } + +// 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() + 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() { + Log.d("HomeFragment", "ON RESUME") + super.onResume() + binding.webView.onResume() + binding.webView.resumeTimers() + } + + inner class MyWebViewClient : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { + val url = request.url.toString() + Log.d("shouldOverrideUrlLoading", "url: $url") + Log.d("shouldOverrideUrlLoading", "ziplineUrl: $ziplineUrl") + + 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) { + 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, + 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 33cb914..a52f974 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -6,23 +6,23 @@ import android.net.Uri import android.os.Build import android.os.Bundle import android.util.Log -import android.webkit.WebResourceRequest -import android.webkit.WebView -import android.webkit.WebViewClient +import android.view.View +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.core.view.get +import androidx.core.view.size +import androidx.drawerlayout.widget.DrawerLayout import org.cssnr.zipline.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding + internal lateinit var binding: ActivityMainBinding - @SuppressLint("SetJavaScriptEnabled") + @SuppressLint("SetJavaScriptEnabled", "SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d("onCreate", "savedInstanceState: $savedInstanceState") @@ -31,58 +31,112 @@ 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) 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 -> + 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") + val currentFragment = supportFragmentManager.findFragmentById(R.id.main) + Log.d("setNavigationItemSelectedListener", "currentFragment: $currentFragment") + if (currentFragment !is HomeFragment) { + Log.d("setNavigationItemSelectedListener", "NOT HomeFragment") + + 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() + true + } + + R.id.nav_item_settings -> { + Log.d("setNavigationItemSelectedListener", "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 + } + + else -> false + } } - 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) - } + // 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 { + 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 + } + } + } - override fun onPause() { - Log.d("onPause", "ON PAUSE") - super.onPause() - binding.webView.onPause() - binding.webView.pauseTimers() + handleIntent(intent, savedInstanceState) } - override fun onResume() { - Log.d("onResume", "ON RESUME") - super.onResume() - binding.webView.onResume() - binding.webView.resumeTimers() + 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") - 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}") @@ -98,22 +152,20 @@ 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() } else if (Intent.ACTION_MAIN == intent.action) { - Log.d("handleIntent", "ACTION_MAIN") + Log.d("handleIntent", "ACTION_MAIN: $savedInstanceState") - binding.webView.loadUrl(ziplineUrl) + // 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") @@ -172,74 +224,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("") - //} - - } } diff --git a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt index 83a3db3..1d2052e 100644 --- a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt @@ -25,22 +25,24 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.cssnr.zipline.databinding.FragmentPreviewBinding - class PreviewFragment : Fragment() { private var _binding: FragmentPreviewBinding? = null 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 } @@ -168,8 +170,14 @@ 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 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/SettingsFragment.kt b/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt index 0667ff7..b8cd950 100644 --- a/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SettingsFragment.kt @@ -9,14 +9,14 @@ import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import com.google.android.material.color.MaterialColors - class SettingsFragment : PreferenceFragmentCompat() { override fun onCreateView( inflater: LayoutInflater, 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 7e4fc89..66260cc 100644 --- a/app/src/main/java/org/cssnr/zipline/SetupFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/SetupFragment.kt @@ -24,22 +24,30 @@ 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 + // 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()) @@ -99,12 +107,24 @@ 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) - activity?.supportFragmentManager?.beginTransaction() - ?.remove(this@SetupFragment) - ?.commit() + + //activity?.supportFragmentManager?.beginTransaction() + // ?.replace(R.id.main, HomeFragment()) + // ?.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") } } 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, 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..5a20c0a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,11 +1,23 @@ - + - + android:layout_height="match_parent"> - + + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..37380d3 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,13 @@ + + + + + + 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..f9fcda7 --- /dev/null +++ b/app/src/main/res/menu/drawer_menu.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + 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 @@