From a16a79f682c51dd398f8cb98e8678e9694193f64 Mon Sep 17 00:00:00 2001 From: Mohit Date: Fri, 6 Mar 2020 12:31:27 +0530 Subject: [PATCH 01/12] Contacts: about: Add license, authors, and contact information --- res/values/e_strings.xml | 33 +++++++++++++++++ res/xml/preference_about.xml | 26 +++++++++++++ .../preference/AboutPreferenceFragment.java | 37 ++++++++++++++++--- 3 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 res/values/e_strings.xml diff --git a/res/values/e_strings.xml b/res/values/e_strings.xml new file mode 100644 index 0000000000..c0f2b3fb18 --- /dev/null +++ b/res/values/e_strings.xml @@ -0,0 +1,33 @@ + + + + + Contacts is forked from LineageOS Contacts + + + Authors + + + Source code + + + Licence + + + Contacts information + Contacts is an open source App for Android + + diff --git a/res/xml/preference_about.xml b/res/xml/preference_about.xml index a109db68ed..9258a60d75 100644 --- a/res/xml/preference_about.xml +++ b/res/xml/preference_about.xml @@ -15,11 +15,37 @@ --> + + + + + + + + + + Date: Thu, 25 Mar 2021 22:18:37 +0530 Subject: [PATCH 02/12] Contacts: Sort /e/ account with first priority and allow user to modify primary account for profile Change-Id: I27755aa319359ec33438f0a6bd470be126fd0f9a --- .../contacts/editor/RawContactEditorView.java | 2 +- .../contacts/model/account/AccountComparator.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java index 755800aa5d..6e8d793f83 100644 --- a/src/com/android/contacts/editor/RawContactEditorView.java +++ b/src/com/android/contacts/editor/RawContactEditorView.java @@ -794,7 +794,7 @@ public class RawContactEditorView extends LinearLayout implements View.OnClickLi } // If we're saving a new contact and there are multiple accounts, add the account selector. - if (mHasNewContact && !mIsUserProfile && mAccounts.size() > 1) { + if (mHasNewContact && mAccounts.size() > 1) { addAccountSelector(mCurrentRawContactDelta); } } diff --git a/src/com/android/contacts/model/account/AccountComparator.java b/src/com/android/contacts/model/account/AccountComparator.java index 70ccf494fb..8bc8fbbf76 100644 --- a/src/com/android/contacts/model/account/AccountComparator.java +++ b/src/com/android/contacts/model/account/AccountComparator.java @@ -38,13 +38,13 @@ public class AccountComparator implements Comparator { return -1; } else if (a.name == null || a.type == null) { return 1; - } else if (isWritableGoogleAccount(a) && a.equals(mDefaultAccount)) { + } else if (isWritableEAccount(a) && a.equals(mDefaultAccount)) { return -1; - } else if (isWritableGoogleAccount(b) && b.equals(mDefaultAccount)) { + } else if (isWritableEAccount(b) && b.equals(mDefaultAccount)) { return 1; - } else if (isWritableGoogleAccount(a) && !isWritableGoogleAccount(b)) { + } else if (isWritableEAccount(a) && !isWritableEAccount(b)) { return -1; - } else if (isWritableGoogleAccount(b) && !isWritableGoogleAccount(a)) { + } else if (isWritableEAccount(b) && !isWritableEAccount(a)) { return 1; } else { int diff = a.name.compareToIgnoreCase(b.name); @@ -65,7 +65,7 @@ public class AccountComparator implements Comparator { } } - private static boolean isWritableGoogleAccount(AccountWithDataSet account) { - return GoogleAccountType.ACCOUNT_TYPE.equals(account.type) && account.dataSet == null; + private static boolean isWritableEAccount(AccountWithDataSet account) { + return "foundation.e.accountmanager.eelo.address_book".equals(account.type) && account.dataSet == null; } } -- GitLab From 949626cffa922768e080b1ef1ff06cbf2c04ca60 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Mon, 3 Oct 2022 12:14:37 +0000 Subject: [PATCH 03/12] 709-s-Open_accountManager_onClick_add_account --- .../activities/ContactEditorAccountsChangedActivity.java | 2 +- src/com/android/contacts/list/ContactsUnavailableFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java index 01336c6370..55f674f624 100644 --- a/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java +++ b/src/com/android/contacts/activities/ContactEditorAccountsChangedActivity.java @@ -70,7 +70,7 @@ public class ContactEditorAccountsChangedActivity extends Activity private final OnClickListener mAddAccountClickListener = new OnClickListener() { @Override public void onClick(View v) { - final Intent intent = ImplicitIntentsUtil.getIntentForAddingGoogleAccount(); + final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount(); startActivityForResult(intent, SUBACTIVITY_ADD_NEW_ACCOUNT); } }; diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java index 048ce62e36..299a184550 100644 --- a/src/com/android/contacts/list/ContactsUnavailableFragment.java +++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java @@ -131,7 +131,7 @@ public class ContactsUnavailableFragment extends Fragment implements OnClickList public void onClick(View v) { final int id = v.getId(); if (id == R.id.add_account_button) { - final Intent intent = ImplicitIntentsUtil.getIntentForAddingGoogleAccount(); + final Intent intent = ImplicitIntentsUtil.getIntentForAddingAccount(); ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent); } else if (id == R.id.import_contacts_button) { -- GitLab From 299d3c67bccfcbf4b82fc1c0be839f5c5f7be242 Mon Sep 17 00:00:00 2001 From: althafvly Date: Sun, 23 Oct 2022 21:14:50 +0530 Subject: [PATCH 04/12] Contacts: Support changing vCard export version Change-Id: Ib275eeb002f71ea74490b2c2c780a734dbc3cac0 --- res/values/e_arrays.xml | 28 ++++++++++++++++ res/values/e_strings.xml | 8 +++++ res/xml/preference_display_options.xml | 8 +++++ .../contacts/vcard/ExportProcessor.java | 33 +++++++++++++------ 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 res/values/e_arrays.xml diff --git a/res/values/e_arrays.xml b/res/values/e_arrays.xml new file mode 100644 index 0000000000..a38cce56ce --- /dev/null +++ b/res/values/e_arrays.xml @@ -0,0 +1,28 @@ + + + + + @string/menu_export_type_vcf_21 + @string/menu_export_type_vcf_30 + @string/menu_export_type_vcf_40 + + + + @string/menu_export_type_vcf_21_value + @string/menu_export_type_vcf_30_value + @string/menu_export_type_vcf_40_value + + diff --git a/res/values/e_strings.xml b/res/values/e_strings.xml index c0f2b3fb18..f5ffa90eb6 100644 --- a/res/values/e_strings.xml +++ b/res/values/e_strings.xml @@ -30,4 +30,12 @@ Contacts information Contacts is an open source App for Android + + Export vCard version + VCF 2.1 + VCF 3.0 + VCF 4.0 + v21_generic + v30_generic + v40_generic diff --git a/res/xml/preference_display_options.xml b/res/xml/preference_display_options.xml index c969cd24f1..9f30a8fdcc 100644 --- a/res/xml/preference_display_options.xml +++ b/res/xml/preference_display_options.xml @@ -65,6 +65,14 @@ android:key="export" android:title="@string/menu_export"/> + + sVCardTypeMap = new HashMap<>(); + sVCardTypeMap.put(VCARD_TYPE_V21_GENERIC_STR, VCARD_TYPE_V21_GENERIC); + sVCardTypeMap.put(VCARD_TYPE_V30_GENERIC_STR, VCARD_TYPE_V30_GENERIC); + sVCardTypeMap.put(VCARD_TYPE_V40_GENERIC_STR, VCARD_TYPE_V40_GENERIC); + + final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( + mService.getApplicationContext()); + final String defVcfType = pref.getString(KEY_EXPORT_TYPE, + VCARD_TYPE_V40_GENERIC_STR); + final int vcardType = sVCardTypeMap.get(defVcfType); composer = new VCardComposer(mService, vcardType, true); -- GitLab From 55feac34aafbe6e3bd4c2f0d9aa173bca6ef4cb2 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Fri, 2 Jun 2023 16:18:57 +0000 Subject: [PATCH 05/12] Contacts: show labels for contacts --- res/layout/expanding_entry_card_item.xml | 33 ++++---- res/layout/quickcontact_content.xml | 6 ++ res/values/dimens.xml | 2 +- .../contacts/activities/PeopleActivity.java | 37 +++++++++ .../contacts/model/GroupMembershipTools.java | 67 +++++++++++++++ .../quickcontact/ExpandingEntryCardView.java | 13 +++ .../quickcontact/QuickContactActivity.java | 81 ++++++++++++++++++- 7 files changed, 220 insertions(+), 19 deletions(-) create mode 100644 src/com/android/contacts/model/GroupMembershipTools.java diff --git a/res/layout/expanding_entry_card_item.xml b/res/layout/expanding_entry_card_item.xml index dbbeee5fa4..c044428d57 100644 --- a/res/layout/expanding_entry_card_item.xml +++ b/res/layout/expanding_entry_card_item.xml @@ -67,24 +67,29 @@ android:layout_marginEnd="@dimen/expanding_entry_card_item_sub_header_icon_margin_right" android:layout_marginBottom="@dimen/expanding_entry_card_item_sub_header_icon_margin_bottom" /> - - - + android:orientation="horizontal" + android:gravity="center" + > + + + + + + + + 20dp 8dp 13dp - 16dp + 13dp 27dp diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java index 62dc48ef44..deaa1b13b5 100644 --- a/src/com/android/contacts/activities/PeopleActivity.java +++ b/src/com/android/contacts/activities/PeopleActivity.java @@ -104,6 +104,7 @@ import com.google.common.util.concurrent.Futures; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; /** @@ -140,6 +141,9 @@ public class PeopleActivity extends AppCompatContactsActivity implements private static final String KEY_CONTACTS_VIEW = "contactsView"; private static final String KEY_NEW_GROUP_ACCOUNT = "newGroupAccount"; + public static final String ACTION_OPEN_GROUP_FROM_CONTACT = "openGroupFromContact"; + public static final String EXTRA_GROUP_ID = "groupId"; + private static final long DRAWER_CLOSE_DELAY = 300L; private ContactsIntentResolver mIntentResolver; @@ -157,6 +161,8 @@ public class PeopleActivity extends AppCompatContactsActivity implements private boolean mShouldSwitchToGroupView; + private boolean mGroupOpenedFromContact = false; + private ContactsView mCurrentView; private CoordinatorLayout mLayoutRoot; @@ -419,12 +425,34 @@ public class PeopleActivity extends AppCompatContactsActivity implements Log.d(Constants.PERFORMANCE_TAG, "PeopleActivity.onCreate finish"); } getWindow().setBackgroundDrawable(null); + + openProvidedGroupFromContact(getIntent()); + } + + private void openProvidedGroupFromContact(Intent intent) { + if (intent == null) { + return; + } + final String action = intent.getAction(); + if (Objects.equals(action, ACTION_OPEN_GROUP_FROM_CONTACT)) { + long groupId = intent.getLongExtra(EXTRA_GROUP_ID, -1); + if (groupId != -1) { + onGroupMenuItemClicked(groupId); + mGroupOpenedFromContact = true; + } + } } @SuppressWarnings("MissingSuperCall") // TODO: Fix me @Override protected void onNewIntent(Intent intent) { final String action = intent.getAction(); + + openProvidedGroupFromContact(intent); + if (isGroupOpenedFromContact()) { + return; + } + if (GroupUtil.ACTION_CREATE_GROUP.equals(action)) { mGroupUri = intent.getData(); if (mGroupUri == null) { @@ -802,6 +830,11 @@ public class PeopleActivity extends AppCompatContactsActivity implements return; } + if (isGroupOpenedFromContact()) { + finish(); + return; + } + // Handle the back event in "second level". if (isGroupView()) { onBackPressedGroupView(); @@ -1246,6 +1279,10 @@ public class PeopleActivity extends AppCompatContactsActivity implements return mCurrentView == ContactsView.GROUP_VIEW; } + public boolean isGroupOpenedFromContact() { + return mGroupOpenedFromContact; + } + protected boolean isAssistantView() { return mCurrentView == ContactsView.ASSISTANT; } diff --git a/src/com/android/contacts/model/GroupMembershipTools.java b/src/com/android/contacts/model/GroupMembershipTools.java new file mode 100644 index 0000000000..5d506b31c6 --- /dev/null +++ b/src/com/android/contacts/model/GroupMembershipTools.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2019-2023 E FOUNDATION + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.android.contacts.model; + +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.ContactsContract; + +public class GroupMembershipTools { + + public boolean isTypeGroupMembership(String mimeType) { + return ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType); + } + + public String getGroupTitle(Context context, long groupId) { + final Uri groupUri = ContactsContract.Groups.CONTENT_URI; + + final String[] projection = new String[]{ + ContactsContract.Groups._ID, + ContactsContract.Groups.TITLE, + }; + final String selection = ContactsContract.Groups.AUTO_ADD + " = ? AND " + ContactsContract.Groups.FAVORITES + " = ?"; + final String[] selectionArgs = new String[]{"0", "0"}; + + try { + Cursor groupCursor = context.getContentResolver().query(groupUri, projection, selection, selectionArgs, null, null); + if (groupCursor.moveToFirst()) { + do { + final int groupIdColumnIndex = groupCursor.getColumnIndex(ContactsContract.Groups._ID); + final int groupTitleColumnIndex = groupCursor.getColumnIndex(ContactsContract.Groups.TITLE); + if (groupIdColumnIndex == -1 || groupTitleColumnIndex == -1) { + groupCursor.close(); + return null; + } + final long id = groupCursor.getLong(groupIdColumnIndex); + final String title = groupCursor.getString(groupTitleColumnIndex); + if (groupId == id) { + groupCursor.close(); + return title; + } + } while (groupCursor.moveToNext()); + } + groupCursor.close(); + return null; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java index d462a0ee04..5ed14d8862 100644 --- a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java +++ b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java @@ -24,6 +24,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.ColorFilter; +import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -617,6 +618,18 @@ public class ExpandingEntryCardView extends CardView { thirdIcon.mutate(); thirdIcon.setColorFilter(mThemeColorFilter); } + Drawable textIcon = entry.getTextIcon(); + if (textIcon != null) { + textIcon.mutate(); + if (entry.shouldApplyColor()) { + textIcon.setColorFilter(mThemeColorFilter); + } else { + final int textColor = + getResources().getColor(R.color.quickcontact_entry_sub_header_text_color); + textIcon.setColorFilter(textColor, PorterDuff.Mode.SRC_ATOP); + } + textIcon.setAlpha(200); + } } } } diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java index bff805c649..b92e7b3fd8 100644 --- a/src/com/android/contacts/quickcontact/QuickContactActivity.java +++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java @@ -109,6 +109,7 @@ import com.android.contacts.ShortcutIntentBuilder; import com.android.contacts.ShortcutIntentBuilder.OnShortcutIntentCreatedListener; import com.android.contacts.activities.ContactEditorActivity; import com.android.contacts.activities.ContactSelectionActivity; +import com.android.contacts.activities.PeopleActivity; import com.android.contacts.activities.RequestPermissionsActivity; import com.android.contacts.compat.CompatUtils; import com.android.contacts.compat.EventCompat; @@ -131,6 +132,7 @@ import com.android.contacts.logging.ScreenEvent.ScreenType; import com.android.contacts.model.AccountTypeManager; import com.android.contacts.model.Contact; import com.android.contacts.model.ContactLoader; +import com.android.contacts.model.GroupMembershipTools; import com.android.contacts.model.RawContact; import com.android.contacts.model.account.AccountType; import com.android.contacts.model.dataitem.CustomDataItem; @@ -138,6 +140,7 @@ import com.android.contacts.model.dataitem.DataItem; import com.android.contacts.model.dataitem.DataKind; import com.android.contacts.model.dataitem.EmailDataItem; import com.android.contacts.model.dataitem.EventDataItem; +import com.android.contacts.model.dataitem.GroupMembershipDataItem; import com.android.contacts.model.dataitem.ImDataItem; import com.android.contacts.model.dataitem.NicknameDataItem; import com.android.contacts.model.dataitem.NoteDataItem; @@ -281,6 +284,7 @@ public class QuickContactActivity extends ContactsActivity { private QuickContactImageView mPhotoView; private ExpandingEntryCardView mContactCard; + private ExpandingEntryCardView mLabelsCard; private ExpandingEntryCardView mNoContactDetailsCard; private ExpandingEntryCardView mAboutCard; @@ -337,7 +341,6 @@ public class QuickContactActivity extends ContactsActivity { Event.CONTENT_ITEM_TYPE, Relation.CONTENT_ITEM_TYPE, Im.CONTENT_ITEM_TYPE, - GroupMembership.CONTENT_ITEM_TYPE, Identity.CONTENT_ITEM_TYPE, CustomDataItem.MIMETYPE_CUSTOM_FIELD, Note.CONTENT_ITEM_TYPE); @@ -354,6 +357,8 @@ public class QuickContactActivity extends ContactsActivity { private static final String FRAGMENT_TAG_SELECT_ACCOUNT = "select_account_fragment"; + private static final GroupMembershipTools groupMembershipTools = new GroupMembershipTools(); + final OnClickListener mEntryClickHandler = new OnClickListener() { @Override public void onClick(View v) { @@ -700,6 +705,7 @@ public class QuickContactActivity extends ContactsActivity { mScroller = (MultiShrinkScroller) findViewById(R.id.multiscroller); mContactCard = (ExpandingEntryCardView) findViewById(R.id.communication_card); + mLabelsCard = (ExpandingEntryCardView) findViewById(R.id.labels_card); mNoContactDetailsCard = (ExpandingEntryCardView) findViewById(R.id.no_contact_data_card); mAboutCard = (ExpandingEntryCardView) findViewById(R.id.about_card); @@ -710,6 +716,9 @@ public class QuickContactActivity extends ContactsActivity { mAboutCard.setOnClickListener(mEntryClickHandler); mAboutCard.setOnCreateContextMenuListener(mEntryContextMenuListener); + mLabelsCard.setOnClickListener(mEntryClickHandler); + mLabelsCard.setOnCreateContextMenuListener(mEntryContextMenuListener); + mPhotoView = (QuickContactImageView) findViewById(R.id.photo); final View transparentView = findViewById(R.id.transparent_view); if (mScroller != null) { @@ -1029,6 +1038,7 @@ public class QuickContactActivity extends ContactsActivity { mOnlyOneEmail = emailDataItems != null && emailDataItems.size() == 1; populateContactAndAboutCard(cp2DataCardModel, /* shouldAddPhoneticName */ true); + populateLabelsCard(mCachedCp2DataCardModel); } private void showActivity() { @@ -1069,6 +1079,7 @@ public class QuickContactActivity extends ContactsActivity { if (mHasIntentLaunched) { mHasIntentLaunched = false; populateContactAndAboutCard(mCachedCp2DataCardModel, /* shouldAddPhoneticName */ false); + populateLabelsCard(mCachedCp2DataCardModel); } maybeShowProgressDialog(); @@ -1180,6 +1191,31 @@ public class QuickContactActivity extends ContactsActivity { Trace.endSection(); } + private void populateLabelsCard(Cp2DataCardModel cp2DataCardModel) { + mCachedCp2DataCardModel = cp2DataCardModel; + if (mHasIntentLaunched || cp2DataCardModel == null) { + return; + } + + final List> labelEntries = cp2DataCardModel.labelEntries; + final String cardTitle = getString(R.string.groupsLabel); + + mLabelsCard.setTitle(cardTitle); + mLabelsCard.initialize(labelEntries, + /* numInitialVisibleEntries = */ 1, + /* isExpanded = */ true, + /* isAlwaysExpanded = */ true, + mExpandingEntryCardViewListener, + mScroller); + + if (labelEntries.size() > 0) { + mLabelsCard.setVisibility(View.VISIBLE); + return; + } + + mLabelsCard.setVisibility(View.GONE); + } + /** * Create a card that shows "Add email" and "Add phone number" entries in grey. * When contact is a SIM contact, only shows "Add phone number". @@ -1272,7 +1308,7 @@ public class QuickContactActivity extends ContactsActivity { dataItem.setDataKind(dataKind); final boolean hasData = !TextUtils.isEmpty(dataItem.buildDataString(this, - dataKind)); + dataKind)) || groupMembershipTools.isTypeGroupMembership(mimeType); if (isMimeExcluded(mimeType) || !hasData) continue; } else if (!tachyonEnabled) { @@ -1300,8 +1336,17 @@ public class QuickContactActivity extends ContactsActivity { */ final List> dataItemsList = new ArrayList<>(); for (List mimeTypeDataItems : dataItemsMap.values()) { - // Remove duplicate data items - Collapser.collapseList(mimeTypeDataItems, this); + if (mimeTypeDataItems.isEmpty()) { + continue; + } + + String mimeType = mimeTypeDataItems.get(0).getMimeType(); + + if (!groupMembershipTools.isTypeGroupMembership(mimeType)) { + // Remove duplicate data items + Collapser.collapseList(mimeTypeDataItems, this); + } + // Sort within mimetype Collections.sort(mimeTypeDataItems, mWithinMimeTypeDataItemComparator); // Add to the list of data item lists @@ -1318,6 +1363,7 @@ public class QuickContactActivity extends ContactsActivity { final List> contactCardEntries = new ArrayList<>(); final List> aboutCardEntries = buildAboutCardEntries(dataItemsMap); + final List> labelCardEntries = new ArrayList<>(); final MutableString aboutCardName = new MutableString(); for (int i = 0; i < dataItemsList.size(); ++i) { @@ -1326,6 +1372,12 @@ public class QuickContactActivity extends ContactsActivity { if (SORTED_ABOUT_CARD_MIMETYPES.contains(topDataItem.getMimeType())) { // About card mimetypes are built in buildAboutCardEntries, skip here continue; + } else if (groupMembershipTools.isTypeGroupMembership(topDataItem.getMimeType())) { + List labelEntries = dataItemsToEntries(dataItemsByMimeType, + aboutCardName); + if (labelEntries.size() > 0) { + labelCardEntries.add(labelEntries); + } } else { List contactEntries = dataItemsToEntries(dataItemsList.get(i), aboutCardName); @@ -1341,6 +1393,7 @@ public class QuickContactActivity extends ContactsActivity { dataModel.customAboutCardName = aboutCardName.value; dataModel.aboutCardEntries = aboutCardEntries; dataModel.contactCardEntries = contactCardEntries; + dataModel.labelEntries = labelCardEntries; dataModel.dataItemsMap = dataItemsMap; dataModel.areAllRawContactsSimAccounts = data.areAllRawContactsSimAccounts(this); return dataModel; @@ -1380,6 +1433,7 @@ public class QuickContactActivity extends ContactsActivity { public Map> dataItemsMap; public List> aboutCardEntries; public List> contactCardEntries; + public List> labelEntries; public String customAboutCardName; public boolean areAllRawContactsSimAccounts; } @@ -1723,6 +1777,24 @@ public class QuickContactActivity extends ContactsActivity { aboutCardName.value = res.getString(R.string.about_card_title); } } + } else if (dataItem instanceof GroupMembershipDataItem) { + + final GroupMembershipDataItem group = (GroupMembershipDataItem) dataItem; + String groupTitle = groupMembershipTools.getGroupTitle(context, group.getGroupRowId()); + + if (!TextUtils.isEmpty(groupTitle)) { + text = groupTitle; + textIcon = res.getDrawable(R.drawable.quantum_ic_label_vd_theme_24); + + entryContextMenuInfo = new EntryContextMenuInfo(text, + res.getString(R.string.groupsLabel), dataItem.getMimeType(), + dataItem.getId(), dataItem.isSuperPrimary()); + + intent = new Intent(context, PeopleActivity.class) + .setAction(PeopleActivity.ACTION_OPEN_GROUP_FROM_CONTACT) + .putExtra(PeopleActivity.EXTRA_GROUP_ID, group.getGroupRowId()); + } + } else if (CallUtil.isTachyonEnabled(context) && MIMETYPE_TACHYON.equals( dataItem.getMimeType())) { // Skip these actions. They will be placed by the phone number. @@ -2064,6 +2136,7 @@ public class QuickContactActivity extends ContactsActivity { new PorterDuffColorFilter(mColorFilterColor, PorterDuff.Mode.SRC_ATOP); mContactCard.setColorAndFilter(mColorFilterColor, mColorFilter); mAboutCard.setColorAndFilter(mColorFilterColor, mColorFilter); + mLabelsCard.setColorAndFilter(mColorFilterColor, mColorFilter); } private void updateStatusBarColor() { -- GitLab From 5cf3266ac2bfc6854e8911ac769df12dd3e8dfae Mon Sep 17 00:00:00 2001 From: althafvly Date: Wed, 28 Jun 2023 11:06:39 +0530 Subject: [PATCH 06/12] Contacts: Drop google maps web intent - Using `geo:0,0?q=` launches map-related functionality or map applications directly. Change-Id: I0abb021f9adb596d84a0ee26271892d9d04ed72e --- .../contacts/quickcontact/QuickContactActivity.java | 2 +- src/com/android/contacts/util/StructuredPostalUtils.java | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java index b92e7b3fd8..172481c724 100644 --- a/src/com/android/contacts/quickcontact/QuickContactActivity.java +++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java @@ -1732,7 +1732,7 @@ public class QuickContactActivity extends ContactsActivity { } primaryContentDescription.append(header); alternateIntent = - StructuredPostalUtils.getViewPostalAddressDirectionsIntent(postalAddress); + StructuredPostalUtils.getViewPostalAddressIntent(postalAddress); alternateIntent.putExtra(EXTRA_ACTION_TYPE, ActionType.DIRECTIONS); alternateIcon = context.getDrawable(R.drawable.quantum_ic_directions_vd_theme_24); alternateContentDescription.append(res.getString( diff --git a/src/com/android/contacts/util/StructuredPostalUtils.java b/src/com/android/contacts/util/StructuredPostalUtils.java index 6e46176ca8..59d38ea435 100644 --- a/src/com/android/contacts/util/StructuredPostalUtils.java +++ b/src/com/android/contacts/util/StructuredPostalUtils.java @@ -30,12 +30,4 @@ public class StructuredPostalUtils { public static Uri getPostalAddressUri(String postalAddress) { return Uri.parse("geo:0,0?q=" + Uri.encode(postalAddress)); } - - public static Intent getViewPostalAddressDirectionsIntent(String postalAddress) { - return new Intent(Intent.ACTION_VIEW, getPostalAddressDirectionsUri(postalAddress)); - } - - public static Uri getPostalAddressDirectionsUri(String postalAddress) { - return Uri.parse("https://maps.google.com/maps?daddr=" + Uri.encode(postalAddress)); - } } -- GitLab From a984df3f63790e23b1d95a161bb083065c990245 Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Mon, 17 Jul 2023 11:14:02 +0000 Subject: [PATCH 07/12] Issue 1317: Fix address books appreaing repeatedly --- .../contacts/model/AccountTypeManager.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/com/android/contacts/model/AccountTypeManager.java b/src/com/android/contacts/model/AccountTypeManager.java index 253097bac8..7cb8657202 100644 --- a/src/com/android/contacts/model/AccountTypeManager.java +++ b/src/com/android/contacts/model/AccountTypeManager.java @@ -597,12 +597,29 @@ class AccountTypeManagerImpl extends AccountTypeManager result.add( typeProvider.getTypeForAccount(account).wrapAccount(mContext, account)); } + + filterDuplicateAccounts(result); + AccountInfo.sortAccounts(null, result); return result; } }, MoreExecutors.directExecutor()); } + private void filterDuplicateAccounts(List accountList) { + final List uniqueList = new ArrayList<>(); + + for (AccountInfo resultInfo: accountList) { + final boolean isPresent = uniqueList.stream().anyMatch(resultInfo::sameAccount); + if (!isPresent) { + uniqueList.add(resultInfo); + } + } + + accountList.clear(); + accountList.addAll(uniqueList); + } + @Override public ListenableFuture> filterAccountsAsync( final Predicate filter) { -- GitLab From 487d1183e9fcd3dca493cac56c37e3092f94aade Mon Sep 17 00:00:00 2001 From: Sayantan Roychowdhury Date: Tue, 28 Nov 2023 21:34:22 +0000 Subject: [PATCH 08/12] Issue 1756: Account selector ui fix --- res/layout/account_selector_list_item_condensed.xml | 12 +----------- res/layout/dialog_title.xml | 2 +- res/values/styles.xml | 2 +- .../android/contacts/util/AccountSelectionUtil.java | 6 +----- .../android/contacts/util/AccountsListAdapter.java | 6 +----- 5 files changed, 5 insertions(+), 23 deletions(-) diff --git a/res/layout/account_selector_list_item_condensed.xml b/res/layout/account_selector_list_item_condensed.xml index ae91726033..a7de3c0237 100644 --- a/res/layout/account_selector_list_item_condensed.xml +++ b/res/layout/account_selector_list_item_condensed.xml @@ -38,19 +38,9 @@ android:layout_marginRight="8dip" android:layout_marginEnd="8dip" android:textSize="16sp" - android:textColor="@color/contacts_text_color" + android:textColor="?android:attr/textColorPrimary" android:textAppearance="?android:attr/textAppearanceMedium" android:singleLine="true" android:ellipsize="end"/> - - diff --git a/res/layout/dialog_title.xml b/res/layout/dialog_title.xml index 45f5f73676..63fcf0b232 100644 --- a/res/layout/dialog_title.xml +++ b/res/layout/dialog_title.xml @@ -22,7 +22,7 @@ android:paddingStart="24dp" android:paddingEnd="24dp" android:textSize="20sp" - android:textColor="@color/contacts_text_color" + android:textColor="?android:attr/textColorPrimary" android:textAlignment="viewStart" android:fontFamily="sans-serif-medium" android:ellipsize="end" diff --git a/res/values/styles.xml b/res/values/styles.xml index d31ce80da4..5473705d24 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -289,7 +289,7 @@ true - - diff --git a/res/values/colors.xml b/res/values/colors.xml index 429695ec7d..72907edddf 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -17,40 +17,40 @@ #F5F5F5 - #dd000000 + @color/e_primary_text_color - #89000000 + @color/e_secondary_text_color - #61000000 + @color/e_disabled_color - #737373 + @color/e_secondary_text_color #202020 @*android:color/system_accent1_600 #0f000000 - #FFFFFF + @color/e_primary_text_color - @color/primary_color + @color/e_action_bar - #f6f6f6 + @color/e_action_bar - #bababa + @color/e_action_bar - @*android:color/system_accent1_700 - @*android:color/system_accent1_600 + @color/e_action_bar + @color/e_accent - @*android:color/system_neutral1_900 - @*android:color/system_neutral1_800 + @color/e_action_bar + @color/e_action_bar @*android:color/system_neutral1_0 - @color/contacts_accent_color - @android:color/system_accent1_600 + @color/e_background + @color/e_accent @*android:color/transparent @@ -62,7 +62,7 @@ #ffffff - #f4f4f4 + @color/e_background #2aad6f #ff2e58 @@ -74,7 +74,7 @@ #7f7f7f - #40000000 + @color/e_disabled_color #40000000 @@ -86,18 +86,18 @@ #4D000000 - #efefef + @color/e_background #a0ffffff - #363636 + @color/e_primary_text_color - @color/dialtacts_secondary_text_color + @color/e_secondary_text_color - @color/dialtacts_theme_color + @color/e_primary_text_color @*android:color/system_neutral1_800 @@ -112,7 +112,7 @@ #333333 - #737373 + @color/e_secondary_text_color #7f000000 @@ -127,35 +127,35 @@ These colors are also used by MaterialColorMapUtils to generate primary activity colors. --> - @*android:color/system_accent1_300 - @*android:color/system_accent2_300 - @*android:color/system_accent3_300 - @*android:color/system_accent1_400 - @*android:color/system_accent2_400 - @*android:color/system_accent3_400 - @*android:color/system_accent1_500 - @*android:color/system_accent2_500 - @*android:color/system_accent3_500 - @*android:color/system_accent1_600 - @*android:color/system_accent2_600 - @*android:color/system_accent3_600 + #0F94F6 + #00B4B4 + #008D96 + #44B04C + #AFD83D + #FFED21 + #FFC300 + #FF7A00 + #F8432E + #ED1C61 + #ED1C61 + #5754DC - @*android:color/system_accent1_500 - @*android:color/system_accent2_500 - @*android:color/system_accent3_500 - @*android:color/system_accent1_600 - @*android:color/system_accent2_600 - @*android:color/system_accent3_600 - @*android:color/system_accent1_700 - @*android:color/system_accent2_700 - @*android:color/system_accent3_700 - @*android:color/system_accent1_800 - @*android:color/system_accent2_800 - @*android:color/system_accent3_800 + #0F94F6 + #00B4B4 + #008D96 + #44B04C + #AFD83D + #FFED21 + #FFC300 + #FF7A00 + #F8432E + #ED1C61 + #ED1C61 + #5754DC - #ffffff + @color/e_primary_text_color @color/actionbar_background_color - #ffffff + @color/e_primary_text_color #8C000000 - #DF000000 + @color/actionbar_text_color #777777 - #000000 + @color/e_primary_text_color - #ffffff + @color/e_action_bar - #66000000 + @color/e_disabled_color @color/dialtacts_theme_color - @*android:color/system_neutral1_50 - @*android:color/system_neutral1_0 + @color/e_background + @color/e_background #d1041c @@ -224,7 +224,7 @@ @color/actionbar_text_color_black #dbdbdb - @color/primary_color + @color/e_accent #333333 @@ -236,13 +236,13 @@ #e0e0e0 - #E5E5E5 + @android:color/transparent - #FAFAFA + @color/e_drawer_background - #E8E8E8 + @color/navigation_drawer_item_background #1A000000 diff --git a/res/values/lineage_colors.xml b/res/values/lineage_colors.xml index fdac8e53dc..8a1a4964f0 100644 --- a/res/values/lineage_colors.xml +++ b/res/values/lineage_colors.xml @@ -15,5 +15,5 @@ limitations under the License. --> - @android:color/white + @color/e_action_bar diff --git a/res/values/styles.xml b/res/values/styles.xml index 5473705d24..affe6fcb0b 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -92,7 +92,7 @@ @@ -388,8 +391,7 @@ @@ -455,6 +457,8 @@ background and text color. See also android:style/Widget.Holo.TextView.ListSepar