diff --git a/samples/browseable/ActiveNotifications/AndroidManifest.xml b/samples/browseable/ActiveNotifications/AndroidManifest.xml index 3a3928290..022e2116f 100644 --- a/samples/browseable/ActiveNotifications/AndroidManifest.xml +++ b/samples/browseable/ActiveNotifications/AndroidManifest.xml @@ -24,7 +24,7 @@ android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme"> - diff --git a/samples/browseable/ActiveNotifications/_index.jd b/samples/browseable/ActiveNotifications/_index.jd index d8ce4a9d8..7ba4b8a57 100644 --- a/samples/browseable/ActiveNotifications/_index.jd +++ b/samples/browseable/ActiveNotifications/_index.jd @@ -1,13 +1,17 @@ -page.tags="ActiveNotification" -sample.group=Notification +page.tags="ActiveNotifications" +sample.group=Android N Preview @jd:body

-The NotificationManager can tell you how many notifications your application is currently showing. -This sample demonstrates how to use this API that has been introduced with Android M. -To get started, press the "add a notification" button. -When a notification is being canceled, the count gets updated via a PendingIntent. +Notifications can now be grouped in Android N. Since Android M, the +NotificationManager can tell you how many notifications your application +is currently showing. This sample demonstrates how to use these APIs +together for a nicer user experience when an app may have multiple +notifications. To get started, press the "add a notification" button. +If you add more than one notification a notification summary will be +added. When a notification is being canceled, the count gets updated +via a PendingIntent.

