summaryrefslogtreecommitdiff
path: root/src/com
diff options
context:
space:
mode:
authorSarmad Hashmi <mhashmi@google.com>2016-01-25 17:35:36 -0800
committerSarmad Hashmi <mhashmi@google.com>2016-02-24 15:15:02 -0800
commitcdc14da9275c67d123b55e668f48f73c4b58d948 (patch)
treef7441079b38f5c50bae4cf45d68b105f05d6fc8b /src/com
parent6d8399afae309207237456c27b336d948ed912ff (diff)
[DO NOT MERGE] Display missed call count for call log.
The number of unread missed calls are displayed beside the Call Log as a badge. All unread missed calls are bolded under the call log tab. When exiting the call log tab, all unread calls are marked as read. When interacting with an unread missed call card while in the call log tab, it will subtract 1 from the badge. Cherry-picked from d118a8e0d8a68499398504f350f81175118e2ecf BUG=24953555 Change-Id: If91a3bc89197465934cb773955e4bec005d6d14e
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapter.java6
-rw-r--r--src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java35
-rw-r--r--src/com/android/dialer/calllog/CallLogFragment.java11
-rw-r--r--src/com/android/dialer/calllog/CallLogQueryHandler.java43
-rw-r--r--src/com/android/dialer/list/ListsFragment.java25
-rw-r--r--src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java5
6 files changed, 108 insertions, 17 deletions
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 372c7bd9b..7c2e80df1 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -169,6 +169,9 @@ public class CallLogAdapter extends GroupingListAdapter
mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
} else {
+ if (viewHolder.callType == CallLog.Calls.MISSED_TYPE) {
+ CallLogAsyncTaskUtil.markCallAsRead(mContext, viewHolder.callIds);
+ }
expandViewHolderActions(viewHolder);
}
@@ -506,7 +509,8 @@ public class CallLogAdapter extends GroupingListAdapter
details.features = getCallFeatures(c, count);
details.geocode = c.getString(CallLogQuery.GEOCODED_LOCATION);
details.transcription = c.getString(CallLogQuery.TRANSCRIPTION);
- if (details.callTypes[0] == CallLog.Calls.VOICEMAIL_TYPE) {
+ if (details.callTypes[0] == CallLog.Calls.VOICEMAIL_TYPE ||
+ details.callTypes[0] == CallLog.Calls.MISSED_TYPE) {
details.isRead = c.getInt(CallLogQuery.IS_READ) == 1;
}
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index df6dc7de4..982591814 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -29,6 +29,7 @@ import android.text.TextUtils;
import android.util.Log;
import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.DialtactsActivity;
import com.android.dialer.PhoneCallDetails;
import com.android.dialer.util.AppCompatConstants;
@@ -51,6 +52,7 @@ public class CallLogAsyncTaskUtil {
DELETE_CALL,
DELETE_BLOCKED_CALL,
MARK_VOICEMAIL_READ,
+ MARK_CALL_READ,
GET_CALL_DETAILS,
UPDATE_DURATION
}
@@ -349,8 +351,6 @@ public class CallLogAsyncTaskUtil {
Intent intent = new Intent(context, CallLogNotificationsService.class);
intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD);
context.startService(intent);
-
- ((DialtactsActivity) context).updateTabUnreadCounts();
return null;
}
});
@@ -380,6 +380,37 @@ public class CallLogAsyncTaskUtil {
});
}
+ public static void markCallAsRead(final Context context, final long[] callIds) {
+ if (!PermissionsUtil.hasPhonePermissions(context)) {
+ return;
+ }
+ if (sAsyncTaskExecutor == null) {
+ initTaskExecutor();
+ }
+
+ sAsyncTaskExecutor.submit(Tasks.MARK_CALL_READ, new AsyncTask<Void, Void, Void>() {
+ @Override
+ public Void doInBackground(Void... params) {
+
+ StringBuilder where = new StringBuilder();
+ where.append(CallLog.Calls.TYPE).append(" = ").append(CallLog.Calls.MISSED_TYPE);
+ where.append(" AND ");
+
+ Long[] callIdLongs = new Long[callIds.length];
+ for (int i = 0; i < callIds.length; i++) {
+ callIdLongs[i] = callIds[i];
+ }
+ where.append(CallLog.Calls._ID).append(
+ " IN (" + TextUtils.join(",", callIdLongs) + ")");
+
+ ContentValues values = new ContentValues(1);
+ values.put(CallLog.Calls.IS_READ, "1");
+ context.getContentResolver().update(
+ CallLog.Calls.CONTENT_URI, values, where.toString(), null);
+ return null;
+ }
+ });
+ }
/**
* Updates the duration of a voicemail call log entry.
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index 41ff7d311..ac8dfdabe 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -41,6 +41,7 @@ import android.view.ViewGroup;
import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.R;
+import com.android.dialer.list.ListsFragment;
import com.android.dialer.util.EmptyLoader;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
import com.android.dialer.widget.EmptyContentView;
@@ -278,6 +279,9 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
public void onVoicemailUnreadCountFetched(Cursor cursor) {}
@Override
+ public void onMissedCallsUnreadCountFetched(Cursor cursor) {}
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
View view = inflater.inflate(R.layout.call_log_fragment, container, false);
setupView(view, null);
@@ -443,7 +447,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
fetchCalls();
mCallLogQueryHandler.fetchVoicemailStatus();
-
+ mCallLogQueryHandler.fetchMissedCallsUnreadCount();
updateOnTransition(true /* onEntry */);
mRefreshDataRequired = false;
} else {
@@ -467,13 +471,8 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
// On either of the transitions we update the missed call and voicemail notifications.
// While exiting we additionally consume all missed calls (by marking them as read).
mCallLogQueryHandler.markNewCallsAsOld();
- if (!onEntry) {
- mCallLogQueryHandler.markMissedCallsAsRead();
- }
if (mCallTypeFilter == Calls.VOICEMAIL_TYPE) {
CallLogNotificationsHelper.updateVoicemailNotifications(getActivity());
- } else {
- CallLogNotificationsHelper.removeMissedCallNotifications(getActivity());
}
}
}
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 4cb835bda..9ff74cfbc 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -62,6 +62,8 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
private static final int QUERY_VOICEMAIL_STATUS_TOKEN = 57;
/** The token for the query to fetch the number of unread voicemails. */
private static final int QUERY_VOICEMAIL_UNREAD_COUNT_TOKEN = 58;
+ /** The token for the query to fetch the number of missed calls. */
+ private static final int QUERY_MISSED_CALLS_UNREAD_COUNT_TOKEN = 59;
private final int mLogLimit;
@@ -225,19 +227,25 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
if (!PermissionsUtil.hasPhonePermissions(mContext)) {
return;
}
- // Mark all "new" calls as not new anymore.
- StringBuilder where = new StringBuilder();
- where.append(Calls.IS_READ).append(" = 0");
- where.append(" AND ");
- where.append(Calls.TYPE).append(" = ").append(Calls.MISSED_TYPE);
ContentValues values = new ContentValues(1);
values.put(Calls.IS_READ, "1");
startUpdate(UPDATE_MARK_MISSED_CALL_AS_READ_TOKEN, null, Calls.CONTENT_URI, values,
- where.toString(), null);
+ getUnreadMissedCallsQuery(), null);
}
+ /** Fetch all missed calls received since last time the tab was opened. */
+ public void fetchMissedCallsUnreadCount() {
+ if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+ return;
+ }
+
+ startQuery(QUERY_MISSED_CALLS_UNREAD_COUNT_TOKEN, null, Calls.CONTENT_URI,
+ new String[]{Calls._ID}, getUnreadMissedCallsQuery(), null, null);
+ }
+
+
@Override
protected synchronized void onNotNullableQueryComplete(int token, Object cookie,
Cursor cursor) {
@@ -253,6 +261,8 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
updateVoicemailStatus(cursor);
} else if (token == QUERY_VOICEMAIL_UNREAD_COUNT_TOKEN) {
updateVoicemailUnreadCount(cursor);
+ } else if (token == QUERY_MISSED_CALLS_UNREAD_COUNT_TOKEN) {
+ updateMissedCallsUnreadCount(cursor);
} else {
Log.w(TAG, "Unknown query completed: ignoring: " + token);
}
@@ -276,6 +286,17 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
}
+ /**
+ * @return Query string to get all unread missed calls.
+ */
+ private String getUnreadMissedCallsQuery() {
+ StringBuilder where = new StringBuilder();
+ where.append(Calls.IS_READ).append(" = 0");
+ where.append(" AND ");
+ where.append(Calls.TYPE).append(" = ").append(Calls.MISSED_TYPE);
+ return where.toString();
+ }
+
private void updateVoicemailStatus(Cursor statusCursor) {
final Listener listener = mListener.get();
if (listener != null) {
@@ -290,6 +311,13 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
}
}
+ private void updateMissedCallsUnreadCount(Cursor statusCursor) {
+ final Listener listener = mListener.get();
+ if (listener != null) {
+ listener.onMissedCallsUnreadCountFetched(statusCursor);
+ }
+ }
+
/** Listener to completion of various queries. */
public interface Listener {
/** Called when {@link CallLogQueryHandler#fetchVoicemailStatus()} completes. */
@@ -298,6 +326,9 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
/** Called when {@link CallLogQueryHandler#fetchVoicemailUnreadCount()} completes. */
void onVoicemailUnreadCountFetched(Cursor cursor);
+ /** Called when {@link CallLogQueryHandler#fetchMissedCallsUnreadCount()} completes. */
+ void onMissedCallsUnreadCountFetched(Cursor cursor);
+
/**
* Called when {@link CallLogQueryHandler#fetchCalls(int)} complete.
* Returns true if takes ownership of cursor.
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index d5caa1a2e..9f761486d 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -192,6 +192,7 @@ public class ListsFragment extends Fragment
mCallLogQueryHandler =
new CallLogQueryHandler(getActivity(), getActivity().getContentResolver(), this);
mCallLogQueryHandler.fetchVoicemailStatus();
+ mCallLogQueryHandler.fetchMissedCallsUnreadCount();
Trace.endSection();
}
@@ -347,6 +348,23 @@ public class ListsFragment extends Fragment
}
@Override
+ public void onMissedCallsUnreadCountFetched(Cursor cursor) {
+ if (getActivity() == null || getActivity().isFinishing() || cursor == null) {
+ return;
+ }
+
+ int count = 0;
+ try {
+ count = cursor.getCount();
+ } finally {
+ cursor.close();
+ }
+
+ mViewPagerTabs.setUnreadCount(count, TAB_INDEX_HISTORY);
+ mViewPagerTabs.updateTab(TAB_INDEX_HISTORY);
+ }
+
+ @Override
public boolean onCallsFetched(Cursor statusCursor) {
// Return false; did not take ownership of cursor
return false;
@@ -361,8 +379,11 @@ public class ListsFragment extends Fragment
* expands a voicemail in the call log.
*/
public void updateTabUnreadCounts() {
- if (mHasActiveVoicemailProvider && mCallLogQueryHandler != null) {
- mCallLogQueryHandler.fetchVoicemailUnreadCount();
+ if (mCallLogQueryHandler != null) {
+ mCallLogQueryHandler.fetchMissedCallsUnreadCount();
+ if (mHasActiveVoicemailProvider) {
+ mCallLogQueryHandler.fetchVoicemailUnreadCount();
+ }
}
}
diff --git a/src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java b/src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java
index 3134b1486..80a0368bd 100644
--- a/src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java
+++ b/src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java
@@ -91,6 +91,11 @@ public class VisualVoicemailEnabledChecker implements CallLogQueryHandler.Listen
}
@Override
+ public void onMissedCallsUnreadCountFetched(Cursor cursor) {
+ // Do nothing
+ }
+
+ @Override
public boolean onCallsFetched(Cursor combinedCursor) {
// Do nothing
return false;