1 /* 2 * Copyright (C) 2019 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.car.dialer.ui.favorite; 18 19 import android.app.AlertDialog; 20 import android.graphics.drawable.Drawable; 21 import android.os.Bundle; 22 import android.widget.Toast; 23 24 import androidx.lifecycle.ViewModelProviders; 25 26 import com.android.car.dialer.R; 27 import com.android.car.dialer.ui.search.ContactResultsFragment; 28 import com.android.car.telephony.common.Contact; 29 import com.android.car.telephony.common.PhoneNumber; 30 import com.android.car.telephony.common.TelecomUtils; 31 import com.android.car.ui.AlertDialogBuilder; 32 import com.android.car.ui.recyclerview.CarUiContentListItem; 33 import com.android.car.ui.recyclerview.CarUiListItem; 34 import com.android.car.ui.recyclerview.CarUiListItemAdapter; 35 36 import java.util.ArrayList; 37 import java.util.HashSet; 38 import java.util.List; 39 import java.util.Set; 40 41 /** 42 * A fragment that allows the user to search for and select favorite phone numbers 43 */ 44 public class AddFavoriteFragment extends ContactResultsFragment { 45 46 /** 47 * Creates a new instance of AddFavoriteFragment 48 */ newInstance()49 public static AddFavoriteFragment newInstance() { 50 return new AddFavoriteFragment(); 51 } 52 53 private AlertDialog mCurrentDialog; 54 private CarUiListItemAdapter mDialogAdapter; 55 private List<CarUiListItem> mFavoritePhoneNumberList; 56 private Set<PhoneNumber> mSelectedNumbers; 57 private Contact mSelectedContact; 58 private Drawable mFavoriteIcon; 59 private Drawable mFavoriteIconEmpty; 60 61 @Override onCreate(Bundle savedInstanceState)62 public void onCreate(Bundle savedInstanceState) { 63 super.onCreate(savedInstanceState); 64 65 FavoriteViewModel favoriteViewModel = ViewModelProviders.of(getActivity()).get( 66 FavoriteViewModel.class); 67 mSelectedNumbers = new HashSet<>(); 68 69 mFavoriteIcon = getResources().getDrawable(R.drawable.ic_favorite_activatable, null); 70 mFavoriteIcon.setTintList( 71 getResources().getColorStateList(R.color.primary_icon_selector, null)); 72 73 mFavoritePhoneNumberList = new ArrayList<>(); 74 mDialogAdapter = new CarUiListItemAdapter(mFavoritePhoneNumberList); 75 76 mCurrentDialog = new AlertDialogBuilder(getContext()) 77 .setTitle(R.string.select_number_dialog_title) 78 .setAdapter(mDialogAdapter) 79 .setNegativeButton(R.string.cancel_add_favorites_dialog, null) 80 .setPositiveButton(R.string.confirm_add_favorites_dialog, 81 (d, which) -> { 82 for (PhoneNumber number : mSelectedNumbers) { 83 favoriteViewModel.addToFavorite(mSelectedContact, 84 number); 85 } 86 mSelectedNumbers.clear(); 87 getFragmentManager().popBackStackImmediate(); 88 }) 89 .create(); 90 } 91 setPhoneNumbers(List<PhoneNumber> phoneNumbers)92 private void setPhoneNumbers(List<PhoneNumber> phoneNumbers) { 93 mFavoritePhoneNumberList.clear(); 94 for (PhoneNumber number : phoneNumbers) { 95 CarUiContentListItem item = new CarUiContentListItem(CarUiContentListItem.Action.ICON); 96 item.setTitle(TelecomUtils.getBidiWrappedNumber(number.getNumber())); 97 item.setSupplementalIcon(mFavoriteIcon.getConstantState().newDrawable()); 98 setFavoriteItemState(item, number); 99 100 item.setOnItemClickedListener((listItem) -> { 101 if (mSelectedNumbers.contains(number)) { 102 mSelectedNumbers.remove(number); 103 listItem.setActivated(false); 104 } else { 105 mSelectedNumbers.add(number); 106 listItem.setActivated(true); 107 } 108 mDialogAdapter.notifyItemChanged(mFavoritePhoneNumberList.indexOf(listItem)); 109 }); 110 mFavoritePhoneNumberList.add(item); 111 } 112 mDialogAdapter.notifyDataSetChanged(); 113 } 114 setFavoriteItemState(CarUiContentListItem item, PhoneNumber number)115 private void setFavoriteItemState(CarUiContentListItem item, PhoneNumber number) { 116 CharSequence readableLabel = number.getReadableLabel(getResources()); 117 118 if (number.isFavorite()) { 119 // This phone number is marked as favorite locally. Disable the favorite action button. 120 item.setEnabled(false); 121 item.setActivated(true); 122 item.setBody(getResources().getString(R.string.favorite_number_description, 123 readableLabel)); 124 } else if (mSelectedContact.isStarred()) { 125 // This contact is downloaded from phone, all phone numbers under this contact will show 126 // under the favorite tab. Disable the favorite action button. 127 item.setActivated(false); 128 item.setEnabled(false); 129 item.setBody(getResources().getString(R.string.favorite_number_description, 130 readableLabel)); 131 } else { 132 item.setEnabled(true); 133 item.setActivated(false); 134 item.setBody(readableLabel); 135 } 136 } 137 138 @Override onShowContactDetail(Contact contact)139 public void onShowContactDetail(Contact contact) { 140 if (contact == null) { 141 mCurrentDialog.dismiss(); 142 return; 143 } 144 145 mSelectedContact = contact; 146 if (contact.getNumbers().isEmpty()) { 147 Toast.makeText(getContext(), R.string.no_phone_numbers, Toast.LENGTH_SHORT).show(); 148 mCurrentDialog.dismiss(); 149 } else { 150 setPhoneNumbers(contact.getNumbers()); 151 mCurrentDialog.show(); 152 } 153 } 154 } 155