Skip to content

Commit 05eacfb

Browse files
Merge pull request #86 from nitanmarcel/about_redesign
Design improvements
2 parents e6405cb + e0391d5 commit 05eacfb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+953
-472
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ dependencies {
8787
implementation("androidx.activity:activity-ktx:1.9.3")
8888
implementation("com.google.code.gson:gson:2.10.1")
8989
implementation("com.github.vatbub:mslinks:1.0.6.2")
90+
implementation("com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0")
91+
implementation("com.getkeepsafe.taptargetview:taptargetview:1.15.0")
9092
implementation(project(":app:stub"))
9193
}
9294

app/src/main/java/com/micewine/emu/activities/MainActivity.kt

Lines changed: 111 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,22 @@ import android.graphics.drawable.Icon
1616
import android.os.Build
1717
import android.os.Bundle
1818
import android.os.storage.StorageManager
19+
import android.util.Log
1920
import android.view.ContextMenu
2021
import android.view.KeyEvent
22+
import android.view.Menu
2123
import android.view.MenuItem
2224
import android.view.View
2325
import android.widget.Toast
2426
import androidx.appcompat.app.AppCompatActivity
27+
import androidx.appcompat.widget.Toolbar
2528
import androidx.fragment.app.Fragment
2629
import androidx.lifecycle.lifecycleScope
2730
import androidx.preference.PreferenceManager
31+
import com.getkeepsafe.taptargetview.TapTarget
32+
import com.getkeepsafe.taptargetview.TapTargetSequence
33+
import com.getkeepsafe.taptargetview.TapTargetView
34+
import com.google.android.material.appbar.MaterialToolbar
2835
import com.google.android.material.bottomnavigation.BottomNavigationView
2936
import com.micewine.emu.BuildConfig
3037
import com.micewine.emu.R
@@ -109,22 +116,23 @@ import com.micewine.emu.activities.GeneralSettings.Companion.WINE_LOG_LEVEL
109116
import com.micewine.emu.activities.GeneralSettings.Companion.WINE_LOG_LEVEL_DEFAULT_VALUE
110117
import com.micewine.emu.core.EnvVars
111118
import com.micewine.emu.core.EnvVars.getEnv
119+
import com.micewine.emu.core.HighlightState
112120
import com.micewine.emu.core.RatPackageManager
113121
import com.micewine.emu.core.RatPackageManager.installRat
114122
import com.micewine.emu.core.ShellLoader.runCommand
115123
import com.micewine.emu.core.ShellLoader.runCommandWithOutput
116124
import com.micewine.emu.core.WineWrapper
117125
import com.micewine.emu.databinding.ActivityMainBinding
118-
import com.micewine.emu.fragments.AboutFragment
126+
import com.micewine.emu.fragments.HomeFragment
119127
import com.micewine.emu.fragments.AskInstallRatPackageFragment
120128
import com.micewine.emu.fragments.AskInstallRatPackageFragment.Companion.ratCandidate
121129
import com.micewine.emu.fragments.DeleteGameItemFragment
122130
import com.micewine.emu.fragments.FileManagerFragment
123131
import com.micewine.emu.fragments.FileManagerFragment.Companion.refreshFiles
124132
import com.micewine.emu.fragments.FloatingFileManagerFragment
125-
import com.micewine.emu.fragments.HomeFragment
126-
import com.micewine.emu.fragments.HomeFragment.Companion.saveToGameList
127-
import com.micewine.emu.fragments.HomeFragment.Companion.setIconToGame
133+
import com.micewine.emu.fragments.ShortcutsFragment
134+
import com.micewine.emu.fragments.ShortcutsFragment.Companion.saveToGameList
135+
import com.micewine.emu.fragments.ShortcutsFragment.Companion.setIconToGame
128136
import com.micewine.emu.fragments.RenameGameItemFragment
129137
import com.micewine.emu.fragments.RenameGameItemFragment.Companion.initialTextRenameGameFragment
130138
import com.micewine.emu.fragments.SettingsFragment
@@ -258,14 +266,17 @@ class MainActivity : AppCompatActivity() {
258266
}
259267
}
260268

269+
private var appToolbar: MaterialToolbar? = null
261270
private var bottomNavigation: BottomNavigationView? = null
262271
private var runningXServer = false
263-
private val homeFragment: HomeFragment = HomeFragment()
272+
private val shortcutsFragment: ShortcutsFragment = ShortcutsFragment()
264273
private val settingsFragment: SettingsFragment = SettingsFragment()
265274
private val fileManagerFragment: FileManagerFragment = FileManagerFragment()
266-
private val aboutFragment: AboutFragment = AboutFragment()
275+
private val homeFragment: HomeFragment = HomeFragment()
267276
private var preferences: SharedPreferences? = null
268277

