1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.homepage.contextualcards.deviceinfo; 18 19 import android.app.PendingIntent; 20 import android.app.settings.SettingsEnums; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.net.Uri; 24 import android.telephony.SubscriptionInfo; 25 import android.telephony.SubscriptionManager; 26 import android.text.BidiFormatter; 27 import android.text.TextDirectionHeuristics; 28 import android.text.TextUtils; 29 30 import androidx.annotation.VisibleForTesting; 31 import androidx.core.graphics.drawable.IconCompat; 32 import androidx.slice.Slice; 33 import androidx.slice.builders.ListBuilder; 34 import androidx.slice.builders.SliceAction; 35 36 import com.android.settings.R; 37 import com.android.settings.SubSettings; 38 import com.android.settings.Utils; 39 import com.android.settings.deviceinfo.HardwareInfoPreferenceController; 40 import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment; 41 import com.android.settings.slices.CustomSliceRegistry; 42 import com.android.settings.slices.CustomSliceable; 43 import com.android.settings.slices.SliceBuilderUtils; 44 import com.android.settingslib.DeviceInfoUtils; 45 46 import java.util.List; 47 48 public class DeviceInfoSlice implements CustomSliceable { 49 private static final String TAG = "DeviceInfoSlice"; 50 51 private final Context mContext; 52 private final SubscriptionManager mSubscriptionManager; 53 DeviceInfoSlice(Context context)54 public DeviceInfoSlice(Context context) { 55 mContext = context; 56 mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class); 57 } 58 59 @Override getSlice()60 public Slice getSlice() { 61 final IconCompat icon = IconCompat.createWithResource(mContext, 62 R.drawable.ic_info_outline_24dp); 63 final String title = mContext.getString(R.string.device_info_label); 64 final SliceAction primaryAction = SliceAction.createDeeplink(getPrimaryAction(), icon, 65 ListBuilder.ICON_IMAGE, title); 66 return new ListBuilder(mContext, CustomSliceRegistry.DEVICE_INFO_SLICE_URI, 67 ListBuilder.INFINITY) 68 .setAccentColor((Utils.getColorAccentDefaultColor(mContext))) 69 .setHeader(new ListBuilder.HeaderBuilder().setTitle(title)) 70 .addRow(new ListBuilder.RowBuilder() 71 .setTitle(getPhoneNumber()) 72 .setSubtitle(getDeviceModel()) 73 .setPrimaryAction(primaryAction)) 74 .build(); 75 } 76 77 @Override getUri()78 public Uri getUri() { 79 return CustomSliceRegistry.DEVICE_INFO_SLICE_URI; 80 } 81 82 @Override getIntent()83 public Intent getIntent() { 84 final String screenTitle = mContext.getText(R.string.device_info_label).toString(); 85 return SliceBuilderUtils.buildSearchResultPageIntent(mContext, 86 MyDeviceInfoFragment.class.getName(), "" /* key */, screenTitle, 87 SettingsEnums.SLICE) 88 .setClassName(mContext.getPackageName(), SubSettings.class.getName()) 89 .setData(CustomSliceRegistry.DEVICE_INFO_SLICE_URI); 90 } 91 getPrimaryAction()92 private PendingIntent getPrimaryAction() { 93 final Intent intent = getIntent(); 94 return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */); 95 } 96 97 @VisibleForTesting getPhoneNumber()98 CharSequence getPhoneNumber() { 99 final SubscriptionInfo subscriptionInfo = getFirstSubscriptionInfo(); 100 if (subscriptionInfo == null) { 101 return mContext.getString(R.string.device_info_default); 102 } 103 final String phoneNumber = DeviceInfoUtils.getFormattedPhoneNumber(mContext, 104 subscriptionInfo); 105 return TextUtils.isEmpty(phoneNumber) ? mContext.getString(R.string.device_info_default) 106 : BidiFormatter.getInstance().unicodeWrap(phoneNumber, TextDirectionHeuristics.LTR); 107 } 108 getDeviceModel()109 private CharSequence getDeviceModel() { 110 return HardwareInfoPreferenceController.getDeviceModel(); 111 } 112 113 @VisibleForTesting getFirstSubscriptionInfo()114 SubscriptionInfo getFirstSubscriptionInfo() { 115 final List<SubscriptionInfo> subscriptionInfoList = 116 mSubscriptionManager.getActiveSubscriptionInfoList(true); 117 if (subscriptionInfoList == null || subscriptionInfoList.isEmpty()) { 118 return null; 119 } 120 return subscriptionInfoList.get(0); 121 } 122 123 @Override onNotifyChange(Intent intent)124 public void onNotifyChange(Intent intent) { 125 126 } 127 } 128