summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/app/list
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/app/list')
-rw-r--r--java/com/android/dialer/app/list/AllContactsFragment.java8
-rw-r--r--java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java33
-rw-r--r--java/com/android/dialer/app/list/DialerViewPager.java55
-rw-r--r--java/com/android/dialer/app/list/ListsFragment.java59
-rw-r--r--java/com/android/dialer/app/list/OldSpeedDialFragment.java18
-rw-r--r--java/com/android/dialer/app/list/PhoneFavoriteListView.java19
-rw-r--r--java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java4
-rw-r--r--java/com/android/dialer/app/list/PhoneFavoriteTileView.java38
-rw-r--r--java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java79
-rw-r--r--java/com/android/dialer/app/list/RegularSearchFragment.java4
-rw-r--r--java/com/android/dialer/app/list/RemoveView.java2
-rw-r--r--java/com/android/dialer/app/list/SearchFragment.java4
-rw-r--r--java/com/android/dialer/app/list/SmartDialSearchFragment.java2
13 files changed, 260 insertions, 65 deletions
diff --git a/java/com/android/dialer/app/list/AllContactsFragment.java b/java/com/android/dialer/app/list/AllContactsFragment.java
index 04609970a..f5fdb9e2d 100644
--- a/java/com/android/dialer/app/list/AllContactsFragment.java
+++ b/java/com/android/dialer/app/list/AllContactsFragment.java
@@ -38,12 +38,14 @@ import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.ContactListFilter;
import com.android.contacts.common.list.DefaultContactListAdapter;
import com.android.dialer.app.R;
-import com.android.dialer.app.widget.EmptyContentView;
-import com.android.dialer.app.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
import com.android.dialer.compat.CompatUtils;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.IntentUtil;
import com.android.dialer.util.PermissionsUtil;
+import com.android.dialer.widget.EmptyContentView;
+import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
/** Fragments to show all contacts with phone numbers. */
public class AllContactsFragment extends ContactEntryListFragment<ContactEntryListAdapter>
@@ -149,6 +151,8 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final Uri uri = (Uri) view.getTag();
if (uri != null) {
+ Logger.get(getContext())
+ .logInteraction(InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_ALL_CONTACTS_GENERAL);
if (CompatUtils.hasPrioritizedMimeType()) {
QuickContact.showQuickContact(getContext(), view, uri, null, Phone.CONTENT_ITEM_TYPE);
} else {
diff --git a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
index 537f488d5..04927cf7a 100644
--- a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
+++ b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
@@ -19,6 +19,7 @@ package com.android.dialer.app.list;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
+import android.graphics.drawable.Drawable;
import android.telephony.PhoneNumberUtils;
import android.text.BidiFormatter;
import android.text.TextDirectionHeuristics;
@@ -29,7 +30,6 @@ import com.android.contacts.common.list.PhoneNumberListAdapter;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.app.R;
import com.android.dialer.location.GeoUtil;
-import com.android.dialer.util.CallUtil;
/**
* {@link PhoneNumberListAdapter} with the following added shortcuts, that are displayed as list
@@ -50,7 +50,6 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
private final boolean[] mShortcutEnabled = new boolean[SHORTCUT_COUNT];
private final BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
- private final boolean mVideoCallingEnabled;
private final String mCountryIso;
private String mFormattedQueryString;
@@ -59,7 +58,6 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
super(context);
mCountryIso = GeoUtil.getCurrentCountryIso(context);
- mVideoCallingEnabled = CallUtil.isVideoEnabled(context);
}
@Override
@@ -110,8 +108,7 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
return convertView;
} else {
final ContactListItemView v =
- new ContactListItemView(
- getContext(), null, mVideoCallingEnabled, isCallAndShareEnabled());
+ new ContactListItemView(getContext(), null, mIsImsVideoEnabled);
assignShortcutToView(v, shortcutType);
return v;
}
@@ -125,8 +122,7 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
Context context, int partition, Cursor cursor, int position, ViewGroup parent) {
final ContactListItemView view = super.newView(context, partition, cursor, position, parent);
- view.setSupportVideoCallIcon(mVideoCallingEnabled);
- view.setSupportCallAndShareIcon(isCallAndShareEnabled());
+ view.setSupportVideoCallIcon(mIsImsVideoEnabled);
return view;
}
@@ -171,7 +167,7 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
private void assignShortcutToView(ContactListItemView v, int shortcutType) {
final CharSequence text;
- final int drawableId;
+ final Drawable drawable;
final Resources resources = getContext().getResources();
final String number = getFormattedQueryString();
switch (shortcutType) {
@@ -181,34 +177,39 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
resources,
R.string.search_shortcut_call_number,
mBidiFormatter.unicodeWrap(number, TextDirectionHeuristics.LTR));
- drawableId = R.drawable.ic_search_phone;
+ drawable = getContext().getResources().getDrawable(R.drawable.quantum_ic_call_vd_theme_24);
break;
case SHORTCUT_CREATE_NEW_CONTACT:
text = resources.getString(R.string.search_shortcut_create_new_contact);
- drawableId = R.drawable.ic_search_add_contact;
+ drawable =
+ getContext().getResources().getDrawable(R.drawable.quantum_ic_person_add_vd_theme_24);
+ drawable.setAutoMirrored(true);
break;
case SHORTCUT_ADD_TO_EXISTING_CONTACT:
text = resources.getString(R.string.search_shortcut_add_to_contact);
- drawableId = R.drawable.quantum_ic_person_white_24;
+ drawable =
+ getContext().getResources().getDrawable(R.drawable.quantum_ic_person_add_vd_theme_24);
break;
case SHORTCUT_SEND_SMS_MESSAGE:
text = resources.getString(R.string.search_shortcut_send_sms_message);
- drawableId = R.drawable.quantum_ic_message_white_24;
+ drawable =
+ getContext().getResources().getDrawable(R.drawable.quantum_ic_message_vd_theme_24);
break;
case SHORTCUT_MAKE_VIDEO_CALL:
text = resources.getString(R.string.search_shortcut_make_video_call);
- drawableId = R.drawable.quantum_ic_videocam_white_24;
+ drawable =
+ getContext().getResources().getDrawable(R.drawable.quantum_ic_videocam_vd_theme_24);
break;
case SHORTCUT_BLOCK_NUMBER:
text = resources.getString(R.string.search_shortcut_block_number);
- drawableId = R.drawable.ic_not_interested_googblue_24dp;
+ drawable =
+ getContext().getResources().getDrawable(R.drawable.ic_not_interested_googblue_24dp);
break;
default:
throw new IllegalArgumentException("Invalid shortcut type");
}
- v.setDrawableResource(drawableId);
+ v.setDrawable(drawable);
v.setDisplayName(text);
- v.setPhotoPosition(super.getPhotoPosition());
v.setAdjustSelectionBoundsEnabled(false);
}
diff --git a/java/com/android/dialer/app/list/DialerViewPager.java b/java/com/android/dialer/app/list/DialerViewPager.java
new file mode 100644
index 000000000..ae99f0521
--- /dev/null
+++ b/java/com/android/dialer/app/list/DialerViewPager.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017 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.dialer.app.list;
+
+import android.content.Context;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+/** Class that handles enabling/disabling swiping between @{ViewPagerTabs}. */
+public class DialerViewPager extends ViewPager {
+
+ private boolean enableSwipingPages;
+
+ public DialerViewPager(Context context, AttributeSet attributeSet) {
+ super(context, attributeSet);
+ enableSwipingPages = true;
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent event) {
+ if (enableSwipingPages) {
+ return super.onInterceptTouchEvent(event);
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (enableSwipingPages) {
+ return super.onTouchEvent(event);
+ }
+
+ return false;
+ }
+
+ public void setEnableSwipingPages(boolean enabled) {
+ enableSwipingPages = enabled;
+ }
+}
diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java
index 8dd52a9d4..32501d556 100644
--- a/java/com/android/dialer/app/list/ListsFragment.java
+++ b/java/com/android/dialer/app/list/ListsFragment.java
@@ -31,19 +31,23 @@ import android.os.Handler;
import android.os.Trace;
import android.preference.PreferenceManager;
import android.provider.VoicemailContract;
-import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
import com.android.contacts.common.list.ViewPagerTabs;
import com.android.dialer.app.R;
import com.android.dialer.app.calllog.CallLogFragment;
import com.android.dialer.app.calllog.CallLogNotificationsService;
+import com.android.dialer.app.calllog.VisualVoicemailCallLogFragment;
import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler;
import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler.Source;
import com.android.dialer.common.LogUtil;
import com.android.dialer.database.CallLogQueryHandler;
+import com.android.dialer.database.CallLogQueryHandler.Listener;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.ScreenEvent;
@@ -61,24 +65,28 @@ import java.util.ArrayList;
* containing the lists up above the search bar and pin it against the top of the screen.
*/
public class ListsFragment extends Fragment
- implements ViewPager.OnPageChangeListener, CallLogQueryHandler.Listener {
+ implements OnPageChangeListener, Listener, OnClickListener {
private static final String TAG = "ListsFragment";
- private ViewPager mViewPager;
+ private DialerViewPager mViewPager;
private ViewPagerTabs mViewPagerTabs;
private DialtactsPagerAdapter mAdapter;
private RemoveView mRemoveView;
private View mRemoveViewContent;
+ private View mMultiSelectSelectAllViewContent;
+ private TextView mSelectUnselectAllViewText;
+ private ImageView mSelectUnselectAllIcon;
private Fragment mCurrentPage;
private SharedPreferences mPrefs;
private boolean mHasFetchedVoicemailStatus;
+ private boolean selectAllMode;
private boolean mShowVoicemailTabAfterVoicemailStatusIsFetched;
private VoicemailStatusHelper mVoicemailStatusHelper;
private final ArrayList<OnPageChangeListener> mOnPageChangeListeners = new ArrayList<>();
/** The position of the currently selected tab. */
private int mTabIndex = TAB_INDEX_SPEED_DIAL;
- private boolean mPaused;
+ private boolean mPaused;
private CallLogQueryHandler mCallLogQueryHandler;
private final ContentObserver mVoicemailStatusObserver =
@@ -163,7 +171,7 @@ public class ListsFragment extends Fragment
tabIcons[TAB_INDEX_ALL_CONTACTS] = R.drawable.quantum_ic_people_white_24;
tabIcons[TAB_INDEX_VOICEMAIL] = R.drawable.quantum_ic_voicemail_white_24;
- mViewPager = (ViewPager) parentView.findViewById(R.id.lists_pager);
+ mViewPager = (DialerViewPager) parentView.findViewById(R.id.lists_pager);
mAdapter =
new DialtactsPagerAdapter(
getContext(),
@@ -180,9 +188,15 @@ public class ListsFragment extends Fragment
mViewPagerTabs.configureTabIcons(tabIcons);
mViewPagerTabs.setViewPager(mViewPager);
addOnPageChangeListener(mViewPagerTabs);
-
mRemoveView = (RemoveView) parentView.findViewById(R.id.remove_view);
mRemoveViewContent = parentView.findViewById(R.id.remove_view_content);
+ mMultiSelectSelectAllViewContent =
+ parentView.findViewById(R.id.multi_select_select_all_view_content);
+ mSelectUnselectAllViewText = (TextView) parentView.findViewById(R.id.select_all_view_text);
+ mSelectUnselectAllIcon = (ImageView) parentView.findViewById(R.id.select_all_view_icon);
+ mMultiSelectSelectAllViewContent.setOnClickListener(null);
+ mSelectUnselectAllIcon.setOnClickListener(this);
+ mSelectUnselectAllViewText.setOnClickListener(this);
if (PermissionsUtil.hasReadVoicemailPermissions(getContext())
&& PermissionsUtil.hasAddVoicemailPermissions(getContext())) {
@@ -191,7 +205,7 @@ public class ListsFragment extends Fragment
.registerContentObserver(
VoicemailContract.Status.CONTENT_URI, true, mVoicemailStatusObserver);
} else {
- LogUtil.w("ListsFragment.onCreateView", "no voicemail read/add permissions");
+ LogUtil.w("ListsFragment.onCreateView", "no voicemail read permissions");
}
Trace.endSection();
@@ -385,6 +399,13 @@ public class ListsFragment extends Fragment
mRemoveView.animate().alpha(show ? 1 : 0).start();
}
+ public void showMultiSelectRemoveView(boolean show) {
+ mMultiSelectSelectAllViewContent.setVisibility(show ? View.VISIBLE : View.GONE);
+ mMultiSelectSelectAllViewContent.setAlpha(show ? 0 : 1);
+ mMultiSelectSelectAllViewContent.animate().alpha(show ? 1 : 0).start();
+ mViewPager.setEnableSwipingPages(!show);
+ }
+
public boolean hasFrequents() {
Fragment page = mAdapter.getItem(mAdapter.getRtlPosition(TAB_INDEX_SPEED_DIAL));
return page instanceof OldSpeedDialFragment
@@ -424,4 +445,28 @@ public class ListsFragment extends Fragment
}
Logger.get(getActivity()).logScreenView(screenType, getActivity());
}
+
+ @Override
+ public void onClick(View v) {
+ updateSelectAllIcon();
+ selectAllMode = !selectAllMode;
+ }
+
+ public void setSelectAllModeToFalse() {
+ selectAllMode = false;
+ mSelectUnselectAllIcon.setImageDrawable(
+ getContext().getDrawable(R.drawable.ic_empty_check_mark_white_24dp));
+ }
+
+ private void updateSelectAllIcon() {
+ if (selectAllMode) {
+ mSelectUnselectAllIcon.setImageDrawable(
+ getContext().getDrawable(R.drawable.ic_empty_check_mark_white_24dp));
+ ((VisualVoicemailCallLogFragment) mCurrentPage).getAdapter().onAllDeselected();
+ } else {
+ mSelectUnselectAllIcon.setImageDrawable(
+ getContext().getDrawable(R.drawable.ic_check_mark_blue_24dp));
+ ((VisualVoicemailCallLogFragment) mCurrentPage).getAdapter().onAllSelected();
+ }
+ }
}
diff --git a/java/com/android/dialer/app/list/OldSpeedDialFragment.java b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
index 40fe74565..1ddc0f4e1 100644
--- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java
+++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
@@ -50,12 +50,11 @@ import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.common.list.ContactTileView;
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.dialer.app.R;
-import com.android.dialer.app.widget.EmptyContentView;
-import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.LogUtil;
import com.android.dialer.util.PermissionsUtil;
import com.android.dialer.util.ViewUtil;
+import com.android.dialer.widget.EmptyContentView;
import java.util.ArrayList;
/** This fragment displays the user's favorite/frequent contacts in a grid. */
@@ -430,7 +429,7 @@ public class OldSpeedDialFragment extends Fragment
void showAllContactsTab();
}
- private class ContactTileLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
+ class ContactTileLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public CursorLoader onCreateLoader(int id, Bundle args) {
@@ -460,24 +459,17 @@ public class OldSpeedDialFragment extends Fragment
private class ContactTileAdapterListener implements ContactTileView.Listener {
@Override
- public void onContactSelected(Uri contactUri, Rect targetRect) {
+ public void onContactSelected(
+ Uri contactUri, Rect targetRect, CallSpecificAppData callSpecificAppData) {
if (mPhoneNumberPickerActionListener != null) {
- CallSpecificAppData callSpecificAppData =
- CallSpecificAppData.newBuilder()
- .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
- .build();
mPhoneNumberPickerActionListener.onPickDataUri(
contactUri, false /* isVideoCall */, callSpecificAppData);
}
}
@Override
- public void onCallNumberDirectly(String phoneNumber) {
+ public void onCallNumberDirectly(String phoneNumber, CallSpecificAppData callSpecificAppData) {
if (mPhoneNumberPickerActionListener != null) {
- CallSpecificAppData callSpecificAppData =
- CallSpecificAppData.newBuilder()
- .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
- .build();
mPhoneNumberPickerActionListener.onPickPhoneNumber(
phoneNumber, false /* isVideoCall */, callSpecificAppData);
}
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteListView.java b/java/com/android/dialer/app/list/PhoneFavoriteListView.java
index 9516f0611..f4f395ff0 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteListView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteListView.java
@@ -1,6 +1,5 @@
/*
- * Copyright (C) 2012 Google Inc.
- * Licensed to The Android Open Source Project.
+ * Copyright (C) 2017 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.
@@ -24,7 +23,6 @@ import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.os.Handler;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
@@ -33,6 +31,7 @@ import android.widget.GridView;
import android.widget.ImageView;
import com.android.dialer.app.R;
import com.android.dialer.app.list.DragDropController.DragItemContainer;
+import com.android.dialer.common.LogUtil;
/** Viewgroup that presents the user's speed dial contacts in a grid. */
public class PhoneFavoriteListView extends GridView
@@ -40,14 +39,14 @@ public class PhoneFavoriteListView extends GridView
public static final String LOG_TAG = PhoneFavoriteListView.class.getSimpleName();
final int[] mLocationOnScreen = new int[2];
- private final long SCROLL_HANDLER_DELAY_MILLIS = 5;
- private final int DRAG_SCROLL_PX_UNIT = 25;
- private final float DRAG_SHADOW_ALPHA = 0.7f;
+ private static final long SCROLL_HANDLER_DELAY_MILLIS = 5;
+ private static final int DRAG_SCROLL_PX_UNIT = 25;
+ private static final float DRAG_SHADOW_ALPHA = 0.7f;
/**
* {@link #mTopScrollBound} and {@link mBottomScrollBound} will be offseted to the top / bottom by
* {@link #getHeight} * {@link #BOUND_GAP_RATIO} pixels.
*/
- private final float BOUND_GAP_RATIO = 0.2f;
+ private static final float BOUND_GAP_RATIO = 0.2f;
private float mTouchSlop;
private int mTopScrollBound;
@@ -67,7 +66,6 @@ public class PhoneFavoriteListView extends GridView
}
};
private boolean mIsDragScrollerRunning = false;
- private int mTouchDownForDragStartX;
private int mTouchDownForDragStartY;
private Bitmap mDragShadowBitmap;
private ImageView mDragShadowOverlay;
@@ -98,7 +96,7 @@ public class PhoneFavoriteListView extends GridView
}
public PhoneFavoriteListView(Context context, AttributeSet attrs) {
- this(context, attrs, -1);
+ this(context, attrs, 0);
}
public PhoneFavoriteListView(Context context, AttributeSet attrs, int defStyle) {
@@ -121,7 +119,6 @@ public class PhoneFavoriteListView extends GridView
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
- mTouchDownForDragStartX = (int) ev.getX();
mTouchDownForDragStartY = (int) ev.getY();
}
@@ -287,7 +284,7 @@ public class PhoneFavoriteListView extends GridView
try {
bitmap = cache.copy(Bitmap.Config.ARGB_8888, false);
} catch (final OutOfMemoryError e) {
- Log.w(LOG_TAG, "Failed to copy bitmap from Drawing cache", e);
+ LogUtil.w(LOG_TAG, "Failed to copy bitmap from Drawing cache", e);
bitmap = null;
}
}
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
index 5a18d039b..40f23ea6f 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
@@ -26,6 +26,8 @@ import android.widget.TextView;
import com.android.contacts.common.list.ContactEntry;
import com.android.dialer.app.R;
import com.android.dialer.compat.CompatUtils;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
/** Displays the contact's picture overlaid with their name and number type in a tile. */
public class PhoneFavoriteSquareTileView extends PhoneFavoriteTileView {
@@ -87,6 +89,8 @@ public class PhoneFavoriteSquareTileView extends PhoneFavoriteTileView {
new OnClickListener() {
@Override
public void onClick(View v) {
+ Logger.get(getContext())
+ .logInteraction(InteractionEvent.Type.SPEED_DIAL_OPEN_CONTACT_CARD);
launchQuickContact();
}
});
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
index db89cf3dc..835b448bd 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
@@ -18,16 +18,22 @@ package com.android.dialer.app.list;
import android.content.ClipData;
import android.content.Context;
+import android.provider.ContactsContract.PinnedPositions;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
-import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
import com.android.contacts.common.MoreContactUtils;
+import com.android.contacts.common.lettertiles.LetterTileDrawable;
import com.android.contacts.common.list.ContactEntry;
import com.android.contacts.common.list.ContactTileView;
import com.android.dialer.app.R;
+import com.android.dialer.callintent.CallInitiationType;
+import com.android.dialer.callintent.CallSpecificAppData;
+import com.android.dialer.callintent.SpeedDialContactType;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
/**
* A light version of the {@link com.android.contacts.common.list.ContactTileView} that is used in
@@ -42,7 +48,6 @@ public abstract class PhoneFavoriteTileView extends ContactTileView {
// tile is long pressed.
static final String DRAG_PHONE_FAVORITE_TILE = "PHONE_FAVORITE_TILE";
private static final String TAG = PhoneFavoriteTileView.class.getSimpleName();
- private static final boolean DEBUG = false;
// These parameters instruct the photo manager to display the default image/letter at 70% of
// its normal size, and vertically offset upwards 12% towards the top of the letter tile, to
// make room for the contact name and number label at the bottom of the image.
@@ -55,6 +60,8 @@ public abstract class PhoneFavoriteTileView extends ContactTileView {
private View mShadowOverlay;
/** Users' most frequent phone number. */
private String mPhoneNumberString;
+ private boolean isPinned;
+ private boolean isStarred;
public PhoneFavoriteTileView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -83,6 +90,8 @@ public abstract class PhoneFavoriteTileView extends ContactTileView {
super.loadFromContact(entry);
// Set phone number to null in case we're reusing the view.
mPhoneNumberString = null;
+ isPinned = (entry.pinned != PinnedPositions.UNPINNED);
+ isStarred = entry.isFavorite;
if (entry != null) {
// Grab the phone-number to call directly. See {@link onClick()}.
mPhoneNumberString = entry.phoneNumber;
@@ -113,16 +122,35 @@ public abstract class PhoneFavoriteTileView extends ContactTileView {
if (mListener == null) {
return;
}
+
+ CallSpecificAppData.Builder callSpecificAppData =
+ CallSpecificAppData.newBuilder()
+ .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL)
+ .setSpeedDialContactPosition(
+ ((PhoneFavoriteListView) v.getParent()).getPositionForView(v));
+ if (isStarred) {
+ callSpecificAppData.addSpeedDialContactType(SpeedDialContactType.Type.STARRED_CONTACT);
+ } else {
+ callSpecificAppData.addSpeedDialContactType(SpeedDialContactType.Type.FREQUENT_CONTACT);
+ }
+ if (isPinned) {
+ callSpecificAppData.addSpeedDialContactType(SpeedDialContactType.Type.PINNED_CONTACT);
+ }
+
if (TextUtils.isEmpty(mPhoneNumberString)) {
// Copy "superclass" implementation
+ Logger.get(getContext())
+ .logInteraction(InteractionEvent.Type.SPEED_DIAL_CLICK_CONTACT_WITH_AMBIGUOUS_NUMBER);
mListener.onContactSelected(
- getLookupUri(), MoreContactUtils.getTargetRectFromView(PhoneFavoriteTileView.this));
+ getLookupUri(),
+ MoreContactUtils.getTargetRectFromView(PhoneFavoriteTileView.this),
+ callSpecificAppData.build());
} else {
// When you tap a frequently-called contact, you want to
// call them at the number that you usually talk to them
// at (i.e. the one displayed in the UI), regardless of
// whether that's their default number.
- mListener.onCallNumberDirectly(mPhoneNumberString);
+ mListener.onCallNumberDirectly(mPhoneNumberString, callSpecificAppData.build());
}
}
};
@@ -133,7 +161,7 @@ public abstract class PhoneFavoriteTileView extends ContactTileView {
return new DefaultImageRequest(
displayName,
lookupKey,
- ContactPhotoManager.TYPE_DEFAULT,
+ LetterTileDrawable.TYPE_DEFAULT,
DEFAULT_IMAGE_LETTER_SCALE,
DEFAULT_IMAGE_LETTER_OFFSET,
false);
diff --git a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
index c692ecac7..ce8598261 100644
--- a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
+++ b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
@@ -30,7 +30,6 @@ import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.PinnedPositions;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
-import android.util.Log;
import android.util.LongSparseArray;
import android.view.View;
import android.view.ViewGroup;
@@ -41,6 +40,11 @@ import com.android.contacts.common.list.ContactEntry;
import com.android.contacts.common.list.ContactTileView;
import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.app.R;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.lightbringer.Lightbringer;
+import com.android.dialer.lightbringer.LightbringerComponent;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
import com.android.dialer.shortcuts.ShortcutRefresher;
import com.google.common.collect.ComparisonChain;
import java.util.ArrayList;
@@ -190,6 +194,14 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
// Track the length of {@link #mContactEntries} and compare to {@link #TILES_SOFT_LIMIT}.
int counter = 0;
+ // Data for logging
+ int starredContactsCount = 0;
+ int pinnedContactsCount = 0;
+ int multipleNumbersContactsCount = 0;
+ int contactsWithPhotoCount = 0;
+ int contactsWithNameCount = 0;
+ int duoReachableContactsCount = 0;
+
// The cursor should not be closed since this is invoked from a CursorLoader.
if (cursor.moveToFirst()) {
int starredColumn = cursor.getColumnIndexOrThrow(Contacts.STARRED);
@@ -262,6 +274,22 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
contact.pinned = pinned;
mContactEntries.add(contact);
+ // Set counts for logging
+ if (isStarred) {
+ // mNumStarred might be larger than the number of visible starred contact,
+ // since it includes invisible ones (starred contact with no phone number).
+ starredContactsCount++;
+ }
+ if (pinned != PinnedPositions.UNPINNED) {
+ pinnedContactsCount++;
+ }
+ if (!TextUtils.isEmpty(name)) {
+ contactsWithNameCount++;
+ }
+ if (photoUri != null) {
+ contactsWithPhotoCount++;
+ }
+
duplicates.put(id, contact);
counter++;
@@ -274,6 +302,47 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
ShortcutRefresher.refresh(mContext, mContactEntries);
notifyDataSetChanged();
+
+ Lightbringer lightbringer = LightbringerComponent.get(mContext).getLightbringer();
+ for (ContactEntry contact : mContactEntries) {
+ if (contact.phoneNumber == null) {
+ multipleNumbersContactsCount++;
+ } else if (lightbringer.isReachable(mContext, contact.phoneNumber)) {
+ duoReachableContactsCount++;
+ }
+ }
+
+ Logger.get(mContext)
+ .logSpeedDialContactComposition(
+ counter,
+ starredContactsCount,
+ pinnedContactsCount,
+ multipleNumbersContactsCount,
+ contactsWithPhotoCount,
+ contactsWithNameCount,
+ duoReachableContactsCount);
+ // Logs for manual testing
+ LogUtil.v("PhoneFavoritesTileAdapter.saveCursorToCache", "counter: %d", counter);
+ LogUtil.v(
+ "PhoneFavoritesTileAdapter.saveCursorToCache",
+ "starredContactsCount: %d",
+ starredContactsCount);
+ LogUtil.v(
+ "PhoneFavoritesTileAdapter.saveCursorToCache",
+ "pinnedContactsCount: %d",
+ pinnedContactsCount);
+ LogUtil.v(
+ "PhoneFavoritesTileAdapter.saveCursorToCache",
+ "multipleNumbersContactsCount: %d",
+ multipleNumbersContactsCount);
+ LogUtil.v(
+ "PhoneFavoritesTileAdapter.saveCursorToCache",
+ "contactsWithPhotoCount: %d",
+ contactsWithPhotoCount);
+ LogUtil.v(
+ "PhoneFavoritesTileAdapter.saveCursorToCache",
+ "contactsWithNameCount: %d",
+ contactsWithNameCount);
}
/** Iterates over the {@link Cursor} Returns position of the first NON Starred Contact */
@@ -347,7 +416,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
@Override
public void notifyDataSetChanged() {
if (DEBUG) {
- Log.v(TAG, "notifyDataSetChanged");
+ LogUtil.v(TAG, "notifyDataSetChanged");
}
super.notifyDataSetChanged();
}
@@ -355,7 +424,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (DEBUG) {
- Log.v(TAG, "get view for " + String.valueOf(position));
+ LogUtil.v(TAG, "get view for " + position);
}
PhoneFavoriteTileView tileView = null;
@@ -455,8 +524,9 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
// update the database here with the new pinned positions
try {
mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations);
+ Logger.get(mContext).logInteraction(InteractionEvent.Type.SPEED_DIAL_PIN_CONTACT);
} catch (RemoteException | OperationApplicationException e) {
- Log.e(TAG, "Exception thrown when pinning contacts", e);
+ LogUtil.e(TAG, "Exception thrown when pinning contacts", e);
}
}
}
@@ -609,6 +679,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop
if (mDraggedEntry != null) {
unstarAndUnpinContact(mDraggedEntry.lookupUri);
mAwaitingRemove = true;
+ Logger.get(mContext).logInteraction(InteractionEvent.Type.SPEED_DIAL_REMOVE_CONTACT);
}
}
diff --git a/java/com/android/dialer/app/list/RegularSearchFragment.java b/java/com/android/dialer/app/list/RegularSearchFragment.java
index 02896793b..4f032032f 100644
--- a/java/com/android/dialer/app/list/RegularSearchFragment.java
+++ b/java/com/android/dialer/app/list/RegularSearchFragment.java
@@ -25,12 +25,12 @@ import android.view.ViewGroup;
import com.android.contacts.common.list.ContactEntryListAdapter;
import com.android.contacts.common.list.PinnedHeaderListView;
import com.android.dialer.app.R;
-import com.android.dialer.app.widget.EmptyContentView;
-import com.android.dialer.app.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.phonenumbercache.CachedNumberLookupService;
import com.android.dialer.phonenumbercache.PhoneNumberCache;
import com.android.dialer.util.PermissionsUtil;
+import com.android.dialer.widget.EmptyContentView;
+import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
public class RegularSearchFragment extends SearchFragment
implements OnEmptyViewActionButtonClickedListener,
diff --git a/java/com/android/dialer/app/list/RemoveView.java b/java/com/android/dialer/app/list/RemoveView.java
index 3b917db43..1d566c5a0 100644
--- a/java/com/android/dialer/app/list/RemoveView.java
+++ b/java/com/android/dialer/app/list/RemoveView.java
@@ -41,7 +41,7 @@ public class RemoveView extends FrameLayout {
}
public RemoveView(Context context, AttributeSet attrs) {
- this(context, attrs, -1);
+ this(context, attrs, 0);
}
public RemoveView(Context context, AttributeSet attrs, int defStyle) {
diff --git a/java/com/android/dialer/app/list/SearchFragment.java b/java/com/android/dialer/app/list/SearchFragment.java
index fcf8236e3..7f2d17650 100644
--- a/java/com/android/dialer/app/list/SearchFragment.java
+++ b/java/com/android/dialer/app/list/SearchFragment.java
@@ -34,19 +34,18 @@ import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Space;
import com.android.contacts.common.list.ContactEntryListAdapter;
-import com.android.contacts.common.list.ContactListItemView;
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.contacts.common.list.PhoneNumberPickerFragment;
import com.android.dialer.animation.AnimUtils;
import com.android.dialer.app.R;
import com.android.dialer.app.dialpad.DialpadFragment.ErrorDialogFragment;
import com.android.dialer.app.widget.DialpadSearchEmptyContentView;
-import com.android.dialer.app.widget.EmptyContentView;
import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.LogUtil;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.IntentUtil;
import com.android.dialer.util.PermissionsUtil;
+import com.android.dialer.widget.EmptyContentView;
public class SearchFragment extends PhoneNumberPickerFragment {
@@ -80,7 +79,6 @@ public class SearchFragment extends PhoneNumberPickerFragment {
setQuickContactEnabled(true);
setAdjustSelectionBoundsEnabled(false);
setDarkTheme(false);
- setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(false /* opposite */));
setUseCallableUri(true);
try {
diff --git a/java/com/android/dialer/app/list/SmartDialSearchFragment.java b/java/com/android/dialer/app/list/SmartDialSearchFragment.java
index eb1508c72..fc21c8bc3 100644
--- a/java/com/android/dialer/app/list/SmartDialSearchFragment.java
+++ b/java/com/android/dialer/app/list/SmartDialSearchFragment.java
@@ -29,11 +29,11 @@ import android.support.v13.app.FragmentCompat;
import com.android.contacts.common.list.ContactEntryListAdapter;
import com.android.dialer.app.R;
import com.android.dialer.app.dialpad.SmartDialCursorLoader;
-import com.android.dialer.app.widget.EmptyContentView;
import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.common.LogUtil;
import com.android.dialer.database.DialerDatabaseHelper;
import com.android.dialer.util.PermissionsUtil;
+import com.android.dialer.widget.EmptyContentView;
/** Implements a fragment to load and display SmartDial search results. */
public class SmartDialSearchFragment extends SearchFragment