whats new in android jakarta gdg (2015-08-26)
TRANSCRIPT
What’s New in Android
+Adam Koch
+Ankur Kotwal
AgendaAndroid M ReleaseGoogle Play Services v7.8Android Tools & Libraries
Android M
Android M…?
Android Marshmallow
Available now for Nexus 5/6/9, Player & emulator
developer.android.com/preview
Get your apps ready!
Provide feedback and report bugs
Issue tracker: goo.gl/zcjEj7
Google+ community: goo.gl/BIq1eJ
Android M Developer Preview
On August 17 we released:
- Developer Preview 3 ROMs
- Final Android 6.0 (Marshmallow) SDK
Start publishing to Play today!
M Preview Timeline You are here
Getting Started with Marshmallow
android {
compileSdkVersion 23
buildToolsVersion '23.0.0'
defaultConfig {
applicationId 'com.google.samples.apps.mpreviewtest'
minSdkVersion 23
targetSdkVersion 23
versionCode 1
versionName '1.0'
}
}
Runtime permissions!
Auto Backup
Power-Saving Optimizations
Other behavior changes:- Adoptable Storage Devices
- AndroidHttpClient -> HttpUrlConnection
- OpenSSL -> BoringSSL
- And more: goo.gl/cf4lwy
Android M Behavior Changes
Why should you care?
- Significantly different behavior (after targeting M)
- No permission dialog on install --> less friction
- App updates --> automatic
- Fine grained, revocable permissions --> user feels in
control, improved user experience
Runtime Permissions
targetSdkVersion < M targetSdkVersion = M+
Pre-M deviceInstall time permission dialog
All permissions granted
M deviceInstall time permission dialog
All permissions grantedUser can revoke permissions
No dialog during installNo permissions granted initially
App can request permissionsUser can revoke permissions
Runtime Permissions
Runtime Permissions
Location
Camera
Microphone
Phone
All location permissions
Photo and video permissions
Audio recording
Phone state, dialing, etc.
SMS
Contacts
Calendar
Sensors
Storage
Controlling or reading SMS/MMS/etc.
Managing contacts
Managing calendars
Body sensors
Read, write external storage
Best Practices
Only ask for what you need, when you need it
Don’t overwhelm the user
Consider using system Intents if possible
Explain why you need permissions
Runtime Permissions
Context.checkSelfPermission(String permission)
Activity.requestPermissions(
String[] permissions, int requestCode)
Activity.onRequestPermissionsResult(
int requestCode, String[] permissions,
int[] grantResults)
New permissions methods
ContextCompat.checkSelfPermission(String permission)
ActivityCompat.requestPermissions(
String[] permissions, int requestCode)
ActivityCompat.onRequestPermissionsResult(
int requestCode, String[] permissions,
int[] grantResults)
*Also in Support Library (v23)
static final int LOCATION_PERMISSION_REQUEST_RESULT = 2;
...
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
LOCATION_PERMISSION_REQUEST_RESULT);
}
Requesting a permission
@Override
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case LOCATION_PERMISSION_REQUEST_RESULT: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Granted!
} else {
// Denied!
}
}
}
}
Checking if permission was granted
If shouldShowRequestPermissionRationale()
returns true then show your own in-app UI
explaining why you need the permission.
When does it return true? If the user has denied the
permission in the past (but NOT checked “Don’t ask
again”).
Showing your own explaination
Free and automatic app data backup (and restore)
Up to 25MB per user per app
Occurs every 24 hours
Enabled for *all* apps running on M Preview (but for
M final only targetSdkVersion=M)
Auto Backup for Apps
Use platform APIs correctly, don’t hardcode paths:getFilesDir(), getExternalFilesDir(), etc. will be backed up
getCacheDir(), getExternalCacheDir(), etc. will not be backed up
Exclude device-specific identifiers from backup(eg. GCM registration ID, etc.)
Auto Backup for Apps
Configuring Auto BackupAndroidManifest.xml
<application ...
android:fullBackupContent="@xml/mybackupscheme" />
xml/mybackupscheme.xml
<full-backup-content>
<include domain=["file"|"database"|"sharedpref"|"external"|"root"] path="string" />
<exclude domain=["file"|"database"|"sharedpref"|"external"|"root"] path="string" />
</full-backup-content>
# enable logging
$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE
# initialize Backup Manager
$ adb shell bmgr run
# trigger backup or restore
$ adb shell bmgr fullbackup <PACKAGE>
$ adb shell bmgr restore <PACKAGE>
Testing Auto Backup
Doze
increase standby time of devices
that aren’t being used
App Standby
reduce overhead of apps that are
installed but not used recently
Power-Saving Optimizations
flickr/trophygeek
Network access disabled (except high priority GCM)
Wake locks are ignored except for alarms set with setAlarmClock()
and setAndAllowWhileIdle()
Syncs and JobScheduler tasks are not allowed to run
Test with:
Doze
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
$ adb shell dumpsys deviceidle -h
Apps considered idle unless:- explicitly launched by user
- has a foreground process
- visible notification
- user asks for the app to be exempt
Idle apps are restricted:- network access disabled
- syncs and background jobs suspended
App Standby
Android M New Platform Features
Direct Share
Fingerprint API & Confirm Credentials
Voice Interactions & Assist API
App Linking
Text Selection
And much more:- Bluetooth Stylus, 4K Display, MIDI, Camera,
Android for Work...
Other Smaller Additions
Other Small Additions
After:<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:foreground="@drawable/selector">
...
</LinearLayout>
Before:<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:foreground="@drawable/selector">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
...
</LinearLayout>
</FrameLayout>
Other Small Additions
Notifications
New android.graphics.drawable.Icon,
- Icon.createWithBitmap(Bitmap) for dynamic icons
Notification.Builder.setSmall/LargeIcon(Icon)
getActiveNotifications()
And lots more...
Fingerprint API & Confirm Credentials
Voice Interactions & Assist API
App Linking
Text Selection
Bluetooth Stylus
4K Display
MIDI
Camera
Android for Work…
Themeable ColorStateLists
Google Play Services v7.8
Nearby Messages
Find nearby devices or beacons and
share messages
Cross platform supportAndroid & iOS
Unauthenticated(Does not require a Google account)
Uses a variety of tech under the hoodBluetooth, Bluetooth Low Energy, Wi-Fi and an
ultrasonic modem
Face API & Barcode API
Mobile Vision API
Smart Lock for Passwords
Credentials API● auth.credentials.save
● auth.credentials.request
com.google.android.gms.auth.api.c
redentials.CredentialsApi
Creates a unique ID per app per install
Generate security tokens for services (suited for user by GCM)
Verify app authenticity & check if app install is active via web API
InstanceID
// Get InstanceID
String iid = InstanceID.getInstance().getID();
Topic based subscriptions
New base classes for receiving GCM messages
GCM Network Manager
Google Cloud Messaging
GCM Network ManagerGcmNetworkManager JobScheduler
Run during specifictime window
Supported(one off, periodic)
Supported(one off, periodic)
Require device charging Supported Supported
Specify network type Supported Supported
Require device idle Not Supported Supported
Execute by deadline Not Supported Supported
Android Tools & Libraries
C/C++ support (coming soon)- integrated debugging,
code completion, refactoring
Debugger improvements
Separate unit testing module
Speed improvements
Visual theme editor, layout editor improvements
Android Studio
Android Studio
Drawable ResourcesBitmap Vector
compile 'com.android.support:design:23.0.0'
Android Design Support Library
Floating labels for hint and error text
Built-in animations
Wrap EditText in a TextInputLayout
TextInputLayout
Providing lightweight quick feedback to your users
Snackbar
.make(parentLayout, “My Text”, Snackbar.LENGTH_LONG)
.setAction(“My Action”, myOnClickListener)
.show(); //Don’t forget to show!
Snackbar
Top level navigation or grouping content
tabGravity = center, fill
tabMode = scrollable, fixed
TabLayout
● Component to create view inside Navigation Drawer
● Used with DrawerLayout
● Load items from menu resources
NavigationView
Built-in component for FAB, follows design spec
Default color = ?attr/colorAccent
fabSize = full, mini
Floating Action Button (FAB)
Provide additional level of control between child
views
Coordinate different Views- FloatingActionButton
- Snackbar
- Toolbar, Tabs
Each View sets own behavior- CoordinatorLayout.Behavior
CoordinatorLayout
compile 'com.android.support:percent:23.0.0'
Managing percent based dimensions
<android.support.percent.PercentFrameLayout ...>
<ImageView app:layout_widthPercent="50%"
app:layout_heightPercent="50%"
app:layout_marginTopPercent="25%"
app:layout_marginLeftPercent="25%"/>
</android.support.percent.PercentFrameLayout>
Percent Support Library
Placing a FAB - Before
private void addFloatingActionButton() {
final int fabSize =
getResources().getDimensionPixelSize(R.dimen.fab_size);
int bottomOfQuestionView =
findViewById(R.id.question_view).getBottom();
final LayoutParams fabLayoutParams =
new LayoutParams(fabSize, fabSize, Gravity.END | Gravity.TOP);
final int fabPadding =
getResources().getDimensionPixelSize(R.dimen.padding_fab);
final int halfAFab = fabSize / 2;
fabLayoutParams.setMargins(0, // left
bottomOfQuestionView - halfAFab, //top
0, // right
fabPadding); // bottom
addView(mSubmitAnswer, fabLayoutParams);
}
<android.support.design.widget.CoordinatorLayout ...>
<TextView android:id="@+id/textLayout" />
<android.support.design.widget.FloatingActionButton ...
android:src="@drawable/ic_action_map"
app:layout_anchor="@id/textLayout"
app:layout_anchorGravity="bottom|start" />
</android.support.design.widget.CoordinatorLayout>
Placing a FAB - After
Android Developer Blog Post
goo.gl/THH9OA
DevByte Video
goo.gl/0jhXFb
Cheesesquare Sample
github.com/chrisbanes/cheesesquare
Resources
Thank You!
Questions?
+Adam Koch +Ankur Kotwal