Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
smite1921 committed Dec 1, 2023
1 parent 052527f commit f3fa3e2
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 11 deletions.
7 changes: 5 additions & 2 deletions enigma-machine-android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-parcelize'
id 'kotlinx-serialization'
}

android {
Expand All @@ -12,8 +13,8 @@ android {
applicationId "com.smitpatel.enigmamachine"
minSdk 21
targetSdk 33
versionCode 10
versionName "2.0"
versionCode 12
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

Expand Down Expand Up @@ -43,6 +44,8 @@ dependencies {

implementation 'io.github.ShawnLin013:number-picker:2.4.13'

implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0"

// Datastore
implementation("androidx.datastore:datastore-preferences:1.0.0")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ sealed class EnigmaEvent {
data class RotorStartPositionChanged(val rotorPosition: RotorPosition, val start: Int): EnigmaEvent()
data class SettingMenuClosed(val didSettingsChanged : Boolean) : EnigmaEvent()
data class PasteRawText(val rawText: String) : EnigmaEvent()
data class PasteEnigmaSettings(val rawText: String): EnigmaEvent()
object InputSpacePressed : EnigmaEvent()
object InputDeletePressed : EnigmaEvent()
object InputLongDeletePressed : EnigmaEvent()
object ToastMessageDisplayed : EnigmaEvent()
object CopyRawText : EnigmaEvent()
object CopyEncodedText : EnigmaEvent()
object CopySettings : EnigmaEvent()
object CopySettingsText : EnigmaEvent()
object CopySettingsJson : EnigmaEvent()
object ClosePasteError : EnigmaEvent()
object SaveState : EnigmaEvent()
object RestoreState : EnigmaEvent()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import com.smitpatel.enigmamachine.numberToLetter
import com.smitpatel.enigmamachine.ui.RotorPosition
import com.smitpatel.enigmamachine.ui.paste_error.PasteErrorFragment
import com.smitpatel.enigmamachine.viewmodels.EnigmaViewModel
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

class EnigmaMainActivity : AppCompatActivity() {

Expand Down Expand Up @@ -113,15 +115,30 @@ class EnigmaMainActivity : AppCompatActivity() {
)
}

if (it.showSettingsErrorToast) {
showToast(text = resources.getString(R.string.settings_not_changed_toast_message))
viewModel.handleEvent(
event = EnigmaEvent.ToastMessageDisplayed
)
}

if (it.clipboardCopyState != null) {
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
when (val settingsState = it.clipboardCopyState.settingsState) {
null -> {
val settingsState = it.clipboardCopyState.settingsState
val json = it.clipboardCopyState.json
when {
settingsState == null -> {
clipboardManager.setPrimaryClip(ClipData.newPlainText(
"",
it.clipboardCopyState.text,
))
}
json -> {
clipboardManager.setPrimaryClip(ClipData.newPlainText(
"",
Json.encodeToString(settingsState)
))
}
else -> {

fun getReflectorLabelText(reflector: Reflector) = when (reflector) {
Expand Down Expand Up @@ -316,8 +333,12 @@ class EnigmaMainActivity : AppCompatActivity() {
viewModel.handleEvent(EnigmaEvent.CopyEncodedText)
true
}
R.id.copy_enigma_settings -> {
viewModel.handleEvent(EnigmaEvent.CopySettings)
R.id.copy_enigma_settings_text -> {
viewModel.handleEvent(EnigmaEvent.CopySettingsText)
true
}
R.id.copy_enigma_settings_json -> {
viewModel.handleEvent(EnigmaEvent.CopySettingsJson)
true
}
R.id.paste_raw_text -> {
Expand All @@ -328,6 +349,14 @@ class EnigmaMainActivity : AppCompatActivity() {
}
true
}
R.id.paste_enigma_settings -> {
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
val clipboardText = clipboardManager.primaryClip?.getItemAt(0)?.text
if (!clipboardText.isNullOrEmpty()) {
viewModel.handleEvent(EnigmaEvent.PasteEnigmaSettings(rawText = clipboardText.toString()))
}
true
}
else -> super.onContextItemSelected(item)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.smitpatel.enigmamachine.ui.main

import com.smitpatel.enigmamachine.models.Reflector
import com.smitpatel.enigmamachine.models.Rotor
import kotlinx.serialization.Serializable

data class EnigmaUiState(
val rotorOnePosition: Int,
Expand All @@ -15,13 +16,17 @@ data class EnigmaUiState(
val encodedMessage: String,
val clipboardCopyState: ClipboardCopyState?,
val showSettingsChangedToast: Boolean,
val showSettingsErrorToast: Boolean,
val pasteError: String?,
)

data class ClipboardCopyState(
val text: String,
val settingsState: SettingsCopyState?,
val json: Boolean,
) {

@Serializable
data class SettingsCopyState(
val rotorOneLabel: Rotor.RotorOption,
val rotorTwoLabel: Rotor.RotorOption,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.smitpatel.enigmamachine.viewmodels

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
Expand All @@ -12,6 +13,9 @@ import com.smitpatel.enigmamachine.numberToLetter
import com.smitpatel.enigmamachine.ui.RotorPosition
import com.smitpatel.enigmamachine.ui.main.ClipboardCopyState
import com.smitpatel.enigmamachine.ui.main.EnigmaUiState
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import java.lang.Exception
import java.util.Stack

class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
Expand All @@ -31,6 +35,7 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
activeLampboard = -1,
clipboardCopyState = null,
showSettingsChangedToast = false,
showSettingsErrorToast = false,
pasteError = null,
)
)
Expand Down Expand Up @@ -90,6 +95,7 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
activeLampboard = -1,
clipboardCopyState = null,
showSettingsChangedToast = false,
showSettingsErrorToast = false,
pasteError = null,
)
}
Expand All @@ -116,6 +122,7 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
activeLampboard = -1,
clipboardCopyState = null,
showSettingsChangedToast = false,
showSettingsErrorToast = false,
pasteError = null,
)
}
Expand Down Expand Up @@ -160,6 +167,7 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
activeLampboard = -1,
clipboardCopyState = null,
showSettingsChangedToast = true,
showSettingsErrorToast = false,
pasteError = null,
)
}
Expand All @@ -169,6 +177,7 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
clipboardCopyState = ClipboardCopyState(
text = it.formatCopy(),
settingsState = null,
json = false
)
)
}
Expand All @@ -177,10 +186,11 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
clipboardCopyState = ClipboardCopyState(
text = it.formatCopy(),
settingsState = null,
json = false
)
)
}
is EnigmaEvent.CopySettings -> enigmaUiState.value?.encodedMessage?.let {
is EnigmaEvent.CopySettingsText -> enigmaUiState.value?.encodedMessage?.let {
enigmaUiState.value = enigmaUiState.value?.copy(
clipboardCopyState = ClipboardCopyState(
text = "",
Expand All @@ -197,6 +207,28 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
reflector = enigma.reflector,
plugboardPairs = enigma.plugboard.getAllPairs()
),
json = false
)
)
}
is EnigmaEvent.CopySettingsJson -> enigmaUiState.value?.encodedMessage?.let {
enigmaUiState.value = enigmaUiState.value?.copy(
clipboardCopyState = ClipboardCopyState(
text = "",
settingsState = ClipboardCopyState.SettingsCopyState(
rotorOneLabel = enigma.rotorOne.rotorOption,
rotorTwoLabel = enigma.rotorTwo.rotorOption,
rotorThreeLabel = enigma.rotorThree.rotorOption,
rotorOnePosition = enigma.rotorOne.position,
rotorTwoPosition = enigma.rotorTwo.position,
rotorThreePosition = enigma.rotorThree.position,
rotorOneRing = enigma.rotorOne.ring,
rotorTwoRing = enigma.rotorTwo.ring,
rotorThreeRing = enigma.rotorThree.ring,
reflector = enigma.reflector,
plugboardPairs = enigma.plugboard.getAllPairs()
),
json = true
)
)
}
Expand Down Expand Up @@ -236,8 +268,51 @@ class EnigmaViewModel(private val savedState: SavedStateHandle) : ViewModel() {
}

}
is EnigmaEvent.PasteEnigmaSettings -> {
try {
val enigmaSettings = Json
.decodeFromString<ClipboardCopyState.SettingsCopyState>(event.rawText)
enigma.applySettings(
settings = EnigmaHistoryItem(
rotorOneOption = enigmaSettings.rotorOneLabel,
rotorTwoOption = enigmaSettings.rotorTwoLabel,
rotorThreeOption = enigmaSettings.rotorThreeLabel,
rotorOnePosition = enigmaSettings.rotorOnePosition,
rotorTwoPosition = enigmaSettings.rotorTwoPosition,
rotorThreePosition = enigmaSettings.rotorThreePosition,
ringOneOption = enigmaSettings.rotorOneRing,
ringTwoOption = enigmaSettings.rotorTwoRing,
ringThreeOption = enigmaSettings.rotorThreeRing,
reflectorOption = enigmaSettings.reflector,
plugboardPairs = enigmaSettings.plugboardPairs
)
)
enigma.historyStack.clear()
enigmaUiState.value = EnigmaUiState(
rotorOnePosition = enigma.rotorOne.position,
rotorTwoPosition = enigma.rotorTwo.position,
rotorThreePosition = enigma.rotorThree.position,
rotorOneLabel = enigma.rotorOne.rotorOption,
rotorTwoLabel = enigma.rotorTwo.rotorOption,
rotorThreeLabel = enigma.rotorThree.rotorOption,
rawMessage = "",
encodedMessage = "",
activeLampboard = -1,
clipboardCopyState = null,
showSettingsChangedToast = true,
showSettingsErrorToast = false,
pasteError = null,
)

} catch (e: Exception) {
enigmaUiState.value = enigmaUiState.value?.copy(
showSettingsErrorToast = true,
)
}
}
is EnigmaEvent.ToastMessageDisplayed -> enigmaUiState.value = enigmaUiState.value?.copy(
showSettingsChangedToast = false,
showSettingsErrorToast = false,
clipboardCopyState = null,
)
is EnigmaEvent.SaveState -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,19 @@
android:title="@string/menu_copy_encoded_text"/>

<item
android:id="@+id/copy_enigma_settings"
android:title="@string/menu_copy_enigma_settings"/>
android:id="@+id/copy_enigma_settings_text"
android:title="@string/menu_copy_enigma_settings_text"/>

<item
android:id="@+id/copy_enigma_settings_json"
android:title="@string/menu_copy_enigma_settings_json"/>


<item
android:id="@+id/paste_raw_text"
android:title="@string/menu_paste_raw_text"/>

<item
android:id="@+id/paste_enigma_settings"
android:title="@string/menu_paste_enigma_settings"/>
</menu>
5 changes: 4 additions & 1 deletion enigma-machine-android/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,14 @@

<string name="settings_changed_toast_message">New settings applied</string>
<string name="text_copied_toast_message">Copied</string>
<string name="settings_not_changed_toast_message">Could not apply settings</string>

<string name="menu_copy_raw_text">Copy raw text</string>
<string name="menu_copy_encoded_text">Copy encoded text</string>
<string name="menu_copy_enigma_settings">Copy enigma settings</string>
<string name="menu_copy_enigma_settings_text">Copy enigma settings (Text)</string>
<string name="menu_copy_enigma_settings_json">Copy enigma settings (Json)</string>
<string name="menu_paste_raw_text">Paste raw text</string>
<string name="menu_paste_enigma_settings">Paste enigma settings (Json)</string>


<string name="copy_settings_text">
Expand Down
1 change: 1 addition & 0 deletions enigma-machine-android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
id 'org.jetbrains.kotlin.plugin.serialization' version '1.6.21'
}

task clean(type: Delete) {
Expand Down

0 comments on commit f3fa3e2

Please sign in to comment.