Download Additions in Nougat (android 7.0 and 7.1)

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Cosc 4735
Nougat API 24+ additions
App Shortcuts
• If your app targets Android 7.1 (API
level 25) or higher
– you can define shortcuts to specific
actions in your app.
• These shortcuts can be displayed in
a supported launcher.
• Shortcuts let your users quickly start
common or recommended tasks
within your app.
– These can be both static and dynamic
shortcuts.
• These shortcuts can also be
“pinned” to the desktop as separate
icons.
Static shortcuts
• Static shortcuts don’t change, so all the work is done in the xml files for
the AndroidManifest.xml file.
• Find the activity with the MAIN intent and category LAUNCHER and add
the two lines in blue:
<manifest … > <application ... >
<activity android:name="Main" … >
<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>
</application> </manifest>
Static shortcuts (2)
• In the shortcuts xml file, we then create the number of enters needed.
– We need a id, icon, label, and intent (either to launcher an activity or custom
Intent)
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="compose"
android:icon="@drawable/compose_icon"
android:shortcutShortLabel="@string/compose_shortcut_short_label1"
android:shortcutLongLabel="@string/compose_shortcut_long_label1"
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.ComposeActivity" />
</shortcut>
<!-- Specify more shortcuts here. -->
</shortcuts>
Dynamic Shortcuts
• We need to create the shortcut first, then add it.
• Shortcutinfo is done via a builder.
Shortcutinfo item = new ShortcutInfo.Builder(this,"id1")
.setShortLabel("Web Site")
.setLongLabel("Cosc 4735 Web site")
.setIcon(Icon.createWithResource(this, R.drawable.bookmark))
.setIntent(new Intent(Intent.ACTION_VIEW,
Uri.parse("http://www.cs.uwyo.edu/~seker/courses/4735/")))
.build();
• Then add it via
– ShortcutManager.class is android, not a class I created.
mShortcutManager = getSystemService(ShortcutManager.class);
mShortcutManager.addDynamicShortcuts(Arrays.asList(item));
• Or if we used a List<ShortcutInfo> myList
mShortcutManager.setDynamicShortcuts(myList);
ShortcutManager
• We can query for size (ie number of dynamic
shortcuts)
• Get a List of all the dynamic shortcuts
– getDynamicShortcuts()
– Or just ones that were pinned via
getPinnedShortcuts()
• We can also remove and disable/enable
shortcuts as well.
– We will need to know the ID of the shortcut.
Demo Code
• AppShortCutsDemo is a simple demo of it
– Shows static and dynamic short cuts.
• Google’s appShortcuts is more complex where
you can add more shortcuts in the app.
– https://github.com/googlesamples/androidAppShortcuts/
• At the time of this was written, there were a couple of
errors in the code for the static shortcuts.
– And while it compiles, doesn’t actually work.
References (shortcuts)
• https://developer.android.com/reference/and
roid/content/pm/ShortcutManager.html
• https://developer.android.com/guide/topics/u
i/shortcuts.html
• https://github.com/googlesamples/androidAppShortcuts/
Multi-window support
• On phones and tablets,
split screen
– Where you can drag a
divider between the two
apps.
On android TV it’s PiP.
Manifest file.
• Each activity now has
– android:resizeableActivity="false" or "true"
• default is true
– You can set a minwidth and minheight in a
<layout> tag between <activity> </activity>
Mode
• You have new methods
isInMultiWindowMode()
isInPictureInPictureMode()
• New override as well
@Override
public void onMultiWindowModeChanged(boolean
isInMultiWindowMode) {
super.onMultiWindowModeChanged(isInMultiWindowMode);
//make changes as needed here.
}
– This appears to be called after onCreate and before onStart.
Lastly a note.
• It appears when the app goes into multi
window mode (or the divider is used to
change the size)
– The app is killed (through onDestroy) and
restarted started.
Demo code
• MultiWindowDemo
– Runs the set of onCreate
to onDestroy so you can
see what's going on.
– Also use is methods to
see what mode it's in.
Notifications additions
• Notifications have added compatibility with
android auto (which still works on wear).
– Allows for remoteinput
– Has the notification been read
– Has the notification been deleted
– How many notifications are there.
Android Auto
• Add this to your androidmanifest.xml inside the between
<application> tags, before the <activity>
– <meta-data android:name=
"com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
• Where the xml file has the following lines:
<?xml version="1.0" encoding="utf-8"?>
<automotiveApp>
<uses name="notification"/>
</automotiveApp>
• Then Ensure that Message notifications are extended using
– NotificationCompat.Builder.extend(new CarExtender()...)
– This is just part of the notification build.
Notifying the app about notifications.
• For read and delete
– Basically the same idea
– Create an pentingintent
– Put the message id in the intent.
– Have a broadcast receiver
• The pentingintent will be sent to the receiver and you
know which notification it was, based on the id number.
Read example
• The Pendingintent
PendingIntent.getBroadcast(getActivity().getApplicationContext(),
NotificationNum,
new Intent()
.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
.setAction("edu.cs4730.notification3.ACTION_MESSAGE_READ")
.putExtra("conversation_id", NotificationNum),
PendingIntent.FLAG_UPDATE_CURRENT);
• Then as the notificaiton is being build
.setContentIntent(readPendingIntent)
• Delete uses
.setDeleteIntent(DeletePendingIntent):
Read example (2)
• Either declare a broadcast receiver static or dynamic
• private BroadcastReceiver mReadReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceiveRead");
int conversationId = intent.getIntExtra(CONVERSATION_ID, -1);
if (conversationId != -1) {
//now you know, do what?
}
}
};
• In onResume
registerReceiver(mReadReceiver, new
IntentFilter("edu.cs4730.notification3.ACTION_MESSAGE_READ"));
remoteInput
• basically the same idea, but far more complex
• Build a RemoteInput for receiving voice input in a Car
Notification or text input on
– devices that support text input (like devices on Android N and
above).
• Building a Pending Intent for the reply action to trigger
• Build an Android N compatible Remote Input enabled
action.
• Create the UnreadConversation builderand populate it with
the participant name, read and reply intents.
• Then in the notification builder, add it with the extend (and
carextender() for compatilibity).
– This is best all seen in the example code, instead of here.
remoteInput (2)
• Again, we need broadcast receiver for the
reply and the intentfilter (like read)
• In the receiver we can get the reply message
from the remoteinput intent and the message
id
• Finally, we need to update the notification
that we have received it, so we build a simple
notification, using the same id number.
Example
• notificationDemo3
– Show how to setup a read, delete, and reply for
notifcations.
– You may need to review notifications to under
some of what is going on.
References (notifications)
• https://developer.android.com/guide/topics/u
i/notifiers/notifications.html
• https://developer.android.com/about/version
s/nougat/android7.0.html#notification_enhancements
• https://github.com/googlesamples/androidMessagingService
• https://github.com/googlesamples/androidActiveNotifications/
Quick Setting Tiles
• When you need to it
fast basically
– Even when the screen is
locked!
• Three types
– Tap
– Dialog
– Launch an activity.
TileService
• Extend a tileservice
– Then you can override
– onTileAdded() called when tile is added.
– onStartListening() when tile is visible
– onStopListening () when tile is no longer visible.
– onTileRemoved() when tile is removed.
– onClick() when the tile is tapped.
TileService (2)
• onClick, etc
• We can now update the tile
Tile tile = getQsTile();
tile.setIcon(Icon.createWithResource(this,
R.drawable.cooltile_on));
tile.setLabel("Cool tile");
tile.setContentDescription("cool tile is On");
tile.setState(Tile.STATE_ACTIVE); // colored white
//Tile.STATE_INACTIVE will color it gray.
tile.updateTile(); //required to update the tile!
TileService (3)
• Each time on the methods is called, it will bind
to the service.
– You can NOT guarantee the service was running
before or values were keep.
– In the test code, it uses a preference to store a
value.
Dialog and Activity
• To show a dialog, create a dialog and then use
the builtin method, showDialog( …dialog…)
• To start an activity
– Create the intent for the activity and use
startActivityAndCollapse(intent).
Androidmanifest.xml
• Declare the Quick Setting service
<service
android:name=".QuickSettingsTapService"
android:icon="@drawable/cooltile_off"
android:label="Cool Tile Tap"
android:permission=
"android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action
android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
icon
• The icon should be a 24x24 vector graphic
solid color
• Since it only works on API 24+ you can use
the vector graphic builder built into studio for
the graphics.
– 3rd party can't use SVG for animated graphics.
Maybe in API 26.
References (Quick Settings)
• https://medium.com/googledevelopers/quick-settings-tilese3c22daf93a8#.q1z2hhur8
• https://plus.google.com/u/0/+AndroidDevelo
pers/posts/8rGs9FaHMZw?sfc=true
• https://developer.android.com/reference/and
roid/service/quicksettings/TileService.html
• https://github.com/googlecodelabs/androidn-quick-settings
Q&A