norn-talk/app/src/main/java/xyz/johnny/norntalk/SplashActivity.kt

121 lines
4 KiB
Kotlin

package xyz.johnny.norntalk
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.PackageManager
import android.os.AsyncTask
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
/**
* Le premier écran de l'application.
* On profite de cet écran pour charger certains éléments de l'application qui pourraient ralentir
* l'application si ils étaient instanciés plus tard.
*/
class SplashActivity : AppCompatActivity() {
private var _tasks: Array<AsyncTask<Void, Void, Unit>>? = null
/**
* Les tâches effectuées en arrière plan
*/
private val tasks get() = _tasks!!
/**
* L'ensemble des permissions demandées par l'application
*/
private val all_permissions = arrayOf(
Manifest.permission.RECEIVE_SMS,
Manifest.permission.SEND_SMS,
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_MMS,
Manifest.permission.READ_CONTACTS,
Manifest.permission.VIBRATE,
Manifest.permission.READ_PHONE_STATE
)
/**
* Vérifie si une permission a été donnée par l'utilisateur.
*
* @param perm Permission
* @return Vrai si la permission a été donné, Faux sinon
*/
fun checkperm(perm: String) = ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED
/**
* Méthode permettant d'effectuer des opérations en parallèle
*
* @param function Fonction contenant l'opération à effectuer en parallèle
* @return Tâche correspondant à l'opération
*/
@SuppressLint("StaticFieldLeak")
private fun load_helper(function: () -> Any?): AsyncTask<Void, Void, Unit> {
return object : AsyncTask<Void, Void, Unit>() {
override fun doInBackground(vararg params: Void?) {
function()
}
}
}
/**
* Charger l'ensemble des singletons de Security
*
* @return Tâches correspondants aux opérations
*/
fun load(): Array<AsyncTask<Void, Void, Unit>> {
val tasks = arrayOf(
load_helper { Security.random },
load_helper { Security.curve },
load_helper { NornNotification.createChannel(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) }
return tasks
}
@SuppressLint("StaticFieldLeak")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// lancer les tâches en arrière plan
this._tasks = this.load()
// trouver les permissions non acceptées par l'utilisateur
val permissions = all_permissions.filter { this.checkperm(it) }.toTypedArray()
if (permissions.isEmpty())
this.close()
else
// demander les permissions manquantes
ActivityCompat.requestPermissions(this, permissions, 0)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
this.close()
}
/**
* Lancer l'activité principale après que toutes les tâches en arrière plan aient été effectuées
*/
fun close() {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}
}