summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllog/ui/NewCallLogAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/calllog/ui/NewCallLogAdapter.java')
-rw-r--r--java/com/android/dialer/calllog/ui/NewCallLogAdapter.java111
1 files changed, 91 insertions, 20 deletions
diff --git a/java/com/android/dialer/calllog/ui/NewCallLogAdapter.java b/java/com/android/dialer/calllog/ui/NewCallLogAdapter.java
index 839ba332f..22163774e 100644
--- a/java/com/android/dialer/calllog/ui/NewCallLogAdapter.java
+++ b/java/com/android/dialer/calllog/ui/NewCallLogAdapter.java
@@ -16,16 +16,21 @@
package com.android.dialer.calllog.ui;
import android.content.Context;
+import android.content.SharedPreferences;
import android.database.Cursor;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.android.dialer.calllogutils.CallLogDates;
import com.android.dialer.common.Assert;
+import com.android.dialer.duo.Duo;
+import com.android.dialer.duo.DuoComponent;
import com.android.dialer.logging.Logger;
+import com.android.dialer.storage.StorageComponent;
import com.android.dialer.time.Clock;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -33,31 +38,45 @@ import java.lang.annotation.RetentionPolicy;
/** {@link RecyclerView.Adapter} for the new call log fragment. */
final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
+ @VisibleForTesting
+ static final String SHARED_PREF_KEY_DUO_DISCLOSURE_DISMISSED = "duo_disclosure_dismissed";
+
/** IntDef for the different types of rows that can be shown in the call log. */
@Retention(RetentionPolicy.SOURCE)
@IntDef({
+ RowType.DUO_DISCLOSURE_CARD,
RowType.HEADER_TODAY,
RowType.HEADER_YESTERDAY,
RowType.HEADER_OLDER,
RowType.CALL_LOG_ENTRY
})
@interface RowType {
+ /** The Duo disclosure card. */
+ int DUO_DISCLOSURE_CARD = 1;
+
/** Header that displays "Today". */
- int HEADER_TODAY = 1;
+ int HEADER_TODAY = 2;
+
/** Header that displays "Yesterday". */
- int HEADER_YESTERDAY = 2;
+ int HEADER_YESTERDAY = 3;
+
/** Header that displays "Older". */
- int HEADER_OLDER = 3;
+ int HEADER_OLDER = 4;
+
/** A row representing a call log entry (which could represent one or more calls). */
- int CALL_LOG_ENTRY = 4;
+ int CALL_LOG_ENTRY = 5;
}
private final Clock clock;
+ private final Context context;
private final RealtimeRowProcessor realtimeRowProcessor;
private final PopCounts popCounts = new PopCounts();
private Cursor cursor;
+ /** Position of the Duo disclosure card. Null when it should not be displayed. */
+ @Nullable private Integer duoDisclosureCardPosition;
+
/** Position of the "Today" header. Null when it should not be displayed. */
@Nullable private Integer todayHeaderPosition;
@@ -68,11 +87,12 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
@Nullable private Integer olderHeaderPosition;
NewCallLogAdapter(Context context, Cursor cursor, Clock clock) {
+ this.context = context;
this.cursor = cursor;
this.clock = clock;
this.realtimeRowProcessor = CallLogUiComponent.get(context).realtimeRowProcessor();
- setHeaderPositions();
+ setCardAndHeaderPositions();
}
void updateCursor(Cursor updatedCursor) {
@@ -80,7 +100,7 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
this.realtimeRowProcessor.clearCache();
this.popCounts.reset();
- setHeaderPositions();
+ setCardAndHeaderPositions();
notifyDataSetChanged();
}
@@ -92,7 +112,15 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
Logger.get(context).logAnnotatedCallLogMetrics(popCounts.popped, popCounts.didNotPop);
}
- private void setHeaderPositions() {
+ private void setCardAndHeaderPositions() {
+ // Set the position for the Duo disclosure card if it should be shown.
+ duoDisclosureCardPosition = null;
+ int numCards = 0;
+ if (shouldShowDuoDisclosureCard()) {
+ duoDisclosureCardPosition = 0;
+ numCards++;
+ }
+
// If there are no rows to display, set all header positions to null.
if (!cursor.moveToFirst()) {
todayHeaderPosition = null;
@@ -101,6 +129,7 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
return;
}
+ // Calculate positions for headers.
long currentTimeMillis = clock.currentTimeMillis();
int numItemsInToday = 0;
@@ -126,24 +155,42 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
// Set all header positions.
// A header position will be null if there is no item to be displayed under that header.
- todayHeaderPosition = numItemsInToday > 0 ? 0 : null;
- yesterdayHeaderPosition = numItemsInYesterday > 0 ? numItemsInToday : null;
- olderHeaderPosition = !cursor.isAfterLast() ? numItemsInToday + numItemsInYesterday : null;
+ todayHeaderPosition = numItemsInToday > 0 ? numCards : null;
+ yesterdayHeaderPosition = numItemsInYesterday > 0 ? numItemsInToday + numCards : null;
+ olderHeaderPosition =
+ !cursor.isAfterLast() ? numItemsInToday + numItemsInYesterday + numCards : null;
+ }
+
+ private boolean shouldShowDuoDisclosureCard() {
+ Duo duo = DuoComponent.get(context).getDuo();
+ if (!duo.isEnabled(context) || !duo.isActivated(context)) {
+ return false;
+ }
+
+ SharedPreferences sharedPref = StorageComponent.get(context).unencryptedSharedPrefs();
+ return !sharedPref.getBoolean(SHARED_PREF_KEY_DUO_DISCLOSURE_DISMISSED, false);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, @RowType int viewType) {
switch (viewType) {
+ case RowType.DUO_DISCLOSURE_CARD:
+ return new DuoDisclosureCardViewHolder(
+ LayoutInflater.from(context)
+ .inflate(
+ R.layout.new_call_log_duo_disclosure_card,
+ viewGroup,
+ /* attachToRoot = */ false));
case RowType.HEADER_TODAY:
case RowType.HEADER_YESTERDAY:
case RowType.HEADER_OLDER:
return new HeaderViewHolder(
- LayoutInflater.from(viewGroup.getContext())
- .inflate(R.layout.new_call_log_header, viewGroup, false));
+ LayoutInflater.from(context)
+ .inflate(R.layout.new_call_log_header, viewGroup, /* attachToRoot = */ false));
case RowType.CALL_LOG_ENTRY:
return new NewCallLogViewHolder(
- LayoutInflater.from(viewGroup.getContext())
- .inflate(R.layout.new_call_log_entry, viewGroup, false),
+ LayoutInflater.from(context)
+ .inflate(R.layout.new_call_log_entry, viewGroup, /* attachToRoot = */ false),
clock,
realtimeRowProcessor,
popCounts);
@@ -156,6 +203,19 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
public void onBindViewHolder(ViewHolder viewHolder, int position) {
@RowType int viewType = getItemViewType(position);
switch (viewType) {
+ case RowType.DUO_DISCLOSURE_CARD:
+ ((DuoDisclosureCardViewHolder) viewHolder)
+ .setDismissListener(
+ unused -> {
+ StorageComponent.get(context)
+ .unencryptedSharedPrefs()
+ .edit()
+ .putBoolean(SHARED_PREF_KEY_DUO_DISCLOSURE_DISMISSED, true)
+ .apply();
+ setCardAndHeaderPositions();
+ notifyDataSetChanged();
+ });
+ break;
case RowType.HEADER_TODAY:
((HeaderViewHolder) viewHolder).setHeader(R.string.new_call_log_header_today);
break;
@@ -167,17 +227,20 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
break;
case RowType.CALL_LOG_ENTRY:
NewCallLogViewHolder newCallLogViewHolder = (NewCallLogViewHolder) viewHolder;
- int previousHeaders = 0;
+ int previousCardAndHeaders = 0;
+ if (duoDisclosureCardPosition != null && position > duoDisclosureCardPosition) {
+ previousCardAndHeaders++;
+ }
if (todayHeaderPosition != null && position > todayHeaderPosition) {
- previousHeaders++;
+ previousCardAndHeaders++;
}
if (yesterdayHeaderPosition != null && position > yesterdayHeaderPosition) {
- previousHeaders++;
+ previousCardAndHeaders++;
}
if (olderHeaderPosition != null && position > olderHeaderPosition) {
- previousHeaders++;
+ previousCardAndHeaders++;
}
- cursor.moveToPosition(position - previousHeaders);
+ cursor.moveToPosition(position - previousCardAndHeaders);
newCallLogViewHolder.bind(cursor);
break;
default:
@@ -189,6 +252,9 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
@Override
@RowType
public int getItemViewType(int position) {
+ if (duoDisclosureCardPosition != null && position == duoDisclosureCardPosition) {
+ return RowType.DUO_DISCLOSURE_CARD;
+ }
if (todayHeaderPosition != null && position == todayHeaderPosition) {
return RowType.HEADER_TODAY;
}
@@ -203,7 +269,12 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
@Override
public int getItemCount() {
+ int numberOfCards = 0;
int numberOfHeaders = 0;
+
+ if (duoDisclosureCardPosition != null) {
+ numberOfCards++;
+ }
if (todayHeaderPosition != null) {
numberOfHeaders++;
}
@@ -213,7 +284,7 @@ final class NewCallLogAdapter extends RecyclerView.Adapter<ViewHolder> {
if (olderHeaderPosition != null) {
numberOfHeaders++;
}
- return cursor.getCount() + numberOfHeaders;
+ return cursor.getCount() + numberOfHeaders + numberOfCards;
}
static class PopCounts {