Le Paris Android User Group (PAUG) a organisé le 28 septembre un meetup dédié aux nouveautés d'Android 7.0 (Nougat). J'y ai participé en présentant deux fonctionnalités : Android TV (le picture-in-picture notamment), ainsi que le nouveau mode Direct Boot).
L'ensemble des slides sont disponibles sur ce lien : http://bit.ly/slidesn
4. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Qu’est-ce que le picture in picture (PIP) ?
4
5. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Supporter le picture in picture (Android Manifest)
5
<activity
android:name=".MyActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges="screenSize|smallestScreenSize|
screenLayout|orientation" />
Mettre le launchMode en singleTask est recommandé
6. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Supporter le picture in picture (bouton)
6
if (supportsPIP(context)) {
adapter.add(
new PlaybackControlsRow.PictureInPictureAction(context));
}
boolean supportsPIP(Context context) {
return BuildCompat.isAtLeastN() &&
context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_PICTURE_IN_PICTURE);
}
7. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Supporter le picture in picture (activer le mode)
7
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPictureMode();
return;
}
// ....
}
8. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Picture in picture
8
9. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Cacher les composants en mode picture in picture
9
void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
uiControls.setVisibility(View.INVISIBLE);
} else {
uiControls.setVisibility(View.VISIBLE);
}
}
10. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Gestion du lifecycle avec le picture in picture
10
public void onPause() {
super.onPause();
if (!inPictureInPicture() && videoView.isPlaying()) {
if (!requestVisibleBehind(true)) {
playPause(false);
} else {
requestVisibleBehind(false);
}
}
11. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV - Picture in picture : Exemple de code
11
Exemple
de code
12. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android TV : Enregistrement des chaînes TV
12
14. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Etre notifié du démarrage du terminal
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootBroadcastReceiver"
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
14
Intent relatif au démarrage du terminal
15. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
L’application doit avoir été
lancée une première fois
avant de recevoir l’Intent
Depuis
Android 3.1
15
Intent relatif au démarrage du terminal
16. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
3.0 (Honeycomb)
Février 2011
Support du
chiffrement
Full Disk Encryption
(FDE)
4.4 (KitKat)
Novembre 2013
Utilisation de
scrypt
Sécurité renforcée
7.0 (Nougat)
Août 2016
Nouveau type
de chiffrement
File-Based Encryption
(FBE)
5.0 (Lollipop)
Novembre 2014
Diverses
améliorations
Chiffrement sans mot de
passe, support schéma…
16
Android : Evolution du chiffrement
17. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Mieux
comprendre
le
chiffrement
5.0 (Lollipop)
Novembre 2014
Chiffrement
obligatoire
… puis non
6.0 (Marshmallow)
Septembre 2015
Chiffrement
(vraiment)
obligatoire
17
Android : Evolution du chiffrement
18. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
— Seuls des mots de passe et PIN
peuvent être utilisés
— La demande au démarrage est
bloquante
Android 3.0 - Android 4.4
— Possibilité d’utiliser des schémas
— Le démarrage sécurisé devient
optionnel
Depuis Android 5.0
18
Android : Evolution du chiffrement
19. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
— Aucune application tierce n’est
exécutée
— Bloque le lancement du terminal
Démarrage sécurisé
19
Android : Evolution du chiffrement
20. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Seuls les terminaux
sous Android 7.0
peuvent en bénéficier
Depuis Nougat
Le terminal doit
être chiffré
Données chiffrées
Le chiffrement doit être
“basé sur un fichier”
File-based encryption
20
Comment obtenir Direct Boot ?
21. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Android Manifest
Ajouter android:directBootAware
uniquement sur les
receivers / services / providers
qui seront accessibles
au démarrage
L’attribut n’apporte rien sur les
Activity, car il faut au préalable
déverrouiller le terminal
Un nouvel Intent est envoyé lors du
“direct boot”
<receiver android:name=".BootBroadcastReceiver"
android:directBootAware="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
21
Implémenter Direct Boot
22. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Application
“système”
Il est possible de mettre l’attribut sur
le tag application, mais il ne prendra
effet que sur les applications
“système”
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:theme="@style/Theme.AppCompat.Light"
android:directBootAware="true">
22
Implémenter Direct Boot
23. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Stockage
disponible
uniquement après
le premier
déverrouillage
Credential Encrypted
(CE) storage
Stockage
disponible avant
et après le premier
déverrouillage
Device Encrypted
(DE) storage
23
Les deux types de stockage
24. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Utiliser le
stockage DE
Il faut récupérer un Context différent
Deux méthodes permettent de
déplacer facilement les préférences
et bases de données dans leur
globalité
Context context =
ContextCompat.createDeviceProtectedStorageContext(srcContext);
ContextCompat.isDeviceProtectedStorage(context);
context.moveDatabaseFrom(srcContext, "dbName");
context.moveSharedPreferencesFrom(srcContext, "prefName");
24
Utiliser le stockage DE (accessible avant le déverrouillage)
25. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Application
“système”
Il est possible d’ajouter un attribut le
tag application afin que seul le
stockage “DE” soit utilisé
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:theme="@style/Theme.AppCompat.Light"
android:directBootAware="true"
android:defaultToDeviceProtectedStorage="true">
25
Utiliser le stockage DE (accessible avant le déverrouillage)
26. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Tester Direct Boot
— Paramètres -> Options pour les
développeurs -> Convertir en chiffrement
basé sur un fichier
— adb reboot bootloader
fastboot --wipe-and-use-fbe
Emulation de Direct Boot
— adb shell sm set-emulate-fbe true
— adb shell sm set-emulate-fbe false
26
Tester Direct Boot
27. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
android.intent.action.BOOT_COMPLETED android.intent.action.USER_PRESENT
27
L’évolution des Intent envoyés : avant Nougat
28. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
android.intent.action.LOCKED_BOOT_COMPLETED
android.intent.action.USER_PRESENT
puis
android.intent.action.BOOT_COMPLETED
android.intent.action.ACTION_USER_UNLOCKED
28
L’évolution des Intent envoyés : avec Nougat et sans Direct Boot
29. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
android.intent.action.LOCKED_BOOT_COMPLETED
android.intent.action.BOOT_COMPLETED
android.intent.action.ACTION_USER_UNLOCKED
puis
android.intent.action.USER_PRESENT
29
L’évolution des Intent envoyés : avec Nougat et Direct Boot
30. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
30
Direct Boot : juste un dernier slide
— Chaque utilisateur possède ses
propres clés
— Une pour le DE, l’autre pour CE
Support multi-utilisateur Exemple de code
UserManagerCompat.
isUserUnlocked(context));
Déverrouillé ?
32. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Raccourci vers les paramètres
32
33. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Raccourci vers les paramètres
33
Paramètres
Dans l’AndroidManifest, spécifier un
Intent-Filter particulier
Afin d’éviter que d’autres
applications puissent ouvrir cette
Activité, on peut limiter à une
permission
Il n’est pas nécessaire que l’Activité
soit exportée
<activity
android:name=".MyActivity"
android:permission="android.permission.WRITE_SECURE_SETTINGS">
<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
34. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Résolution des langues
34
Default
(en)
fr_BE
en_UK es_ES
de_DE ru_RU
fr_FR
35. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Résolution des langues (pre-Nougat)
35
fr_FR
existe-il ?
Non juste
fr_BE
fr existe-il ? Non
Valeur par
défaut (en)
36. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Résolution des langues (depuis Nougat)
36
fr_FR
existe-il ?
Non juste
fr_BE
fr existe-il ?
Non
Existe-t-il
un autre type
de fr ?
Oui
fr_BE
37. Les nouveautés d’Android Nougat (7.0) Paris Android User Group (bit.ly/paugand)
PARTIE 1 PARTIE 2 PARTIE 3 PARTIE 4 PARTIE 5 PARTIE 6
Langues multiples
37
Récupérer les différentes langues
LocaleList.getDefault()
Support de ICU4J