diff --git a/res/values/strings.xml b/res/values/strings.xml index ac8f305dbf1..183eca4295d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10264,4 +10264,7 @@ Unavailable when connected to %1$s + + + Medical info, emergency contacts diff --git a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java index d1c633f423c..26f86b9da5e 100644 --- a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java +++ b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import com.android.settings.homepage.deviceinfo.DataUsageSlice; import com.android.settings.homepage.deviceinfo.DeviceInfoSlice; import com.android.settings.homepage.deviceinfo.StorageSlice; +import com.android.settings.homepage.deviceinfo.EmergencyInfoSlice; import com.android.settings.intelligence.ContextualCardProto.ContextualCard; import com.android.settings.intelligence.ContextualCardProto.ContextualCardList; import com.android.settings.wifi.WifiSlice; @@ -57,11 +58,17 @@ public class SettingsContextualCardProvider extends ContextualCardProvider { .setSliceUri(StorageSlice.STORAGE_CARD_URI.toString()) .setCardName(StorageSlice.PATH_STORAGE_INFO) .build(); + final ContextualCard emergencyInfoCard = + ContextualCard.newBuilder() + .setSliceUri(EmergencyInfoSlice.EMERGENCY_INFO_CARD_URI.toString()) + .setCardName(EmergencyInfoSlice.PATH_EMERGENCY_INFO_CARD) + .build(); final ContextualCardList cards = ContextualCardList.newBuilder() .addCard(wifiCard) .addCard(dataUsageCard) .addCard(deviceInfoCard) .addCard(storageInfoCard) + .addCard(emergencyInfoCard) .build(); return cards; diff --git a/src/com/android/settings/homepage/deviceinfo/EmergencyInfoSlice.java b/src/com/android/settings/homepage/deviceinfo/EmergencyInfoSlice.java new file mode 100644 index 00000000000..62678b37516 --- /dev/null +++ b/src/com/android/settings/homepage/deviceinfo/EmergencyInfoSlice.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.homepage.deviceinfo; + +import android.app.PendingIntent; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import androidx.core.graphics.drawable.IconCompat; +import androidx.slice.Slice; +import androidx.slice.builders.ListBuilder; +import androidx.slice.builders.SliceAction; + +import com.android.settings.R; +import com.android.settings.slices.SettingsSliceProvider; + +// This is a slice helper class for EmergencyInfo +public class EmergencyInfoSlice { + /** + * The path denotes the unique name of emergency info slice. + */ + public static final String PATH_EMERGENCY_INFO_CARD = "emergency_info_card"; + + /** + * Backing Uri for the Emergency Info Slice. + */ + public static final Uri EMERGENCY_INFO_CARD_URI = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(PATH_EMERGENCY_INFO_CARD) + .build(); + + private static final String ACTION_EDIT_EMERGENCY_INFO = "android.settings.EDIT_EMERGENCY_INFO"; + + public static Slice getSlice(Context context) { + final ListBuilder listBuilder = new ListBuilder(context, EMERGENCY_INFO_CARD_URI, + ListBuilder.INFINITY); + listBuilder.addRow( + new ListBuilder.RowBuilder() + .setTitle(context.getText(R.string.emergency_info_title)) + .setSubtitle( + context.getText(R.string.emergency_info_contextual_card_summary)) + .setPrimaryAction(generatePrimaryAction(context))); + return listBuilder.build(); + } + + private static SliceAction generatePrimaryAction(Context context) { + PendingIntent pendingIntent = + PendingIntent.getActivity( + context, + 0 /* requestCode */, + new Intent(ACTION_EDIT_EMERGENCY_INFO), + PendingIntent.FLAG_UPDATE_CURRENT); + + return SliceAction.create( + pendingIntent, + IconCompat.createWithResource(context, R.drawable.empty_icon), + ListBuilder.SMALL_IMAGE, + context.getText(R.string.emergency_info_title)); + } +} diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index 8b975b4c518..41c207bba34 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -41,6 +41,7 @@ import com.android.settings.R; import com.android.settings.bluetooth.BluetoothSliceBuilder; import com.android.settings.core.BasePreferenceController; import com.android.settings.flashlight.FlashlightSliceBuilder; +import com.android.settings.homepage.deviceinfo.EmergencyInfoSlice; import com.android.settings.location.LocationSliceBuilder; import com.android.settings.network.telephony.Enhanced4gLteSliceHelper; import com.android.settings.notification.ZenModeSliceBuilder; @@ -178,6 +179,8 @@ public class SettingsSliceProvider extends SliceProvider { registerIntentToUri(FlashlightSliceBuilder.INTENT_FILTER, sliceUri); mRegisteredUris.add(sliceUri); return; + } else if (EmergencyInfoSlice.EMERGENCY_INFO_CARD_URI.equals(sliceUri)) { + return; } // Start warming the slice, we expect someone will want it soon. @@ -241,6 +244,8 @@ public class SettingsSliceProvider extends SliceProvider { .createWifiCallingPreferenceSlice(sliceUri); } else if (FlashlightSliceBuilder.FLASHLIGHT_URI.equals(sliceUri)) { return FlashlightSliceBuilder.getSlice(getContext()); + } else if (EmergencyInfoSlice.EMERGENCY_INFO_CARD_URI.equals(sliceUri)) { + return EmergencyInfoSlice.getSlice(getContext()); } SliceData cachedSliceData = mSliceWeakDataCache.get(sliceUri); diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java index fbc91114883..2c42379f86e 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java @@ -32,6 +32,7 @@ import com.google.android.settings.intelligence.libs.contextualcards.ContextualC import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) @@ -40,6 +41,7 @@ public class SettingsContextualCardProviderTest { private Context mContext; private ContentResolver mResolver; private Uri mUri; + private SettingsContextualCardProvider mProvider; @Before public void setUp() { @@ -49,15 +51,18 @@ public class SettingsContextualCardProviderTest { .scheme(ContentResolver.SCHEME_CONTENT) .authority(SettingsContextualCardProvider.CARD_AUTHORITY) .build(); + mProvider = Robolectric.setupContentProvider(SettingsContextualCardProvider.class); } @Test public void contentProviderCall_returnCorrectSize() throws Exception { + final int actualNo = mProvider.getContextualCards().getCardCount(); + final Bundle returnValue = mResolver.call(mUri, ContextualCardProvider.METHOD_GET_CARD_LIST, "", null); final ContextualCardList cards = - ContextualCardList.parseFrom( - returnValue.getByteArray(ContextualCardProvider.BUNDLE_CARD_LIST)); - assertThat(cards.getCardCount()).isEqualTo(4); + ContextualCardList.parseFrom( + returnValue.getByteArray(ContextualCardProvider.BUNDLE_CARD_LIST)); + assertThat(cards.getCardCount()).isEqualTo(actualNo); } } \ No newline at end of file