Table of Contents......Page 4
The Book’s Structure......Page 46
Testing......Page 47
Advanced UI......Page 48
Data Storage and Retrieval......Page 49
Hardware and System Services......Page 50
Tuning Android Applications......Page 51
About the Updates......Page 52
Warescription......Page 53
About the APK Edition......Page 54
Book Bug Bounty......Page 55
Creative Commons and the Four-to-Free (42F) Guarantee......Page 56
Acknowledgments......Page 57
Programming Language......Page 60
Activities......Page 62
Widgets, Containers, and Resources......Page 63
Apps and Packages......Page 64
Types......Page 65
The Emulator......Page 66
OS Versions and API Levels......Page 67
Processes and Threads......Page 68
Don’t Be Scared......Page 69
Eclipse......Page 70
Yet Other Alternatives......Page 71
App Inventor......Page 72
App Generators......Page 73
But First, Some Notes About Android’s Emulator......Page 74
Step #1: Checking Your Hardware......Page 75
Step #3: Install Android Studio......Page 76
Step #4: Install the SDKs and Add-Ons......Page 78
Using SDK Manager and Updating Your Environment......Page 85
In Our Next Episode…......Page 86
Creating a New Project......Page 88
Copying a Project......Page 93
Starter Project Generators......Page 94
About Our Tutorial Project......Page 96
Step #1: Importing the Project......Page 97
Windows......Page 101
Step #3: Set Up the AVD......Page 102
Step #4: Set Up the Device......Page 109
Windows Update......Page 112
macOS and Linux......Page 113
Step #5: Running the Project......Page 114
In Our Next Episode…......Page 116
Navigating The Project Explorer......Page 118
Classic Project View......Page 119
Opening Files from the Explorer......Page 120
The Basics......Page 121
Build View......Page 122
SDK and AVD Managers......Page 124
Android Studio and Release Channels......Page 125
Visit the Trails!......Page 127
The Modules......Page 128
The Java......Page 129
The Build Instructions......Page 130
The App Directory......Page 131
The Source Sets......Page 132
What You Get Out Of It......Page 133
What is Gradle?......Page 134
What is Groovy?......Page 135
Direct Installation......Page 136
The gradlew Wrapper......Page 137
Versions of Gradle and the Android Gradle Plugin......Page 138
The Project-Level File......Page 139
buildscript......Page 140
The Module-Level Gradle File......Page 141
Introducing the Manifest......Page 142
Package Name and Application ID......Page 143
minSdkVersion and targetSdkVersion......Page 144
Other Gradle Items of Note......Page 145
An Application For Your Application......Page 146
Supporting Multiple Screens......Page 147
Learning More About Gradle......Page 148
Visit the Trails!......Page 149
Step #1: Supporting Screens......Page 150
Step #3: Ignoring Lint......Page 151
In Our Next Episode…......Page 153
String Theory......Page 154
Plain Strings......Page 155
Um, Wait, My Manifest Does Not Look Like That......Page 157
Styled Text......Page 158
Editing String Resources......Page 159
Multi-Locale Support......Page 160
Got the Picture?......Page 161
Some Notes About WebP......Page 163
Dimensions......Page 164
Editing Dimension Resources......Page 165
The Resource That Shall Not Be Named… Yet......Page 166
App Icons… And Everything Else......Page 168
Foreground Layer......Page 169
Legacy......Page 172
Using In Your Manifest......Page 174
Creating Other Icons with the Asset Studio......Page 175
Step #1: Changing the Name......Page 176
Step #2: Changing the Icon......Page 177
In Our Next Episode…......Page 182
What Are Widgets?......Page 184
What Are Containers?......Page 186
The Absolute Positioning Anti-Pattern......Page 187
The Theme of This Section: Themes......Page 188
In the Beginning, There Was “Theme”, And It Was Meh......Page 189
Holo, There!......Page 190
Doing More with Themes......Page 191
The Activity......Page 194
Dissecting the Activity......Page 195
What Is an XML-Based Layout?......Page 196
Why Use XML-Based Layouts?......Page 198
Using Layouts from Java......Page 199
Widgets and Attributes......Page 200
The Curious Case of the Cast......Page 201
Size......Page 202
Introducing the Graphical Layout Editor......Page 203
Palette......Page 204
Preview......Page 205
Blueprint......Page 206
Upper Left Toolbar......Page 207
Component Tree......Page 208
Attributes......Page 209
Text Tab......Page 211
And Now, Some Notes About the Book’s Sample Projects......Page 212
Assigning Labels......Page 213
Android Studio Graphical Layout Editor......Page 214
Editing the Text......Page 215
Editing the ID......Page 216
Notable TextView Attributes......Page 217
A Commanding Button......Page 218
Tracking Button Clicks......Page 220
Fleeting Images......Page 221
Android Studio Graphical Layout Editor......Page 222
Scaling Images......Page 224
Fields of Green. Or Other Colors.......Page 227
Notable EditText Attributes......Page 229
Padding......Page 230
Colors......Page 231
Useful Methods......Page 232
Visit the Trails!......Page 233
Debugging Your App......Page 234
Logcat in Android Studio......Page 235
The Case of the Confounding Class Cast......Page 236
Point Break......Page 237
Introducing the Sampler App......Page 238
RTL and Your Layouts......Page 239
Orientation......Page 240
Weight......Page 241
Android Studio Graphical Layout Editor......Page 242
The XML......Page 244
Android Studio Graphical Layout Editor......Page 246
Example: Stacked-Percent......Page 247
The XML......Page 248
Android Studio Graphical Layout Editor......Page 249
Example: URL Dialog......Page 250
The XML......Page 251
Android Studio Graphical Layout Editor......Page 253
The XML......Page 262
Android Studio Graphical Layout Editor......Page 264
The Problem......Page 265
Positions Relative to Container......Page 266
Positions Relative to Other Widgets......Page 267
Android Studio Graphical Layout Editor......Page 268
The XML......Page 269
Android Studio Graphical Layout Editor......Page 270
Example: URL Dialog......Page 272
Example: Overlap......Page 274
Putting Cells in Rows......Page 276
Non-Row Children of TableLayout......Page 277
Stretch, Shrink, and Collapse......Page 278
Example: A Bigger Form......Page 279
Example: URL Dialog......Page 281
Hey, What About ConstraintLayout?......Page 282
Turning Back to RTL......Page 283
Just a Box to Check......Page 286
Android Studio Graphical Layout Editor......Page 289
Don’t Like Checkboxes? How About Toggles or Switches?......Page 290
Turn the Radio Up......Page 294
Scrollwork......Page 297
Framing the Scene......Page 301
Visit the Trails!......Page 302
Step #1: Creating a New Layout Resource......Page 304
Step #2: Defining the UI......Page 305
In Our Next Episode…......Page 309
GUI Building, Continued......Page 310
Including Includes......Page 311
Preview of Coming Attractions......Page 313
AdapterViews and Adapters......Page 314
Using ArrayAdapter......Page 315
Lists of Naughty and Nice......Page 316
Choice Modes......Page 319
Clicks versus Selections, Revisited......Page 321
Spin Control......Page 322
Grid Your Lions (Or Something Like That…)......Page 326
Fields: Now With 35% Less Typing!......Page 331
Step #0: Get Things Set Up Simply......Page 336
Step #1: Design Your Row......Page 337
Step #3: Override the Constructor and getView()......Page 338
Optimizing with the ViewHolder Pattern......Page 340
Dealing with Multiple Row Layouts......Page 343
Visit the Trails!......Page 344
Role of WebView......Page 346
Adding the Widget......Page 347
Loading Content Via a URL......Page 348
Supporting JavaScript......Page 350
Alternatives for Loading Content......Page 351
Listening for Events......Page 352
Addressing the Link/Redirect Behavior......Page 355
Safe Browsing......Page 357
Visit the Trails!......Page 358
Styles: DIY DRY......Page 360
Where to Apply a Style......Page 362
Inheriting a Style......Page 363
The Possible Values......Page 364
What Happens If You Have No Theme......Page 365
Android Studio’s Theme Editor......Page 366
What’s a Dependency?......Page 372
Dependency Scopes......Page 373
Depending on a Local JAR......Page 374
Major Library Families from Google......Page 375
Configure the Repositories......Page 376
Identify the Dependencies and Versions......Page 377
Add the Dependencies......Page 378
About the Names......Page 379
Choosing a Version......Page 380
Attaching It To Your Project......Page 381
Step #1: Getting Rid of Existing Cruft......Page 384
Step #2: Requesting New Dependencies......Page 385
In Our Next Episode…......Page 387
Drag-and-Drop GUI Builders......Page 388
Performance......Page 389
Getting ConstraintLayout......Page 390
Using a ConstraintLayout......Page 391
The XML......Page 392
The Android Studio Graphical Layout Editor......Page 394
Basic Anchoring, Dual Axis......Page 400
Playing the Percentages......Page 403
Converting Existing Layouts......Page 405
Visit the Trails!......Page 407
AdapterView and its Discontents......Page 408
Enter RecyclerView......Page 409
The Dependency......Page 410
A RecyclerViewActivity......Page 411
The LayoutManager......Page 412
The Adapter......Page 413
The ViewHolder......Page 415
What’s Missing?......Page 417
CardView......Page 418
DividerItemDecoration......Page 421
DIY Decorators......Page 422
Handling Click Events......Page 425
Responding to Clicks......Page 426
Option #1: Translucent Selector on Top......Page 428
Option #2: Background Selector......Page 430
Option #3: Controlled Ripple Emanation Point......Page 431
Visit the Trails!......Page 432
Android 1.x/2.x......Page 434
Android 3.0-4.1, Tablets......Page 435
Android 4.0-4.4, Phones......Page 437
Android 4.2-4.4, Tablets......Page 438
Android 5.0+......Page 440
Your Action Bar Options......Page 441
A Quick Note About Toasts......Page 442
Setting the Target......Page 443
Defining the Resource......Page 445
A Quick Note About Android Studio......Page 446
Responding to Events......Page 447
The Rest of the Sample Activity......Page 448
MENU Key, We Hardly Knew Ye......Page 455
Action Bars, Live in Living Color!......Page 456
Color Resources......Page 457
Applying the Theme......Page 458
The Results......Page 459
Restoring the Icon (Sort Of)......Page 460
Action Bar Style Generator......Page 461
Designing the Scheme......Page 462
Implementing the Scheme......Page 464
Visit the Trails!......Page 466
Getting the Artwork......Page 468
Android Studio Vector Asset Wizard......Page 469
Using the Artwork......Page 472
VectorDrawableCompat......Page 473
Gradle Configuration......Page 474
Use in Java......Page 475
Step #1: Adding Some Icons......Page 480
Step #2: Defining Some Options......Page 482
Step #3: Loading and Responding to Our Options......Page 485
Step #4: Supporting Older Devices......Page 486
Step #5: Trying It Out......Page 488
In Our Next Episode…......Page 489
When Processes Are Created......Page 490
BACK, HOME, and Your Process......Page 491
Termination......Page 492
You and Your Heap......Page 493
Activities and Their Lifecycles......Page 494
Defining the Class and Resources......Page 495
Populating the Class and Resources......Page 497
Augmenting the Manifest......Page 498
Warning! Contains Explicit Intents!......Page 499
Using Implicit Intents......Page 501
Where Do We Get These Uri Values?......Page 506
Extra! Extra!......Page 507
Pondering Parcelable......Page 509
Schroedinger’s Activity......Page 510
onCreate() and onDestroy()......Page 511
onPause() and onResume()......Page 512
When Activities Die......Page 513
Walking Through the Lifecycle......Page 514
Recycling Activities......Page 517
Application: Transcending the Activity......Page 518
The Case of the Invisible Activity......Page 519
Step #1: Creating the Stub Activity Class and Manifest Entry......Page 522
Step #2: Launching Our Activity......Page 524
In Our Next Episode…......Page 525
What?......Page 526
WHY?!?!?......Page 527
Screen Sizes......Page 528
Where You Get Your Fragments From......Page 529
The Fragment Layout......Page 530
The Fragment Class......Page 531
The Activity Layout......Page 532
The Activity Class......Page 533
The Fragment Lifecycle Methods......Page 534
onAttach() Versus onAttach()......Page 535
The ListFragment Class......Page 536
The Activity Class......Page 537
Fragments and the Action Bar......Page 539
Step #1: Create a SimpleContentFragment......Page 542
Step #2: Examining SimpleContentFragment......Page 544
In Our Next Episode…......Page 545
Pieces of a Pager......Page 546
The Activity......Page 547
The PagerAdapter......Page 548
The Fragment......Page 549
The Result......Page 551
Paging Other Stuff......Page 552
PagerTitleStrip and PagerTabStrip......Page 553
Revisiting the Containers Sampler......Page 556
The Data......Page 557
The Fragment......Page 559
The Activity......Page 560
The PagerAdapter......Page 561
Visit the Trails!......Page 562
Step #1: Add a ViewPager to the Layout......Page 564
Step #2: Creating a ContentsAdapter......Page 565
Step #3: Setting Up the ViewPager......Page 566
In Our Next Episode…......Page 569
What’s a Configuration? And How Do They Change?......Page 570
Configurations and Resource Sets......Page 571
Screen Size and Orientation......Page 572
The Modern: Developer-Defined Buckets......Page 573
About That API Level......Page 574
Coping with Complexity......Page 575
Choosing The Right Resource......Page 576
Scenario #2: Disparate Resource Set Categories......Page 577
Scenario #5: Screen Density......Page 578
Scenario #6: Screen Sizes......Page 579
Use Case: Themes by API Level......Page 580
Destroy and Recreate the Activity......Page 582
Retain Some Widget State......Page 583
State Saving Scenarios......Page 584
Retain Your Fragments......Page 585
Add to the Bundle......Page 592
Fragments and a Bundle......Page 594
onRetainNonConfigurationInstance()......Page 595
DIY......Page 597
Blocking Rotations......Page 599
And Now, a Word From the Android Project View......Page 600
Configuration Challenges......Page 601
Multi-Locale Support......Page 602
Screen Zoom/Dynamic Density......Page 603
Basic Tinting Options......Page 608
Official Google-Approved Colors......Page 613
The Main Application Thread......Page 614
The Theory......Page 616
The Stages of AsyncTask......Page 617
A Sample Task......Page 618
The Fragment and its AsyncTask......Page 619
The Activity and the Results......Page 623
Where Not to Use AsyncTask......Page 624
About the AsyncTask Thread Pool......Page 625
Alternatives to AsyncTask......Page 626
Event Buses......Page 628
What Is an Event Bus?......Page 629
Requesting the Artifact......Page 630
Defining Events......Page 631
Posting Events......Page 632
Receiving Events......Page 633
The Activity......Page 635
Visit the Trails!......Page 637
Requesting Permissions......Page 638
What Are Some Common Permissions, and What Do They Defend?......Page 639
How Do I Request a Permission?......Page 640
Installing Through SDK Tools......Page 641
Installing from the Play Store, Android 6.0+......Page 642
Installing by Other Means, Android 5.1 and Older......Page 643
Name......Page 644
Normal......Page 645
Maximum SDK Version......Page 646
New Permissions in Old Applications......Page 647
What Permissions Are Affected By This?......Page 648
How Do I Know If I Have Permission?......Page 649
How Do I Ask the User For Permission?......Page 652
When Do I Not Ask the User For Permission?......Page 656
What Do I Do If the User Says “No”?......Page 657
What Do I Do If the User Says “No, And Please Stop Asking”?......Page 658
What Happens When My App Has a Lower Target SDK Version?......Page 659
Should I Be Using PermissionChecker?......Page 660
Examining the Protocol......Page 661
Requesting the Permission......Page 662
Handling the Result......Page 663
Dealing with (Configuration) Change......Page 664
Raw Resources......Page 666
Assets......Page 667
Internal vs. External......Page 668
Working with Internal Storage......Page 669
Where to Write......Page 677
Relevant Permissions......Page 678
Letting the User See Your Files......Page 681
Removable Storage......Page 683
Multiple User Accounts......Page 684
Linux Filesystems: You Sync, You Win......Page 685
StrictMode: Avoiding Janky Code......Page 687
Mounting as a Drive......Page 689
Browsing Files Via Android Studio......Page 690
Push and Pull for External Storage......Page 694
Run-As for Internal Storage......Page 695
XML Parsing Options......Page 696
Using Files with Implicit Intents......Page 697
Visit the Trails!......Page 698
Step #1: Adding Some Content......Page 700
Step #2: Using SimpleContentFragment......Page 701
Step #3: Launching Our Activities, For Real This Time......Page 702
Step #4: Getting a Bit More Material......Page 703
Step #5: Seeing the Results......Page 705
In Our Next Episode…......Page 707
Step #1: Adding a Book......Page 708
Step #2: Creating a ModelFragment......Page 709
Step #3: Defining Our Model......Page 710
Step #5: Defining Our Event......Page 712
Step #6: Loading Our Model......Page 713
Step #7: Registering for Events......Page 716
Step #8: Adapting the Content......Page 717
Step #9: Showing the Content When Loaded......Page 718
Step #10: Attaching our ModelFragment......Page 719
Step #11: Showing the Content After a Configuration Change......Page 720
Step #12: Setting Up StrictMode......Page 721
In Our Next Episode…......Page 722
Getting What You Want......Page 724
Collecting Preferences with PreferenceFragment......Page 725
Showing the Current Values......Page 726
Defining Your Preferences......Page 729
Creating Your PreferenceFragment......Page 730
The Results......Page 731
Types of Preferences......Page 734
EditTextPreference......Page 735
RingtonePreference......Page 736
ListPreference and MultiSelectListPreference......Page 737
Step #1: Defining the Preference XML Files......Page 742
Step #2: Creating Our Preference Activity......Page 746
Step #4: Launching the Preference Activity......Page 747
Step #5: Loading the Preferences......Page 750
Step #6: Saving the Last-Read Position......Page 754
Step #7: Restoring the Last-Read Position......Page 755
Step #8: Keeping the Screen On......Page 756
In Our Next Episode…......Page 758
Introducing SQLite......Page 760
Start with a Helper......Page 761
Employing Your Helper......Page 765
Getting Data Out......Page 766
Your Query Options......Page 767
Using the Cursor Manually......Page 768
Introducing CursorAdapter......Page 769
Getting Data Out, Asynchronously......Page 771
The Primary Option: execSQL()......Page 773
Alternative Options......Page 774
Asynchronous CRUD and UI Updates......Page 775
Setting Transaction Bounds......Page 778
Visit the Trails!......Page 779
Step #1: Adding a DatabaseHelper......Page 782
Step #2: Examining DatabaseHelper......Page 783
Step #3: Creating a NoteFragment......Page 784
Step #5: Creating the NoteActivity......Page 785
Step #6: Examining NoteActivity......Page 786
Step #7: Add Notes to the Action Bar......Page 787
Step #8: Defining a NoteLoadedEvent......Page 789
Step #9: Loading a Note from the Database......Page 790
Step #10: Loading the Note Into the Fragment......Page 791
Step #11: Updating the Database......Page 792
Step #12: Saving the Note......Page 793
Step #13: Adding a Delete Action Bar Item......Page 795
Step #14: Closing the NoteFragment When Deleted......Page 797
In Our Next Episode…......Page 803
DIY HTTP......Page 804
Creating Your Data Model......Page 805
A Thread for Loading......Page 807
A Fragment for Questions......Page 809
An Activity for Orchestration......Page 812
What Android Brings to the Table......Page 813
What About HttpClient?......Page 814
Using Third-Party Libraries......Page 815
Using HTTP Client Libraries......Page 816
OkHttp......Page 817
Retrofit......Page 819
Creating the Interface......Page 820
Making the Request......Page 822
Downloading and Installing Picasso......Page 824
Updating the Model......Page 825
Requesting the Images......Page 826
The Rest of the Story......Page 827
Volley......Page 828
Making a Manager......Page 829
Requesting JSON......Page 831
Requesting Images......Page 834
Visit the Trails......Page 837
Pieces of Intents......Page 838
Intent Routing......Page 839
Responding to Implicit Intents......Page 840
Requesting Implicit Intents......Page 843
One Match......Page 844
The Chooser Override......Page 845
Direct Share Targets......Page 847
ShareActionProvider......Page 848
Practice Safe Content Resolution......Page 851
Receiving a Broadcast: In an Activity......Page 854
Receiving a Broadcast: Via the Manifest......Page 855
Getting Into the Stopped State......Page 856
At Boot Time......Page 857
On Battery State Changes......Page 859
Sticky Broadcasts and the Battery......Page 864
Battery and the Emulator......Page 865
The Order of Things......Page 866
Keeping It Local......Page 867
Visit the Trails!......Page 868
Step #1: Adding a ShareActionProvider......Page 870
Step #2: Sharing the Note......Page 871
Step #3: Testing the Result......Page 874
In Our Next Episode…......Page 877
Why Services?......Page 878
The Service Class......Page 879
Lifecycle Methods......Page 880
Manifest Entry......Page 881
Sending Commands with startService()......Page 882
Binding to Services......Page 883
The Service Implementation......Page 884
Using the Service......Page 886
The Power of the PendingIntent......Page 887
How Do We Execute the PendingIntent?......Page 888
Why Not Just Pass the Intent?......Page 889
Broadcast Intents......Page 890
Messenger......Page 891
The Design......Page 892
Using the Service......Page 893
The Service Implementation......Page 895
Receiving the Broadcast......Page 897
Limitation: Time......Page 898
JobIntentService......Page 899
Services and Configuration Changes......Page 903
Scenario #2: Android Terminates Your Process......Page 904
Background Service Limitations......Page 905
What Happens?......Page 906
What Are the Alternatives?......Page 908
Step #1: Adding a Stub DownloadCheckService......Page 910
Step #2: Tying the Service Into the Action Bar......Page 911
Step #4: Defining Our JSON......Page 913
Step #5: Defining Our Retrofit Interface......Page 914
Step #6: Retrieving Our JSON Via Retrofit......Page 915
Step #7: Downloading the Update......Page 917
Step #8: Unpacking the Update......Page 918
Step #9: Using the Update......Page 921
In Our Next Episode…......Page 926
Step #1: Creating Our Layouts......Page 928
Step #3: Opening the Sidebar......Page 933
Step #4: Loading Content Into the Sidebar......Page 934
Step #5: Removing Content From the Sidebar......Page 937
Think Forwards, Not Backwards......Page 944
A Target-Rich Environment......Page 946
Lint: It’s Not Just For Belly Buttons......Page 947
Avoid the New on the Old......Page 948
@TargetAPI......Page 949
Resources......Page 950
Components......Page 951
Keeping Track of Changes......Page 952
What is a System Service?......Page 954
What System Services Are There?......Page 955
…From the Standpoint of Developers?......Page 958
Android Pay / Google Wallet......Page 959
Google Analytics......Page 960
Google Cast......Page 961
Google Cloud Messaging......Page 962
Google Location Services......Page 963
Google Mobile Vision......Page 964
Adding Play Services to Your Project......Page 965
Dealing with Runtime Permissions......Page 966
Detecting If We Have Permission......Page 967
Requesting Permissions......Page 968
Dealing with Configuration Changes......Page 969
Initializing the GoogleApiClient......Page 970
Connecting and Disconnecting......Page 972
Questions. Sometimes, With Answers.......Page 976
Heading to the Source......Page 977
Creating a Library Module......Page 980
Library Modules and the Manifest......Page 983
Library Modules and Transitive Dependencies......Page 984
Limitations of Library Modules......Page 985
Key Build-Related Tasks......Page 986
Results......Page 989
Objectives of the Project Structure......Page 990
Source Sets......Page 991
Product Flavors......Page 992
Build Variants......Page 993
Source Sets......Page 994
build.gradle Settings......Page 995
Order of Precedence......Page 997
Adding Product Flavors and Getting Build Variants......Page 998
Scoping Your Splits......Page 1000
Requesting Density Splits......Page 1001
The Build Variants View......Page 1002
The Android Project View......Page 1003
Flavors, Build Types, and the Project Structure Dialog......Page 1004
Manifest Scenarios......Page 1006
App Manifest and Product Flavors......Page 1007
Markers and Selectors......Page 1008
Placeholders......Page 1009
Viewing Merged Manifests in Android Studio......Page 1010
Basic Merger Rules......Page 1011
Example #1: Manifest Attributes......Page 1012
Example #2: Additional Permissions......Page 1014
Example #3: Additional Components......Page 1015
Example #4: Intent Filter......Page 1016
uses-sdk......Page 1017
Markers and Selectors......Page 1018
Employing Placeholders......Page 1021
Role of Code Signing......Page 1026
Synchronizing Your Debug Signing Key......Page 1027
Manually......Page 1028
Android Studio......Page 1030
Gradle......Page 1033
Two Types of Key Security......Page 1035
Versioning......Page 1036
Logging......Page 1037
Testing......Page 1038
EULA......Page 1039
Customizing a Gradle Build......Page 1042
Code Generation......Page 1043
Create a Java Module......Page 1044
Apply the Groovy Plugin......Page 1046
Add a Groovy Source Directory and Package......Page 1047
Implement a Plugin......Page 1048
Using Both Groovy and Java......Page 1049
Adding Plugin Metadata......Page 1050
Distributing the Plugin......Page 1051
Using the Plugin......Page 1054
Trying the Sample App......Page 1056
Integrating with the Android Plugin......Page 1057
Validating the Environment......Page 1058
Splicing Your Task Into the Build......Page 1059
Configuring the Plugin......Page 1061
What Drives the Custom Code?......Page 1062
Other Project Files......Page 1063
Java as Poetry......Page 1064
Writing a Code Generation Plugin......Page 1065
Designing the Output......Page 1066
Crafting the Plugin......Page 1067
Writing the Task......Page 1070
Generating Java Code......Page 1072
Using the Generated Code......Page 1076
It’s build.gradle All The Way Down......Page 1078
gradle.properties......Page 1079
Custom Properties Files......Page 1080
Auto-Incrementing the versionCode......Page 1081
Adding to BuildConfig......Page 1083
Instrumentation Tests and Unit Tests......Page 1088
Where Your Test Code Runs......Page 1089
The Test Methods......Page 1090
Setup and Teardown......Page 1091
Testing Activities......Page 1093
Testing Context-Dependent Code......Page 1094
The Test Runner......Page 1096
Android Studio Ad-Hoc Test Runs......Page 1097
Android Studio Run Configuration......Page 1098
Examining the Test Results......Page 1102
Testing and Runtime Permissions......Page 1103
The Android Test Orchestrator......Page 1104
Adding a Shot of Espresso......Page 1108
Finding Widgets via Hamcrest Matchers......Page 1111
Performing Actions......Page 1112
Stock Assertions......Page 1113
Custom Assertions......Page 1114
Starting and Recording......Page 1117
What You Get......Page 1120
Testing AdapterView......Page 1121
Testing RecyclerView......Page 1122
Intent Testing......Page 1125
Testing Activity Re-Creation and Configuration Changes......Page 1128
Waiting for the World to Change......Page 1131
What’s an IdlingResource?......Page 1132
Using an IdlingResource......Page 1133
Implementing a Custom IdlingResource......Page 1136
Why Choose UI Automator Over Alternatives?......Page 1138
Gradle and Android Studio Settings......Page 1139
Performing Device-Level Actions......Page 1140
Getting Proxies for Widgets and Containers......Page 1141
UiObject, UiCollection, and UiScrollable......Page 1142
Asserting Conditions......Page 1144
Using the UI Automator Viewer......Page 1145
Who Tests the Testers?......Page 1148
Branch Coverage......Page 1149
Loop Coverage......Page 1150
Coverage and Your Instrumentation Tests......Page 1151
Prerequisites......Page 1156
Scenario: Clean Architecture......Page 1157
Setting Up Unit Testing......Page 1158
Adding the Test JUnit Dependency......Page 1159
Adding the Test Package......Page 1160
Writing a Test Case......Page 1161
Running Unit Tests......Page 1164
From Android Studio......Page 1165
From the Command Line......Page 1167
Why Are We Being Mean to Android?......Page 1168
Why Mockito?......Page 1169
Setting Up Mockito......Page 1170
Using Mockito in Unit Tests......Page 1171
Robolectric......Page 1176
Choosing an API Level......Page 1177
Writing Robolectric Tests......Page 1178
Running Robolectric Tests......Page 1180
OK, So, Why Bother?......Page 1181
Writing a MonkeyRunner Script......Page 1182
Monkeying Around......Page 1184
Prerequisites......Page 1190
The Basic Idea......Page 1191
Using Lambda Expressions......Page 1192
Replacing Listeners with Lambdas......Page 1193
Alternative: Method References......Page 1196
Life is But a Stream......Page 1198
Action and Reaction......Page 1199
A Rx For What Ails You......Page 1201
Adding the Dependency......Page 1202
Replacing the Loop......Page 1203
Be Your Own Stream......Page 1204
Removing the AsyncTask......Page 1206
observeOn()......Page 1210
subscribe()......Page 1211
Lambdas and Lifetimes......Page 1212
Streaming from a Resource......Page 1213
Error Handling......Page 1214
Transmogrification......Page 1215
Rx-Enabled Libraries......Page 1216
What About LiveData?......Page 1218
What’s a Notification?......Page 1222
Notifications and Channels......Page 1225
Showing a Simple Notification......Page 1226
The Activity-Or-Notification Scenario......Page 1231
Big (and Rich) Notifications......Page 1232
The Styles......Page 1233
The Sample......Page 1235
The Results......Page 1238
Isn’t “Foreground Service” an Oxymoron?......Page 1239
Putting Your Service in the Foreground......Page 1240
Disabled Notifications......Page 1242
Android 4.x......Page 1243
Android 5.0+......Page 1244
Android 8.0+......Page 1245
Being a Good Citizen......Page 1246
What You Do with Channels......Page 1247
Creating Channel Groups......Page 1248
Creating Channels......Page 1249
What the User Sees......Page 1251
Wear? There!......Page 1253
Simple Notification......Page 1254
“Big” Style and Action Button......Page 1256
Foreground Service......Page 1257
Stacking Notifications......Page 1258
…And the Passage of Time......Page 1263
Avoiding Wear......Page 1264
Pages......Page 1265
Wear-Only Actions......Page 1269
Voice Input......Page 1274
The Activity and Notification......Page 1275
The Receiver......Page 1277
The Results......Page 1279
Remote Input, On-Device......Page 1281
Notification Groups......Page 1286
Lockscreen Notifications......Page 1288
Private Notifications......Page 1291
A Visibility Sample......Page 1292
Priority, Importance, and Heads-Up Notifications......Page 1298
Specifying the Priority......Page 1299
Results on Older Devices......Page 1300
Requesting Full-Screen Output......Page 1301
Results on Android 3.0-4.4 Devices......Page 1302
Progress Notifications......Page 1303
Everything but the Icky Parts......Page 1304
The Interceptor......Page 1306
The ProgressResponseBody......Page 1308
Updating the Notification......Page 1310
What If We Had an Activity in the Foreground?......Page 1311
The Notification Layout......Page 1312
Using the Layout......Page 1313
Life After Delete......Page 1315
Notifications and MessagingStyle......Page 1316
Sounds and Android 7.0......Page 1322
Auto-Timeout......Page 1323
Launcher Icon Badge......Page 1324
A History of Windows......Page 1328
What The User Sees......Page 1329
What Your Code Sees......Page 1331
Opting In......Page 1333
Configuring the Layout......Page 1334
Avoiding Stutter......Page 1336
Handling the Screen Size Transition......Page 1337
Parallel Processing......Page 1338
Split-Screen, HOME, and Your Activity......Page 1340
Forcing Your App Into Multi-Window/Multi-Instance......Page 1341
Using Sidecar......Page 1343
Choosing the Activity......Page 1344
Implementing the TileService......Page 1345
Forcing Activities to Resize......Page 1347
Supporting Legacy Proprietary Multi-Window......Page 1349
Playing with Freeform......Page 1352
The adb Setting......Page 1353
The Freecar App......Page 1356
Picture-in-Picture......Page 1359
Multi-Display Support......Page 1364
Guidelines......Page 1374
Barriers to Entry......Page 1378
Disclosing Your Bias......Page 1383
Centering Yourself......Page 1388
Keeping Things Proportional......Page 1392
Constraining Sizes......Page 1393
…of Children of the ConstraintLayout......Page 1394
…of the ConstraintLayout Itself......Page 1396
How Do We Set up a Chain?......Page 1398
Spread......Page 1399
Chains and Biases......Page 1400
Chains and Weights......Page 1401
What If We’re GONE?......Page 1402
Going in a Circle......Page 1403
Groups of Views… But Not ViewGroups......Page 1406
Nested Containers......Page 1410
Drag-and-Drop......Page 1411
GridLayout and the Android Support Package......Page 1412
Our Test App......Page 1413
Horizontal LinearLayout......Page 1416
Vertical LinearLayout......Page 1417
TableLayout......Page 1418
Implicit Rows and Columns......Page 1422
Row and Column Spans......Page 1424
DatePickerDialog and TimePickerDialog......Page 1430
Changes and Bugs......Page 1436
DialogFragments......Page 1437
DialogFragment: The Other Flavor......Page 1442
Dialogs: Modal, Not Blocking......Page 1443
Prerequisites......Page 1444
Multiple Row Types, and Self Inflation......Page 1445
The Basic BaseAdapter......Page 1446
Requesting Multiple Row Types......Page 1448
Creating and Recycling the Rows......Page 1449
Choice Modes and the Activated Style......Page 1451
Custom Mutable Row Contents......Page 1453
From Head To Toe......Page 1458
Enter RecyclerView......Page 1461
Action Modes......Page 1462
A Matter of Context......Page 1463
Choosing Your Trigger......Page 1464
Starting the Action Mode......Page 1465
onCreateActionMode()......Page 1466
onActionItemClicked()......Page 1467
Multiple-Choice-Modal Action Modes......Page 1469
Long-Click To Initiate an Action Mode......Page 1473
Handling the Long Click......Page 1474
Addressing Configuration Changes......Page 1475
Resetting the Choice Mode......Page 1476
The Results......Page 1477
Action Layouts......Page 1480
Action Views and Action Providers......Page 1481
SearchView… in the Menu Resource......Page 1482
SearchView… in the Action Bar Configuration......Page 1483
onQueryTextChange()......Page 1485
onClose()......Page 1486
Floating Action Bars......Page 1488
Basic Toolbar Mechanics......Page 1492
Use Case: Split Action Bar......Page 1493
Enabling Stock Android 4.x Behavior......Page 1494
Adding the Toolbar......Page 1495
Using the Layout......Page 1496
Populating and Using the Toolbar......Page 1497
Results and Changes......Page 1498
Use Case #2: Replacement Action Bar......Page 1499
Ummmm… Why?......Page 1502
Materialistic......Page 1503
Forced......Page 1504
Your Build Settings......Page 1505
Your Menu Resources......Page 1506
Your Activity and Fragments......Page 1507
Your Callback Methods......Page 1510
Your Results......Page 1511
Tinting......Page 1512
Switch Backport......Page 1514
Overlay......Page 1515
SearchView......Page 1516
ShareActionProvider......Page 1518
Toolbar and AppCompat......Page 1519
To Material, or Not to Material......Page 1522
Prerequisites......Page 1526
Adding the Library… and What Comes With It......Page 1527
Introducing CWAC-CrossPort......Page 1528
Alerts......Page 1529
Action Bars. No, Not Those Action Bars.......Page 1531
CWAC-CrossPort......Page 1533
Absolutely FABulous......Page 1536
FAB Mechanics......Page 1537
Coordinating with Snackbars......Page 1540
CWAC-CrossPort......Page 1542
Third-Party FABs… and FAMs......Page 1543
Material Tabs with TabLayout......Page 1544
CWAC-CrossPort......Page 1550
Floating Labels......Page 1551
Using TextInputLayout......Page 1552
CWAC-CrossPort......Page 1558
Third-Party Floating Labels......Page 1559
What About Cursors?......Page 1564
Grids......Page 1571
A Simple Grid......Page 1572
Choosing the Number of Columns......Page 1574
A List with Headers......Page 1575
A Grid-Style Table......Page 1579
Mutable Row Contents......Page 1588
Switching to the Activated Style......Page 1596
But, What About Single-Choice?......Page 1600
Keyboard Navigation......Page 1605
Action Modes......Page 1610
Updating Existing Contents......Page 1616
Adding and Removing Items......Page 1621
The Gradle Change......Page 1622
The RecyclerViewFragment......Page 1623
The SortedList......Page 1624
The IconicAdapter......Page 1625
The SortedList.Callback......Page 1626
The AsyncTask......Page 1628
Other Bits of Goodness......Page 1630
Animating the Deltas......Page 1631
Model......Page 1632
The Menu......Page 1634
The Diff-ing......Page 1635
The SimpleCallback......Page 1637
The Callback......Page 1639
The Adapter......Page 1640
The Rx Stuff......Page 1641
Expandable Rows......Page 1642
RecyclerView as Pager......Page 1648
Adding the Dependency......Page 1649
Populating the Pages......Page 1650
Dealing with Recycling......Page 1653
Dealing with Configuration Changes......Page 1654
Using SnapHelper......Page 1656
Adding Tabs......Page 1658
Transcript Mode......Page 1662
Friends with Benefits......Page 1666
JavaScript Calling Java: addJavascriptInterface()......Page 1667
Java Calling JavaScript: loadUrl() and evaluateJavascript()......Page 1673
Java Calling JavaScript: WebMessage......Page 1675
JavaScript Calling Java: WebMessagePort......Page 1677
Settings, Preferences, and Options (Oh, My!)......Page 1681
Rogue JavaScript Risks......Page 1682
The Same-Origin Policy Bug......Page 1683
Multi-Process Mode......Page 1685
Honors Cleartext Traffic Setting......Page 1686
Chrome Custom Tabs......Page 1688
Keyboards, Hard and Soft......Page 1690
Tailored To Your Needs......Page 1691
Tell Android Where It Can Go......Page 1696
Fitting In......Page 1699
Jane, Stop This Crazy Thing!......Page 1701
Love The One You’re With......Page 1702
Yeah, But Do We Really Have To Do This in Java?......Page 1706
Here a Glyph, There a Glyph......Page 1707
Auto-Sizing TextView......Page 1708
Justified Text......Page 1713
The Span Concept......Page 1716
Available Spans......Page 1717
String Resource......Page 1718
HTML......Page 1719
Editing Rich Text......Page 1720
Manipulating Rich Text......Page 1725
ViewPropertyAnimator......Page 1728
Native Implementation......Page 1729
Backport Via NineOldAndroids......Page 1732
The Foundation: Value and Object Animators......Page 1733
Animating Custom Types......Page 1736
Hardware Acceleration......Page 1737
The Three-Fragment Problem......Page 1738
The ThreePaneLayout......Page 1739
Using the ThreePaneLayout......Page 1742
The Results......Page 1746
The Backport......Page 1748
The Problems......Page 1749
It’s Not Just For Toons Anymore......Page 1750
Imagining a Sliding Panel......Page 1751
Introducing SlidingPanel......Page 1752
Fading To Black. Or Some Other Color.......Page 1755
Using XML Animations......Page 1756
When It’s All Said And Done......Page 1757
Hit The Accelerator......Page 1758
Animate. Set. Match.......Page 1759
Active Animations......Page 1760
Prerequisites......Page 1762
No Qualifier: Just Say “WTF?”......Page 1763
AnimationDrawable......Page 1764
Animated GIF Conversion......Page 1767
StateListDrawable......Page 1768
ColorStateList......Page 1769
LayerDrawable......Page 1771
TransitionDrawable......Page 1772
LevelListDrawable......Page 1773
ScaleDrawable and ClipDrawable......Page 1774
Scaling......Page 1775
Seeing It In Action......Page 1776
InsetDrawable......Page 1784
ShapeDrawable......Page 1785
......Page 1787
......Page 1788
......Page 1790
......Page 1792
Put a Ring On It......Page 1793
BitmapDrawable......Page 1796
Composite Drawables......Page 1805
A Stitch In Time Saves Nine......Page 1808
Padding and the Box......Page 1809
Stretch Zones......Page 1810
Tooling......Page 1811
Using Nine-Patch Images......Page 1813
Prerequisites......Page 1820
Where You Can Use Maps V2......Page 1821
Your Signing Key Fingerprint(s)......Page 1822
Your API Key......Page 1824
The Dependency......Page 1825
The Project Setup and the Manifest......Page 1826
The Play Services Detection......Page 1827
The Fragment and Activity......Page 1828
Playing with the Map......Page 1830
Placing Simple Markers......Page 1833
Seeing All the Markers......Page 1837
Flattening and Rotating Markers......Page 1840
Sprucing Up Your “Info Windows”......Page 1844
Images and Your Info Window......Page 1849
Setting the Marker Icon......Page 1855
Responding to Taps......Page 1857
Dragging Markers......Page 1858
The “Final” Limitations......Page 1861
Finding the User......Page 1864
Dealing with the Runtime Permission......Page 1865
Tracking If We Should Follow the User......Page 1867
Showing the My-Location Layer......Page 1868
Supplying Location Data......Page 1869
Drawing Lines and Areas......Page 1870
Gestures and Controls......Page 1873
Tracking Camera Changes......Page 1874
Maps in Fragments and Pagers......Page 1877
Animating Marker Movement......Page 1882
Problem #2: The Earth Is Not Flat (Really!)......Page 1883
Seeing This in Action......Page 1884
Honoring Traffic Rules, Like “Drive Only On Streets”......Page 1888
Taking a Snapshot of a Map......Page 1889
SupportMapFragment vs. MapView......Page 1890
About That AbstractMapActivity Class…......Page 1891
Helper Libraries for Maps V2......Page 1895
Problems with Maps V2 Deployment......Page 1899
Mapping Alternatives......Page 1900
Pick Your Poison......Page 1902
Colors, Mixed How You Like Them......Page 1904
The Layout......Page 1905
The Attributes......Page 1907
Constructor Flavors......Page 1908
Using the Attributes......Page 1909
Saving the State......Page 1911
The Rest of the Functionality......Page 1912
Seeing It In Use......Page 1913
ReverseChronometer: Simply a Custom Subclass......Page 1914
AspectLockedFrameLayout: A Custom Container......Page 1921
Mirror and MirroringFrameLayout: Draw It Yourself......Page 1924
MirroringFrameLayout......Page 1926
Mirror......Page 1930
Usage and Results......Page 1933
Limitations......Page 1936
Introducing PreferenceActivity......Page 1938
Defining Your Preference Headers......Page 1939
Creating Your PreferenceActivity......Page 1940
The Results......Page 1942
Intents for Headers or Preferences......Page 1943
Option #1: Do Not Define the Headers......Page 1944
Option #2: Go Directly to the Fragment......Page 1948
Dependent Preferences......Page 1949
Nested Screens......Page 1952
Listening to Preference Changes......Page 1955
Defaults, and Defaults......Page 1958
Dynamic ListPreference Contents......Page 1959
Dealing with External Changes to Preferences......Page 1964
Preferences in Device Settings App......Page 1966
Custom Preference Storage......Page 1968
Your Dialog, Chocolate-Covered......Page 1974
Basic AlertDialog Setup......Page 1976
Handling Color Changes......Page 1977
Preferring Your Own Preferences, Preferably......Page 1978
Creating the View......Page 1979
Getting the Default Value......Page 1980
Closing the Dialog......Page 1981
Using the Preference......Page 1982
Progress Bars......Page 1986
Circular vs. Horizontal......Page 1987
Specific vs. Indeterminate......Page 1989
Primary vs. Secondary......Page 1990
ProgressBar and Threads......Page 1991
Changing the Progress Colors......Page 1994
Changing the Indeterminate Animation......Page 2001
Progress Dialogs......Page 2004
Title Bar and Action Bar Progress Indicators......Page 2006
Direct Progress Indication......Page 2008
Hosting ViewPager in a Fragment......Page 2010
Pages and the Action Bar......Page 2012
ViewPagers and Scrollable Contents......Page 2014
Showing More Pages......Page 2015
The Grid Pattern......Page 2019
Columns for Large, Pages for Small......Page 2020
The Layouts......Page 2021
The Activity......Page 2022
The Results......Page 2024
The Limitations......Page 2025
Prerequisites......Page 2026
Controlling the Focus......Page 2027
Requesting (or Abandoning) Focus......Page 2028
Focus Ordering......Page 2034
Scrolling and Focusing Do Not Mix......Page 2036
Accessibility and Focus......Page 2037
Labels......Page 2038
Font Selection and Size......Page 2039
Widget Size......Page 2045
Enhanced Keyboard Support......Page 2046
Audio and Haptics......Page 2047
Accessibility Beyond Impairment......Page 2048
Android 1.x/2.x......Page 2050
Android 4.0+......Page 2051
Offering a Delayed Timeout......Page 2063
Standard Intents as Event Bus......Page 2068
LocalBroadcastManager as Event Bus......Page 2069
A Simple LocalBroadcastManager Sample......Page 2070
The Activity......Page 2072
The PollReceiver......Page 2073
ScheduledService and Sending Events......Page 2074
EventLogFragment and Receiving Events......Page 2075
Reference, Not Value......Page 2079
greenrobot’s EventBus 3.x......Page 2080
Basic Usage and Sample App......Page 2081
ScheduledService and Sending Events......Page 2082
EventLogFragment and Receiving Events......Page 2083
Handling the “Nobody’s Home” Scenario......Page 2084
Hey, What About Otto?......Page 2085
First, Some Terminology......Page 2088
Recent Tasks......Page 2089
Overview Screen......Page 2090
Android 3.x/4.x......Page 2091
Android 5.x......Page 2092
What Do Task Killers Do?......Page 2094
Why Use One?......Page 2095
A Canary for the Task’s Coal Mine......Page 2096
The Default User Experience......Page 2098
Resuming from the Overview Screen......Page 2099
Starting Another App......Page 2100
When Tasks are Created......Page 2102
Task Affinities......Page 2103
When Tasks (and Processes) are Resumed......Page 2104
What’s Up with onDestroy()?......Page 2105
Reusing an Activity......Page 2106
Forcing a Clean Task......Page 2108
Starting a Cleared Task Yourself......Page 2109
Launching an App Into a New Task......Page 2110
The Invisible Activity......Page 2112
Reparenting Tasks......Page 2113
The Self-Destructing Activity......Page 2117
The Hidden Task......Page 2119
The State of Your State......Page 2120
Where You Return To......Page 2121
When You Should Do This......Page 2122
android:documentLaunchMode......Page 2123
Capping the Number of Documents......Page 2124
Other Task-Related Activity Properties......Page 2125
launchMode......Page 2126
singleTop......Page 2127
singleTask......Page 2129
singleInstance......Page 2132
finishAndRemoveTask()......Page 2134
setTaskDescription()......Page 2135
The Assist API (“Now On Tap”)......Page 2136
Screenshot......Page 2137
Other Data......Page 2138
Assist-Specific Data......Page 2139
Per-Activity......Page 2140
Per-View......Page 2141
Password Fields......Page 2142
NoAssistFrameLayout......Page 2143
Blocking Assist as a User......Page 2145
Implementing Your Own Assistant......Page 2147
A Stub VoiceInteractionService......Page 2148
A Trivial VoiceInteractionSessionService......Page 2149
Basic Setup......Page 2150
onHandleScreenshot()......Page 2151
onHandleAssist()......Page 2152
Determining the Active Assistant......Page 2158
Leading the User to Make an Assistant Change......Page 2159
The Autofill API......Page 2162
The Pieces of the Puzzle......Page 2163
The User Experience......Page 2164
While Completing a Form......Page 2165
What Data Gets Disclosed......Page 2166
Blocking Autofill as a User......Page 2180
Supporting Autofill with Standard Widgets......Page 2182
Identifying Roles via Hints......Page 2183
Indicating Importance......Page 2184
Dealing with Dynamic Changes......Page 2185
Security Requirements of Autofill Services......Page 2186
Google’s Response......Page 2187
Partition the Dataset......Page 2188
Only Give Data Back to the App That Supplied It......Page 2189
What Google’s Advice Does Not Solve......Page 2190
Prerequisites......Page 2192
The What, Now?......Page 2193
Setting Up the Toolchain......Page 2194
Augmenting the Layout… and the Model......Page 2195
Applying the Binding......Page 2197
Creating the Binding......Page 2198
Retrieving Widgets from the Binding......Page 2199
The Extended Layout Resource......Page 2200
Imports and Statics......Page 2201
Variables......Page 2203
Stuff You Won’t Find in Java......Page 2204
Handling String Literals......Page 2205
Other Caveats......Page 2206
Observables and Updating the Binding......Page 2207
ObservableField......Page 2208
Custom Observables......Page 2209
The Limitations of Earlier Examples......Page 2211
Questions vs. Items......Page 2212
Keeping Score (and the ID)......Page 2213
Refreshing the Data......Page 2216
Two-Way Binding......Page 2220
Views, Setters, and Binding......Page 2223
Synthetic Properties......Page 2224
BindingAdapters, and the Picasso Scenario......Page 2226
Event Handling......Page 2231
Tying Events to Methods Directly......Page 2232
Tying Events to Methods via Lambda Expressions......Page 2233
Converting to a RecyclerView/CardView UI......Page 2234
What About the Event Listeners?......Page 2238
Type Converters......Page 2239
Chained Expressions......Page 2241
Extended Include Syntax......Page 2243
Custom Observables......Page 2244
Bindable Properties......Page 2245
Notifying About Intrinsic Changes......Page 2247
Thinking Outside the Box......Page 2248
The Scope of Drag and Drop......Page 2250
Where Are We Dropping To?......Page 2251
…From a View......Page 2252
The Drag Event Listener......Page 2253
ACTION_DRAG_ENTERED......Page 2254
ACTION_DROP......Page 2255
The Landscape Layout......Page 2256
Registering as Drop Targets......Page 2258
Starting to Drag......Page 2259
Reacting to Drag Events......Page 2260
The Result......Page 2262
Drag-and-Drop, Between Apps......Page 2265
The Custom Shadow......Page 2266
The StreamProvider......Page 2267
The Drag Request......Page 2269
The Layout......Page 2271
The Drag Event......Page 2273
The Results......Page 2276
Intra-App Cross-Window Drag-and-Drop......Page 2278
Dragging and Dropping Simple Stuff......Page 2281
The Layout......Page 2282
Showing and Hiding the Action......Page 2284
Handling Drag Events......Page 2286
Nested Drop Targets......Page 2288
The Behavior Prior to Android 7.0......Page 2290
Android 7.0 Behavior......Page 2293
Getting Inclusive on Android 7.0......Page 2295
Pondering Accessibility......Page 2297
Offering Keyboard Shortcuts......Page 2300
Action Bar Item Shortcuts......Page 2301
Arbitrary Hotkeys......Page 2302
Android 7.0 Keyboard Shortcuts Helper......Page 2304
Custom Copy-and-Paste......Page 2310
The Problem......Page 2314
A requestFocus BindingAdapter......Page 2315
Using the BindingAdapter......Page 2317
Offering Mouse Context Menus......Page 2318
Hover Events......Page 2324
Detecting a Long-Enough Hover......Page 2327
What We Are Missing......Page 2329
Android 8.0+......Page 2330
Pointer Capture......Page 2332
The Criteria......Page 2334
How Complex is the PDF?......Page 2335
The Classic Solution: ACTION_VIEW......Page 2336
The Really Bad Idea: Google Docs......Page 2337
The Built-In Option: PdfRenderer......Page 2338
The RecyclerView......Page 2339
Getting the PDF......Page 2340
Adding the PdfRenderer......Page 2342
Showing the Pages......Page 2343
The Thunder Lizard Choice: PDF.js......Page 2346
The Native Approach: Pdfium......Page 2351
What To Choose?......Page 2355
App Widgets and Security......Page 2358
The Big Picture for a Small App Widget......Page 2359
The Manifest......Page 2360
The Metadata......Page 2362
The Layout......Page 2363
The BroadcastReceiver......Page 2364
The Result......Page 2366
Another and Another......Page 2367
Controlling Your (App Widget’s) Destiny......Page 2368
Android 1.x/2.x......Page 2369
Android 3.0+......Page 2370
Lockscreen Widgets......Page 2375
Preview Images......Page 2382
Being a Good Host......Page 2383
AdapterViews for App Widgets......Page 2386
Building Adapter-Based App Widgets......Page 2387
The AppWidgetProvider......Page 2388
The RemoteViewsService......Page 2390
The RemoteViewsFactory......Page 2392
The Rest of the Story......Page 2395
The Results......Page 2397
What Slices Contain......Page 2402
Slice Sizes......Page 2403
Setting Up a Slice......Page 2405
The Gradle Settings......Page 2406
The SliceProvider......Page 2407
The Manifest Entry......Page 2408
Binding a Slice......Page 2409
Trying a Slice......Page 2412
Running Your Slice in the Viewer......Page 2413
The User Flow......Page 2415
The SliceAction......Page 2416
Simple Rows......Page 2417
Headers......Page 2418
Range Rows and Input Range Rows......Page 2419
Hey, What About…?......Page 2420
Small and Large Modes......Page 2421
Asynchronous Slices......Page 2422
Dealing with No Data......Page 2423
Loading the Data......Page 2425
Using the Data......Page 2428
Warning: Make No Rendering Assumptions......Page 2429
Other Slice Viewer Features......Page 2431
Why?......Page 2434
How?......Page 2435
The Simple Way: SliceView......Page 2436
The Fully-Custom Way: Slice......Page 2441
The Catch: Discovering Slices......Page 2442
Slices… from the Web?......Page 2443
Securing Yourself......Page 2444
Enforcing Permissions via the Manifest......Page 2445
Requiring Standard System Permissions......Page 2446
Firmware-Only Permissions......Page 2447
The Custom Permission Vulnerability......Page 2448
Scenarios......Page 2449
The Application SDK Case (A, Then C)......Page 2450
The Peer Apps Case, Part One (A, Then B)......Page 2451
The Downgraded-Level Malware Case (B, Then A, Again)......Page 2452
Behavior Analysis......Page 2453
Android 5.0’s “Fix”......Page 2454
Mitigation Using PermissionUtils......Page 2455
Custom Dangerous Permissions, and Android 6.0......Page 2456
Finding the Available Permissions......Page 2460
PackageManager and Permission Groups......Page 2461
The Activity and ViewPager......Page 2465
The Tab Content......Page 2467
A Bit More Rx......Page 2468
The Results......Page 2469
Android Tablets and Multiple User Accounts......Page 2472
Primary User......Page 2473
Secondary User......Page 2475
Restricted Profile......Page 2476
Determining What the User Can Do......Page 2478
Enabling Custom Restrictions......Page 2481
Option #1: RestrictionEntry List......Page 2482
Option #2: Custom Restriction Activity......Page 2485
What the Primary User Sees......Page 2487
Finding Out the Current Restrictions......Page 2490
Implicit Intents May Go “Boom”......Page 2493
Is the Device Secure?......Page 2496
The KeyguardManager Approach......Page 2497
Reconfirming the User......Page 2501
Using RxFingerprint......Page 2504
Directly......Page 2510
RxFingerprint......Page 2511
OK, So What Was That All About?......Page 2516
Limitations of Fingerprint-Based Encryption......Page 2517
Prerequisites......Page 2518
KeyStore......Page 2519
Creating a Key......Page 2520
Tying the Key to Device Authentication......Page 2521
Learning More About Your Key......Page 2522
Introducing RxKeyBodega......Page 2523
RxKeyBodega Client......Page 2524
RxKeyBodega Implementation......Page 2526
Escaping If Device Is Insecure......Page 2529
Starting Decryption in onCreate()......Page 2530
RxKeyBodega Client......Page 2531
RxKeyBodega Implementation......Page 2532
Time-Limited Device Authentication......Page 2533
Encrypting Passphrases......Page 2537
A NoteRepository......Page 2538
RxPassphrase......Page 2541
Using the NoteRepository and RxPassphrase......Page 2544
A Key(Store) Limitation......Page 2546
Public Key Validation......Page 2548
Checking Yourself......Page 2549
Checking Arbitrary Other Apps......Page 2550
The Easy Solution: SignatureUtils......Page 2551
The UI Structure......Page 2552
Listing the Packages......Page 2554
Decoding the Key......Page 2556
Dumping the Key......Page 2559
The Result......Page 2561
Choosing Your Signing Keysize......Page 2562
Avoiding Accidental APIs......Page 2563
The Chooser Bug......Page 2564
The ContentProvider Behavior Change......Page 2566
Secure Your Output Extras......Page 2567
Notifications......Page 2568
Classic Tapjacking......Page 2569
The Problem......Page 2570
The Problem......Page 2571
How to Address This......Page 2572
The Problem......Page 2574
How to Address This......Page 2575
The Problem with the Solution......Page 2576
Using FLAG_SECURE......Page 2577
Using a Content Provider......Page 2582
Getting a Handle......Page 2583
Makin’ Queries......Page 2584
Adapting to the Circumstances......Page 2586
Give and Take......Page 2587
Retrieving Metadata......Page 2589
Building Content Providers......Page 2590
First, Some Dissection......Page 2591
Implementing the Database-Style API......Page 2592
Implement query()......Page 2593
Implement getType()......Page 2594
Update the Manifest......Page 2595
Add Notify-On-Change Support......Page 2596
Serving the Stream......Page 2597
Issues with Content Providers......Page 2598
Step #1: Create a Provider Class......Page 2600
onCreate()......Page 2601
query()......Page 2603
update()......Page 2604
getType()......Page 2605
Step #3: Declare the “Columns”......Page 2606
Step #4: Update the Manifest......Page 2607
onCreate()......Page 2608
openFile()......Page 2609
getType()......Page 2611
insert(), update(), and delete()......Page 2612
query() and getFileName()......Page 2613
The Manifest......Page 2615
Using this Provider......Page 2616
Step #1: Mark the Provider as Not Exported......Page 2617
Step #2: Grant Access to the Uri......Page 2618
The Stream Provider......Page 2619
The Revised openFile()......Page 2620
The Transfer......Page 2621
FileProvider......Page 2622
The Sources of Files......Page 2623
The Manifest Entry......Page 2624
The Legacy Compatibility......Page 2625
The Usage......Page 2626
StreamProvider......Page 2627
Metadata Elements......Page 2629
I Can Haz Uri?......Page 2631
Uri Prefixes......Page 2632
Supporting Other Stream Locations......Page 2633
Supporting Other Stream Strategies......Page 2634
Adding Support for insert() and update()......Page 2635
Introducing the Loader Framework......Page 2638
LoaderCallbacks......Page 2639
Using CursorLoader......Page 2640
… the Data Behind the Loader Changes?......Page 2642
Writing a Custom Loader......Page 2643
Implementing QuestionsLoader......Page 2644
Loading the Questions......Page 2645
Delivering Results......Page 2646
Starting, Stopping, and Resetting......Page 2647
Using QuestionsLoader......Page 2648
Considering the Loader Contract......Page 2649
Prerequisites......Page 2650
A Look Back at Android 1.6......Page 2651
Picking a Contact......Page 2652
Viewing a Contact......Page 2653
Contact Permissions......Page 2654
The UI......Page 2655
Loading the Data......Page 2657
Showing the Results......Page 2659
Makin’ Contacts......Page 2662
Looking at the CallLog......Page 2666
Contents of CallLog.Calls......Page 2667
Showing the CallLog......Page 2668
The CalendarContract Provider......Page 2672
Do You Have Room on Your Calendar?......Page 2673
The Permission......Page 2674
The CursorLoader......Page 2675
The RecyclerView......Page 2676
The Results......Page 2679
Penciling In an Event......Page 2680
Prerequisites......Page 2682
Indexed Media......Page 2683
MediaStore and “Other” External Storage......Page 2684
How Do I Retrieve Video from the MediaStore?......Page 2685
Requesting Permission......Page 2686
Querying for Video......Page 2687
Showing the Thumbnails......Page 2689
Playing the Selection......Page 2690
The Results......Page 2691
The Storage Access… What?......Page 2692
Picking How to Pick (a Peck of Pickled Pepper Photos)......Page 2694
Opening a Document......Page 2695
Why We Want Things To Be Openable......Page 2699
Update......Page 2700
CWAC-Document and DocumentFileCompat......Page 2701
Getting Durable Access......Page 2702
Dice? Where?!?......Page 2711
We Want Words!......Page 2712
The Results......Page 2713
Loading Our Words......Page 2714
Getting More Words......Page 2719
Other Fiddly Bits......Page 2722
Getting a Tree......Page 2725
The Objective: a Preference for Storage......Page 2726
What the User Sees......Page 2727
The Preference XML......Page 2733
Populating the Preference......Page 2734
Choosing a Tree......Page 2735
The Preference XML......Page 2738
Populating the Preference......Page 2739
Choosing a Volume......Page 2741
Scoped Directory Access Bug......Page 2743
Web Links for Documents......Page 2744
Document Settings Activity......Page 2745
Have Your Content, and Provide it Too......Page 2746
Root and Document IDs......Page 2748
The Activity......Page 2749
The Manifest......Page 2750
onCreate()......Page 2751
queryRoots()......Page 2752
queryChildDocuments()......Page 2754
queryDocument()......Page 2757
openDocument()......Page 2758
The Results......Page 2761
Create......Page 2764
Update......Page 2765
Change Notification......Page 2766
Recent Documents......Page 2767
Other Flags......Page 2768
Encrypted Storage......Page 2770
Obtaining SQLCipher......Page 2771
Using SQLCipher......Page 2772
SQLCipher Limitations......Page 2773
Passwords and Sessions......Page 2774
Upgrading to Encryption......Page 2775
Dealing with the Version 3.0.x Upgrade......Page 2778
Multi-Factor Authentication......Page 2780
SQLCipher for Android and Performance......Page 2781
Encryption via Custom SharedPreferences......Page 2782
Encryption via Custom Preference UI and Accessors......Page 2783
IOCipher......Page 2784
Packing a Database To Go......Page 2786
Create and Pack the Database......Page 2787
Upgrading Sans Java......Page 2788
Limitations......Page 2789
Full-Text Indexing......Page 2790
FTS3 and FTS4......Page 2791
Creating a Full-Text Indexed Table......Page 2792
Populating a Full-Text Indexed Table......Page 2793
Querying a Full-Text Indexed Table......Page 2794
Adding a ModelFragment......Page 2795
Adding a SearchView......Page 2799
The Results......Page 2802
Getting Snippets......Page 2805
Prerequisites......Page 2808
What Google Thinks “Backup” Means......Page 2809
What IT Thinks “Backup” Means......Page 2810
Implementing IT-Style Backup......Page 2811
Choosing the Backup Scope......Page 2813
Choosing a Backup Trigger......Page 2814
Generating the Dataset......Page 2815
Transmitting the Dataset......Page 2820
Initiating a Restore......Page 2823
Starting the Restore Activity......Page 2828
Downloading and Restoring the Dataset......Page 2830
Trying This Yourself… With a Little Help from Ol’ Blue Eyes......Page 2834
What to Bootstrap?......Page 2836
Configuring the Backup......Page 2837
Testing the Backup and Restore Steps......Page 2840
Bootstrap Backup on Android 2.2-5.1......Page 2843
Boosting Backup Security......Page 2844
Securing Transmission of the Dataset......Page 2845
Data Versioning......Page 2846
Data Synchronization......Page 2847
Basic SSL Operation......Page 2852
Self-Signed Certificate......Page 2853
Custom Certificate Authority......Page 2854
Ignoring Domain Names......Page 2855
Introducing Network Security Configuration......Page 2856
The CWAC-NetSecurity Backport......Page 2857
Pinning the Certificate Authority......Page 2859
Unusual Certificate Authorities......Page 2864
Pinning the Certificate......Page 2865
Self-Signed Certificates......Page 2866
Blocking Cleartext Traffic......Page 2868
Other SSL Strengthening Techniques......Page 2869
Certificate Memorizing......Page 2870
Watching for Encryption......Page 2871
Using Alternative Network Security Configuration XML......Page 2872
Adding the TrustManager......Page 2873
Debugging Certificate Chains......Page 2874
NetCipher......Page 2875
A Quick Primer on Tor......Page 2876
What NetCipher Provides......Page 2877
Choose an HTTP Stack......Page 2878
Set up OrbotHelper......Page 2879
Choose and Create a Builder......Page 2880
Seeing the Builder in Action......Page 2881
Common Configuration Methods......Page 2885
StrongConnectionBuilder......Page 2889
StrongHttpClientBuilder......Page 2891
StrongVolleyQueueBuilder......Page 2892
StrongOkHttpClientBuilder......Page 2894
Downloading Files......Page 2896
The Permissions......Page 2897
Requesting the Download......Page 2899
Keeping Track of Download Status......Page 2901
Download Broadcasts......Page 2903
What the User Sees......Page 2905
Limitations......Page 2909
Data Saver......Page 2910
Get Your Media On......Page 2914
MediaPlayer for Audio......Page 2915
SoundPool......Page 2920
ToneGenerator......Page 2921
Recording by Intent......Page 2924
Recording to Files......Page 2927
Setting Up the Stream......Page 2932
Changes in Recording Configuration......Page 2934
Requesting the Microphone......Page 2935
Moving Pictures......Page 2936
Being Specific About Features......Page 2942
Setting the Theme......Page 2943
Adding the FileProvider......Page 2944
Taking a Picture......Page 2946
Viewing the Photo......Page 2948
The Caveats......Page 2949
Permissions and Third-Party Camera Apps......Page 2950
EXIF Tags and Camera Images......Page 2951
EXIF Tags and Android......Page 2952
You Spin (Photos) Right Round......Page 2953
And Then, There Are the Bugs......Page 2957
Scanning with ZXing......Page 2958
Videos: Letting the Camera App Do It......Page 2959
Using a Camera Library......Page 2962
CameraKit-Android......Page 2963
Adding the Preview Display......Page 2964
Integrating with the Lifecycle......Page 2966
Recording a Video......Page 2968
Adding the Dependency......Page 2969
Adding the Preview Display......Page 2970
Configuring the Fotoapparat......Page 2971
Taking a Picture......Page 2973
Directly Working with the Camera......Page 2974
A Tale of Two APIs......Page 2976
android.hardware.camera2......Page 2977
Performing Basic Camera Operations......Page 2978
Features......Page 2979
Other Camera Features......Page 2980
android.hardware.Camera......Page 2981
android.hardware.camera2......Page 2982
android.hardware.Camera......Page 2983
android.hardware.camera2......Page 2984
Setting Up a Preview Surface......Page 2986
TextureView for the Camera......Page 2987
android.hardware.Camera......Page 2988
android.hardware.camera2......Page 2990
android.hardware.Camera......Page 2993
android.hardware.camera2......Page 2994
Using MediaRecorder......Page 2999
Configuring the Still Camera......Page 3001
android.hardware.camera2......Page 3002
android.hardware.Camera......Page 3003
android.hardware.camera2......Page 3004
android.hardware.Camera......Page 3005
android.hardware.camera2......Page 3007
Choosing a Preview Size......Page 3009
Previews and Aspect Ratios......Page 3010
Picture Orientation......Page 3011
Camera Peeking Attacks......Page 3012
Media......Page 3016
android.support.v7.media......Page 3017
Working with Routes......Page 3018
Registering a Callback......Page 3019
The Basic Project and Dependencies......Page 3020
The Menu Resource......Page 3021
Initializing the MediaRouter and Selector......Page 3022
Registering for Route Changes......Page 3024
The Results......Page 3025
Live Audio Routes......Page 3026
Live Video Routes......Page 3029
Remote Playback Routes......Page 3031
Using Remote Playback Routes......Page 3035
Setting Up MediaRouteActionProvider......Page 3036
The Rest of the User Interface......Page 3038
Connecting and Session Management......Page 3040
What’s a Session?......Page 3041
Starting a Session......Page 3042
About the Action Bar......Page 3043
Session IDs......Page 3044
Playing......Page 3045
Stopping, and a Bug......Page 3048
The Workaround: RunnableSessionActionCallback......Page 3049
Pausing and Resuming......Page 3051
Disconnecting......Page 3053
Other Remote Playback Features......Page 3054
A History of External Displays......Page 3056
What is a Presentation?......Page 3057
Playing with External Displays......Page 3058
Emulated......Page 3059
USB 3.1 Type C......Page 3062
Miracast......Page 3063
Detecting Displays......Page 3064
The Presentation Itself......Page 3065
Detecting the Displays......Page 3066
Showing and Hiding the Presentation......Page 3067
The Results......Page 3070
Getting a Little Help......Page 3071
Help When You Need It......Page 3074
Presentations and Configuration Changes......Page 3077
The Reuse Reality......Page 3078
The Context Conundrum......Page 3079
A PresentationFragment (and Subclasses)......Page 3080
Using PresentationFragment......Page 3085
Limits......Page 3088
Another Sample Project: Slides......Page 3089
The PagerAdapter......Page 3090
The PresentationFragment......Page 3092
The Activity......Page 3093
Setting Up the Pager......Page 3094
Controlling the Presentation......Page 3095
Offering an Action Bar......Page 3096
Presentations from a Service......Page 3098
Step #4: Build the View......Page 3099
Hey, What About Chromecast?......Page 3101
Here a Cast, There a Cast......Page 3104
What is Google Cast?......Page 3105
Your API Choices......Page 3106
The Receiver......Page 3107
Supported Media Types......Page 3108
Device Registration and Development Setup......Page 3109
The CastCompanionLibrary… Or Not......Page 3110
Developing Google Cast Apps......Page 3111
Prerequisites......Page 3112
Overscan......Page 3113
Navigation......Page 3114
Fonts......Page 3115
Colors......Page 3116
Where to Get Leanback......Page 3117
BrowseSupportFragment......Page 3118
Theme and Activity......Page 3119
Loading the Videos......Page 3122
Headers and Contents......Page 3126
Presenting the Presenters......Page 3128
Handling Clicks......Page 3131
The Results......Page 3133
Testing Your Theories......Page 3134
Putting the TVs All Together: Decktastic......Page 3136
Introducing Decktastic......Page 3137
Launcher UI......Page 3138
Presentation UI......Page 3140
The Presentation Format......Page 3141
PresoContents......Page 3143
PresoRoster......Page 3144
The Launcher Activity: LeanbackActivity......Page 3146
Manifest Entry......Page 3147
RosterFragment......Page 3148
PresoPresenter......Page 3151
Basic Setup......Page 3155
The ViewPager......Page 3157
Supporting the Direct-to-TV Scenario......Page 3159
Supporting External Displays......Page 3162
Supporting Chromecast and Remote Playback Devices......Page 3166
The Rest of the Story......Page 3171
Terminology......Page 3176
MediaRouteProvider......Page 3177
Communications Protocol......Page 3178
Defining the Supported Actions......Page 3179
Creating the Descriptors......Page 3181
Receiving the Actions......Page 3183
Play......Page 3185
Pause, Resume, and Stop......Page 3186
Get Status and Seek......Page 3187
Publishing the Controller......Page 3188
Consuming the MediaRouteProvider......Page 3189
Private Provider......Page 3190
Public Provider......Page 3193
Handling Other Actions/Protocols......Page 3194
Custom Actions......Page 3195
Requesting Screenshots......Page 3196
Asking for Permission......Page 3197
Setting Up the Notification......Page 3198
Capturing a Screenshot......Page 3202
The ImageTransmogrifier......Page 3203
Saving the Screenshot......Page 3206
Requesting Media Projection… Without a GUI......Page 3207
Implementing a Control Channel… Without a GUI......Page 3208
Using the Control Channel… From the Command Line......Page 3215
Starting the Recording......Page 3216
Deciding How Big Our Recording Is......Page 3217
Actually Recording Stuff......Page 3221
Stopping the Recording......Page 3223
Usage Notes......Page 3224
Scenarios......Page 3226
Wake Up… Or Not?......Page 3227
Inexact… Or Not?......Page 3228
A Simple Example......Page 3229
The Five set…() Varieties......Page 3231
When to Schedule Alarms......Page 3233
After a Force-Stop......Page 3234
Back to the Main Application Thread......Page 3235
Return of the JobIntentService......Page 3236
Examining a Sample......Page 3237
How the Magic Works......Page 3240
Debugging Alarms......Page 3241
Android 7.0 and OnAlarmListener......Page 3244
Keeping the Screen On, UI-Style......Page 3248
The Role of the WakeLock......Page 3249
What WakefulIntentService Does......Page 3250
The Limitations of AlarmManager......Page 3252
Employing JobScheduler......Page 3253
Defining and Scheduling the Job......Page 3254
Implementing the Job......Page 3257
Wiring in the Job Service......Page 3260
The Rest of the Sample......Page 3261
Idle Jobs......Page 3268
Other JobScheduler Features......Page 3269
Periodic Work, Across Device Versions......Page 3270
The Job......Page 3271
The JobCreator......Page 3272
The Application......Page 3273
Scheduling Jobs......Page 3274
App Standby Mode......Page 3275
…AndAllowWhileIdle()......Page 3276
The Whitelist......Page 3277
setAlarmClock()......Page 3286
Scheduling Content Monitoring......Page 3287
Enqueuing the Work......Page 3292
Working Off the Queue......Page 3293
Testing the Service......Page 3296
Work Limits......Page 3298
Prerequisites......Page 3302
Finding Yourself......Page 3303
Getting Permission......Page 3305
Modelling the Weather......Page 3306
Requesting Updates......Page 3307
Implementing the Listener......Page 3310
Displaying the Results......Page 3311
Are We There Yet? Are We There Yet? Are We There Yet?......Page 3313
Alternative Flavors of Updates......Page 3314
Locations and Features......Page 3316
Why Use the Fused Location Provider?......Page 3318
Adding Dependencies......Page 3319
Confirm Locations Are Available......Page 3320
Request the Location......Page 3325
Using the Location......Page 3326
Defining a Location Request......Page 3327
Requesting Location Updates......Page 3328
Working with the Clipboard......Page 3332
ClipData and Drag-and-Drop......Page 3337
Monitoring the Clipboard......Page 3338
The Android 4.3 Clipboard Bug......Page 3339
If Your App Pastes to the Clipboard…......Page 3340
Prerequisites......Page 3342
You Make the Call!......Page 3343
No, Really, You Make the Call!......Page 3346
Prerequisites......Page 3348
Sending Via the SMS Client......Page 3349
Inside the Sender Sample......Page 3350
Monitoring and Receiving SMS......Page 3356
The Undocumented, Unsupported, Pre-Android 4.4 Way......Page 3357
The Android 4.4+ Way: Monitoring SMS......Page 3358
Receiving the Broadcasts......Page 3360
Other Expectations......Page 3361
The Undocumented, Unsupported, Pre-Android 4.4 Way......Page 3363
Asking to Change the Default......Page 3364
SMS Tokens......Page 3365
What Is NFC?......Page 3372
To NDEF, Or Not to NDEF......Page 3373
NDEF Modalities......Page 3374
NDEF Structure and Android’s Translation......Page 3375
Some Tags Need to be Formatted......Page 3376
Tag and Device Compatibility......Page 3377
Getting a URL......Page 3378
Detecting a Tag......Page 3379
Reacting to a Tag......Page 3381
Creating the Byte Array......Page 3382
Writing to a Tag......Page 3384
Responding to a Tag......Page 3387
Mobile Devices are Mobile......Page 3388
Android Beam......Page 3389
The Fragment......Page 3390
Requesting the Beam......Page 3392
Sending the Beam......Page 3393
Receiving the Beam......Page 3394
The Scenarios......Page 3396
Beaming Files......Page 3397
Another Sample: SecretAgentMan......Page 3398
Configuration and Initialization......Page 3399
Writing to the Tag......Page 3400
Reading from the Tag......Page 3405
Beaming the Text......Page 3406
Beaming the File......Page 3407
Additional Resources......Page 3408
Objectives and Scope......Page 3410
The Metadata......Page 3411
The Manifest......Page 3412
The Receiver......Page 3413
The Demand for Device Domination......Page 3414
Going Into Lockdown......Page 3417
Mandating Quality of Security......Page 3424
Establishing Password Requirements......Page 3425
Password-Related Events......Page 3427
Getting Along with Others......Page 3429
The Sensor Abstraction Model......Page 3430
Considering Rates......Page 3431
Obtaining a SensorManager......Page 3432
Identifying a Sensor of Interest......Page 3433
Getting Sensor Events......Page 3434
Interpreting Sensor Events......Page 3436
Wiring Together the Sample......Page 3438
The Results......Page 3443
Batching Sensor Readings......Page 3444
Prerequisites......Page 3446
About the Sample App......Page 3447
Printing a Bitmap......Page 3448
Printing a URL......Page 3451
Limitations and Concerns......Page 3454
Printing a PDF File......Page 3455
Introducing ThreadedPrintDocumentAdapter......Page 3456
A PdfDocumentAdapter......Page 3459
Using PdfDocumentAdapter......Page 3463
Printing Using a Canvas......Page 3464
Print Jobs......Page 3466
Printing, Threads, and Services......Page 3467
HTML Generation......Page 3470
Writing the Report Template......Page 3471
Creating a Report Context......Page 3472
Printing the Report......Page 3473
PDF Generation Options......Page 3474
A Quick Bit of Scope......Page 3476
The User Experience......Page 3477
Bluetooth and Permissions......Page 3483
The Rx for Your Bluetooth......Page 3484
I Can Haz Bluetooth?......Page 3485
Getting the Paired Devices......Page 3488
Listing the Devices......Page 3490
Enabling Discoverability......Page 3491
Discovering Other Devices......Page 3492
Reacting to Discovery Results......Page 3493
Service Scaffolding......Page 3494
A Quick Word About MutableLiveData......Page 3495
Keeping the UI in the Loop......Page 3496
Services with Services......Page 3498
Reach Out and Touch Someone......Page 3499
Finding Out When We Should Connect......Page 3500
Connecting and Disconnecting......Page 3502
Getting Our Client Streams......Page 3503
Sending the Message......Page 3504
Processing the Request......Page 3505
Receiving the Response......Page 3506
Differences with Android Things......Page 3507
Filtering Out Devices......Page 3510
uses-feature......Page 3511
uses-library......Page 3512
Features......Page 3513
Dealing with Device Bugs......Page 3514
The Role of Parcelable......Page 3518
By Annotations......Page 3519
By Code Generator Sites and Tools......Page 3520
The Parcelable Interface......Page 3521
The CREATOR......Page 3523
By Hand, With a Little Bit of Help......Page 3524
The 1MB Limit......Page 3525
Pass-By-Value......Page 3526
Sharing Between Apps......Page 3527
Beware the PendingIntent......Page 3528
Manifest Modifications......Page 3534
Creating a Custom URL......Page 3536
Reacting to the Link......Page 3537
App Links......Page 3539
Setting Up the IntentFilter......Page 3540
Setting Up the JSON......Page 3541
Results......Page 3543
User Intervention......Page 3545
Testing Your Setup......Page 3547
Prerequisites......Page 3550
App Shortcuts, from the User’s POV......Page 3551
Ad-Hoc Requests......Page 3552
Alternatives......Page 3553
Identify the Destinations......Page 3554
Add Entry Points for Destination in Manifest......Page 3555
Write the XML......Page 3556
Add to the Manifest......Page 3557
Results......Page 3558
Disabling Manifest App Shortcuts......Page 3559
Offering Dynamic App Shortcuts......Page 3560
Ponder the IDs......Page 3563
Craft the Intent......Page 3564
Define the Shortcuts......Page 3566
Remove the Shortcuts......Page 3568
Grok the Other Verbs......Page 3569
Contemplate Update vs. Replace......Page 3570
Deal with Reality......Page 3571
Privacy, Security, and App Shortcuts......Page 3572
Asking Around......Page 3574
Preferred Activities......Page 3578
Finding Applications and Packages......Page 3584
Finding Components......Page 3585
Prerequisites......Page 3588
What the Client Does......Page 3589
A Binding Sample......Page 3590
Write the AIDL......Page 3595
Service From Afar......Page 3597
Service Names......Page 3598
Remote Services and Implicit Intents......Page 3599
The Service......Page 3600
The Client......Page 3601
Tightening Up the Security......Page 3603
Adding the Dependency......Page 3604
Adding the Signature Check: Client......Page 3605
Adding the Signature Check: Service......Page 3606
Servicing the Service......Page 3608
Callbacks via AIDL......Page 3609
Revising the Client......Page 3610
Revising the Service......Page 3611
Thinking About Security......Page 3612
The “Everlasting Service” Anti-Pattern......Page 3613
Just Looking For Some Elbow Room......Page 3616
Configuring Your App to Reside on External Storage......Page 3617
What the User Sees......Page 3619
What Your App Sees… When External Storage is Inaccessible......Page 3620
Android 6.0 and “Adoption” of Removable Storage......Page 3623
Using an Alias......Page 3626
Getting Meta (Data)......Page 3627
Direct Share......Page 3632
The ChooserTargetService......Page 3633
The Manifest Entries......Page 3636
The Results......Page 3637
But… I Got Nothin’!......Page 3640
Take the Shortcut......Page 3641
Implementing a Shortcut Provider......Page 3642
Using the Shortcuts......Page 3644
Integrating with Text Selection......Page 3648
Supporting ACTION_PROCESS_TEXT......Page 3651
The Extras......Page 3652
The Results (If Any)......Page 3654
Security......Page 3655
Blocking ACTION_PROCESS_TEXT......Page 3656
Quick Settings and TileService......Page 3659
The Manifest Entry......Page 3660
And, Of Course, Bugs......Page 3661
The Service......Page 3662
The User Experience......Page 3664
The Other Features and Limitations......Page 3667
Installing Packages......Page 3668
Deleting Packages......Page 3671
Detecting Changes in Packages......Page 3672
Project Structure......Page 3674
SDK Location......Page 3675
Project Settings......Page 3676
Properties......Page 3677
Flavors......Page 3679
Build Types......Page 3681
Dependencies......Page 3682
Translations Editor......Page 3685
Hardware Graphics Acceleration......Page 3692
Keyboard Behavior......Page 3693
Camera Options......Page 3695
Memory and Storage Configuration......Page 3696
Frames and Skins......Page 3697
The Emulator Sidebar......Page 3698
Power and Navigation Controls......Page 3699
Screenshots......Page 3703
Faking the Real World......Page 3704
Location......Page 3705
Network Status......Page 3706
Battery......Page 3707
Emulator Window Operations......Page 3708
Headless Operation......Page 3709
Prerequisites......Page 3710
Android Studio......Page 3711
What to Fix......Page 3712
Android Studio......Page 3713
Command Line......Page 3714
Support Annotations......Page 3717
Methods......Page 3718
ContentProviders......Page 3719
What Permissions Should I Annotate?......Page 3720
Type Roles, and the War on Enums......Page 3721
Resources......Page 3722
Custom Enum Replacement......Page 3723
Flags......Page 3725
Size......Page 3726
Ranges......Page 3727
Thread Validation......Page 3728
Other Annotations......Page 3729
Launching the Layout Inspector......Page 3730
Inspections and Captures......Page 3731
Prerequisites......Page 3734
Collecting from Android Studio......Page 3735
Screenshots......Page 3736
Collecting from the Command Line......Page 3738
Screenshots......Page 3739
Collecting from Another App......Page 3740
Tips and Tricks......Page 3741
This is the Droid That You Are Looking For......Page 3742
Playing with Permissions......Page 3743
Starting and Stopping Components......Page 3744
Changing Display Metrics......Page 3745
Basic Stetho Integration......Page 3748
Adding the Stetho Dependency......Page 3749
The Main Application......Page 3750
The Debug Application......Page 3752
Overriding the Application......Page 3753
Elements: View Hierarchy......Page 3756
Network: HTTP Requests......Page 3759
Screencast: Your UI, Mostly......Page 3761
Resources: In-Place Database CLI......Page 3762
Console: Example Environment via JavaScript......Page 3764
Hey, What About Sonar?......Page 3765
Getting Things Done......Page 3770
Not Far Enough in the Background......Page 3771
Playing with Speed......Page 3772
Prerequisites......Page 3774
Opening the Profiler......Page 3775
Manipulating the Profiler......Page 3776
Method Tracing......Page 3777
Debug Class......Page 3778
Displaying Trace Data......Page 3779
Interpreting Trace Data......Page 3780
Logging......Page 3782
UI “Jank” Measurement......Page 3783
Enabling Developer Options......Page 3784
Toggling on GPU Profiling......Page 3785
Collecting Data......Page 3786
Analyzing the Results......Page 3791
Using systrace......Page 3792
Enabling and Collecting a Trace: Command-Line......Page 3793
Collecting Traces on Android 9.0 Devices......Page 3795
Choosing the Trace Tags......Page 3797
Augmenting the Trace from Java......Page 3798
Viewing and Interpreting the Results......Page 3799
Prerequisites......Page 3802
Dalvik: Secure, Yes; Speedy, Not So Much......Page 3803
Porting......Page 3804
Cross-Platform Compatibility......Page 3805
Installing the NDK......Page 3806
Your C/C++ Code......Page 3807
Your Makefile......Page 3808
Building Your Library......Page 3810
Your Java and JNI Code......Page 3812
libhoudini and the NDK......Page 3816
Reduce CPU Utilization......Page 3818
Avoid Floating-Point Math......Page 3819
Support Hardware-Accelerated Graphics......Page 3820
Remote Bound Service......Page 3821
Remote OS Operation......Page 3822
Reduce Time on the Main Application Thread......Page 3823
Generate Less Garbage......Page 3824
Background Threads......Page 3825
Asynchronous BroadcastReceiver Operations......Page 3826
Saving SharedPreferences......Page 3829
Improve Throughput and Responsiveness......Page 3831
Set Thread Priority......Page 3832
Do the Work Some Other Time......Page 3833
The Case: ThreePaneDemoBC......Page 3834
Traceview......Page 3835
Overdraw......Page 3837
Extraneous Views......Page 3844
Conclusion: Too Many layout() Calls?......Page 3846
Removing the Jank......Page 3847
What Data You Get......Page 3849
How You Get That Data......Page 3850
You’re Using Too Much of the Slow Stuff......Page 3856
You’re Using Too Much of the Expensive Stuff......Page 3857
You’re Using Too Much of Somebody Else’s Stuff......Page 3858
You’re Using Too Much… And There Is None......Page 3859
Device Statistics......Page 3860
Interpreting the Results......Page 3861
TrafficRecord......Page 3862
TrafficSnapshot......Page 3863
TrafficMonitorActivity......Page 3864
Using TrafficMonitor......Page 3869
In Production......Page 3871
During Testing......Page 3872
On-Device Measurement......Page 3874
Yourself, via TrafficStats......Page 3875
Data Usage Screen in Settings......Page 3876
Wireshark......Page 3878
Android Studio Profiler......Page 3880
Bandwidth Savings......Page 3882
If-Modified-Since / If-None-Match......Page 3883
Keep-Alive Semantics......Page 3884
Thumbnails and Tiles......Page 3885
Bandwidth Shaping......Page 3886
Budgets......Page 3887
Windows......Page 3888
Driven by Other Usage......Page 3889
Data Saver......Page 3890
Prerequisites......Page 3892
Determining Your Heap Size At Runtime......Page 3893
Fragments of Memory......Page 3894
onTrimMemory() Callbacks......Page 3895
Warning: Contains Graphic Images......Page 3896
Bitmap Sizing......Page 3897
Bitmap Color Space......Page 3907
Cheating......Page 3908
The 1MB IPC Transaction Limit......Page 3909
Prerequisites......Page 3912
Android Studio Profiler......Page 3913
From Code......Page 3916
Navigating the Heap Dump UI......Page 3917
Class List......Page 3918
Heap Selector......Page 3919
Package Tree View......Page 3920
Instance List......Page 3922
Identifying Leak Candidates......Page 3923
The Static Widget......Page 3924
Thread References......Page 3926
Retaining Too Much......Page 3928
A Canary in a Leaky Coal Mine......Page 3931
Adding the Dependencies......Page 3932
Adding the Application......Page 3933
Adding Manual Leak Checks......Page 3934
The Notifications......Page 3935
Activity Output......Page 3936
Can’t We All Just Get Along?......Page 3940
Contributors to System RAM Consumption......Page 3941
Process Stats in Settings......Page 3942
The Summary......Page 3944
Refresh and Duration......Page 3945
Controlling What is Shown......Page 3947
Drilling Down Into an App......Page 3948
procstats......Page 3949
meminfo......Page 3953
getMemoryInfo()......Page 3958
Learn To Let Go (Of Your Heap)......Page 3959
Prerequisites......Page 3962
You’re Getting Blamed......Page 3963
Stretching Out the Last mWh......Page 3964
Prerequisites......Page 3966
Running a Test......Page 3967
Battery History......Page 3968
Per-PID Stats......Page 3969
Daily Stats......Page 3970
“Statistics since last charge” Summary......Page 3971
WakeLock Summary......Page 3972
Installing the Battery Historian......Page 3974
Running the Battery Historian......Page 3975
Interpreting the Historian Output......Page 3976
PowerTutor......Page 3979
Battery Screen in Settings Application......Page 3984
BatteryInfo Dump......Page 3985
Prerequisites......Page 3988
Screen......Page 3989
Disk I/O......Page 3990
Use What You Already Downloaded......Page 3991
Use In Batches......Page 3992
Use When Android Wants You To......Page 3993
GPS......Page 3994
CPU/GPU......Page 3995
Sensors......Page 3996
Audio Input and Output......Page 3997
The APK Analyzer......Page 3998
What Is It?......Page 4001
Where Are The Methods Coming From?......Page 4002
Use Better Libraries......Page 4003
Use ProGuard......Page 4004
Multidex......Page 4005
Mitigation via libhoudini......Page 4006
Mitigation via Resource Aliases......Page 4007
Mitigation via pngquant......Page 4008
APK Expansion Files......Page 4009
What Happens When Things Go “Boom”?......Page 4010
Introducing ACRA......Page 4011
Acralyzer......Page 4012
A Host for Testing......Page 4013
Adding the Dependencies......Page 4014
Build Types, Product Flavors, and ACRA......Page 4015
Creating a Custom Application......Page 4016
Configuring the Core......Page 4018
Initializing ACRA......Page 4019
What the User Sees......Page 4020
Default: “Silent”......Page 4021
Dialog......Page 4022
Notification......Page 4024
What You See......Page 4026
ACRA and Processes......Page 4032
Prerequisites......Page 4036
The Diagnostic Activity......Page 4037
The Manifest......Page 4038
The Activity......Page 4039
The Limitations......Page 4047
The Diagnostic Overlay......Page 4048
Introducing RVAdapterWrapper......Page 4049
TimingWrapper (a.k.a., StrictMode for RecyclerView)......Page 4051
The RecyclerViewActivity......Page 4054
Being Stupid......Page 4055
Areas for Improvement......Page 4056
What Changed in Android 6.0......Page 4057
Leak Threads… Or Things Attached to Threads......Page 4064
The Counter-Arguments......Page 4065
Use Large Heap Unnecessarily......Page 4066
The Counter-Arguments......Page 4067
The Counter-Arguments......Page 4068
The Costs......Page 4069
The Counter-Arguments......Page 4070
The Costs......Page 4071
Implement a “Quit” Button......Page 4072
The Counter-Arguments......Page 4073
The Counter-Arguments......Page 4074
The Costs......Page 4075
Use Multiple Processes......Page 4076
The Counter-Arguments......Page 4077
The Counter-Arguments......Page 4078
Key Usage Tips......Page 4082
Visual Representation......Page 4083
Key Usage Tips......Page 4084
A Sample Usage......Page 4085
Visual Representation......Page 4087
Key Usage Tips......Page 4090
A Sample Usage......Page 4091
Visual Representation......Page 4094
Key Usage Tips......Page 4100
A Sample Usage......Page 4101
Visual Representation......Page 4108
A Sample Usage......Page 4110
Visual Representation......Page 4113
Declaring a SlidingPaneLayout......Page 4116
Visual Representation......Page 4118
Interacting with a SlidingPaneLayout......Page 4120
Key Usage Tips......Page 4122
A Sample Usage......Page 4123
Visual Representation......Page 4125
Key Usage Tips......Page 4128
A Sample Usage......Page 4129
Visual Representation......Page 4132
A Sample Usage......Page 4134
Visual Representation......Page 4137
Key Usage Tips......Page 4140
A Sample Usage......Page 4141
Visual Representation......Page 4142
Prerequisites......Page 4146
How This Works......Page 4147
Chrome OS Form Factors......Page 4148
Step #2: Enable Android Apps......Page 4149
Step #3: Switch the Device to the Dev Channel......Page 4151
Step #4: Enable Chrome OS Developer Mode......Page 4153
Chrome OS Tablets......Page 4154
Step #5: Set Up the Android Environment......Page 4155
Step #7: Get adb Working......Page 4156
Step #7b: Find Your Chrome OS IP Address......Page 4157
Step #7c: Connect to Chrome OS for Development......Page 4159
Trying to Get Onto Chrome OS......Page 4160
Environment......Page 4161
System Features......Page 4164
NDK Binaries......Page 4165
Lifecycle Events......Page 4166
Storage......Page 4167
Internet Access......Page 4168
Distribution Options......Page 4169
Getting Help......Page 4170
Device Catalog: BlackBerry......Page 4172
Hardware......Page 4173
BlackBerry OS 10.3......Page 4174
Package Name Length......Page 4175
Getting Your Development Environment Established......Page 4176
Standalone GUIs......Page 4177
How Does Distribution Work?......Page 4178
Alternatives......Page 4179
Hey, Wait a Minute… I Thought the Name Was “Google TV”?......Page 4182
ADT-1......Page 4183
Screen Size and Density......Page 4185
Overscan......Page 4186
Media Keys......Page 4187
Getting Your Development Environment Established......Page 4188
How Does Distribution Work?......Page 4190
Avoiding Android TV......Page 4191
Fire TV......Page 4194
FIre TV Stick......Page 4200
Input Devices......Page 4201
What Is Really Different?......Page 4202
Casting and Fire TV......Page 4203
Getting Your Development Environment Established......Page 4204
Working with the Remote and Controller......Page 4205
Gaming Controller......Page 4206
Getting Help......Page 4207
Device Catalog: Samsung DeX......Page 4208
DeX Mode......Page 4213
Configuration and State Changes......Page 4215
Moving In and Out of DeX......Page 4216
USB......Page 4217
Screenshots......Page 4218
Detecting DeX......Page 4219
For More Information......Page 4220
cwac-colormixer......Page 4224
cwac-merge......Page 4225
cwac-saferoom......Page 4226
cwac-wakeful......Page 4227
Background Service Limitations......Page 4228
What Is Affected......Page 4229
Why This Ban Was Added......Page 4231
Workarounds for Senders......Page 4232
Background Location Limitations......Page 4234
JobScheduler Enhancements......Page 4235
Auto-Fill......Page 4236
Multi-Window Changes......Page 4237
Package Management......Page 4238
Cache Quotas......Page 4239
Content Annotations......Page 4240
Seekable Streams......Page 4241
Implementing a ProxyFileDescriptorCallback......Page 4242
Using a ProxyFileDescriptorCallback......Page 4244
Foreground Heap Compaction......Page 4245
Auto-Sizing TextView......Page 4246
FragmentLifecycleCallbacks......Page 4247
Permission Granularity......Page 4248
Changes in ANDROID_ID Scope......Page 4249
Build.SERIAL Versus Build.getSerial()......Page 4250
TextClassificationManager......Page 4251
Native Fragment Deprecation......Page 4254
No Hidden API Access......Page 4255
A Minimum targetSdkVersion......Page 4257
“The War on Background Processing”, Continued......Page 4258
Device Administration Deprecations......Page 4259
Signature Changes and Deprecations......Page 4260
Slices......Page 4261
Fingerprint Improvements......Page 4262
BiometricPrompt......Page 4263
ACTION_FINGERPRINT_ENROLL......Page 4267
Display Cutouts......Page 4268
ImageDecoder......Page 4270
AppComponentFactory......Page 4271
JobScheduler Additions......Page 4275
StrictMode Callbacks......Page 4276
Example: ACRA Reporting......Page 4277
Example: Greylist Violation Reporting......Page 4279
Disabling It......Page 4284
Tracing It......Page 4285
Autofill Service Detection......Page 4287
Magnifier......Page 4288
Package Names......Page 4290
RecyclerView Selection......Page 4291
Getting Help with 9.0......Page 4292
Appendix D: Community Theater and the Appinars......Page 4294
Viewing the Appinar Roster......Page 4295
Managing Appinars......Page 4297
Pausing Playback......Page 4301
Manipulating the Content......Page 4302