Do not show "Show voicemail only" if no source is installed.
The "Show voicemail only" (and matching "Show all calls") options menu
items only make sense if there is at least one voicemail source
installed.
If not, then we should not show these options.
In order to determine whether a source is available, we use the
voicemail status table, which contains information about the installed
sources.
Bug: 5216976
Change-Id: Ib25aebba8509a1dd4c1c6de7cba2244461c69cfc
diff --git a/src/com/android/contacts/calllog/CallLogFragment.java b/src/com/android/contacts/calllog/CallLogFragment.java
index 83f44d0..59deff4 100644
--- a/src/com/android/contacts/calllog/CallLogFragment.java
+++ b/src/com/android/contacts/calllog/CallLogFragment.java
@@ -16,6 +16,7 @@
package com.android.contacts.calllog;
+import com.android.common.io.MoreCloseables;
import com.android.contacts.ContactsUtils;
import com.android.contacts.R;
import com.android.contacts.activities.DialtactsActivity.ViewPagerVisibilityListener;
@@ -26,6 +27,7 @@
import com.android.internal.telephony.CallerInfo;
import com.android.internal.telephony.ITelephony;
+import android.app.Activity;
import android.app.KeyguardManager;
import android.app.ListFragment;
import android.content.Context;
@@ -64,6 +66,8 @@
private boolean mScrollToTop;
private boolean mShowOptionsMenu;
+ /** Whether there is at least one voicemail source installed. */
+ private boolean mVoicemailSourcesAvailable = false;
/** Whether we are currently filtering over voicemail. */
private boolean mShowingVoicemailOnly = false;
@@ -112,6 +116,23 @@
return;
}
updateVoicemailStatusMessage(statusCursor);
+
+ int activeSources = mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor);
+ Log.d(TAG, "Num active sources: " + activeSources);
+ setVoicemailSourcesAvailable(activeSources != 0);
+ MoreCloseables.closeQuietly(statusCursor);
+ }
+
+ /** Sets whether there are any voicemail sources available in the platform. */
+ private void setVoicemailSourcesAvailable(boolean voicemailSourcesAvailable) {
+ if (mVoicemailSourcesAvailable == voicemailSourcesAvailable) return;
+ mVoicemailSourcesAvailable = voicemailSourcesAvailable;
+
+ Activity activity = getActivity();
+ if (activity != null) {
+ // This is so that the options menu content is updated.
+ activity.invalidateOptionsMenu();
+ }
}
@Override
@@ -219,8 +240,10 @@
@Override
public void onPrepareOptionsMenu(Menu menu) {
if (mShowOptionsMenu) {
- menu.findItem(R.id.show_voicemails_only).setVisible(!mShowingVoicemailOnly);
- menu.findItem(R.id.show_all_calls).setVisible(mShowingVoicemailOnly);
+ menu.findItem(R.id.show_voicemails_only).setVisible(
+ mVoicemailSourcesAvailable && !mShowingVoicemailOnly);
+ menu.findItem(R.id.show_all_calls).setVisible(
+ mVoicemailSourcesAvailable && mShowingVoicemailOnly);
}
}
diff --git a/src/com/android/contacts/voicemail/VoicemailStatusHelper.java b/src/com/android/contacts/voicemail/VoicemailStatusHelper.java
index 1eab749..6664b88 100644
--- a/src/com/android/contacts/voicemail/VoicemailStatusHelper.java
+++ b/src/com/android/contacts/voicemail/VoicemailStatusHelper.java
@@ -74,8 +74,13 @@
* empty list is returned if no message needs to be shown.
* @param cursor The cursor pointing to the query on {@link Status#CONTENT_URI}. The projection
* to be used is defined by the implementation class of this interface.
- * The class takes over the ownership of the cursor and closes it after processing the
- * request.
*/
public List<StatusMessage> getStatusMessages(Cursor cursor);
+
+ /**
+ * Returns the number of active voicemail sources installed.
+ * <p>
+ * The number of sources is counted by querying the voicemail status table.
+ */
+ public int getNumberActivityVoicemailSources(Cursor cursor);
}
diff --git a/src/com/android/contacts/voicemail/VoicemailStatusHelperImpl.java b/src/com/android/contacts/voicemail/VoicemailStatusHelperImpl.java
index 7332e89..ef7913d 100644
--- a/src/com/android/contacts/voicemail/VoicemailStatusHelperImpl.java
+++ b/src/com/android/contacts/voicemail/VoicemailStatusHelperImpl.java
@@ -24,7 +24,6 @@
import static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION;
import static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK;
-import com.android.common.io.MoreCloseables;
import com.android.contacts.R;
import android.database.Cursor;
@@ -154,20 +153,35 @@
@Override
public List<StatusMessage> getStatusMessages(Cursor cursor) {
- try {
- List<MessageStatusWithPriority> messages =
- new ArrayList<VoicemailStatusHelperImpl.MessageStatusWithPriority>();
- while(cursor.moveToNext()) {
- MessageStatusWithPriority message = getMessageForStatusEntry(cursor);
- if (message != null) {
- messages.add(message);
- }
+ List<MessageStatusWithPriority> messages =
+ new ArrayList<VoicemailStatusHelperImpl.MessageStatusWithPriority>();
+ cursor.moveToPosition(-1);
+ while(cursor.moveToNext()) {
+ MessageStatusWithPriority message = getMessageForStatusEntry(cursor);
+ if (message != null) {
+ messages.add(message);
}
- // Finally reorder the messages by their priority.
- return reorderMessages(messages);
- } finally {
- MoreCloseables.closeQuietly(cursor);
}
+ // Finally reorder the messages by their priority.
+ return reorderMessages(messages);
+ }
+
+ @Override
+ public int getNumberActivityVoicemailSources(Cursor cursor) {
+ int count = 0;
+ cursor.moveToPosition(-1);
+ while(cursor.moveToNext()) {
+ if (isVoicemailSourceActive(cursor)) {
+ ++count;
+ }
+ }
+ return count;
+ }
+
+ /** Returns whether the source status in the cursor corresponds to an active source. */
+ private boolean isVoicemailSourceActive(Cursor cursor) {
+ return cursor.getString(SOURCE_PACKAGE_INDEX) != null
+ && cursor.getInt(CONFIGURATION_STATE_INDEX) == Status.CONFIGURATION_STATE_OK;
}
private List<StatusMessage> reorderMessages(List<MessageStatusWithPriority> messageWrappers) {