278+
private var currentState: HighlightState? = null
279+
269280
@SuppressLint("UnspecifiedRegisterReceiverFlag")
270281
override fun onCreate(savedInstanceState: Bundle?) {
271282
super.onCreate(savedInstanceState)
@@ -279,12 +290,16 @@ class MainActivity : AppCompatActivity() {
279290

280291
preferences = PreferenceManager.getDefaultSharedPreferences(this)
281292

293+
appToolbar = findViewById(R.id.appToolbar)
294+
setSupportActionBar(appToolbar)
295+
296+
282297
bottomNavigation = findViewById(R.id.bottom_navigation)
283298
bottomNavigation?.setOnItemSelectedListener { item: MenuItem ->
284299
when (item.itemId) {
285-
R.id.nav_home -> {
286-
selectedFragment = "HomeFragment"
287-
fragmentLoader(homeFragment, false)
300+
R.id.nav_shortcuts -> {
301+
selectedFragment = "ShortcutsFragment"
302+
fragmentLoader(shortcutsFragment, false)
288303
}
289304

290305
R.id.nav_settings -> {
@@ -297,9 +312,9 @@ class MainActivity : AppCompatActivity() {
297312
fragmentLoader(fileManagerFragment, false)
298313
}
299314

300-
R.id.nav_about_micewine -> {
301-
selectedFragment = "AboutFragment"
302-
fragmentLoader(aboutFragment, false)
315+
R.id.nav_home -> {
316+
selectedFragment = "HomeFragment"
317+
fragmentLoader(homeFragment, false)
303318
}
304319
}
305320

@@ -332,6 +347,10 @@ class MainActivity : AppCompatActivity() {
332347
}
333348
}
334349

350+
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
351+
return true
352+
}
353+
335354
override fun onPostCreate(savedInstanceState: Bundle?) {
336355
super.onPostCreate(savedInstanceState)
337356

@@ -341,6 +360,7 @@ class MainActivity : AppCompatActivity() {
341360
)
342361
} else {
343362
setupDone = true
363+
showHighlightSequence()
344364
}
345365
}
346366

@@ -357,7 +377,7 @@ class MainActivity : AppCompatActivity() {
357377
}
358378

359379
if (selectedFragment != "HomeFragment") {
360-
bottomNavigation?.selectedItemId = R.id.nav_home
380+
bottomNavigation?.selectedItemId = R.id.nav_shortcuts
361381

362382
return true
363383
}
@@ -375,7 +395,7 @@ class MainActivity : AppCompatActivity() {
375395
v: View?,
376396
menuInfo: ContextMenu.ContextMenuInfo?
377397
) {
378-
if (selectedFragment == "HomeFragment") {
398+
if (selectedFragment == "ShortcutsFragment") {
379399
menuInflater.inflate(R.menu.game_list_context_menu, menu)
380400
} else if (selectedFragment == "FileManagerFragment") {
381401
menuInflater.inflate(R.menu.file_list_context_menu, menu)
@@ -653,7 +673,7 @@ class MainActivity : AppCompatActivity() {
653673
val shell = ShellLink(exePath)
654674
val drive = DriveUtils.parseWindowsPath(shell.resolveTarget())
655675
if (drive != null) {
656-
WineWrapper.wine("'${drive.getUnixPath()}'", "'${File(drive.getUnixPath()).parent!!}'")
676+
WineWrapper.wine("'${WineWrapper.getSanatizedPath(drive.getUnixPath())}'", "'${WineWrapper.getSanatizedPath(File(drive.getUnixPath()).parent!!)}'")
657677
}
658678
}
659679
catch (e: ShellLinkException) {
@@ -663,7 +683,7 @@ class MainActivity : AppCompatActivity() {
663683
}
664684
}
665685
else {
666-
WineWrapper.wine("'$exePath'", "'${File(exePath).parent!!}'")
686+
WineWrapper.wine("'${WineWrapper.getSanatizedPath(exePath)}'", "'${File(WineWrapper.getSanatizedPath(exePath)).parent!!}'")
667687
}
668688
}
669689

@@ -763,6 +783,11 @@ class MainActivity : AppCompatActivity() {
763783

764784
fileManagerCwd = fileManagerDefaultDir
765785
setupDone = true
786+
withContext(Dispatchers.Main) {
787+
supportFragmentManager.beginTransaction().detach(homeFragment).commit()
788+
supportFragmentManager.beginTransaction().attach(homeFragment).commit()
789+
showHighlightSequence()
790+
}
766791
}
767792
}
768793

@@ -804,6 +829,76 @@ class MainActivity : AppCompatActivity() {
804829
super.onNewIntent(intent)
805830
}
806831

832+
private fun showHighlightSequence() {
833+
currentState = HighlightState.fromOrdinal(preferences!!.getInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, 0))
834+
if (currentState == HighlightState.HIGHLIGHT_DONE)
835+
return
836+
TapTargetSequence(this)
837+
.targets(
838+
TapTarget.forView(
839+
findViewById(R.id.nav_shortcuts),
840+
getString(R.string.highlight_nav_shortcuts)
841+
),
842+
843+
TapTarget.forView(
844+
findViewById(R.id.nav_settings),
845+
getString(R.string.highlight_nav_settings)
846+
),
847+
848+
TapTarget.forView(
849+
findViewById(R.id.nav_file_manager),
850+
getString(R.string.highlight_nav_files),
851+
getString(R.string.highlight_nav_files_description)
852+
)
853+
)
854+
.listener(object : TapTargetSequence.Listener {
855+
override fun onSequenceFinish() {
856+
857+
}
858+
859+
override fun onSequenceStep(lastTarget: TapTarget, targetClicked: Boolean) {
860+
if (targetClicked) {
861+
when (currentState) {
862+
HighlightState.HIGHLIGHT_SHORTCUTS -> {
863+
selectedFragment = "ShortcutsFragment"
864+
fragmentLoader(shortcutsFragment, false)
865+
866+
val editor = preferences!!.edit()
867+
currentState = HighlightState.HIGHLIGHT_SETTINGS
868+
editor.putInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, currentState!!.ordinal)
869+
editor.apply()
870+
}
871+
HighlightState.HIGHLIGHT_SETTINGS -> {
872+
selectedFragment = "SettingsFragment"
873+
fragmentLoader(settingsFragment, false)
874+
875+
val editor = preferences!!.edit()
876+
currentState = HighlightState.HIGHLIGHT_FILES
877+
editor.putInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, currentState!!.ordinal)
878+
editor.apply()
879+
}
880+
HighlightState.HIGHLIGHT_FILES -> {
881+
selectedFragment = "FileManagerFragment"
882+
fragmentLoader(fileManagerFragment, false)
883+
884+
val editor = preferences!!.edit()
885+
currentState = HighlightState.HIGHLIGHT_DONE
886+
editor.putInt(HighlightState.HIGHLIGHT_PREFERENCE_KEY, currentState!!.ordinal)
887+
editor.apply()
888+
}
889+
else -> {
890+
return
891+
}
892+
}
893+
}
894+
}
895+
896+
override fun onSequenceCanceled(lastTarget: TapTarget) {
897+
}
898+
})
899+
.start()
900+
}
901+
807902
companion object {
808903
@SuppressLint("SdCardPath")
809904
val appRootDir = File("/data/data/com.micewine.emu/files")

app/src/main/java/com/micewine/emu/adapters/AdapterFiles.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package com.micewine.emu.adapters
22

33
import android.annotation.SuppressLint
4+
import android.app.Activity
45
import android.content.Context
56
import android.content.Intent
67
import android.graphics.BitmapFactory
8+
import android.util.Log
79
import android.view.LayoutInflater
810
import android.view.View
911
import android.view.ViewGroup
1012
import android.widget.ImageView
1113
import android.widget.TextView
1214
import androidx.recyclerview.widget.RecyclerView
15+
import com.getkeepsafe.taptargetview.TapTarget
16+
import com.getkeepsafe.taptargetview.TapTargetView
1317
import com.micewine.emu.R
1418
import com.micewine.emu.activities.MainActivity.Companion.ACTION_SELECT_FILE_MANAGER
1519
import com.micewine.emu.activities.MainActivity.Companion.customRootFSPath

app/src/main/java/com/micewine/emu/adapters/AdapterGame.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import com.micewine.emu.activities.MainActivity.Companion.ACTION_RUN_WINE
1616
import com.micewine.emu.activities.MainActivity.Companion.selectedGameArray
1717
import java.io.File
1818

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

50+
fun updateList(newList: List<GameList>) {
51+
gameList.clear()
52+
gameList.addAll(newList)
53+
notifyDataSetChanged()
54+
}
55+
5056
private fun resizeBitmap(originalBitmap: Bitmap, width: Int, height: Int): Bitmap {
5157
return Bitmap.createScaledBitmap(originalBitmap, width, height, false)
5258
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.micewine.emu.core
2+
3+
sealed class HighlightState(val ordinal: Int) {
4+
data object HIGHLIGHT_SHORTCUTS : HighlightState(0)
5+
data object HIGHLIGHT_SETTINGS : HighlightState(1)
6+
data object HIGHLIGHT_FILES : HighlightState(2)
7+
data object HIGHLIGHT_DONE : HighlightState(3)
8+
9+
10+
companion object {
11+
const val HIGHLIGHT_PREFERENCE_KEY = "tutorial_state"
12+
fun fromOrdinal(int: Int?): HighlightState = when (int) {
13+
0 -> HIGHLIGHT_SHORTCUTS
14+
1 -> HIGHLIGHT_SETTINGS
15+
2 -> HIGHLIGHT_FILES
16+
else -> HIGHLIGHT_DONE
17+
}
18+
}
19+
}

app/src/main/java/com/micewine/emu/core/WineWrapper.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,12 @@ object WineWrapper {
9292
fun extractIcon(exeFile: File, output: String) {
9393
if (exeFile.extension.lowercase() == "exe") {
9494
runCommand(
95-
getEnv() + "wrestool -x -t 14 '${exeFile.path}' > '$output'"
95+
getEnv() + "wrestool -x -t 14 '${getSanatizedPath(exeFile.path)}' > '$output'"
9696
)
9797
}
9898
}
99+
100+
fun getSanatizedPath(filePath: String) : String {
101+
return filePath.replace("'", "'\\''")
102+
}
99103
}

app/src/main/java/com/micewine/emu/fragments/AboutFragment.kt

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)