From 192b1ffbd1ae2b2d0e4de503d9019864db74d98a Mon Sep 17 00:00:00 2001 From: uabdullah Date: Wed, 28 Feb 2018 16:21:47 -0800 Subject: Parity of OldMainActivityPeer with ListsFragment for VM This CL helps to ensure that when the VVM settings toggle is turned on or off, or a sim is swapped, inserted or removed the VM tab disappears and appears, just like it currently does. When a VM tab disappears we also move to the speed dial index. Bug: 73123614,73998717 Test: N/A PiperOrigin-RevId: 187400703 Change-Id: I76a0b43da86713caa67956413a39299c7ecbc8d1 --- .../dialer/main/impl/OldMainActivityPeer.java | 75 +++++++++++++++++++++- .../dialer/main/impl/bottomnav/BottomNavBar.java | 18 ++++++ 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java index a05ef6d16..2999c6b0b 100644 --- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java +++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java @@ -23,11 +23,14 @@ import android.app.KeyguardManager; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.provider.CallLog.Calls; import android.provider.ContactsContract.QuickContact; +import android.provider.VoicemailContract; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; @@ -91,9 +94,15 @@ import com.android.dialer.smartdial.util.SmartDialPrefix; import com.android.dialer.storage.StorageComponent; import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.DialerUtils; +import com.android.dialer.util.PermissionsUtil; import com.android.dialer.util.TransactionSafeActivity; +import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler; +import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler.Source; +import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker; +import com.android.dialer.voicemailstatus.VoicemailStatusHelper; import com.android.voicemail.VoicemailComponent; import com.google.common.util.concurrent.ListenableFuture; +import java.util.Locale; import java.util.concurrent.TimeUnit; /** @@ -273,7 +282,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen if (VoicemailComponent.get(context) .getVoicemailClient() .isVoicemailEnabled(context, defaultUserSelectedAccount)) { - LogUtil.i("OldMainActivityPeer.canVoicemailTabBeShown", "Voicemail is not enabled"); + LogUtil.i("OldMainActivityPeer.canVoicemailTabBeShown", "Voicemail is enabled"); return true; } LogUtil.i("OldMainActivityPeer.canVoicemailTabBeShown", "returning false"); @@ -706,7 +715,6 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen *
  • Marking missed calls as read when appropriate. See {@link * #markMissedCallsAsReadAndRemoveNotification()} *
  • TODO(calderwoodra): multiselect - *
  • TODO(calderwoodra): voicemail status * * * @see CallLogFragmentListener @@ -727,6 +735,15 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen private long timeSelected = -1; private boolean activityIsAlive; + private final ContentObserver voicemailStatusObserver = + new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + callLogQueryHandler.fetchVoicemailStatus(); + } + }; + MainCallLogFragmentListener( Context context, ContentResolver contentResolver, @@ -738,6 +755,21 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen this.toolbar = toolbar; } + private void registerVoicemailStatusContentObserver(Context context) { + + if (PermissionsUtil.hasReadVoicemailPermissions(context) + && PermissionsUtil.hasAddVoicemailPermissions(context)) { + context + .getContentResolver() + .registerContentObserver( + VoicemailContract.Status.CONTENT_URI, true, voicemailStatusObserver); + } else { + LogUtil.w( + "MainCallLogFragmentListener.registerVoicemailStatusContentObserver", + "no voicemail read/add permissions"); + } + } + @Override public void updateTabUnreadCounts() { callLogQueryHandler.fetchMissedCallsUnreadCount(); @@ -752,7 +784,42 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen @Override public void onVoicemailStatusFetched(Cursor statusCursor) { - // TODO(calderwoodra): handle this when voicemail is implemented + LogUtil.i("OldMainActivityPeer.MainCallLogFragmentListener", "onVoicemailStatusFetched"); + VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus( + context, statusCursor, Source.Activity); + + // Update hasActiveVoicemailProvider, which controls the number of tabs displayed. + int numberOfActiveVoicemailSources = + VoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor); + + boolean hasActiveVoicemailProvider = numberOfActiveVoicemailSources > 0; + LogUtil.i( + "OldMainActivityPeer.onVoicemailStatusFetched", + String.format( + Locale.US, + "hasActiveVoicemailProvider:%b, number of active voicemail sources:%d", + hasActiveVoicemailProvider, + numberOfActiveVoicemailSources)); + + if (hasActiveVoicemailProvider) { + // TODO(yueg): Use new logging for VVM_TAB_VISIBLE + // Logger.get(context).logImpression(DialerImpression.Type.VVM_TAB_VISIBLE); + bottomNavBar.showVoicemail(true); + callLogQueryHandler.fetchVoicemailUnreadCount(); + } else { + bottomNavBar.showVoicemail(false); + } + + StorageComponent.get(context) + .unencryptedSharedPrefs() + .edit() + .putBoolean( + VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, + hasActiveVoicemailProvider) + .apply(); + + // TODO(uabdullah): Check if we need to force move to the VM tab (e.g in the event of + // clicking a vm notification and a status wasn't yet fetched). } @Override @@ -812,6 +879,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen public void onActivityResume() { activityIsAlive = true; + registerVoicemailStatusContentObserver(context); callLogQueryHandler.fetchVoicemailStatus(); callLogQueryHandler.fetchMissedCallsUnreadCount(); // Reset the tab on resume to restart the timer @@ -820,6 +888,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen /** Should be called when {@link Activity#onStop()} is called. */ public void onActivityStop(boolean changingConfigurations, boolean keyguardLocked) { + context.getContentResolver().unregisterContentObserver(voicemailStatusObserver); activityIsAlive = false; if (viewedCallLogTabPastTimeThreshold() && !changingConfigurations && !keyguardLocked) { markMissedCallsAsReadAndRemoveNotification(); diff --git a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java index d9a446f84..5ee33fc71 100644 --- a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java +++ b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java @@ -23,6 +23,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -123,8 +124,25 @@ public final class BottomNavBar extends LinearLayout { } } + /** + * Displays or hides the voicemail tab. + * + *

    In the event that the voicemail tab was earlier visible but is now no longer visible, we + * move to the speed dial tab. + * + * @param showTab whether to hide or show the voicemail + */ public void showVoicemail(boolean showTab) { + LogUtil.i("OldMainActivityPeer.showVoicemail", "showing Tab:%b", showTab); + int voicemailpreviousVisibility = voicemail.getVisibility(); voicemail.setVisibility(showTab ? View.VISIBLE : View.GONE); + int voicemailcurrentVisibility = voicemail.getVisibility(); + + if (voicemailpreviousVisibility != voicemailcurrentVisibility + && voicemailpreviousVisibility == View.VISIBLE) { + LogUtil.i("OldMainActivityPeer.showVoicemail", "hid VM tab and moved to speed dial tab"); + selectTab(TabIndex.SPEED_DIAL); + } } public void setNotificationCount(@TabIndex int tab, int count) { -- cgit v1.2.3