Password list get's loaded in the background
- User has to repeat his passphrase - Passwords can now be toggled - Error message on wrong passphrase on decryption
@@ -12,7 +12,8 @@
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme">
|
||||
<activity android:name=".ViewActivity"></activity>
|
||||
<activity android:name=".GeneratorActivity"></activity>
|
||||
<activity android:name=".ViewActivity" />
|
||||
<activity android:name=".PassphraseActivity" />
|
||||
<activity
|
||||
android:name=".CreateActivity"
|
||||
|
||||
@@ -10,6 +10,8 @@ import android.os.Bundle
|
||||
import android.print.PrintAttributes
|
||||
import android.print.PrintJob
|
||||
import android.print.PrintManager
|
||||
import android.text.method.HideReturnsTransformationMethod
|
||||
import android.text.method.PasswordTransformationMethod
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
import android.view.ContextThemeWrapper
|
||||
@@ -27,11 +29,12 @@ import com.google.zxing.integration.android.IntentResult
|
||||
import com.journeyapps.barcodescanner.BarcodeEncoder
|
||||
import dev.turingcomplete.kotlinonetimepassword.GoogleAuthenticator
|
||||
import kotlinx.android.synthetic.main.activity_create.*
|
||||
import kotlinx.android.synthetic.main.dialogpassphrase.*
|
||||
import kotlinx.android.synthetic.main.dialogpassphrase.view.*
|
||||
import kotlinx.coroutines.*
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.lang.IllegalArgumentException
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
class CreateActivity : AppCompatActivity() {
|
||||
private var schema: QRSchema? = null
|
||||
@@ -43,6 +46,8 @@ class CreateActivity : AppCompatActivity() {
|
||||
|
||||
private var fa_uri: Uri? = null
|
||||
|
||||
private var known_passwords = ArrayList<String>()
|
||||
|
||||
/**
|
||||
* Gets triggered when the user clicks on printing button (top left) and renders the paper to
|
||||
* print.
|
||||
@@ -130,17 +135,7 @@ class CreateActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
fun passwordKnown(password: String): Boolean {
|
||||
val known_passwords = String(this.resources.openRawResource(
|
||||
this.resources.getIdentifier("passwordlist", "raw", this.packageName)
|
||||
).readBytes())
|
||||
|
||||
val known_passwords_array = runBlocking {
|
||||
known_passwords.split("\n")
|
||||
}
|
||||
|
||||
Log.i("Create Activity", "Size of passwords: ${known_passwords_array.size}")
|
||||
|
||||
return known_passwords_array.contains(password)
|
||||
return this.known_passwords.contains(password)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@@ -158,6 +153,15 @@ class CreateActivity : AppCompatActivity() {
|
||||
|
||||
setSupportActionBar(findViewById(R.id.toolbar))
|
||||
|
||||
// Split word list in the background (this process can take a few seconds to complete)
|
||||
GlobalScope.async {
|
||||
val known_passwords_ = String(resources.openRawResource(
|
||||
resources.getIdentifier("passwordlist", "raw", packageName)
|
||||
).readBytes())
|
||||
|
||||
known_passwords = known_passwords_.split("\n") as ArrayList<String>
|
||||
}
|
||||
|
||||
setContentView(R.layout.activity_create)
|
||||
back.setOnClickListener {
|
||||
Log.i("CREATE", "Back got clicked!")
|
||||
@@ -186,6 +190,12 @@ class CreateActivity : AppCompatActivity() {
|
||||
showError("Weak passphrase", "Passphrase has to be at least 8 characters long.")
|
||||
return@OnClickListener
|
||||
}
|
||||
if (passphrase != editTextLayout.passphrase2_input.text.toString()) {
|
||||
// Make a new alert, telling the user that his passphrase doesn't match the repeat field.
|
||||
dialogInterface.cancel()
|
||||
showError("Passphrase mismatch", "Both passphrases do not match.")
|
||||
return@OnClickListener
|
||||
}
|
||||
|
||||
// Check if password is found in our offline password list
|
||||
if(passwordKnown(passphrase)) {
|
||||
@@ -207,6 +217,16 @@ class CreateActivity : AppCompatActivity() {
|
||||
|
||||
|
||||
}
|
||||
password_hide.setOnClickListener {
|
||||
if (password_input.transformationMethod == HideReturnsTransformationMethod.getInstance()) {
|
||||
password_input.transformationMethod = PasswordTransformationMethod.getInstance()
|
||||
password_hide.setImageResource(R.drawable.ic_visibility_on)
|
||||
} else {
|
||||
password_input.transformationMethod = HideReturnsTransformationMethod.getInstance()
|
||||
password_hide.setImageResource(R.drawable.ic_visibility_off)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fa_input.isFocusable = false
|
||||
|
||||
@@ -242,6 +262,12 @@ class CreateActivity : AppCompatActivity() {
|
||||
if (result.contents.startsWith("otpauth://totp/")) {
|
||||
fa_progress.visibility = View.VISIBLE
|
||||
fa_uri = Uri.parse(result.contents)
|
||||
|
||||
if (fa_uri?.getQueryParameter("secret").toString() == "" || fa_uri?.getQueryParameter("secret") == null) {
|
||||
showError("Corrupt 2FA", "The scanned 2FA secret doesn't contain a secret!")
|
||||
return
|
||||
}
|
||||
|
||||
val fa_generator = GoogleAuthenticator(base32secret = fa_uri?.getQueryParameter("secret").toString())
|
||||
this.schema!!.custom.put("2fa", fa_uri?.getQueryParameter("secret").toString())
|
||||
|
||||
@@ -253,7 +279,12 @@ class CreateActivity : AppCompatActivity() {
|
||||
// TODO: There is a bug. When the user changes his current app, this coroutine stops.
|
||||
fa_coroutine = GlobalScope.launch(Dispatchers.Main) {
|
||||
while (true) {
|
||||
try {
|
||||
fa_input.setText(fa_generator.generate())
|
||||
} catch (error: IllegalArgumentException) {
|
||||
showError("Corrupt 2FA", "The scanned 2FA secret is corrupt and therefore no codes can be generated.")
|
||||
return@launch
|
||||
}
|
||||
|
||||
var seconds_remaining = CryptoOperations().getRemainingTOTPTime()
|
||||
Log.i("2FA Generator", "Remaining: $seconds_remaining")
|
||||
@@ -275,6 +306,8 @@ class CreateActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
fa_label.text = "${fa_uri?.path?.replace("/", "")} (${fa_uri?.getQueryParameter("issuer")})"
|
||||
} else {
|
||||
showError("No 2FA", "The scanned QR-Code has the wrong format.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.github.mondei1.offpass
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import android.os.Bundle
|
||||
|
||||
class GeneratorActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_generator)
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,12 @@ import android.content.Intent
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import android.os.Bundle
|
||||
import android.text.Editable
|
||||
import android.view.View
|
||||
import kotlinx.android.synthetic.main.activity_passphrase.*
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import javax.crypto.BadPaddingException
|
||||
import kotlin.reflect.typeOf
|
||||
|
||||
class PassphraseActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@@ -22,9 +25,20 @@ class PassphraseActivity : AppCompatActivity() {
|
||||
|
||||
decrypt_button.setOnClickListener {
|
||||
decrypt_button.text = "Decrypting ..."
|
||||
var _continue = true;
|
||||
|
||||
runBlocking {
|
||||
try {
|
||||
qrSchema.decrypt(raw, passphrase_input.text.toString())
|
||||
} catch (err: BadPaddingException) {
|
||||
failed.visibility = View.VISIBLE
|
||||
decrypt_button.text = "Decrypt"
|
||||
_continue = false
|
||||
return@runBlocking
|
||||
}
|
||||
}
|
||||
|
||||
if(!_continue) return@setOnClickListener
|
||||
|
||||
val intent: Intent = Intent(this, ViewActivity::class.java)
|
||||
intent.putExtra("decrypted_raw",qrSchema.decrypted_raw)
|
||||
|
||||
@@ -8,21 +8,33 @@ import android.content.res.ColorStateList
|
||||
import android.graphics.Color
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.text.method.HideReturnsTransformationMethod
|
||||
import android.text.method.PasswordTransformationMethod
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import dev.turingcomplete.kotlinonetimepassword.GoogleAuthenticator
|
||||
import kotlinx.android.synthetic.main.activity_create.*
|
||||
import kotlinx.android.synthetic.main.activity_view.*
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.android.synthetic.main.activity_view.back
|
||||
import kotlinx.android.synthetic.main.activity_view.email_input
|
||||
import kotlinx.android.synthetic.main.activity_view.fa_input
|
||||
import kotlinx.android.synthetic.main.activity_view.fa_label
|
||||
import kotlinx.android.synthetic.main.activity_view.fa_progress
|
||||
import kotlinx.android.synthetic.main.activity_view.password_hide
|
||||
import kotlinx.android.synthetic.main.activity_view.password_input
|
||||
import kotlinx.android.synthetic.main.activity_view.title_label
|
||||
import kotlinx.android.synthetic.main.activity_view.url_input
|
||||
import kotlinx.android.synthetic.main.activity_view.username_input
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
|
||||
class ViewActivity : AppCompatActivity() {
|
||||
|
||||
var fa_coroutine: Job? = null
|
||||
|
||||
override fun onBackPressed() {
|
||||
val i = Intent(this, MainActivity::class.java)
|
||||
i.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||
@@ -46,13 +58,25 @@ class ViewActivity : AppCompatActivity() {
|
||||
i.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||
startActivity(i)
|
||||
}
|
||||
password_hide.setOnClickListener {
|
||||
if (password_input.transformationMethod == HideReturnsTransformationMethod.getInstance()) {
|
||||
password_input.transformationMethod = PasswordTransformationMethod.getInstance()
|
||||
password_input.text = "123456"
|
||||
password_hide.setImageResource(R.drawable.ic_visibility_on)
|
||||
} else {
|
||||
password_input.transformationMethod = HideReturnsTransformationMethod.getInstance()
|
||||
password_input.text = qrSchema.password
|
||||
password_hide.setImageResource(R.drawable.ic_visibility_off)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
qrSchema.decrypted_raw = intent.getStringExtra("decrypted_raw")!!
|
||||
qrSchema.parse(this)
|
||||
|
||||
title_label.text = qrSchema.title
|
||||
username_input.setText(qrSchema.username, TextView.BufferType.EDITABLE)
|
||||
password_input.setText(qrSchema.password, TextView.BufferType.EDITABLE)
|
||||
password_input.setText("123456", TextView.BufferType.EDITABLE)
|
||||
email_input.setText(qrSchema.email, TextView.BufferType.EDITABLE)
|
||||
url_input.setText(qrSchema.website_url, TextView.BufferType.EDITABLE)
|
||||
|
||||
@@ -62,7 +86,7 @@ class ViewActivity : AppCompatActivity() {
|
||||
fa_label.text = "${fa_uri.path?.replace("/", "")} (${fa_uri.getQueryParameter("issuer")})"
|
||||
fa_progress.visibility = View.VISIBLE
|
||||
|
||||
GlobalScope.launch(Dispatchers.Main) {
|
||||
fa_coroutine = GlobalScope.launch(Dispatchers.Main) {
|
||||
while (true) {
|
||||
fa_input.setText(fa_generator.generate())
|
||||
|
||||
@@ -88,4 +112,9 @@ class ViewActivity : AppCompatActivity() {
|
||||
fa_layout.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
fa_coroutine?.cancel(CancellationException("Activity is stopping"))
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 152 B |
|
Before Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 364 B |
|
Before Width: | Height: | Size: 460 B |
|
Before Width: | Height: | Size: 788 B |
|
Before Width: | Height: | Size: 234 B |
|
Before Width: | Height: | Size: 248 B |
|
Before Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 407 B |
|
Before Width: | Height: | Size: 387 B |
|
Before Width: | Height: | Size: 482 B |
BIN
app/src/main/res/drawable-hdpi/ic_autorenew.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
app/src/main/res/drawable-hdpi/ic_visibility_off.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
app/src/main/res/drawable-hdpi/ic_visibility_on.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 123 B |
|
Before Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 264 B |
|
Before Width: | Height: | Size: 345 B |
|
Before Width: | Height: | Size: 554 B |
|
Before Width: | Height: | Size: 163 B |
|
Before Width: | Height: | Size: 197 B |
|
Before Width: | Height: | Size: 248 B |
|
Before Width: | Height: | Size: 290 B |
|
Before Width: | Height: | Size: 255 B |
|
Before Width: | Height: | Size: 340 B |
BIN
app/src/main/res/drawable-mdpi/ic_autorenew.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
app/src/main/res/drawable-mdpi/ic_visibility_off.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
app/src/main/res/drawable-mdpi/ic_visibility_on.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 159 B |
|
Before Width: | Height: | Size: 162 B |
|
Before Width: | Height: | Size: 240 B |
|
Before Width: | Height: | Size: 460 B |
|
Before Width: | Height: | Size: 554 B |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 248 B |
|
Before Width: | Height: | Size: 290 B |
|
Before Width: | Height: | Size: 407 B |
|
Before Width: | Height: | Size: 469 B |
|
Before Width: | Height: | Size: 482 B |
|
Before Width: | Height: | Size: 591 B |
BIN
app/src/main/res/drawable-xhdpi/ic_autorenew.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
app/src/main/res/drawable-xhdpi/ic_visibility_off.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
app/src/main/res/drawable-xhdpi/ic_visibility_on.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 193 B |
|
Before Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 276 B |
|
Before Width: | Height: | Size: 627 B |
|
Before Width: | Height: | Size: 788 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 407 B |
|
Before Width: | Height: | Size: 507 B |
|
Before Width: | Height: | Size: 602 B |
|
Before Width: | Height: | Size: 662 B |
|
Before Width: | Height: | Size: 819 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_autorenew.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
app/src/main/res/drawable-xxhdpi/ic_visibility_off.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
app/src/main/res/drawable-xxhdpi/ic_visibility_on.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 240 B |
|
Before Width: | Height: | Size: 370 B |
|
Before Width: | Height: | Size: 788 B |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 407 B |
|
Before Width: | Height: | Size: 469 B |
|
Before Width: | Height: | Size: 602 B |
|
Before Width: | Height: | Size: 776 B |
|
Before Width: | Height: | Size: 819 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/ic_autorenew.png
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/ic_visibility_off.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/ic_visibility_on.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
@@ -1,10 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z"/>
|
||||
</vector>
|
||||
@@ -1,10 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M10.59,9.17L5.41,4 4,5.41l5.17,5.17 1.42,-1.41zM14.5,4l2.04,2.04L4,18.59 5.41,20 17.96,7.46 20,9.5L20,4h-5.5zM14.83,13.41l-1.41,1.41 3.13,3.13L14.5,20L20,20v-5.5l-2.04,2.04 -3.13,-3.13z"/>
|
||||
</vector>
|
||||
@@ -1,10 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="@color/colorPrimaryDark">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z"/>
|
||||
</vector>
|
||||
|
Before Width: | Height: | Size: 8.5 KiB |
@@ -131,13 +131,13 @@
|
||||
|
||||
<EditText
|
||||
android:id="@+id/password_input"
|
||||
android:layout_width="288dp"
|
||||
android:layout_height="68dp"
|
||||
android:layout_width="263dp"
|
||||
android:layout_height="67dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:background="@color/colorPrimary"
|
||||
android:ems="10"
|
||||
android:fontFamily="sans-serif-black"
|
||||
android:hint="You shouldn't see that"
|
||||
android:hint="Secure password"
|
||||
android:inputType="textPassword"
|
||||
android:singleLine="true"
|
||||
android:textSize="28sp"
|
||||
@@ -235,19 +235,21 @@
|
||||
app:layout_constraintStart_toEndOf="@+id/password_input"
|
||||
app:layout_constraintTop_toTopOf="@+id/password_input"
|
||||
app:layout_constraintVertical_bias="0.48000002"
|
||||
app:srcCompat="@drawable/baseline_visibility_black_36" />
|
||||
app:srcCompat="@drawable/ic_visibility_on" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/password_random"
|
||||
android:layout_width="31dp"
|
||||
android:layout_height="38dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="15dp"
|
||||
android:background="@color/colorPrimary"
|
||||
android:tint="#000000"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/password_input"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@+id/password_hide"
|
||||
app:layout_constraintTop_toTopOf="@+id/password_input"
|
||||
app:srcCompat="@drawable/baseline_sd_storage_24" />
|
||||
app:srcCompat="@drawable/ic_autorenew" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</ScrollView>
|
||||
|
||||
|
||||
9
app/src/main/res/layout/activity_generator.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".GeneratorActivity">
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -9,8 +9,8 @@
|
||||
|
||||
<EditText
|
||||
android:id="@+id/passphrase_input"
|
||||
android:layout_width="234dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="286dp"
|
||||
android:layout_height="61dp"
|
||||
android:layout_marginStart="88dp"
|
||||
android:layout_marginEnd="89dp"
|
||||
android:backgroundTint="#757575"
|
||||
@@ -27,8 +27,7 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_bias="0.513" />
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/decrypt_button"
|
||||
@@ -36,7 +35,7 @@
|
||||
android:layout_width="152dp"
|
||||
android:layout_height="59dp"
|
||||
android:layout_marginStart="161dp"
|
||||
android:layout_marginTop="72dp"
|
||||
android:layout_marginTop="48dp"
|
||||
android:layout_marginEnd="162dp"
|
||||
android:background="#00FFFFFF"
|
||||
android:backgroundTint="#001C1C1C"
|
||||
@@ -45,6 +44,7 @@
|
||||
android:textColor="@color/colorPrimary"
|
||||
android:textSize="18sp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.484"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/passphrase_input" />
|
||||
|
||||
@@ -62,4 +62,20 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/failed"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="180dp"
|
||||
android:layout_marginEnd="180dp"
|
||||
android:layout_marginBottom="40dp"
|
||||
android:fontFamily="sans-serif-black"
|
||||
android:text="Wrong Passphrase"
|
||||
android:textColor="#E53935"
|
||||
android:textSize="18sp"
|
||||
android:visibility="invisible"
|
||||
app:layout_constraintBottom_toTopOf="@+id/passphrase_input"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -100,11 +100,12 @@
|
||||
android:layout_height="68dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:background="@color/colorPrimary"
|
||||
android:ems="10"
|
||||
android:fontFamily="sans-serif-black"
|
||||
android:gravity="center_vertical"
|
||||
android:inputType="textPassword"
|
||||
android:singleLine="true"
|
||||
android:textSize="28sp"
|
||||
android:textColor="@color/colorPrimaryDark"
|
||||
android:textSize="42sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/password_label" />
|
||||
|
||||
@@ -162,13 +163,13 @@
|
||||
android:id="@+id/password_hide"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="60dp"
|
||||
android:layout_marginStart="28dp"
|
||||
android:background="@color/colorPrimary"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/password_input"
|
||||
app:layout_constraintStart_toEndOf="@+id/password_input"
|
||||
app:layout_constraintTop_toTopOf="@+id/password_input"
|
||||
app:layout_constraintVertical_bias="0.437"
|
||||
app:srcCompat="@drawable/baseline_visibility_black_36" />
|
||||
app:layout_constraintVertical_bias="0.45"
|
||||
app:srcCompat="@drawable/ic_visibility_on" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</ScrollView>
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:background="@color/colorPrimaryDark"
|
||||
app:title="Create">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<Button
|
||||
android:id="@+id/back"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="47dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:drawableTop="@drawable/baseline_arrow_forward_white_36"
|
||||
android:text=""
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/settings"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_marginEnd="52dp"
|
||||
android:drawableTop="@drawable/baseline_settings_white_36"
|
||||
android:scaleX="1"
|
||||
android:scaleY="1"
|
||||
android:text=""
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/settings2"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_marginEnd="108dp"
|
||||
android:drawableTop="@drawable/baseline_sd_storage_24"
|
||||
android:scaleX="1"
|
||||
android:scaleY="1"
|
||||
android:text=""
|
||||
android:textColor="#000000"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/print_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="Create"
|
||||
android:textColor="@color/colorPrimary"
|
||||
android:textSize="24sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.appcompat.widget.Toolbar>
|
||||
@@ -11,11 +11,22 @@
|
||||
android:id="@+id/passphrase_input"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"
|
||||
android:backgroundTint="@color/colorPrimary"
|
||||
android:textColorHint="@color/colorPrimary"
|
||||
android:textColor="@color/colorPrimary"
|
||||
android:hint="Enter passphrase"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/passphrase2_input"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"
|
||||
android:backgroundTint="@color/colorPrimary"
|
||||
android:textColorHint="@color/colorPrimary"
|
||||
android:textColor="@color/colorPrimary"
|
||||
android:hint="Repeat passphrase"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/hint_input"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -1,3 +1 @@
|
||||
<resources>
|
||||
<string name="hello_world">Hello Round World!</string>
|
||||
</resources>
|
||||
<resources></resources>
|
||||
@@ -4,12 +4,10 @@
|
||||
Because the window insets on round devices are larger than 15dp, this padding only applies
|
||||
to square screens.
|
||||
-->
|
||||
<dimen name="box_inset_layout_padding">0dp</dimen>
|
||||
|
||||
<!--
|
||||
This padding applies to both square and round screens. The total padding between the buttons
|
||||
and the window insets is box_inset_layout_padding (above variable) on square screens and
|
||||
inner_frame_layout_padding (below variable) on round screens.
|
||||
-->
|
||||
<dimen name="inner_frame_layout_padding">5dp</dimen>
|
||||
</resources>
|
||||
@@ -1,7 +1,5 @@
|
||||
<resources>
|
||||
<string name="app_name">OffPass</string>
|
||||
<string name="qr_schema_support">1</string>
|
||||
<string name="title_activity_create">CreateActivity</string>
|
||||
<!--
|
||||
This string is used for square devices and overridden by hello_world in
|
||||
values-round/strings.xml for round devices.
|
||||
|
||||