Skip to content

Commit

Permalink
Merge pull request #86 from nitanmarcel/about_redesign
Browse files Browse the repository at this point in the history
Design improvements
  • Loading branch information
KreitinnSoftware authored Jan 29, 2025
2 parents e6405cb + e0391d5 commit 05eacfb
Show file tree
Hide file tree
Showing 42 changed files with 953 additions and 472 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ dependencies {
implementation("androidx.activity:activity-ktx:1.9.3")
implementation("com.google.code.gson:gson:2.10.1")
implementation("com.github.vatbub:mslinks:1.0.6.2")
implementation("com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0")
implementation("com.getkeepsafe.taptargetview:taptargetview:1.15.0")
implementation(project(":app:stub"))
}

Expand Down
127 changes: 111 additions & 16 deletions app/src/main/java/com/micewine/emu/activities/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,22 @@ import android.graphics.drawable.Icon
import android.os.Build
import android.os.Bundle
import android.os.storage.StorageManager
import android.util.Log
import android.view.ContextMenu
import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager
import com.getkeepsafe.taptargetview.TapTarget
import com.getkeepsafe.taptargetview.TapTargetSequence
import com.getkeepsafe.taptargetview.TapTargetView
import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.micewine.emu.BuildConfig
import com.micewine.emu.R
Expand Down Expand Up @@ -109,22 +116,23 @@ import com.micewine.emu.activities.GeneralSettings.Companion.WINE_LOG_LEVEL
import com.micewine.emu.activities.GeneralSettings.Companion.WINE_LOG_LEVEL_DEFAULT_VALUE
import com.micewine.emu.core.EnvVars
import com.micewine.emu.core.EnvVars.getEnv
import com.micewine.emu.core.HighlightState
import com.micewine.emu.core.RatPackageManager
import com.micewine.emu.core.RatPackageManager.installRat
import com.micewine.emu.core.ShellLoader.runCommand
import com.micewine.emu.core.ShellLoader.runCommandWithOutput
import com.micewine.emu.core.WineWrapper
import com.micewine.emu.databinding.ActivityMainBinding
import com.micewine.emu.fragments.AboutFragment
import com.micewine.emu.fragments.HomeFragment
import com.micewine.emu.fragments.AskInstallRatPackageFragment
import com.micewine.emu.fragments.AskInstallRatPackageFragment.Companion.ratCandidate
import com.micewine.emu.fragments.DeleteGameItemFragment
import com.micewine.emu.fragments.FileManagerFragment
import com.micewine.emu.fragments.FileManagerFragment.Companion.refreshFiles
import com.micewine.emu.fragments.FloatingFileManagerFragment
import com.micewine.emu.fragments.HomeFragment
import com.micewine.emu.fragments.HomeFragment.Companion.saveToGameList
import com.micewine.emu.fragments.HomeFragment.Companion.setIconToGame
import com.micewine.emu.fragments.ShortcutsFragment
import com.micewine.emu.fragments.ShortcutsFragment.Companion.saveToGameList
import com.micewine.emu.fragments.ShortcutsFragment.Companion.setIconToGame
import com.micewine.emu.fragments.RenameGameItemFragment
import com.micewine.emu.fragments.RenameGameItemFragment.Companion.initialTextRenameGameFragment
import com.micewine.emu.fragments.SettingsFragment
Expand Down Expand Up @@ -258,14 +266,17 @@ class MainActivity : AppCompatActivity() {
}
}

private var appToolbar: MaterialToolbar? = null
private var bottomNavigation: BottomNavigationView? = null
private var runningXServer = false
private val homeFragment: HomeFragment = HomeFragment()
private val shortcutsFragment: ShortcutsFragment = ShortcutsFragment()
private val settingsFragment: SettingsFragment = SettingsFragment()
private val fileManagerFragment: FileManagerFragment = FileManagerFragment()
private val aboutFragment: AboutFragment = AboutFragment()
private val homeFragment: HomeFragment = HomeFragment()
private var preferences: SharedPreferences? = null

private var currentState: HighlightState? = null