diff --git a/samples/browseable/ActiveNotifications/res/values/base-strings.xml b/samples/browseable/ActiveNotifications/res/values/base-strings.xml index 5fc846c8b..1753fa914 100644 --- a/samples/browseable/ActiveNotifications/res/values/base-strings.xml +++ b/samples/browseable/ActiveNotifications/res/values/base-strings.xml @@ -16,15 +16,19 @@ --> - ActiveNotification + ActiveNotifications diff --git a/samples/browseable/ActiveNotifications/res/values/strings.xml b/samples/browseable/ActiveNotifications/res/values/strings.xml index 0f2977d13..a4275fdf2 100644 --- a/samples/browseable/ActiveNotifications/res/values/strings.xml +++ b/samples/browseable/ActiveNotifications/res/values/strings.xml @@ -19,4 +19,5 @@ Active Notifications: %1$s Update count This is a sample notification. + There are %s ActiveNotifications. diff --git a/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationActivity.java b/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationsActivity.java similarity index 90% rename from samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationActivity.java rename to samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationsActivity.java index bdb5421a0..637478d0e 100644 --- a/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationActivity.java +++ b/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationsActivity.java @@ -23,9 +23,9 @@ import android.content.IntentFilter; import android.os.Bundle; import android.os.PersistableBundle; -public class ActiveNotificationActivity extends MainActivity { +public class ActiveNotificationsActivity extends MainActivity { - private ActiveNotificationFragment mFragment; + private ActiveNotificationsFragment mFragment; protected static final String ACTION_NOTIFICATION_DELETE = "com.example.android.activenotifications.delete"; @@ -48,7 +48,7 @@ public class ActiveNotificationActivity extends MainActivity { } private void findFragment() { - mFragment = (ActiveNotificationFragment) getSupportFragmentManager() + mFragment = (ActiveNotificationsFragment) getSupportFragmentManager() .findFragmentById(R.id.sample_content_fragment); } diff --git a/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationFragment.java b/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationsFragment.java similarity index 50% rename from samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationFragment.java rename to samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationsFragment.java index 3e87849a3..db0dbac6f 100644 --- a/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationFragment.java +++ b/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/ActiveNotificationsFragment.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.os.Bundle; import android.service.notification.StatusBarNotification; import android.support.v4.app.Fragment; +import android.support.v4.app.NotificationCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,17 +32,31 @@ import android.widget.TextView; import com.example.android.common.logger.Log; /** - * A fragment that enables display of notifications. + * A fragment that allows notifications to be enqueued. */ -public class ActiveNotificationFragment extends Fragment { +public class ActiveNotificationsFragment extends Fragment { - private static final String TAG = "ActiveNotificationFragment"; + /** + * The request code can be any number as long as it doesn't match another request code used + * in the same app. + */ + private static final int REQUEST_CODE = 2323; + + private static final String TAG = "ActiveNotificationsFragment"; + + private static final String NOTIFICATION_GROUP = + "com.example.android.activenotifications.notification_type"; + + private static final int NOTIFICATION_GROUP_SUMMARY_ID = 1; private NotificationManager mNotificationManager; + private TextView mNumberOfNotifications; - // Every notification needs a unique ID otherwise the previous one would be overwritten. - private int mNotificationId = 0; + // Every notification needs a unique ID otherwise the previous one would be overwritten. This + // variable is incremented when used. + private static int sNotificationId = NOTIFICATION_GROUP_SUMMARY_ID + 1; + private PendingIntent mDeletePendingIntent; @Override @@ -69,7 +84,7 @@ public class ActiveNotificationFragment extends Fragment { public void onClick(View v) { switch (v.getId()) { case R.id.add_notification: { - addNotificationAndReadNumber(); + addNotificationAndUpdateSummaries(); break; } } @@ -79,35 +94,74 @@ public class ActiveNotificationFragment extends Fragment { // [BEGIN create_pending_intent_for_deletion] // Create a PendingIntent to be fired upon deletion of a Notification. - Intent deleteIntent = new Intent(ActiveNotificationActivity.ACTION_NOTIFICATION_DELETE); + Intent deleteIntent = new Intent(ActiveNotificationsActivity.ACTION_NOTIFICATION_DELETE); mDeletePendingIntent = PendingIntent.getBroadcast(getActivity(), - 2323 /* requestCode */, deleteIntent, 0); + REQUEST_CODE, deleteIntent, 0); // [END create_pending_intent_for_deletion] } /** - * Add a new {@link Notification} with sample data and send it to the system. - * Then read the current number of displayed notifications for this application. + * Adds a new {@link Notification} with sample data and sends it to the system. + * Then updates the current number of displayed notifications for this application and + * creates a notification summary if more than one notification exists. */ - private void addNotificationAndReadNumber() { + private void addNotificationAndUpdateSummaries() { // [BEGIN create_notification] // Create a Notification and notify the system. - final Notification.Builder builder = new Notification.Builder(getActivity()) + final NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity()) .setSmallIcon(R.mipmap.ic_notification) .setContentTitle(getString(R.string.app_name)) .setContentText(getString(R.string.sample_notification_content)) .setAutoCancel(true) - .setDeleteIntent(mDeletePendingIntent); + .setDeleteIntent(mDeletePendingIntent) + .setGroup(NOTIFICATION_GROUP); final Notification notification = builder.build(); - mNotificationManager.notify(++mNotificationId, notification); + mNotificationManager.notify(getNewNotificationId(), notification); // [END create_notification] Log.i(TAG, "Add a notification"); + + updateNotificationSummary(); updateNumberOfNotifications(); } /** - * Request the current number of notifications from the {@link NotificationManager} and + * Adds/updates/removes the notification summary as necessary. + */ + protected void updateNotificationSummary() { + final StatusBarNotification[] activeNotifications = mNotificationManager + .getActiveNotifications(); + + int numberOfNotifications = activeNotifications.length; + // Since the notifications might include a summary notification remove it from the count if + // it is present. + for (StatusBarNotification notification : activeNotifications) { + if (notification.getId() == NOTIFICATION_GROUP_SUMMARY_ID) { + numberOfNotifications--; + break; + } + } + + if (numberOfNotifications > 1) { + // Add/update the notification summary. + String notificationContent = getString(R.string.sample_notification_summary_content, + "" + numberOfNotifications); + final NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity()) + .setSmallIcon(R.mipmap.ic_notification) + .setStyle(new NotificationCompat.BigTextStyle() + .setSummaryText(notificationContent)) + .setGroup(NOTIFICATION_GROUP) + .setGroupSummary(true); + final Notification notification = builder.build(); + mNotificationManager.notify(NOTIFICATION_GROUP_SUMMARY_ID, notification); + } else { + // Remove the notification summary. + mNotificationManager.cancel(NOTIFICATION_GROUP_SUMMARY_ID); + } + } + + /** + * Requests the current number of notifications from the {@link NotificationManager} and * display them to the user. */ protected void updateNumberOfNotifications() { @@ -121,4 +175,19 @@ public class ActiveNotificationFragment extends Fragment { numberOfNotifications)); Log.i(TAG, getString(R.string.active_notifications, numberOfNotifications)); } + + /** + * Retrieves a unique notification ID. + */ + public int getNewNotificationId() { + int notificationId = sNotificationId++; + + // Unlikely in the sample, but the int will overflow if used enough so we skip the summary + // ID. Most apps will prefer a more deterministic way of identifying an ID such as hashing + // the content of the notification. + if (notificationId == NOTIFICATION_GROUP_SUMMARY_ID) { + notificationId = sNotificationId++; + } + return notificationId; + } } diff --git a/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/MainActivity.java b/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/MainActivity.java index bf11b8eb5..965248fbc 100644 --- a/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/MainActivity.java +++ b/samples/browseable/ActiveNotifications/src/com.example.android.activenotifications/MainActivity.java @@ -50,7 +50,7 @@ public class MainActivity extends SampleActivityBase { if (savedInstanceState == null) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - ActiveNotificationFragment fragment = new ActiveNotificationFragment(); + ActiveNotificationsFragment fragment = new ActiveNotificationsFragment(); transaction.replace(R.id.sample_content_fragment, fragment); transaction.commit(); } diff --git a/samples/browseable/AutoBackupForApps/src/com.example.android.autobackupsample/AddFileActivity.java b/samples/browseable/AutoBackupForApps/src/com.example.android.autobackupsample/AddFileActivity.java index 64f2912fb..d026ddd95 100644 --- a/samples/browseable/AutoBackupForApps/src/com.example.android.autobackupsample/AddFileActivity.java +++ b/samples/browseable/AutoBackupForApps/src/com.example.android.autobackupsample/AddFileActivity.java @@ -161,7 +161,7 @@ public class AddFileActivity extends Activity { return; } - long fileSize = Long.parseLong(fileSizeEditTextValue) * mSizeMultiplier; + long fileSize = Integer.parseInt(fileSizeEditTextValue) * mSizeMultiplier; if (mFileStorage == FileStorage.EXTERNAL && !Utils.isExternalStorageAvailable()) { Toast toast = Toast.makeText(this, diff --git a/samples/browseable/Camera2Raw/src/com.example.android.camera2raw/Camera2RawFragment.java b/samples/browseable/Camera2Raw/src/com.example.android.camera2raw/Camera2RawFragment.java index bf5efe588..341cc72d3 100644 --- a/samples/browseable/Camera2Raw/src/com.example.android.camera2raw/Camera2RawFragment.java +++ b/samples/browseable/Camera2Raw/src/com.example.android.camera2raw/Camera2RawFragment.java @@ -442,7 +442,10 @@ public class Camera2RawFragment extends Fragment case STATE_WAITING_FOR_3A_CONVERGENCE: { boolean readyToCapture = true; if (!mNoAFRun) { - int afState = result.get(CaptureResult.CONTROL_AF_STATE); + Integer afState = result.get(CaptureResult.CONTROL_AF_STATE); + if (afState == null) { + break; + } // If auto-focus has reached locked state, we are ready to capture readyToCapture = @@ -454,8 +457,11 @@ public class Camera2RawFragment extends Fragment // auto-exposure and auto-white-balance have converged as well before // taking a picture. if (!isLegacyLocked()) { - int aeState = result.get(CaptureResult.CONTROL_AE_STATE); - int awbState = result.get(CaptureResult.CONTROL_AWB_STATE); + Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE); + Integer awbState = result.get(CaptureResult.CONTROL_AWB_STATE); + if (aeState == null || awbState == null) { + break; + } readyToCapture = readyToCapture && aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED && diff --git a/samples/browseable/Camera2Video/src/com.example.android.camera2video/Camera2VideoFragment.java b/samples/browseable/Camera2Video/src/com.example.android.camera2video/Camera2VideoFragment.java index d191e77cd..e2853b306 100644 --- a/samples/browseable/Camera2Video/src/com.example.android.camera2video/Camera2VideoFragment.java +++ b/samples/browseable/Camera2Video/src/com.example.android.camera2video/Camera2VideoFragment.java @@ -757,4 +757,4 @@ public class Camera2VideoFragment extends Fragment } -} \ No newline at end of file +} diff --git a/samples/browseable/DirectBoot/AndroidManifest.xml b/samples/browseable/DirectBoot/AndroidManifest.xml new file mode 100644 index 000000000..be3be93fe --- /dev/null +++ b/samples/browseable/DirectBoot/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/browseable/DirectBoot/_index.jd b/samples/browseable/DirectBoot/_index.jd new file mode 100644 index 000000000..8c60f2f01 --- /dev/null +++ b/samples/browseable/DirectBoot/_index.jd @@ -0,0 +1,13 @@ + +page.tags="DirectBoot" +sample.group=Android N Preview +@jd:body + +

+ +This sample demonstrates how to store/access data in a device protected storage +which is always available while the device is booted. +This sample works as a simple alarm clock. On > Android N devices, the scheduled alarms +go off after reboot even before the user enters their credentials. + +

diff --git a/samples/browseable/DirectBoot/res/drawable-hdpi/ic_add_alarm_white_24dp.png b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_add_alarm_white_24dp.png new file mode 100644 index 000000000..5f33b37ad Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_add_alarm_white_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-hdpi/ic_alarm_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_alarm_black_24dp.png new file mode 100644 index 000000000..907491104 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_alarm_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-hdpi/ic_delete_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_delete_black_24dp.png new file mode 100644 index 000000000..dbbb602a0 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_delete_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-hdpi/ic_fbe_notification.png b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_fbe_notification.png new file mode 100644 index 000000000..421baf4dd Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-hdpi/ic_fbe_notification.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-hdpi/tile.9.png b/samples/browseable/DirectBoot/res/drawable-hdpi/tile.9.png new file mode 100644 index 000000000..135862883 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-hdpi/tile.9.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-mdpi/ic_add_alarm_white_24dp.png b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_add_alarm_white_24dp.png new file mode 100644 index 000000000..85a1e175c Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_add_alarm_white_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-mdpi/ic_alarm_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_alarm_black_24dp.png new file mode 100644 index 000000000..ed2f90aee Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_alarm_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-mdpi/ic_delete_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_delete_black_24dp.png new file mode 100644 index 000000000..999aa4ccc Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_delete_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-mdpi/ic_fbe_notification.png b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_fbe_notification.png new file mode 100644 index 000000000..5635e4144 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-mdpi/ic_fbe_notification.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_add_alarm_white_24dp.png b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_add_alarm_white_24dp.png new file mode 100644 index 000000000..90f4de475 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_add_alarm_white_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_alarm_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_alarm_black_24dp.png new file mode 100644 index 000000000..e37eab0e4 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_alarm_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_delete_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_delete_black_24dp.png new file mode 100644 index 000000000..796ccd225 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_delete_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_fbe_notification.png b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_fbe_notification.png new file mode 100644 index 000000000..e07c3859f Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xhdpi/ic_fbe_notification.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_add_alarm_white_24dp.png b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_add_alarm_white_24dp.png new file mode 100644 index 000000000..3319384e7 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_add_alarm_white_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_alarm_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_alarm_black_24dp.png new file mode 100644 index 000000000..eb1d08d7a Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_alarm_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_delete_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_delete_black_24dp.png new file mode 100644 index 000000000..6d7cb81c5 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_delete_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_fbe_notification.png b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_fbe_notification.png new file mode 100644 index 000000000..193d1bccc Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxhdpi/ic_fbe_notification.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_add_alarm_white_24dp.png b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_add_alarm_white_24dp.png new file mode 100644 index 000000000..2e425c060 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_add_alarm_white_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_alarm_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_alarm_black_24dp.png new file mode 100644 index 000000000..04b6c71d7 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_alarm_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_delete_black_24dp.png b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_delete_black_24dp.png new file mode 100644 index 000000000..f2b75c311 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_delete_black_24dp.png differ diff --git a/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_fbe_notification.png b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_fbe_notification.png new file mode 100644 index 000000000..5dd463f55 Binary files /dev/null and b/samples/browseable/DirectBoot/res/drawable-xxxhdpi/ic_fbe_notification.png differ diff --git a/samples/browseable/DirectBoot/res/drawable/divider.xml b/samples/browseable/DirectBoot/res/drawable/divider.xml new file mode 100644 index 000000000..b21e66485 --- /dev/null +++ b/samples/browseable/DirectBoot/res/drawable/divider.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/samples/browseable/DirectBoot/res/layout/activity_main.xml b/samples/browseable/DirectBoot/res/layout/activity_main.xml new file mode 100755 index 000000000..4011cc4c1 --- /dev/null +++ b/samples/browseable/DirectBoot/res/layout/activity_main.xml @@ -0,0 +1,24 @@ + + + + diff --git a/samples/browseable/DirectBoot/res/layout/alarm_row.xml b/samples/browseable/DirectBoot/res/layout/alarm_row.xml new file mode 100644 index 000000000..ab5fb88ae --- /dev/null +++ b/samples/browseable/DirectBoot/res/layout/alarm_row.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/samples/browseable/DirectBoot/res/layout/fragment_alarm_scheduler.xml b/samples/browseable/DirectBoot/res/layout/fragment_alarm_scheduler.xml new file mode 100644 index 000000000..68fea7298 --- /dev/null +++ b/samples/browseable/DirectBoot/res/layout/fragment_alarm_scheduler.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + diff --git a/samples/browseable/DirectBoot/res/layout/fragment_time_picker.xml b/samples/browseable/DirectBoot/res/layout/fragment_time_picker.xml new file mode 100644 index 000000000..cb83530ec --- /dev/null +++ b/samples/browseable/DirectBoot/res/layout/fragment_time_picker.xml @@ -0,0 +1,63 @@ + + + + + + + + + + +