Les nouveautés d'Android 7.1 (Nougat)

43
Android 7.1 Quelles sont les nouveautés ?

Transcript of Les nouveautés d'Android 7.1 (Nougat)

Page 1: Les nouveautés d'Android 7.1 (Nougat)

Android 7.1Quelles sont les nouveautés ?

Page 2: Les nouveautés d'Android 7.1 (Nougat)

Edouard MarquezMangueur de nougats et de pommes

Développeur Android Freelance

Organisateur du Paris Android User Group

@g123kL

+EdouardMarquezG

Page 3: Les nouveautés d'Android 7.1 (Nougat)

01Des icônes rondes

Que nous réservera la prochaine version d’Android ?

B

Page 4: Les nouveautés d'Android 7.1 (Nougat)

01Des icônes rondes

AndroidManifest.xml

<application

android:icon="@mipmap/ic_launcher" android:label="@string/app_name"

android:roundIcon="@mipmap/ic_icon2">

Mais on peut faire ce que l’on veut

Il est tout à fait possible de donner une image qui n’est pas ronde. Les launchers ne forcent pas pour le moment la forme ronde.

o

6

Page 5: Les nouveautés d'Android 7.1 (Nougat)

01Des icônes rondes

AndroidManifest.xml

<application

android:icon="@mipmap/ic_launcher" android:label="@string/app_name"

android:roundIcon="@mipmap/ic_icon2">

Mais on peut faire ce que l’on veut

Il est tout à fait possible de donner une image qui n’est pas ronde. Les launchers ne forcent pas pour le moment la forme ronde.

o

6

Page 6: Les nouveautés d'Android 7.1 (Nougat)

02Libérer de l’espace sur le disque

Nouvel Intent

StorageManager.ACTION_MANAGE_STORAGEo

Page 7: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Page 8: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :

<service android:label=“@string/name"

android:name=".LWService"

android:permission="android.permission.BIND_WALLPAPER">

<intent-filter>

<action android:name="android.service.wallpaper.WallpaperService" />

</intent-filter>

<meta-data

android:name="android.service.wallpaper"

android:resource="@xml/wallpaper" />

</service>

o

Page 9: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :

<service android:label=“@string/name"

android:name=".LWService"

android:permission="android.permission.BIND_WALLPAPER">

<intent-filter>

<action android:name="android.service.wallpaper.WallpaperService" />

</intent-filter>

<meta-data

android:name="android.service.wallpaper"

android:resource="@xml/wallpaper" />

</service>

oService Android8

oextends AndroidLiveWallpaper Service

Page 10: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :

<service android:label=“@string/name"

android:name=".LWService"

android:permission="android.permission.BIND_WALLPAPER">

<intent-filter>

<action android:name="android.service.wallpaper.WallpaperService" />

</intent-filter>

<meta-data

android:name="android.service.wallpaper"

android:resource="@xml/wallpaper" />

</service>

o Nom du fond d’écran (affiché à l’utilisateur)

4

Page 11: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Pour rappel, un fond d’écran animé se définit dans l’AndroidManifest :

<service android:label=“@string/name"

android:name=".LWService"

android:permission="android.permission.BIND_WALLPAPER">

<intent-filter>

<action android:name="android.service.wallpaper.WallpaperService" />

</intent-filter>

<meta-data

android:name="android.service.wallpaper"

android:resource="@xml/wallpaper" />

</service>

oDéfinition des propriétés du fond d’écran

