Générer un QR code sur le splash screen pour préparer l'appli
This commit is contained in:
parent
00099ce046
commit
aaa53500a2
|
@ -9,8 +9,10 @@ import android.os.Bundle
|
|||
import android.support.v4.app.ActivityCompat
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import com.google.zxing.BarcodeFormat
|
||||
import xyz.johnny.norntalk.database.NornDatabase
|
||||
import xyz.johnny.norntalk.messages.NornNotification
|
||||
import xyz.johnny.norntalk.security.QRCode
|
||||
import xyz.johnny.norntalk.security.Security
|
||||
|
||||
|
||||
|
@ -56,7 +58,7 @@ class SplashActivity : AppCompatActivity() {
|
|||
* @return Tâche correspondant à l'opération
|
||||
*/
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private fun load_helper(function: () -> Any): AsyncTask<Void, Void, Unit> {
|
||||
private fun load_helper(function: () -> Any?): AsyncTask<Void, Void, Unit> {
|
||||
return object : AsyncTask<Void, Void, Unit>() {
|
||||
override fun doInBackground(vararg params: Void?) {
|
||||
function()
|
||||
|
@ -73,9 +75,10 @@ class SplashActivity : AppCompatActivity() {
|
|||
val tasks = arrayOf(
|
||||
load_helper { Security.random },
|
||||
load_helper { Security.curve },
|
||||
load_helper { Security.barcodeEncoder },
|
||||
load_helper { NornNotification.createChannel(this) },
|
||||
load_helper { NornDatabase.getNornDatabase(this) }
|
||||
load_helper { NornDatabase.getNornDatabase(this) },
|
||||
load_helper { QRCode.getNumber(this, true) },
|
||||
load_helper { Security.barcodeEncoder.encodeBitmap("a", BarcodeFormat.QR_CODE, 512, 512).recycle() }
|
||||
)
|
||||
|
||||
tasks.forEach { it.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) }
|
||||
|
@ -109,8 +112,6 @@ class SplashActivity : AppCompatActivity() {
|
|||
* Lancer l'activité principale après que toutes les tâches en arrière plan aient été effectuées
|
||||
*/
|
||||
fun close() {
|
||||
tasks.forEach { it.get() }
|
||||
|
||||
val intent = Intent(this, MainActivity::class.java)
|
||||
startActivity(intent)
|
||||
finish()
|
||||
|
|
|
@ -244,12 +244,14 @@ class NornMessage constructor(text: String?, var ciphertext: String?, sender: St
|
|||
* @param context Contexte courant
|
||||
* @param insert Si Vrai le message doit être inséré dans la base de données, Faux sinon
|
||||
* cela permet de cacher les messages d'échange de clés à l'utilisateur
|
||||
* @param raw Si Vrai le message sera envoyé en clair, sinon le message sera chiffré en fonction
|
||||
* des propriétés de la conversation
|
||||
*/
|
||||
fun send(context: Context, insert: Boolean) {
|
||||
fun send(context: Context, insert: Boolean, raw: Boolean = false) {
|
||||
val smsManager = SmsManager.getDefault()
|
||||
|
||||
// envoyer le message chiffré si la conversation est sécurisée
|
||||
val text = if (this.conversation.secured && this.ciphertext != null) this.ciphertext
|
||||
val text = if (this.conversation.secured && this.ciphertext != null && !raw) this.ciphertext
|
||||
else this.text
|
||||
|
||||
Log.d(this::class.java.simpleName, "sent: " + this)
|
||||
|
|
|
@ -43,12 +43,8 @@ class NornMessageReceiver : BroadcastReceiver() {
|
|||
Log.d(this::class.java.simpleName, message.toString())
|
||||
|
||||
// permettre de vérifier le numéro de téléphone de l'utilisateur
|
||||
val cnToken = CheckNumber.token
|
||||
Log.d(this::class.java.simpleName, "current token: " + cnToken)
|
||||
if (cnToken != null && message.rawtext == cnToken) {
|
||||
CheckNumber.messageReceived(message)
|
||||
if (CheckNumber.messageReceived(message))
|
||||
return
|
||||
}
|
||||
|
||||
// vérifier si le message est en rapport avec un QR code
|
||||
if (QRCode.message_hook(context, message))
|
||||
|
|
|
@ -14,6 +14,8 @@ import java.util.*
|
|||
*/
|
||||
object CheckNumber {
|
||||
|
||||
var number : String = ""
|
||||
|
||||
/**
|
||||
* Taille du token en octets
|
||||
*/
|
||||
|
@ -30,12 +32,17 @@ object CheckNumber {
|
|||
/**
|
||||
* Signale au thread executant checkNumber que le message envoyé a bien été reçu
|
||||
*/
|
||||
fun messageReceived(msg: NornMessage) {
|
||||
synchronized(this.numberObj) {
|
||||
Log.d(this::class.java.simpleName, "sender: " + msg.sender?.number)
|
||||
this.numberObj.number = msg.sender?.number ?: ""
|
||||
this.numberObj.notifyAll()
|
||||
fun messageReceived(msg: NornMessage): Boolean {
|
||||
if (this.token == msg.rawtext) {
|
||||
synchronized(this.numberObj) {
|
||||
Log.d(this::class.java.simpleName, "sender: " + msg.sender?.number)
|
||||
this.numberObj.number = msg.sender?.number ?: ""
|
||||
this.number = msg.sender?.number ?: ""
|
||||
this.numberObj.notifyAll()
|
||||
}
|
||||
}
|
||||
|
||||
return this.token == msg.rawtext
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -68,7 +75,7 @@ object CheckNumber {
|
|||
val message = NornMessage(this.token!!, conversation, Date(), context)
|
||||
|
||||
// envoyer le message
|
||||
message.send(context, false)
|
||||
message.send(context, false, true)
|
||||
|
||||
val end = System.currentTimeMillis() + 3000
|
||||
while (System.currentTimeMillis() < end)
|
||||
|
|
|
@ -69,12 +69,15 @@ object QRCode {
|
|||
return preferences!!
|
||||
}
|
||||
|
||||
private var lastBitmap : Bitmap? = null
|
||||
|
||||
/**
|
||||
* Crée une pop-up pour demander le numéro de téléphone à l'utilisateur
|
||||
*
|
||||
* @param context Contexte courant
|
||||
* @param numberObj Stocke le numéro de téléphone
|
||||
*/
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private fun popUpNumber(context: Context, numberObj: NumberObject) {
|
||||
// Création de la popup
|
||||
val alertDialog = AlertDialog.Builder(context).create()
|
||||
|
@ -170,10 +173,14 @@ object QRCode {
|
|||
* l'utilisateur
|
||||
*
|
||||
* @param context Contexte courant
|
||||
* @param auto Si Vrai ne demandera pas le numéro à l'utilisateur si le numéro est introuvable
|
||||
* @return Numéro de téléphone de l'utilisateur
|
||||
*/
|
||||
@SuppressLint("HardwareIds")
|
||||
fun getNumber(context: Context): String {
|
||||
fun getNumber(context: Context, auto: Boolean = false): String {
|
||||
if (CheckNumber.number.isNotEmpty())
|
||||
return CheckNumber.number
|
||||
|
||||
Log.d(this::class.java.simpleName, "get phone number")
|
||||
val preferences = this.getPreferences(context)
|
||||
var number = preferences.getString("number", "")
|
||||
|
@ -191,7 +198,7 @@ object QRCode {
|
|||
}
|
||||
|
||||
// demander le numéro de téléphone à l'utilisateur
|
||||
number = getNumberFromUser(context)
|
||||
number = if (auto) "" else getNumberFromUser(context)
|
||||
}
|
||||
|
||||
// enregistrer le numéro de téléphone
|
||||
|
@ -201,7 +208,7 @@ object QRCode {
|
|||
editor.apply()
|
||||
}
|
||||
|
||||
Log.d(this::class.java.simpleName, number)
|
||||
Log.d(this::class.java.simpleName, "got number: " + CheckNumber.number)
|
||||
|
||||
return number
|
||||
}
|
||||
|
@ -214,10 +221,11 @@ object QRCode {
|
|||
* @return Bitmap du QR code ou null s'il est impossible de créer le QR code
|
||||
*/
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
fun generate(context: Context) : Bitmap? {
|
||||
fun generate(context: Context, auto: Boolean = false) : Bitmap? {
|
||||
|
||||
// trouver le numéro de l'utilisateur
|
||||
val number = getNumber(context)
|
||||
val number = getNumber(context, auto)
|
||||
Log.d(this::class.java.simpleName, "Number: " + number)
|
||||
|
||||
// retourner null si le numéro n'a pas pu être trouvé
|
||||
if (number.isEmpty())
|
||||
|
@ -245,7 +253,9 @@ object QRCode {
|
|||
|
||||
// génération du QR code
|
||||
val QRencoder = Security.barcodeEncoder
|
||||
return QRencoder.encodeBitmap(content, BarcodeFormat.QR_CODE, 512, 512)
|
||||
this.lastBitmap?.recycle()
|
||||
this.lastBitmap = QRencoder.encodeBitmap(content, BarcodeFormat.QR_CODE, 512, 512)
|
||||
return lastBitmap
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue