Générer un QR code sur le splash screen pour préparer l'appli

This commit is contained in:
odrling 2018-03-17 16:11:04 +01:00
parent 00099ce046
commit aaa53500a2
5 changed files with 40 additions and 24 deletions

View file

@ -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()

View file

@ -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)

View file

@ -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))

View file

@ -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)

View file

@ -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
}
/**