`

Page 12: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

La configuration d’un fond d’écran animé (res/values) avant 7.1

<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"

android:author=“@string/wp_author"

android:description="@string/wp_description"

android:settingsActivity="fr.paug.livewallpaper.PrefsActivity"

android:thumbnail=“@drawable/wp_thumbnail" />

o

Page 13: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Page 14: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Page 15: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Metadata (désactivé par défaut)8

o android:showMetadataInPreview

Page 16: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Metadata (désactivé par défaut)8

o android:showMetadataInPreview

Label du Service (AndroidManifest)0

o android:label

Page 17: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Metadata (désactivé par défaut)8

o android:showMetadataInPreview

Auteur7

o android:author

Page 18: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Metadata (désactivé par défaut)8

o android:showMetadataInPreview

Description7

o android:description

Page 19: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

Metadata (désactivé par défaut)8

o android:showMetadataInPreview

Uri et description (obligatoirement les deux)o

o android:contextUri

o android:contextDescription

Page 20: Les nouveautés d'Android 7.1 (Nougat)

03Les fonds d’écran animés en (un peu) mieux

La configuration d’un fond d’écran animé (res/values) depuis 7.1

<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"

android:author=“@string/wp_author”

android:contextDescription=“@string/wp_uri_desc”

android:contextUri=“@string/wp_uri”

android:description="@string/wp_description"

android:settingsActivity="fr.paug.livewallpaper.PrefsActivity"

android:thumbnail=“@drawable/wp_thumbnail”

android:showMetadataInPreview="true" />

o

Page 21: Les nouveautés d'Android 7.1 (Nougat)

04Insérer des images depuis le clavier

Rétro-compatible avec Android 3.2 (Honeycomb) Avec la support-library-v13

y

Page 22: Les nouveautés d'Android 7.1 (Nougat)

]H

8

G

Transmission mime typesL’EditText va envoyer la liste des mime types souhaités au clavier

Envoi de l’URIMéthode onCommitContent() du Callback appelé

Utilisateur cliqueUn EditText récupère le focus

Clavier avec mime typesL’utilisateur peut alors choisir un gif

Gestion des permissionsSur Android 7.1+, une permission temporaire est donnée

Page 23: Les nouveautés d'Android 7.1 (Nougat)

04Insérer des images depuis le clavier

Modifier le comportement de vos EditText

EditText editText = new EditText(this) {

@Override

public InputConnection onCreateInputConnection(EditorInfo editorInfo) {

final InputConnection ic = super.onCreateInputConnection(editorInfo);

EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes);

final InputConnectionCompat.OnCommitContentListener callback =

new InputConnectionCompat.OnCommitContentListener() {

@Override

public boolean onCommitContent() {…}

};

return InputConnectionCompat.createWrapper(ic, editorInfo, callback);

}

};

o

Page 24: Les nouveautés d'Android 7.1 (Nougat)

04Insérer des images depuis le clavier

Modifier le comportement de vos EditText

EditText editText = new EditText(this) {

@Override

public InputConnection onCreateInputConnection(EditorInfo editorInfo) {

final InputConnection ic = super.onCreateInputConnection(editorInfo);

EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes);

final InputConnectionCompat.OnCommitContentListener callback =

new InputConnectionCompat.OnCommitContentListener() {

@Override

public boolean onCommitContent() {…}

};

return InputConnectionCompat.createWrapper(ic, editorInfo, callback);

}

};

o

Page 25: Les nouveautés d'Android 7.1 (Nougat)

04Insérer des images depuis le clavier

Modifier le comportement de vos EditText

EditText exitText = new EditText(this) {

@Override

public InputConnection onCreateInputConnection(EditorInfo editorInfo) {

final InputConnection ic = super.onCreateInputConnection(editorInfo);

EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes);

final InputConnectionCompat.OnCommitContentListener callback =

new InputConnectionCompat.OnCommitContentListener() {

@Override

public boolean onCommitContent() {…}

};

return InputConnectionCompat.createWrapper(ic, editorInfo, callback);

}

};

o

Liste de mime-types8

onew String[] {“image/gif”}

Page 26: Les nouveautés d'Android 7.1 (Nougat)

04Insérer des images depuis le clavier

Vérifier que l’on possède la permission d’accéder au contenu (uniquement depuis Android 7.1)

public boolean onCommitContent(InputContentInfoCompat inputContentInfo,

int flags, Bundle opts) {

if (BuildCompat.isAtLeastNMR1() && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {

try {

inputContentInfo.requestPermission();

} catch (Exception e) {

return false;

}

}

// …

inputContentInfo.releasePermission();

return true;

}

o

Page 27: Les nouveautés d'Android 7.1 (Nougat)

04Insérer des images depuis le clavier

Vérifier que l’on possède la permission d’accéder au contenu (uniquement depuis Android 7.1)

public boolean onCommitContent(InputContentInfoCompat inputContentInfo,

int flags, Bundle opts) {

if (BuildCompat.isAtLeastNMR1() && (flags & InputConnectionCompat.INPUT_CONTENT_GRANT_READ_URI_PERMISSION) != 0) {

try {

inputContentInfo.requestPermission();

} catch (Exception e) {

return false;

}

}

// …

inputContentInfo.releasePermission();

return true;

}

o

Demander une permission temporaire

W

Page 28: Les nouveautés d'Android 7.1 (Nougat)

04Insérer des images depuis le clavier

Accéder au contenu (à partir du InputContentInfo)

String[] mimeTypes = inputContentInfo.getDescription().filterMimeTypes("*/*");

Uri contentUri = inputContentInfo.getContentUri();

String description = inputContentInfo.getDescription().getLabel();

@Nullable Uri link = inputContentInfo.getLinkUri();

o

Page 29: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Force touch-like

2

Page 30: Les nouveautés d'Android 7.1 (Nougat)

App Shortcut != Shortcut

A ne pas confondre avec les shortcuts (API 11)

!

Page 31: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Ils peuvent être épinglés

2

Page 32: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Les raccourcis statiques se créent en xml sur les Activités affichées sur le launcher

<activity android:name=“.MainActivity">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

<meta-data android:name="android.app.shortcuts"

android:resource="@xml/shortcuts" />

</activity>

o

Page 33: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Les raccourcis statiques se créent en xml sur les Activités affichées sur le launcher

<activity android:name=“.MainActivity">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

<meta-data android:name="android.app.shortcuts"

android:resource="@xml/shortcuts" />

</activity>

o

Page 34: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Les raccourcis statiques se créent en xml

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

<shortcut android:shortcutId="compose"

android:enabled="true"

android:icon="@drawable/compose_icon"

android:shortcutShortLabel="@string/compose_shortcut_short_label1"

android:shortcutLongLabel="@string/compose_shortcut_long_label1"

android:shortcutDisabledMessage="@string/compose_disabled_message1">

<intent android:action="android.intent.action.VIEW"

android:targetPackage=“fr.paug.myapplication"

android:targetClass=“fr.paug.myapplication.EasterEggActivity" />

<categories android:name="android.shortcut.conversation" />

</shortcut>

</shortcuts>

o

Page 35: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Les raccourcis statiques se créent en xml

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

<shortcut android:shortcutId="compose"

android:enabled="true"

android:icon="@drawable/compose_icon"

android:shortcutShortLabel="@string/compose_shortcut_short_label1"

android:shortcutLongLabel="@string/compose_shortcut_long_label1"

android:shortcutDisabledMessage="@string/compose_disabled_message1">

<intent android:action="android.intent.action.VIEW"

android:targetPackage=“fr.paug.myapplication"

android:targetClass=“fr.paug.myapplication.EasterEggActivity" />

<categories android:name="android.shortcut.conversation" />

</shortcut>

</shortcuts>

o

Page 36: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Les raccourcis statiques se créent en xml

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

<shortcut android:shortcutId="compose"

android:enabled="true"

android:icon="@drawable/compose_icon"

android:shortcutShortLabel="@string/compose_shortcut_short_label1"

android:shortcutLongLabel="@string/compose_shortcut_long_label1"

android:shortcutDisabledMessage="@string/compose_disabled_message1">

<intent android:action="android.intent.action.VIEW"

android:targetPackage=“fr.paug.myapplication"

android:targetClass=“fr.paug.myapplication.EasterEggActivity" />

<categories android:name="android.shortcut.conversation" />

</shortcut>

</shortcuts>

o

On peut donner plusieurs Intent (backstack)

z

Page 37: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Ajouter des raccourcis dynamiques

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")

.setIntent(new Intent(...)))

.setShortLabel("Label")

.setLongLabel(“Long label”)

.setDisabledLabel(“Disabled label”)

.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))

.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)

.setRank(0)

.build();

shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));

o

Page 38: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Ajouter des raccourcis dynamiques

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")

.setIntent(new Intent(...)))

.setShortLabel("Label")

.setLongLabel(“Long label”)

.setDisabledLabel(“Disabled label”)

.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))

.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)

.setRank(0)

.build();

shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));

o

Existe aussi avec setIntents( Intent[])

z

Page 39: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Ajouter des raccourcis dynamiques

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")

.setIntent(new Intent(...)))

.setShortLabel("Label")

.setLongLabel(“Long label”)

.setDisabledLabel(“Disabled label”)

.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))

.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)

.setRank(0)

.build();

shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));

o

Nombre maximum de raccourcisG

oShortcutManager .getMaxShortcutCount PerActivity()

Page 40: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Ajouter des raccourcis dynamiques

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "compose")

.setIntent(new Intent(...)))

.setShortLabel("Label")

.setLongLabel(“Long label”)

.setDisabledLabel(“Disabled label”)

.setIcon(Icon.createWithResource(context, R.drawable.ic_shortcut))

.setActivity(new ComponentName(context.getPackageName(), “.MainActivity”)

.setRank(0)

.build();

shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut));

o

Nombre maximum de raccourcisG

oShortcutManager .getMaxShortcutCount PerActivity()

Existe aussi avec/

oupdateDynamicShortcuts

osetDynamicShortcuts

oremoveDynamicShortcuts

Page 41: Les nouveautés d'Android 7.1 (Nougat)

05Les App Shortcuts

Activer / Désactiver des raccourcis

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

shortcutManager.enableShortcuts(Arrays.asList(“compose”));

shortcutManager.disableShortcuts(Arrays.asList(“compose”));

Page 42: Les nouveautés d'Android 7.1 (Nougat)

B Icônes rondes

B Nouvel Intent

BMetadata des fonds d’écran animés

B Clavier avec images

B App Shortcuts

Page 43: Les nouveautés d'Android 7.1 (Nougat)

Merci !Questions ?

@g123kL +EdouardMarquezG