diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8f4aa36..12ede98 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,22 +13,21 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/NPSTheme"> - + - - + + + tools:ignore="LockedOrientationActivity" + android:parentActivityName=".activities.MainActivity" /> \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/activities/AppsListActivity.kt b/app/src/main/java/com/illusionware/npsbrowser/activities/AppsListActivity.kt deleted file mode 100644 index 37c0718..0000000 --- a/app/src/main/java/com/illusionware/npsbrowser/activities/AppsListActivity.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.illusionware.npsbrowser.activities - -import android.content.Intent -import android.os.Bundle -import android.view.View -import android.widget.Toast -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.illusionware.npsbrowser.AppData -import com.illusionware.npsbrowser.RecyclerTouchListener -import com.illusionware.npsbrowser.adapters.AppAdapter -import com.illusionware.npsbrowser.databinding.ActivityAppsListBinding - -class AppsListActivity : BaseActivity() { - companion object { - lateinit var apps : ArrayList - } - private lateinit var recyclerView: RecyclerView - private lateinit var viewAdapter: RecyclerView.Adapter<*> - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val binding = ActivityAppsListBinding.inflate(layoutInflater) - setContentView(binding.root) - - viewAdapter = AppAdapter(apps, applicationContext) - - recyclerView = binding.appsRecycler - recyclerView.apply { - layoutManager = LinearLayoutManager(applicationContext) - adapter = viewAdapter - - recyclerView.addOnItemTouchListener(RecyclerTouchListener(applicationContext, recyclerView, object : RecyclerTouchListener.ClickListener { - override fun onClick(view: View?, position: Int) { - val myIntent = Intent(context, SingleAppActivity::class.java) - SingleAppActivity.app = apps[position] - - startActivity(myIntent) - } - - override fun onLongClick(view: View?, recyclerView: RecyclerView?, position: Int) { - Toast.makeText(applicationContext, "TODO: Long Click ", Toast.LENGTH_SHORT).show() - } - } - )) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt b/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt index 430ebb3..dfbb7ca 100644 --- a/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt +++ b/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt @@ -1,108 +1,39 @@ -package com.illusionware.npsbrowser.activities - -import android.Manifest -import android.app.Activity -import android.content.Intent -import android.content.pm.PackageManager -import android.os.Bundle -import android.util.Log -import android.view.Menu -import android.view.MenuItem -import androidx.core.app.ActivityCompat -import com.github.doyaaaaaken.kotlincsv.dsl.csvReader -import com.illusionware.npsbrowser.AppData -import com.illusionware.npsbrowser.R -import com.illusionware.npsbrowser.databinding.ActivityMainBinding -import kotlinx.android.synthetic.main.appbar.* -import java.io.InputStream - -class MainActivity : BaseActivity() { - - private val tsvReader = csvReader { - charset = "UTF-8" - quoteChar = '\\' - escapeChar = '\\' - delimiter = '\t' - skipEmptyLine = true - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val binding = ActivityMainBinding.inflate(layoutInflater) - setContentView(binding.root) - - setSupportActionBar(toolbar) - - binding.tsvChooserButton.setOnClickListener { - if (!isStoragePermissionGranted()) - return@setOnClickListener - val intent = Intent(Intent.ACTION_GET_CONTENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "text/tab-separated-values" - } - startActivityForResult(intent, 1) - } - } - - override fun onCreateOptionsMenu(menu : Menu) : Boolean { - menuInflater.inflate(R.menu.toolbar_main, menu) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - R.id.action_settings -> { - val settingsIntent = Intent(this, SettingsActivity::class.java) - startActivity(settingsIntent) - true - } - else -> return super.onOptionsItemSelected(item) - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { - super.onActivityResult(requestCode, resultCode, resultData) - if (requestCode == 1 && resultCode == Activity.RESULT_OK) { - resultData?.data?.also { uri -> - val inputStream: InputStream? = contentResolver.openInputStream(uri) - val entries : List> = tsvReader.readAllWithHeader(inputStream!!) - val myIntent = Intent(this, AppsListActivity::class.java) - val apps = ArrayList(entries.size) - - entries.forEach { entry -> - if (entry["Name"].isNullOrEmpty()) { - return@forEach - } - val id = entry["Title ID"] - val region = entry["Region"] - val name = entry["Name"] - val link = entry["PKG direct link"] - val license = entry["zRIF"] - val contentID = entry["Content ID"] - val lastDateTime = entry["Last Modification Date"] - val fileSize = entry["File Size"]?.toLongOrNull() - val sha256 = entry["SHA256"] - val minFW = entry["Required FW"] - val app = AppData(id, region, name, link ?: "MISSING", license ?: "MISSING", - contentID ?: "MISSING", lastDateTime ?: "MISSING", - fileSize ?: 0, sha256 ?: "MISSING", minFW) - apps.add(app) - } - apps.sortBy { it.title } - AppsListActivity.apps = apps - startActivity(myIntent) - } - } - } - - private fun isStoragePermissionGranted(): Boolean { - return if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { - Log.v("perms", "Permission is granted") - true - } else { - Log.v("perms", "Permission is revoked") - ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1) - false - } - } -} +package com.illusionware.npsbrowser.activities + +import android.os.Bundle +import android.view.MenuItem +import com.illusionware.npsbrowser.R +import com.illusionware.npsbrowser.fragments.mainactivity.MainActivityFragment + +class MainActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setTheme(R.style.NPSTheme) + setContentView(R.layout.activity_main) + if (savedInstanceState == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.container, MainActivityFragment.newInstance()) + .commitNow() + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + supportFragmentManager.popBackStack() + return true + } + } + return super.onOptionsItemSelected(item) + } + + fun showUpButton() { + supportActionBar!!.setDisplayHomeAsUpEnabled(true) + } + + fun hideUpButton() { + supportActionBar!!.setDisplayHomeAsUpEnabled(false) + } + +} diff --git a/app/src/main/java/com/illusionware/npsbrowser/activities/SettingsActivity.kt b/app/src/main/java/com/illusionware/npsbrowser/activities/SettingsActivity.kt deleted file mode 100644 index d072484..0000000 --- a/app/src/main/java/com/illusionware/npsbrowser/activities/SettingsActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.illusionware.npsbrowser.activities - -import android.os.Bundle -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.PreferenceManager -import com.illusionware.npsbrowser.R -import com.illusionware.npsbrowser.databinding.SettingsActivityBinding -import kotlinx.android.synthetic.main.appbar.* - -class SettingsActivity : BaseActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val binding = SettingsActivityBinding.inflate(layoutInflater) - setContentView(binding.root) - - setSupportActionBar(toolbar) - - supportFragmentManager - .beginTransaction() - .replace( - R.id.settings, - SettingsFragment() - ) - .commit() - supportActionBar?.setDisplayHomeAsUpEnabled(true) - } - - class SettingsFragment : PreferenceFragmentCompat() { - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.root_preferences, rootKey) - PreferenceManager.setDefaultValues(context, R.xml.root_preferences, false); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/activities/SplashActivity.kt b/app/src/main/java/com/illusionware/npsbrowser/activities/SplashActivity.kt index 67dbd75..4b50089 100644 --- a/app/src/main/java/com/illusionware/npsbrowser/activities/SplashActivity.kt +++ b/app/src/main/java/com/illusionware/npsbrowser/activities/SplashActivity.kt @@ -3,7 +3,6 @@ package com.illusionware.npsbrowser.activities import android.content.Intent import android.os.Bundle import android.view.View -import com.illusionware.npsbrowser.activities.mainactivity.MainActivity class SplashActivity : BaseActivity() { diff --git a/app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt b/app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt index db4af23..c00ea9c 100644 --- a/app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt +++ b/app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt @@ -1,51 +1,72 @@ -package com.illusionware.npsbrowser.adapters - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.core.content.res.ResourcesCompat -import androidx.recyclerview.widget.RecyclerView -import com.illusionware.npsbrowser.AppData -import com.illusionware.npsbrowser.R -import kotlin.collections.ArrayList - -class AppAdapter(private val appsList: ArrayList, val context : Context) : RecyclerView.Adapter() { - - inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var appTitle: TextView = view.findViewById(R.id.appTitle) - var appRegion: TextView = view.findViewById(R.id.appRegion) - var appMinFW: TextView = view.findViewById(R.id.appMinFW) - var appLastDate: TextView = view.findViewById(R.id.appLastDate) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.appTitle.text = appsList[position].title - holder.appRegion.text = appsList[position].region - holder.appMinFW.text = appsList[position].minFW - holder.appMinFW.background = null; - - if (holder.appMinFW.text.isNotBlank()) { - val drawable = ResourcesCompat.getDrawable(context.resources, R.drawable.rect_red, null) - holder.appMinFW.background = drawable; - } - holder.appLastDate.text = appsList[position].lastDateTime - } - - override fun getItemCount(): Int { - return appsList.size - } - - fun updateData(apps: ArrayList) { - appsList.clear() - notifyDataSetChanged() - appsList.addAll(apps) - notifyDataSetChanged() - - } +package com.illusionware.npsbrowser.adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.RecyclerView +import com.illusionware.npsbrowser.AppData +import com.illusionware.npsbrowser.R +import kotlin.collections.ArrayList + +class AppAdapter(private val appsList: ArrayList, val context : Context) : RecyclerView.Adapter() { + private final val LIST_ITEM = 0 + private final val GRID_ITEM = 1 + var isSwitchView = true + + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var appTitle: TextView = view.findViewById(R.id.appTitle) + var appRegion: TextView = view.findViewById(R.id.appRegion) + var appMinFW: TextView = view.findViewById(R.id.appMinFW) + var appLastDate: TextView = view.findViewById(R.id.appLastDate) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return if (viewType == LIST_ITEM) { + ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)) + } else { + ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.grid_item, parent, false)) + } + } + + override fun getItemViewType(position: Int): Int { + return if (isSwitchView) { + LIST_ITEM + } else { + GRID_ITEM + } + } + + public fun toggleItemViewType(type: Int): Boolean { + isSwitchView = type == 0 + return isSwitchView + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.appTitle.text = appsList[position].title + holder.appTitle.isSelected = true + holder.appRegion.text = appsList[position].region + holder.appMinFW.text = appsList[position].minFW + holder.appMinFW.background = null; + + if (holder.appMinFW.text.isNotBlank()) { + val drawable = ResourcesCompat.getDrawable(context.resources, R.drawable.rect_red, null) + holder.appMinFW.background = drawable; + } + holder.appLastDate.text = appsList[position].lastDateTime + } + + override fun getItemCount(): Int { + return appsList.size + } + + fun updateData(apps: ArrayList) { + appsList.clear() + notifyDataSetChanged() + appsList.addAll(apps) + notifyDataSetChanged() + + } } \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/fragments/SettingsFragment.kt b/app/src/main/java/com/illusionware/npsbrowser/fragments/SettingsFragment.kt new file mode 100644 index 0000000..ae17dc0 --- /dev/null +++ b/app/src/main/java/com/illusionware/npsbrowser/fragments/SettingsFragment.kt @@ -0,0 +1,65 @@ +package com.illusionware.npsbrowser.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentTransaction.TRANSIT_FRAGMENT_OPEN +import androidx.preference.PreferenceFragmentCompat +import androidx.preference.PreferenceManager +import com.illusionware.npsbrowser.R +import com.illusionware.npsbrowser.activities.BaseActivity +import com.illusionware.npsbrowser.activities.MainActivity +import com.illusionware.npsbrowser.fragments.mainactivity.MainActivityFragment +import kotlinx.android.synthetic.main.appbar.* + +class SettingsFragment : Fragment() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (activity!!.supportFragmentManager.backStackEntryCount < 1) { + (activity as MainActivity?)?.showUpButton() + MainActivityFragment().recyclerView?.adapter = MainActivityFragment().viewAdapter + } + PreferenceManager.setDefaultValues(context, R.xml.root_preferences, false); + activity?.supportFragmentManager + ?.beginTransaction() + ?.replace( + R.id.prefs, + SettingsFragment() + ) + ?.setTransition(TRANSIT_FRAGMENT_OPEN) + ?.commit() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + activity?.title = resources.getString(R.string.title_activity_settings) + return inflater.inflate(R.layout.settings_fragment, container, false) + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + (activity as BaseActivity?)!!.setSupportActionBar(toolbar) + (activity as BaseActivity?)!!.supportActionBar?.setDisplayHomeAsUpEnabled(true) + //viewModel = ViewModelProviders.of(this).get(MainActivity2ViewModel::class.java) + // TODO: Use the ViewModel + } + + class SettingsFragment : PreferenceFragmentCompat() { + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.root_preferences, rootKey) + PreferenceManager.setDefaultValues(context, R.xml.root_preferences, false); + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + //(activity as BaseActivity?)!!.setSupportActionBar(toolbar) + super.onActivityCreated(savedInstanceState) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/fragments/mainactivity/MainActivityFragment.kt b/app/src/main/java/com/illusionware/npsbrowser/fragments/mainactivity/MainActivityFragment.kt new file mode 100644 index 0000000..aab1041 --- /dev/null +++ b/app/src/main/java/com/illusionware/npsbrowser/fragments/mainactivity/MainActivityFragment.kt @@ -0,0 +1,218 @@ +package com.illusionware.npsbrowser.fragments.mainactivity + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.content.pm.PackageManager +import android.content.res.Configuration +import android.os.Bundle +import android.util.Log +import android.view.* +import android.widget.Toast +import androidx.core.content.ContextCompat.checkSelfPermission +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.ViewModelProviders +import androidx.preference.PreferenceManager +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.github.doyaaaaaken.kotlincsv.dsl.csvReader +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.illusionware.npsbrowser.AppData +import com.illusionware.npsbrowser.R +import com.illusionware.npsbrowser.RecyclerTouchListener +import com.illusionware.npsbrowser.activities.SingleAppActivity +import com.illusionware.npsbrowser.activities.MainActivity +import com.illusionware.npsbrowser.adapters.AppAdapter +import com.illusionware.npsbrowser.fragments.SettingsFragment +import kotlinx.android.synthetic.main.appbar.* +import java.io.InputStream + +class MainActivityFragment : Fragment(), FragmentManager.OnBackStackChangedListener { + + var recyclerView : RecyclerView? = null + var viewAdapter: AppAdapter? = null + + companion object { + + fun newInstance() = MainActivityFragment() + var apps : ArrayList? = arrayListOf() + } + + private val tsvReader = csvReader { + charset = "UTF-8" + quoteChar = '\\' + escapeChar = '\\' + delimiter = '\t' + skipEmptyLine = true + skipMissMatchedRow = true + } + + private lateinit var viewModel: MainActivityViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + activity?.supportFragmentManager?.addOnBackStackChangedListener(this); + setHasOptionsMenu(true) + } + + override fun onBackStackChanged() { + // enable Up button only if there are entries on the backstack + if (requireActivity().supportFragmentManager.backStackEntryCount < 1) { + (activity as MainActivity?)?.hideUpButton() + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + activity?.title = resources.getString(R.string.app_name) + + val view = inflater.inflate(R.layout.main_fragment, container, false) + + recyclerView = view?.findViewById(R.id.appsRecycler) + + if (apps != null) { + viewAdapter = AppAdapter(apps!!, requireContext()) + } + viewAdapter?.notifyDataSetChanged() + val orientation = this.resources.configuration.orientation + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val isViewAsList = prefs.getString("layout_type", "0") + if (isViewAsList == "0") { + viewAdapter?.toggleItemViewType(0) + recyclerView?.layoutManager = LinearLayoutManager(context) + viewAdapter?.notifyDataSetChanged() + } else { + viewAdapter?.toggleItemViewType(1) + recyclerView?.layoutManager = GridLayoutManager(context, + if (orientation == Configuration.ORIENTATION_LANDSCAPE) 4 else 2) + viewAdapter?.notifyDataSetChanged() + } + recyclerView?.adapter = viewAdapter + + recyclerView?.addOnItemTouchListener(RecyclerTouchListener(requireContext(), recyclerView!!, object : RecyclerTouchListener.ClickListener { + override fun onClick(view: View?, position: Int) { + val myIntent = Intent(context, SingleAppActivity::class.java) + SingleAppActivity.app = apps!![position] + + startActivity(myIntent) + } + + override fun onLongClick(view: View?, recyclerView: RecyclerView?, position: Int) { + Toast.makeText(context, "TODO: Long Click ", Toast.LENGTH_SHORT).show() + } + } + )) + return view + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + + (activity as MainActivity?)!!.setSupportActionBar(toolbar) + + view?.findViewById(R.id.tsvChooserButton)?.setOnClickListener { + if (!isStoragePermissionGranted()) + return@setOnClickListener + val intent = Intent(Intent.ACTION_GET_CONTENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "text/tab-separated-values" + } + startActivityForResult(intent, 1) + } + viewModel = ViewModelProviders.of(this).get(MainActivityViewModel::class.java) + // TODO: Use the ViewModel + } + + override fun onCreateOptionsMenu(menu : Menu, menuInflater : MenuInflater) { + menuInflater.inflate(R.menu.toolbar_main, menu) + super.onCreateOptionsMenu(menu, menuInflater) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + R.id.action_settings -> { + activity?.supportFragmentManager + ?.beginTransaction() + ?.replace( + R.id.container, + SettingsFragment() + ) + ?.addToBackStack("settings") + ?.commit() + true + } + else -> return super.onOptionsItemSelected(item) + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == 1 && resultCode == Activity.RESULT_OK) { + resultData?.data?.also { uri -> + Log.d("file_location", uri.toString()) + val inputStream: InputStream? = activity?.contentResolver?.openInputStream(uri) + val entries : List> = tsvReader.readAllWithHeader(inputStream!!) + apps?.clear() + apps = ArrayList(entries.size) + + entries.forEach { entry -> + if (entry["Name"].isNullOrEmpty()) { + return@forEach + } + val id = entry["Title ID"] + val region = entry["Region"] + val name = entry["Name"] + val link = entry["PKG direct link"] + val license = entry["zRIF"] + val contentID = entry["Content ID"] + var lastDateTime = entry["Last Modification Date"] + if (!lastDateTime.isNullOrEmpty()) { + lastDateTime = lastDateTime.substring(0, 10) + } + val fileSize = entry["File Size"]?.toLongOrNull() + val sha256 = entry["SHA256"] + val minFW = entry["Required FW"] + val app = AppData(id, region, name, link ?: "MISSING", license ?: "MISSING", + contentID ?: "MISSING", lastDateTime ?: "MISSING", + fileSize, sha256 ?: "MISSING", minFW) + + apps?.add(app) + } + apps?.sortBy { it.title } + recyclerView = view?.findViewById(R.id.appsRecycler) + viewAdapter = AppAdapter(apps!!, requireContext()) + val orientation = this.resources.configuration.orientation + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val isViewAsList = prefs.getString("layout_type", "0") + + if (isViewAsList == "0") { + viewAdapter?.toggleItemViewType(0) + recyclerView?.layoutManager = LinearLayoutManager(context) + viewAdapter?.notifyDataSetChanged() + } else { + viewAdapter?.toggleItemViewType(1) + recyclerView?.layoutManager = GridLayoutManager(context, + if (orientation == Configuration.ORIENTATION_LANDSCAPE) 4 else 2) + viewAdapter?.notifyDataSetChanged() + } + + recyclerView?.adapter = viewAdapter + } + } + } + + private fun isStoragePermissionGranted(): Boolean { + return if (checkSelfPermission(this.context!!, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + Log.v("perms", "Permission is granted") + true + } else { + Log.v("perms", "Permission is revoked") + requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1) + false + } + } +} diff --git a/app/src/main/java/com/illusionware/npsbrowser/fragments/mainactivity/MainActivityViewModel.kt b/app/src/main/java/com/illusionware/npsbrowser/fragments/mainactivity/MainActivityViewModel.kt new file mode 100644 index 0000000..9492813 --- /dev/null +++ b/app/src/main/java/com/illusionware/npsbrowser/fragments/mainactivity/MainActivityViewModel.kt @@ -0,0 +1,7 @@ +package com.illusionware.npsbrowser.fragments.mainactivity + +import androidx.lifecycle.ViewModel + +class MainActivityViewModel : ViewModel() { + // TODO: Implement the ViewModel +} diff --git a/app/src/main/res/layout/activity_apps_list.xml b/app/src/main/res/layout/activity_apps_list.xml deleted file mode 100644 index bdc8c96..0000000 --- a/app/src/main/res/layout/activity_apps_list.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 9682a03..1963eba 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,26 +1,7 @@ - - - - - - - \ No newline at end of file + + diff --git a/app/src/main/res/layout/grid_item.xml b/app/src/main/res/layout/grid_item.xml new file mode 100644 index 0000000..7daa12c --- /dev/null +++ b/app/src/main/res/layout/grid_item.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml index f10fad1..534d886 100644 --- a/app/src/main/res/layout/list_item.xml +++ b/app/src/main/res/layout/list_item.xml @@ -1,100 +1,104 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_fragment.xml b/app/src/main/res/layout/main_fragment.xml new file mode 100644 index 0000000..5c21a76 --- /dev/null +++ b/app/src/main/res/layout/main_fragment.xml @@ -0,0 +1,38 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml deleted file mode 100644 index 8123489..0000000 --- a/app/src/main/res/layout/settings_activity.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml new file mode 100644 index 0000000..d60e331 --- /dev/null +++ b/app/src/main/res/layout/settings_fragment.xml @@ -0,0 +1,31 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 7ca39db..57c31f4 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,13 +1,21 @@ - - - - Light - Dark - Use System Default - - - 0 - 1 - 2 - - + + + + Light + Dark + Use System Default + + + 0 + 1 + 2 + + + List + Grid + + + 0 + 1 + + diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index c22af9e..0e7e000 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -1,12 +1,19 @@ - - - - - + + + + + + \ No newline at end of file