norn-talk/app/src/main/java/xyz/johnny/norntalk/SplashActivity.kt
2018-03-21 00:05:03 +01:00

104 lines
3.3 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.LoadHelper
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<LoadHelper>? = 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
/**
* Charger l'ensemble des singletons de Security
*
* @return Tâches correspondants aux opérations
*/
fun load(): Array<LoadHelper> {
val tasks = arrayOf(
LoadHelper { Security.random },
LoadHelper { Security.curve },
LoadHelper { NornNotification.createChannel(this) },
LoadHelper { NornDatabase.getNornDatabase(this) },
LoadHelper { Security.barcodeEncoder.encodeBitmap("a", BarcodeFormat.QR_CODE, 512, 512).recycle() }
)
tasks.forEach { it.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) }
return tasks
}
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()
}
}