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