Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Oreo Behind Scenes

Android Oreo Behind Scenes

My talk Mobile Day 2017, The goal is show the most relevant features of android oreo.

Erik Jhordan Rey

October 31, 2017
Tweet

More Decks by Erik Jhordan Rey

Other Decks in Programming

Transcript

  1. Fonts ¬ Light 112 sp Regular 56 sp Thin 45

    sp Bold 34 sp Mono 24 sp Black 20 sp
  2. Lets you use fonts as resources. You can add the

    font file in the res/font/ folder to bundle fonts as resources. These fonts are compiled in your R file and to access a font resource, use @font/myfont, or R.font.myfont.
  3. Introduce support for APIs to request fonts from a provider

    application. The Downloadable Fonts feature offers the following benefits: • Reduces the APK size • Increases the app installation success rate • Improves the overall system health as multiple APKs can share the same font through a provider.
  4. Font Request Callback private fun getFontRequestCallback() = object : FontsContractCompat.FontRequestCallback()

    { override fun onTypefaceRetrieved(typeface: Typeface?) { super.onTypefaceRetrieved(typeface) text_font_disclaimer.typeface = typeface } override fun onTypefaceRequestFailed(reason: Int) { super.onTypefaceRequestFailed(reason) Log.e(FontsFragment::class.java.simpleName, "An Error Occurred: " + reason) } }
  5. The EmojiCompat support library aims to keep Android devices up

    to date with the latest emoji. • Prevents your app from showing missing emoji characters in the form of ☐ • Your app users do not need to wait for Android OS updates to get the latest emoji
  6. EmojiCompat identifies emoji for a given CharSequence, replaces them with

    EmojiSpans, if required, and finally renders the emoji glyphs. Note: backward-compatible emoji support on devices running Android 4.4 (API level 19) and higher
  7. EmojiCompat Regular Widgets Use EmojiCompat.get().process(text) to add EmojiSpans if any

    emoji are found. The code above should be inside of an implementation of InitCallback. Listen the initialization of EmojiCompat EmojiCompat.get().registerInitCallback(initCallback)
  8. class EmojiTextViewCallback constructor(regularTextView: TextView, val text: String) : EmojiCompat.InitCallback() {

    private val regularTextViewReference: WeakReference<TextView> = WeakReference(regularTextView) override fun onInitialized() { super.onInitialized() val regularTextView = regularTextViewReference.get() regularTextView!!.text = EmojiCompat.get().process(text) } override fun onFailed(throwable: Throwable?) { super.onFailed(throwable) throwable!!.printStackTrace() } } EmojiTextViewCallback
  9. Downloadable fonts The downloadable fonts configuration uses the Downloadable Fonts

    support library feature to download an emoji font Bundled fonts This package includes the font with the embedded metadata
  10. class YourApplication : Application() { override fun onCreate() { super.onCreate()

    val config: EmojiCompat.Config if (Constants.ENABLE_BUNDLED_EMOJI) { // bundled config = BundledEmojiCompatConfig(applicationContext) } else { // downloadable val fontRequest = FontRequest( Constants.PROVIDER_AUTHORITY, Constants.PROVIDER_PACKAGE, Constants.FONT_QUERY, R.array.com_google_android_gms_fonts_certs) config = FontRequestEmojiCompatConfig(this, fontRequest) .setReplaceAll(true) .setEmojiSpanIndicatorEnabled(false) .setEmojiSpanIndicatorColor(Color.MAGENTA) } EmojiCompat.init(config) } } Using EmojiCompat Bundled or Downloadable
  11. Allows you to instruct a TextView to let the text

    size expand or contract automatically to fill its layout based on the TextView's characteristics and boundaries. Autosizing There are three ways you can set up the autosizing of TextView: • Default • Granularity • Preset Sizes Note: The library provides support to Android 4.0 (API level 14) and higher. The android.support.v4.widget package contains the TextViewCompat.
  12. Default setting lets the autosizing of TextView scale uniformly on

    horizontal and vertical axes. <android.support.v7.widget.AppCompatTextView android:id="@+id/text_default" android:layout_width="match_parent" android:layout_height="100dp" android:text="@string/autosizing_default_disclaimer" app:autoSizeTextType="uniform"/> Default Provide AUTO_SIZE_TEXT_TYPE_NONE to turn off the autosizing feature or AUTO_SIZE_TEXT_TYPE_UNIFORM to scale the horizontal and the vertical axes uniformly.
  13. You can define a range of minimum and maximum text

    sizes and a dimension that specifies the size of each step. The TextView scales uniformly in a range between the minimum and maximum size attributes. Each increment occurs as per the step size set in the granularity attribute. <android.support.v7.widget.AppCompatTextView android:id="@+id/text_default" android:layout_width="match_parent" android:layout_height="100dp" android:text="@string/autosizing_granularity_disclaimer" app:autoSizeMaxTextSize="34sp" app:autoSizeMinTextSize="10sp" app:autoSizeStepGranularity="2sp" app:autoSizeTextType="uniform"/> Granularity
  14. Preset sizes lets you specify all the values that the

    TextView picks when automatically auto-sizing text. <android.support.v7.widget.AppCompatTextView android:id="@+id/text_default" android:layout_width="match_parent" android:layout_height="100dp" android:text="@string/autosizing_preset_sizes_disclaimer" app:autoSizePresetSizes="@array/autosize_text_sizes" app:autoSizeTextType="uniform"/> Preset Sizes <array name="autosize_text_sizes"> <item>10sp</item> <item>12sp</item> <item>20sp</item> <item>40sp</item> <item>100sp</item> </array>
  15. Adaptive launcher icons, which can display a variety of shapes

    across different device models. You can control the look of your adaptive launcher icon by defining 2 layers, consisting of a background and a foreground. You must provide icon layers as drawables without masks or background shadows around the outline of the icon. Adaptive Icons
  16. As of Android O, activities can launch in Picture-in-Picture (PiP)

    mode. PiP is a special type of multi-window mode <activity android:name=".home.HomeActivity" android:label="@string/app_name" android:supportsPictureInPicture="true"> … </activity> Picture in Picture
  17. private fun setPictureInPicture() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val

    pictureInPictureParamsBuilder = PictureInPictureParams.Builder() val aspectRatio = Rational(1200, 600) pictureInPictureParamsBuilder.setAspectRatio(aspectRatio).build() enterPictureInPictureMode(pictureInPictureParamsBuilder.build()) } } Picture in Picture Mode
  18. Handling UI during Picture in Picture override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean,

    newConfig: Configuration?) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig) if (isInPictureInPictureMode) { println("Picture-in-picture mode") } else { println("Restore the full-screen UI") } }
  19. • You want to target API level 27, you’ll need

    to support the behavior changes introduced in Android 8.0 Oreo, such as background execution limits, location limits, and others. • Once you publish an app with targetSdkVersion set to 23 or higher, you can't later publish a version of the app with a higher versionCode that targets 22 or lower. Google Play that target API level 27