@SuppressLint("UnspecifiedRegisterReceiverFlag")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -279,12 +290,16 @@ class MainActivity : AppCompatActivity() {

preferences = PreferenceManager.getDefaultSharedPreferences(this)

appToolbar = findViewById(R.id.appToolbar)
setSupportActionBar(appToolbar)


bottomNavigation = findViewById(R.id.bottom_navigation)
bottomNavigation?.setOnItemSelectedListener { item: MenuItem ->
when (item.itemId) {
R.id.nav_home -> {
selectedFragment = "HomeFragment"
fragmentLoader(homeFragment, false)
R.id.nav_shortcuts -> {
selectedFragment = "ShortcutsFragment"
fragmentLoader(shortcutsFragment, false)
}

R.id.nav_settings -> {
Expand All @@ -297,9 +312,9 @@ class MainActivity : AppCompatActivity() {
fragmentLoader(fileManagerFragment, false)
}

R.id.nav_about_micewine -> {
selectedFragment = "AboutFragment"
fragmentLoader(aboutFragment, false)
R.id.nav_home -> {
selectedFragment = "HomeFragment"
fragmentLoader(homeFragment, false)
}
}

Expand Down Expand Up @@ -332,6 +347,10 @@ class MainActivity : AppCompatActivity() {
}
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
return true
}

override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)

Expand All @@ -341,6 +360,7 @@ class MainActivity : AppCompatActivity() {
)
} else {
setupDone = true
showHighlightSequence()
}
}

Expand All @@ -357,7 +377,7 @@ class MainActivity : AppCompatActivity() {
}

if (selectedFragment != "HomeFragment") {
bottomNavigation?.selectedItemId = R.id.nav_home
bottomNavigation?.selectedItemId = R.id.nav_shortcuts

return true
}
Expand All @@ -375,7 +395,7 @@ class MainActivity : AppCompatActivity() {
v: View?,
menuInfo: ContextMenu.ContextMenuInfo?
) {
if (selectedFragment == "HomeFragment") {
if (selectedFragment == "ShortcutsFragment") {
menuInflater.inflate(R.menu.game_list_context_menu, menu)
} else if (selectedFragment == "FileManagerFragment") {
menuInflater.inflate(R.menu.file_list_context_menu, menu)
Expand Down Expand Up @@ -653,7 +673,7 @@ class MainActivity : AppCompatActivity() {
val shell = ShellLink(exePath)
val drive = DriveUtils.parseWindowsPath(shell.resolveTarget())
if (drive != null) {
WineWrapper.wine("'${drive.getUnixPath()}'", "'${File(drive.getUnixPath()).parent!!}'")
WineWrapper.wine("'${WineWrapper.getSanatizedPath(drive.getUnixPath())}'", "'${WineWrapper.getSanatizedPath(File(drive.getUnixPath()).parent!!)}'")
}
}
catch (e: ShellLinkException) {
Expand All @@ -663,7 +683,7 @@ class MainActivity : AppCompatActivity() {
}
}
else {
WineWrapper.wine("'$exePath'", "'${File(exePath).parent!!}'")
WineWrapper.wine("'${WineWrapper.getSanatizedPath(exePath)}'", "'${File(WineWrapper.getSanatizedPath(exePath)).parent!!}'")
}
}

Expand Down Expand Up @@ -763,6 +783,11 @@ class MainActivity : AppCompatActivity() {

fileManagerCwd = fileManagerDefaultDir
setupDone = true
withContext(Dispatchers.Main) {
supportFragmentManager.beginTransaction().detach(homeFragment).commit()
supportFragmentManager.beginTransaction().attach(homeFragment).commit()
showHighlightSequence()
}
}
}

Expand Down Expand Up @@ -804,6 +829,76 @@ class MainActivity : AppCompatActivity() {
super.onNewIntent(intent)
}

private fun showHighlightSequence() {
currentState = HighlightState.fromOrdinal(preferences!!.getInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, 0))
if (currentState == HighlightState.HIGHLIGHT_DONE)
return
TapTargetSequence(this)
.targets(
TapTarget.forView(
findViewById(R.id.nav_shortcuts),
getString(R.string.highlight_nav_shortcuts)
),

TapTarget.forView(
findViewById(R.id.nav_settings),
getString(R.string.highlight_nav_settings)
),

TapTarget.forView(
findViewById(R.id.nav_file_manager),
getString(R.string.highlight_nav_files),
getString(R.string.highlight_nav_files_description)
)
)
.listener(object : TapTargetSequence.Listener {
override fun onSequenceFinish() {

}

override fun onSequenceStep(lastTarget: TapTarget, targetClicked: Boolean) {
if (targetClicked) {
when (currentState) {
HighlightState.HIGHLIGHT_SHORTCUTS -> {
selectedFragment = "ShortcutsFragment"
fragmentLoader(shortcutsFragment, false)

val editor = preferences!!.edit()
currentState = HighlightState.HIGHLIGHT_SETTINGS
editor.putInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, currentState!!.ordinal)
editor.apply()
}
HighlightState.HIGHLIGHT_SETTINGS -> {
selectedFragment = "SettingsFragment"
fragmentLoader(settingsFragment, false)

val editor = preferences!!.edit()
currentState = HighlightState.HIGHLIGHT_FILES
editor.putInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, currentState!!.ordinal)
editor.apply()
}
HighlightState.HIGHLIGHT_FILES -> {
selectedFragment = "FileManagerFragment"
fragmentLoader(fileManagerFragment, false)

val editor = preferences!!.edit()
currentState = HighlightState.HIGHLIGHT_DONE
editor.putInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, currentState!!.ordinal)
editor.apply()
}
else -> {
return
}
}
}
}

override fun onSequenceCanceled(lastTarget: TapTarget) {
}
})
.start()
}

