diff options
Diffstat (limited to 'java/com/android/dialer')
6 files changed, 132 insertions, 36 deletions
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java index b15dc456d..bf978ecf3 100644 --- a/java/com/android/dialer/calldetails/CallDetailsActivity.java +++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java @@ -32,6 +32,7 @@ import android.provider.CallLog.Calls; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresPermission; +import android.support.v4.os.BuildCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -52,6 +53,7 @@ import com.android.dialer.common.concurrent.DialerExecutor.FailureListener; import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; import com.android.dialer.common.concurrent.DialerExecutor.Worker; import com.android.dialer.common.concurrent.DialerExecutorComponent; +import com.android.dialer.compat.telephony.TelephonyManagerCompat; import com.android.dialer.constants.ActivityRequestCodes; import com.android.dialer.dialercontact.DialerContact; import com.android.dialer.duo.Duo; @@ -407,8 +409,14 @@ public class CallDetailsActivity extends AppCompatActivity { @Override public void openAssistedDialingSettings(View unused) { - Intent intent = new Intent(getActivity(), AssistedDialingSettingActivity.class); - getActivity().startActivity(intent); + if (BuildCompat.isAtLeastP()) { + Intent callSettingsIntent = + new Intent(TelephonyManagerCompat.ACTION_SHOW_ASSISTED_DIALING_SETTINGS); + getActivity().startActivity(callSettingsIntent); + } else { + Intent intent = new Intent(getActivity(), AssistedDialingSettingActivity.class); + getActivity().startActivity(intent); + } } @Override diff --git a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java index 86f344f4e..669cba7a9 100644 --- a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java +++ b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java @@ -80,6 +80,10 @@ public class TelephonyManagerCompat { */ public static final Integer FEATURES_ASSISTED_DIALING = 1 << 4; + /** The {@link android.content.Intent} action used to show the assisted dialing settings. */ + public static final String ACTION_SHOW_ASSISTED_DIALING_SETTINGS = + "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS"; + /** * Returns the number of phones available. Returns 1 for Single standby mode (Single SIM * functionality) Returns 2 for Dual standby mode.(Dual SIM functionality) diff --git a/java/com/android/dialer/spam/Spam.java b/java/com/android/dialer/spam/Spam.java index b1240c69a..ea1ea138e 100644 --- a/java/com/android/dialer/spam/Spam.java +++ b/java/com/android/dialer/spam/Spam.java @@ -18,9 +18,13 @@ package com.android.dialer.spam; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.android.dialer.DialerPhoneNumber; import com.android.dialer.logging.ContactLookupResult; import com.android.dialer.logging.ContactSource; import com.android.dialer.logging.ReportingLocation; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.util.concurrent.ListenableFuture; /** Allows the container application to mark calls as spam. */ public interface Spam { @@ -39,7 +43,17 @@ public interface Spam { int percentOfNonSpamNotificationsToShow(); /** - * Checks if the given number is suspected of being a spamer. + * Checks if each of numbers in the given list is suspected of being a spam. + * + * @param dialerPhoneNumbers A list of {@link DialerPhoneNumber}. + * @return A {@link ListenableFuture} of a map that maps each number to its spam status + * (true/false). + */ + ListenableFuture<ImmutableMap<DialerPhoneNumber, Boolean>> batchCheckSpamStatus( + ImmutableList<DialerPhoneNumber> dialerPhoneNumbers); + + /** + * Checks if the given number is suspected of being a spam. * * @param number The phone number of the call. * @param countryIso The country ISO of the call. @@ -81,6 +95,15 @@ public interface Spam { boolean checkSpamStatusSynchronous(String number, String countryIso); /** + * Returns a {@link ListenableFuture} indicating whether the spam data have been updated since + * {@code timestampMillis}. + * + * <p>It is the caller's responsibility to ensure the timestamp is in milliseconds. Failure to do + * so will result in undefined behavior. + */ + ListenableFuture<Boolean> dataUpdatedSince(long timestampMillis); + + /** * Reports number as spam. * * @param number The number to be reported. diff --git a/java/com/android/dialer/spam/SpamStub.java b/java/com/android/dialer/spam/SpamStub.java index daa475c4a..ac2e94359 100644 --- a/java/com/android/dialer/spam/SpamStub.java +++ b/java/com/android/dialer/spam/SpamStub.java @@ -16,16 +16,27 @@ package com.android.dialer.spam; +import com.android.dialer.DialerPhoneNumber; +import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor; import com.android.dialer.logging.ContactLookupResult; import com.android.dialer.logging.ContactSource; import com.android.dialer.logging.ReportingLocation; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; import javax.inject.Inject; /** Default implementation of Spam. */ public class SpamStub implements Spam { + private final ListeningExecutorService backgroundExecutorService; + @Inject - public SpamStub() {} + public SpamStub(@BackgroundExecutor ListeningExecutorService backgroundExecutorService) { + this.backgroundExecutorService = backgroundExecutorService; + } @Override public boolean isSpamEnabled() { @@ -58,6 +69,20 @@ public class SpamStub implements Spam { } @Override + public ListenableFuture<ImmutableMap<DialerPhoneNumber, Boolean>> batchCheckSpamStatus( + ImmutableList<DialerPhoneNumber> dialerPhoneNumbers) { + return backgroundExecutorService.submit( + () -> { + ImmutableMap.Builder<DialerPhoneNumber, Boolean> resultBuilder = + new ImmutableMap.Builder<>(); + for (DialerPhoneNumber dialerPhoneNumber : dialerPhoneNumbers) { + resultBuilder.put(dialerPhoneNumber, false); + } + return resultBuilder.build(); + }); + } + + @Override public void checkSpamStatus(String number, String countryIso, Listener listener) { listener.onComplete(false); } @@ -83,6 +108,11 @@ public class SpamStub implements Spam { } @Override + public ListenableFuture<Boolean> dataUpdatedSince(long timestampMillis) { + return Futures.immediateFuture(false); + } + + @Override public void reportSpamFromAfterCallNotification( String number, String countryIso, diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java b/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java index c9bf6e1a8..5519aa486 100644 --- a/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java +++ b/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java @@ -59,7 +59,7 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> @interface RowType { /** A row representing a voicemail alert. */ int VOICEMAIL_ALERT = 1; - /** Header that displays "Today" or "Older". */ + /** Header that displays "Today", "Yesterday" or "Older". */ int HEADER = 2; /** A row representing a voicemail entry. */ int VOICEMAIL_ENTRY = 3; @@ -70,6 +70,8 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> /** {@link Integer#MAX_VALUE} when the "Today" header should not be displayed. */ private int todayHeaderPosition = Integer.MAX_VALUE; + /** {@link Integer#MAX_VALUE} when the "Yesterday" header should not be displayed. */ + private int yesterdayHeaderPosition = Integer.MAX_VALUE; /** {@link Integer#MAX_VALUE} when the "Older" header should not be displayed. */ private int olderHeaderPosition = Integer.MAX_VALUE; /** {@link Integer#MAX_VALUE} when the voicemail alert message should not be displayed. */ @@ -117,11 +119,44 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> private void updateHeaderPositions() { LogUtil.i( "NewVoicemailAdapter.updateHeaderPositions", - "before updating todayPos:%d, olderPos:%d, alertPos:%d", + "before updating todayPos:%d, yestPos:%d, olderPos:%d, alertPos:%d", todayHeaderPosition, + yesterdayHeaderPosition, olderHeaderPosition, voicemailAlertPosition); + // If there are no rows to display, set all header positions to MAX_VALUE. + if (!cursor.moveToFirst()) { + todayHeaderPosition = Integer.MAX_VALUE; + yesterdayHeaderPosition = Integer.MAX_VALUE; + olderHeaderPosition = Integer.MAX_VALUE; + return; + } + + long currentTimeMillis = clock.currentTimeMillis(); + + int numItemsInToday = 0; + int numItemsInYesterday = 0; + + do { + long timestamp = VoicemailCursorLoader.getTimestamp(cursor); + long dayDifference = CallLogDates.getDayDifference(currentTimeMillis, timestamp); + if (dayDifference == 0) { + numItemsInToday++; + } else if (dayDifference == 1) { + numItemsInYesterday++; + } else { + break; + } + } while (cursor.moveToNext()); + + if (numItemsInToday > 0) { + numItemsInToday++; // including the "Today" header; + } + if (numItemsInYesterday > 0) { + numItemsInYesterday++; // including the "Yesterday" header; + } + int alertOffSet = 0; if (voicemailAlertPosition != Integer.MAX_VALUE) { Assert.checkArgument( @@ -129,37 +164,21 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> alertOffSet = 1; } - // Calculate header adapter positions by reading cursor. - long currentTimeMillis = clock.currentTimeMillis(); - if (cursor.moveToNext()) { - long firstTimestamp = VoicemailCursorLoader.getTimestamp(cursor); - if (CallLogDates.getDayDifference(currentTimeMillis, firstTimestamp) == 0) { - this.todayHeaderPosition = 0 + alertOffSet; - int adapterPosition = - 2 + alertOffSet; // Accounted for the "Alert", "Today" header and first row. - while (cursor.moveToNext()) { - long timestamp = VoicemailCursorLoader.getTimestamp(cursor); - - if (CallLogDates.getDayDifference(currentTimeMillis, timestamp) == 0) { - adapterPosition++; - } else { - this.olderHeaderPosition = adapterPosition; - return; - } - } - this.olderHeaderPosition = Integer.MAX_VALUE; // Didn't find any "Older" rows. - } else { - this.todayHeaderPosition = Integer.MAX_VALUE; // Didn't find any "Today" rows. - this.olderHeaderPosition = 0 + alertOffSet; - } - } else { // There are no rows, just need to set these because they are final. - this.todayHeaderPosition = Integer.MAX_VALUE; - this.olderHeaderPosition = Integer.MAX_VALUE; - } + // Set all header positions. + // A header position will be MAX_VALUE if there is no item to be displayed under that header. + todayHeaderPosition = numItemsInToday > 0 ? alertOffSet : Integer.MAX_VALUE; + yesterdayHeaderPosition = + numItemsInYesterday > 0 ? numItemsInToday + alertOffSet : Integer.MAX_VALUE; + olderHeaderPosition = + !cursor.isAfterLast() + ? numItemsInToday + numItemsInYesterday + alertOffSet + : Integer.MAX_VALUE; + LogUtil.i( "NewVoicemailAdapter.updateHeaderPositions", - "after updating todayPos:%d, olderPos:%d, alertOffSet:%d, alertPos:%d", + "after updating todayPos:%d, yestPos:%d, olderPos:%d, alertOffSet:%d, alertPos:%d", todayHeaderPosition, + yesterdayHeaderPosition, olderHeaderPosition, alertOffSet, voicemailAlertPosition); @@ -233,6 +252,8 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> @RowType int viewType = getItemViewType(position); if (position == todayHeaderPosition) { headerViewHolder.setHeader(R.string.new_voicemail_header_today); + } else if (position == yesterdayHeaderPosition) { + headerViewHolder.setHeader(R.string.new_voicemail_header_yesterday); } else if (position == olderHeaderPosition) { headerViewHolder.setHeader(R.string.new_voicemail_header_older); } else { @@ -272,6 +293,9 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> if (todayHeaderPosition != Integer.MAX_VALUE && position > todayHeaderPosition) { previousHeaders++; } + if (yesterdayHeaderPosition != Integer.MAX_VALUE && position > yesterdayHeaderPosition) { + previousHeaders++; + } if (olderHeaderPosition != Integer.MAX_VALUE && position > olderHeaderPosition) { previousHeaders++; } @@ -870,6 +894,9 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> if (todayHeaderPosition != Integer.MAX_VALUE) { numberOfHeaders++; } + if (yesterdayHeaderPosition != Integer.MAX_VALUE) { + numberOfHeaders++; + } if (olderHeaderPosition != Integer.MAX_VALUE) { numberOfHeaders++; } @@ -893,6 +920,9 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<ViewHolder> if (todayHeaderPosition != Integer.MAX_VALUE && position == todayHeaderPosition) { return RowType.HEADER; } + if (yesterdayHeaderPosition != Integer.MAX_VALUE && position == yesterdayHeaderPosition) { + return RowType.HEADER; + } if (olderHeaderPosition != Integer.MAX_VALUE && position == olderHeaderPosition) { return RowType.HEADER; } diff --git a/java/com/android/dialer/voicemail/listui/res/values/strings.xml b/java/com/android/dialer/voicemail/listui/res/values/strings.xml index 70a5d03df..e7373d69f 100644 --- a/java/com/android/dialer/voicemail/listui/res/values/strings.xml +++ b/java/com/android/dialer/voicemail/listui/res/values/strings.xml @@ -30,8 +30,9 @@ <!-- Header in voicemail tab to group calls from the current day. [CHAR LIMIT=30] --> <string name="new_voicemail_header_today">Today</string> - - <!-- Header in voicemail tab to group calls from before the current day. [CHAR LIMIT=30] --> + <!-- Header in voicemail tab to group calls from yesterday. [CHAR LIMIT=30] --> + <string name="new_voicemail_header_yesterday">Yesterday</string> + <!-- Header in voicemail tab to group calls from before yesterday. [CHAR LIMIT=30] --> <string name="new_voicemail_header_older">Older</string> <string name="verizon_terms_and_conditions_title" translatable="false">Turn on visual voicemail</string> |