les nouveautés d'android 7.1 (nougat)

Post on 15-Apr-2017

537 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Android 7.1Quelles sont les nouveautés ?

Edouard MarquezMangueur de nougats et de pommes

Développeur Android Freelance

Organisateur du Paris Android User Group

@g123kL

+EdouardMarquezG

01Des icônes rondes

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

B

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

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

02Libérer de l’espace sur le disque

Nouvel Intent

StorageManager.ACTION_MANAGE_STORAGEo

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

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

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

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

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

`

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

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

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

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

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

o android:showMetadataInPreview

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

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

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

o android:showMetadataInPreview

Auteur7

o android:author

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

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

o android:showMetadataInPreview

Description7

o android:description

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

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

04Insérer des images depuis le clavier

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

y

]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

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

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

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”}

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

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

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

05Les App Shortcuts

Force touch-like

2

App Shortcut != Shortcut

A ne pas confondre avec les shortcuts (API 11)

!

05Les App Shortcuts

Ils peuvent être épinglés

2

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

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

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

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

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

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

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

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

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

05Les App Shortcuts

Activer / Désactiver des raccourcis

ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

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

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

B Icônes rondes

B Nouvel Intent

BMetadata des fonds d’écran animés

B Clavier avec images

B App Shortcuts

Merci !Questions ?

@g123kL +EdouardMarquezG

top related