companion object {
@SuppressLint("SdCardPath")
val appRootDir = File("/data/data/com.micewine.emu/files")
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/micewine/emu/adapters/AdapterFiles.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.micewine.emu.adapters

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.getkeepsafe.taptargetview.TapTarget
import com.getkeepsafe.taptargetview.TapTargetView
import com.micewine.emu.R
import com.micewine.emu.activities.MainActivity.Companion.ACTION_SELECT_FILE_MANAGER
import com.micewine.emu.activities.MainActivity.Companion.customRootFSPath
Expand Down
8 changes: 7 additions & 1 deletion app/src/main/java/com/micewine/emu/adapters/AdapterGame.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import com.micewine.emu.activities.MainActivity.Companion.ACTION_RUN_WINE
import com.micewine.emu.activities.MainActivity.Companion.selectedGameArray
import java.io.File

class AdapterGame(private val gameList: List<GameList>, private val activity: Activity) : RecyclerView.Adapter<AdapterGame.ViewHolder>() {
class AdapterGame(private val gameList: MutableList<GameList>, private val activity: Activity) : RecyclerView.Adapter<AdapterGame.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.adapter_game_item, parent, false)
return ViewHolder(itemView)
Expand Down Expand Up @@ -47,6 +47,12 @@ class AdapterGame(private val gameList: List<GameList>, private val activity: Ac
return gameList.size
}

fun updateList(newList: List<GameList>) {
gameList.clear()
gameList.addAll(newList)
notifyDataSetChanged()
}

private fun resizeBitmap(originalBitmap: Bitmap, width: Int, height: Int): Bitmap {
return Bitmap.createScaledBitmap(originalBitmap, width, height, false)
}
Expand Down
19 changes: 19 additions & 0 deletions app/src/main/java/com/micewine/emu/core/HighlightState.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.micewine.emu.core

sealed class HighlightState(val ordinal: Int) {
data object HIGHLIGHT_SHORTCUTS : HighlightState(0)
data object HIGHLIGHT_SETTINGS : HighlightState(1)
data object HIGHLIGHT_FILES : HighlightState(2)
data object HIGHLIGHT_DONE : HighlightState(3)


companion object {
const val HIGHLIGHT_PREFERENCE_KEY = "tutorial_state"
fun fromOrdinal(int: Int?): HighlightState = when (int) {
0 -> HIGHLIGHT_SHORTCUTS
1 -> HIGHLIGHT_SETTINGS
2 -> HIGHLIGHT_FILES
else -> HIGHLIGHT_DONE
}
}
}
6 changes: 5 additions & 1 deletion app/src/main/java/com/micewine/emu/core/WineWrapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,12 @@ object WineWrapper {
fun extractIcon(exeFile: File, output: String) {
if (exeFile.extension.lowercase() == "exe") {
runCommand(
getEnv() + "wrestool -x -t 14 '${exeFile.path}' > '$output'"
getEnv() + "wrestool -x -t 14 '${getSanatizedPath(exeFile.path)}' > '$output'"
)
}
}

fun getSanatizedPath(filePath: String) : String {
return filePath.replace("'", "'\\''")
}
}
53 changes: 0 additions & 53 deletions app/src/main/java/com/micewine/emu/fragments/AboutFragment.kt

This file was deleted.

Loading

0 comments on commit 05eacfb

Please sign in to comment.