Loading res/layout/call_log_list_item.xml +25 −14 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ class="com.android.contacts.calllog.CallLogListItemView" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/call_log_inner_margin" > <!-- This layout may represent either a call log item or one of the Loading @@ -45,22 +44,25 @@ android:layout_height="@dimen/call_log_list_contact_photo_size" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/call_log_inner_margin" android:layout_marginLeft="@dimen/call_log_outer_margin" android:layout_marginTop="@dimen/call_log_inner_margin" android:layout_marginBottom="@dimen/call_log_inner_margin" /> <LinearLayout android:id="@+id/divider" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:layout_centerInParent="true" android:layout_centerVertical="true" android:layout_alignTop="@+id/primary_action_view" android:layout_alignBottom="@+id/primary_action_view" android:orientation="horizontal" > <ImageView android:id="@+id/unheard_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/call_log_inner_margin" android:layout_gravity="center_vertical" android:layout_height="match_parent" android:paddingRight="@dimen/call_log_inner_margin" android:scaleType="center" android:src="@drawable/ic_unheard_voicemail_holo_dark" android:visibility="gone" Loading @@ -69,27 +71,32 @@ <View android:layout_width="1px" android:layout_height="@dimen/call_log_call_action_size" android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/call_log_inner_margin" android:background="@drawable/ic_divider_dashed_holo_dark" android:layout_gravity="center_vertical" /> <ImageView <ImageButton android:id="@+id/secondary_action_icon" android:layout_width="@dimen/call_log_call_action_width" android:layout_height="@dimen/call_log_call_action_height" android:layout_gravity="center_vertical" android:layout_height="match_parent" android:paddingLeft="@dimen/call_log_inner_margin" android:paddingTop="@dimen/call_log_inner_margin" android:paddingBottom="@dimen/call_log_inner_margin" android:paddingRight="@dimen/call_log_outer_margin" android:scaleType="center" android:background="@drawable/list_selector" /> </LinearLayout> <LinearLayout android:id="@+id/primary_action_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_toRightOf="@id/quick_contact_photo" android:layout_toLeftOf="@id/divider" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/call_log_inner_margin" android:padding="@dimen/call_log_inner_margin" android:orientation="vertical" android:background="@drawable/list_selector" android:focusable="true" > <TextView android:id="@+id/name" Loading Loading @@ -139,8 +146,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/call_log_inner_margin" android:layout_marginRight="@dimen/call_log_inner_margin" android:textSize="14sp" android:textStyle="bold" android:textColor="?attr/call_log_header_color" android:padding="@dimen/call_log_inner_margin" android:focusable="true" android:drawableBottom="@android:color/holo_blue_light" /> </view> src/com/android/contacts/calllog/CallLogFragment.java +18 −36 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.contacts.calllog; import com.android.common.widget.GroupingListAdapter; import com.android.contacts.CallDetailActivity; import com.android.contacts.ContactPhotoManager; import com.android.contacts.ContactsUtils; import com.android.contacts.PhoneCallDetails; Loading @@ -34,7 +33,6 @@ import com.android.internal.telephony.ITelephony; import com.google.common.annotations.VisibleForTesting; import android.app.ListFragment; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.content.res.Resources; Loading Loading @@ -275,7 +273,18 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility /** Can be set to true by tests to disable processing of requests. */ private volatile boolean mRequestProcessingDisabled = false; private final View.OnClickListener mCallPlayOnClickListener = new View.OnClickListener() { /** Listener for the primary action in the list, opens the call details. */ private final View.OnClickListener mPrimaryActionListener = new View.OnClickListener() { @Override public void onClick(View view) { IntentProvider intentProvider = (IntentProvider) view.getTag(); if (intentProvider != null) { mContext.startActivity(intentProvider.getIntent(mContext)); } } }; /** Listener for the secondary action in the list, either call or play. */ private final View.OnClickListener mSecondaryActionListener = new View.OnClickListener() { @Override public void onClick(View view) { IntentProvider intentProvider = (IntentProvider) view.getTag(); Loading Loading @@ -663,7 +672,8 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility private void findAndCacheViews(View view) { // Get the views to bind to. CallLogListItemViews views = CallLogListItemViews.fromView(view); views.secondaryActionView.setOnClickListener(mCallPlayOnClickListener); views.primaryActionView.setOnClickListener(mPrimaryActionListener); views.secondaryActionView.setOnClickListener(mSecondaryActionListener); view.setTag(views); } Loading Loading @@ -701,6 +711,9 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility final String formattedNumber; final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO); views.primaryActionView.setTag( IntentProvider.getCallDetailIntentProvider( this, c.getPosition(), c.getLong(CallLogQuery.ID), count)); // Store away the voicemail information so we can play it directly. if (callType == Calls.VOICEMAIL_TYPE) { String voicemailUri = c.getString(CallLogQuery.VOICEMAIL_URI); Loading Loading @@ -907,6 +920,7 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility mAdapter = new CallLogAdapter(getActivity(), mCallLogQueryHandler, currentCountryIso, getVoiceMailNumber()); setListAdapter(mAdapter); getListView().setItemsCanFocus(true); } @Override Loading Loading @@ -1101,38 +1115,6 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility } } @Override public void onListItemClick(ListView l, View v, int position, long id) { Cursor cursor = (Cursor) mAdapter.getItem(position); if (CallLogQuery.isSectionHeader(cursor)) { // Do nothing when a header is clicked. return; } Intent intent = new Intent(getActivity(), CallDetailActivity.class); if (mAdapter.isGroupHeader(position)) { // We want to restore the position in the cursor at the end. int currentPosition = cursor.getPosition(); int groupSize = mAdapter.getGroupSize(position); long[] ids = new long[groupSize]; // Copy the ids of the rows in the group. for (int index = 0; index < groupSize; ++index) { ids[index] = cursor.getLong(CallLogQuery.ID); cursor.moveToNext(); } intent.putExtra(CallDetailActivity.EXTRA_CALL_LOG_IDS, ids); cursor.moveToPosition(currentPosition); } else { // If there is a single item, use the direct URI for it. intent.setData(ContentUris.withAppendedId(Calls.CONTENT_URI_WITH_VOICEMAIL, id)); String voicemailUri = cursor.getString(CallLogQuery.VOICEMAIL_URI); if (voicemailUri != null) { intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_URI, Uri.parse(voicemailUri)); } intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_START_PLAYBACK, false); } startActivity(intent); } @VisibleForTesting public CallLogAdapter getAdapter() { return mAdapter; Loading src/com/android/contacts/calllog/CallLogListItemViews.java +6 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.widget.TextView; public final class CallLogListItemViews { /** The quick contact badge for the contact. */ public final QuickContactBadge quickContactView; /** The primary action view of the entry. */ public final View primaryActionView; /** The secondary action button on the entry. */ public final ImageView secondaryActionView; /** The icon used for unheard voicemail. */ Loading @@ -44,11 +46,12 @@ public final class CallLogListItemViews { /** The text of the header in a stand-alone row, or null for other types of rows. */ public final TextView listHeaderTextView; private CallLogListItemViews(QuickContactBadge quickContactView, private CallLogListItemViews(QuickContactBadge quickContactView, View primaryActionView, ImageView secondaryActionView, View unheardView, View dividerView, PhoneCallDetailsViews phoneCallDetailsViews, View listItemView, TextView listHeaderTextView) { this.quickContactView = quickContactView; this.primaryActionView = primaryActionView; this.secondaryActionView = secondaryActionView; this.unheardView = unheardView; this.dividerView = dividerView; Loading @@ -60,6 +63,7 @@ public final class CallLogListItemViews { public static CallLogListItemViews fromView(View view) { return new CallLogListItemViews( (QuickContactBadge) view.findViewById(R.id.quick_contact_photo), view.findViewById(R.id.primary_action_view), (ImageView) view.findViewById(R.id.secondary_action_icon), view.findViewById(R.id.unheard_icon), view.findViewById(R.id.divider), Loading @@ -71,6 +75,7 @@ public final class CallLogListItemViews { public static CallLogListItemViews createForTest(Context context) { return new CallLogListItemViews( new QuickContactBadge(context), new View(context), new ImageView(context), new View(context), new View(context), Loading src/com/android/contacts/calllog/IntentProvider.java +40 −0 Original line number Diff line number Diff line Loading @@ -17,10 +17,13 @@ package com.android.contacts.calllog; import com.android.contacts.CallDetailActivity; import com.android.contacts.calllog.CallLogFragment.CallLogAdapter; import com.android.contacts.calllog.CallLogFragment.CallLogQuery; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.provider.CallLog.Calls; import android.telephony.PhoneNumberUtils; Loading Loading @@ -68,4 +71,41 @@ public abstract class IntentProvider { } }; } public static IntentProvider getCallDetailIntentProvider( final CallLogAdapter adapter, final int position, final long id, final int groupSize) { return new IntentProvider() { @Override public Intent getIntent(Context context) { Cursor cursor = adapter.getCursor(); cursor.moveToPosition(position); if (CallLogQuery.isSectionHeader(cursor)) { // Do nothing when a header is clicked. return null; } Intent intent = new Intent(context, CallDetailActivity.class); if (adapter.isGroupHeader(position)) { // We want to restore the position in the cursor at the end. long[] ids = new long[groupSize]; // Copy the ids of the rows in the group. for (int index = 0; index < groupSize; ++index) { ids[index] = cursor.getLong(CallLogQuery.ID); cursor.moveToNext(); } intent.putExtra(CallDetailActivity.EXTRA_CALL_LOG_IDS, ids); } else { // If there is a single item, use the direct URI for it. intent.setData(ContentUris.withAppendedId( Calls.CONTENT_URI_WITH_VOICEMAIL, id)); String voicemailUri = cursor.getString(CallLogQuery.VOICEMAIL_URI); if (voicemailUri != null) { intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_URI, Uri.parse(voicemailUri)); } intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_START_PLAYBACK, false); } return intent; } }; } } Loading
res/layout/call_log_list_item.xml +25 −14 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ class="com.android.contacts.calllog.CallLogListItemView" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/call_log_inner_margin" > <!-- This layout may represent either a call log item or one of the Loading @@ -45,22 +44,25 @@ android:layout_height="@dimen/call_log_list_contact_photo_size" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/call_log_inner_margin" android:layout_marginLeft="@dimen/call_log_outer_margin" android:layout_marginTop="@dimen/call_log_inner_margin" android:layout_marginBottom="@dimen/call_log_inner_margin" /> <LinearLayout android:id="@+id/divider" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:layout_centerInParent="true" android:layout_centerVertical="true" android:layout_alignTop="@+id/primary_action_view" android:layout_alignBottom="@+id/primary_action_view" android:orientation="horizontal" > <ImageView android:id="@+id/unheard_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/call_log_inner_margin" android:layout_gravity="center_vertical" android:layout_height="match_parent" android:paddingRight="@dimen/call_log_inner_margin" android:scaleType="center" android:src="@drawable/ic_unheard_voicemail_holo_dark" android:visibility="gone" Loading @@ -69,27 +71,32 @@ <View android:layout_width="1px" android:layout_height="@dimen/call_log_call_action_size" android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/call_log_inner_margin" android:background="@drawable/ic_divider_dashed_holo_dark" android:layout_gravity="center_vertical" /> <ImageView <ImageButton android:id="@+id/secondary_action_icon" android:layout_width="@dimen/call_log_call_action_width" android:layout_height="@dimen/call_log_call_action_height" android:layout_gravity="center_vertical" android:layout_height="match_parent" android:paddingLeft="@dimen/call_log_inner_margin" android:paddingTop="@dimen/call_log_inner_margin" android:paddingBottom="@dimen/call_log_inner_margin" android:paddingRight="@dimen/call_log_outer_margin" android:scaleType="center" android:background="@drawable/list_selector" /> </LinearLayout> <LinearLayout android:id="@+id/primary_action_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_height="match_parent" android:layout_toRightOf="@id/quick_contact_photo" android:layout_toLeftOf="@id/divider" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/call_log_inner_margin" android:padding="@dimen/call_log_inner_margin" android:orientation="vertical" android:background="@drawable/list_selector" android:focusable="true" > <TextView android:id="@+id/name" Loading Loading @@ -139,8 +146,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/call_log_inner_margin" android:layout_marginRight="@dimen/call_log_inner_margin" android:textSize="14sp" android:textStyle="bold" android:textColor="?attr/call_log_header_color" android:padding="@dimen/call_log_inner_margin" android:focusable="true" android:drawableBottom="@android:color/holo_blue_light" /> </view>
src/com/android/contacts/calllog/CallLogFragment.java +18 −36 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.contacts.calllog; import com.android.common.widget.GroupingListAdapter; import com.android.contacts.CallDetailActivity; import com.android.contacts.ContactPhotoManager; import com.android.contacts.ContactsUtils; import com.android.contacts.PhoneCallDetails; Loading @@ -34,7 +33,6 @@ import com.android.internal.telephony.ITelephony; import com.google.common.annotations.VisibleForTesting; import android.app.ListFragment; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.content.res.Resources; Loading Loading @@ -275,7 +273,18 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility /** Can be set to true by tests to disable processing of requests. */ private volatile boolean mRequestProcessingDisabled = false; private final View.OnClickListener mCallPlayOnClickListener = new View.OnClickListener() { /** Listener for the primary action in the list, opens the call details. */ private final View.OnClickListener mPrimaryActionListener = new View.OnClickListener() { @Override public void onClick(View view) { IntentProvider intentProvider = (IntentProvider) view.getTag(); if (intentProvider != null) { mContext.startActivity(intentProvider.getIntent(mContext)); } } }; /** Listener for the secondary action in the list, either call or play. */ private final View.OnClickListener mSecondaryActionListener = new View.OnClickListener() { @Override public void onClick(View view) { IntentProvider intentProvider = (IntentProvider) view.getTag(); Loading Loading @@ -663,7 +672,8 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility private void findAndCacheViews(View view) { // Get the views to bind to. CallLogListItemViews views = CallLogListItemViews.fromView(view); views.secondaryActionView.setOnClickListener(mCallPlayOnClickListener); views.primaryActionView.setOnClickListener(mPrimaryActionListener); views.secondaryActionView.setOnClickListener(mSecondaryActionListener); view.setTag(views); } Loading Loading @@ -701,6 +711,9 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility final String formattedNumber; final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO); views.primaryActionView.setTag( IntentProvider.getCallDetailIntentProvider( this, c.getPosition(), c.getLong(CallLogQuery.ID), count)); // Store away the voicemail information so we can play it directly. if (callType == Calls.VOICEMAIL_TYPE) { String voicemailUri = c.getString(CallLogQuery.VOICEMAIL_URI); Loading Loading @@ -907,6 +920,7 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility mAdapter = new CallLogAdapter(getActivity(), mCallLogQueryHandler, currentCountryIso, getVoiceMailNumber()); setListAdapter(mAdapter); getListView().setItemsCanFocus(true); } @Override Loading Loading @@ -1101,38 +1115,6 @@ public class CallLogFragment extends ListFragment implements ViewPagerVisibility } } @Override public void onListItemClick(ListView l, View v, int position, long id) { Cursor cursor = (Cursor) mAdapter.getItem(position); if (CallLogQuery.isSectionHeader(cursor)) { // Do nothing when a header is clicked. return; } Intent intent = new Intent(getActivity(), CallDetailActivity.class); if (mAdapter.isGroupHeader(position)) { // We want to restore the position in the cursor at the end. int currentPosition = cursor.getPosition(); int groupSize = mAdapter.getGroupSize(position); long[] ids = new long[groupSize]; // Copy the ids of the rows in the group. for (int index = 0; index < groupSize; ++index) { ids[index] = cursor.getLong(CallLogQuery.ID); cursor.moveToNext(); } intent.putExtra(CallDetailActivity.EXTRA_CALL_LOG_IDS, ids); cursor.moveToPosition(currentPosition); } else { // If there is a single item, use the direct URI for it. intent.setData(ContentUris.withAppendedId(Calls.CONTENT_URI_WITH_VOICEMAIL, id)); String voicemailUri = cursor.getString(CallLogQuery.VOICEMAIL_URI); if (voicemailUri != null) { intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_URI, Uri.parse(voicemailUri)); } intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_START_PLAYBACK, false); } startActivity(intent); } @VisibleForTesting public CallLogAdapter getAdapter() { return mAdapter; Loading
src/com/android/contacts/calllog/CallLogListItemViews.java +6 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.widget.TextView; public final class CallLogListItemViews { /** The quick contact badge for the contact. */ public final QuickContactBadge quickContactView; /** The primary action view of the entry. */ public final View primaryActionView; /** The secondary action button on the entry. */ public final ImageView secondaryActionView; /** The icon used for unheard voicemail. */ Loading @@ -44,11 +46,12 @@ public final class CallLogListItemViews { /** The text of the header in a stand-alone row, or null for other types of rows. */ public final TextView listHeaderTextView; private CallLogListItemViews(QuickContactBadge quickContactView, private CallLogListItemViews(QuickContactBadge quickContactView, View primaryActionView, ImageView secondaryActionView, View unheardView, View dividerView, PhoneCallDetailsViews phoneCallDetailsViews, View listItemView, TextView listHeaderTextView) { this.quickContactView = quickContactView; this.primaryActionView = primaryActionView; this.secondaryActionView = secondaryActionView; this.unheardView = unheardView; this.dividerView = dividerView; Loading @@ -60,6 +63,7 @@ public final class CallLogListItemViews { public static CallLogListItemViews fromView(View view) { return new CallLogListItemViews( (QuickContactBadge) view.findViewById(R.id.quick_contact_photo), view.findViewById(R.id.primary_action_view), (ImageView) view.findViewById(R.id.secondary_action_icon), view.findViewById(R.id.unheard_icon), view.findViewById(R.id.divider), Loading @@ -71,6 +75,7 @@ public final class CallLogListItemViews { public static CallLogListItemViews createForTest(Context context) { return new CallLogListItemViews( new QuickContactBadge(context), new View(context), new ImageView(context), new View(context), new View(context), Loading
src/com/android/contacts/calllog/IntentProvider.java +40 −0 Original line number Diff line number Diff line Loading @@ -17,10 +17,13 @@ package com.android.contacts.calllog; import com.android.contacts.CallDetailActivity; import com.android.contacts.calllog.CallLogFragment.CallLogAdapter; import com.android.contacts.calllog.CallLogFragment.CallLogQuery; import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.provider.CallLog.Calls; import android.telephony.PhoneNumberUtils; Loading Loading @@ -68,4 +71,41 @@ public abstract class IntentProvider { } }; } public static IntentProvider getCallDetailIntentProvider( final CallLogAdapter adapter, final int position, final long id, final int groupSize) { return new IntentProvider() { @Override public Intent getIntent(Context context) { Cursor cursor = adapter.getCursor(); cursor.moveToPosition(position); if (CallLogQuery.isSectionHeader(cursor)) { // Do nothing when a header is clicked. return null; } Intent intent = new Intent(context, CallDetailActivity.class); if (adapter.isGroupHeader(position)) { // We want to restore the position in the cursor at the end. long[] ids = new long[groupSize]; // Copy the ids of the rows in the group. for (int index = 0; index < groupSize; ++index) { ids[index] = cursor.getLong(CallLogQuery.ID); cursor.moveToNext(); } intent.putExtra(CallDetailActivity.EXTRA_CALL_LOG_IDS, ids); } else { // If there is a single item, use the direct URI for it. intent.setData(ContentUris.withAppendedId( Calls.CONTENT_URI_WITH_VOICEMAIL, id)); String voicemailUri = cursor.getString(CallLogQuery.VOICEMAIL_URI); if (voicemailUri != null) { intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_URI, Uri.parse(voicemailUri)); } intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_START_PLAYBACK, false); } return intent; } }; } }