diff options
Diffstat (limited to 'java')
8 files changed, 161 insertions, 15 deletions
diff --git a/java/com/android/dialer/app/res/layout/call_log_list_item.xml b/java/com/android/dialer/app/res/layout/call_log_list_item.xml index 1b776b42c..acaa82085 100644 --- a/java/com/android/dialer/app/res/layout/call_log_list_item.xml +++ b/java/com/android/dialer/app/res/layout/call_log_list_item.xml @@ -202,6 +202,7 @@ android:id="@+id/voicemail_transcription_rating_good" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:contentDescription="@string/description_rating_good" android:gravity="end|center_vertical" android:focusable="true" android:src="@drawable/quantum_ic_thumb_up_grey600_24"/> @@ -211,6 +212,7 @@ android:id="@+id/voicemail_transcription_rating_bad" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:contentDescription="@string/description_rating_bad" android:gravity="end|center_vertical" android:focusable="true" android:src="@drawable/quantum_ic_thumb_down_grey600_24"/> diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml index 5974f47fd..7332c31e3 100644 --- a/java/com/android/dialer/app/res/values/strings.xml +++ b/java/com/android/dialer/app/res/values/strings.xml @@ -706,6 +706,14 @@ <!-- Message displayed after user has rated a voicemail transcription [CHAR LIMIT=30] --> <string name="voicemail_transcription_rating_thanks">Thanks for your feedback</string> + <!-- Describes the thumbs up, 'good' transcription button. Read by TalkBack. + [CHAR LIMIT=NONE] --> + <string name="description_rating_good">Like</string> + + <!-- Describes the thumbs down, 'bad' transcription button. Read by TalkBack. + [CHAR LIMIT=NONE] --> + <string name="description_rating_bad">Dislike</string> + <!-- Button text to prompt a user to open an sms conversation [CHAR LIMIT=NONE] --> <string name="view_conversation">View</string> 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 * <li>Marking missed calls as read when appropriate. See {@link * #markMissedCallsAsReadAndRemoveNotification()} * <li>TODO(calderwoodra): multiselect - * <li>TODO(calderwoodra): voicemail status * </ul> * * @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. + * + * <p>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) { diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java b/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java index 9296d04e7..6d71dade9 100644 --- a/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java +++ b/java/com/android/dialer/voicemail/listui/NewVoicemailFragment.java @@ -30,6 +30,7 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.FrameLayout; import com.android.dialer.calllog.CallLogComponent; import com.android.dialer.calllog.RefreshAnnotatedCallLogReceiver; import com.android.dialer.common.LogUtil; @@ -38,6 +39,7 @@ import com.android.dialer.common.concurrent.UiListener; import com.android.dialer.glidephotomanager.GlidePhotoManagerComponent; import com.android.dialer.voicemail.listui.error.VoicemailStatus; import com.android.dialer.voicemailstatus.VoicemailStatusQuery; +import com.android.dialer.widget.EmptyContentView; import com.android.voicemail.VoicemailComponent; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.ListenableFuture; @@ -52,6 +54,11 @@ public final class NewVoicemailFragment extends Fragment implements LoaderCallba private RefreshAnnotatedCallLogReceiver refreshAnnotatedCallLogReceiver; private UiListener<ImmutableList<VoicemailStatus>> queryVoicemailStatusTableListener; + // View required to show/hide recycler and empty views + FrameLayout fragmentRootFrameLayout; + + private EmptyContentView emptyContentView; + public NewVoicemailFragment() { LogUtil.enterBlock("NewVoicemailFragment.NewVoicemailFragment"); } @@ -147,10 +154,14 @@ public final class NewVoicemailFragment extends Fragment implements LoaderCallba public View onCreateView( LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { LogUtil.enterBlock("NewVoicemailFragment.onCreateView"); - View view = inflater.inflate(R.layout.new_voicemail_call_log_fragment, container, false); - recyclerView = view.findViewById(R.id.new_voicemail_call_log_recycler_view); + + fragmentRootFrameLayout = + (FrameLayout) inflater.inflate(R.layout.new_voicemail_call_log_fragment, container, false); + recyclerView = fragmentRootFrameLayout.findViewById(R.id.new_voicemail_call_log_recycler_view); + + emptyContentView = fragmentRootFrameLayout.findViewById(R.id.empty_content_view); getLoaderManager().restartLoader(0, null, this); - return view; + return fragmentRootFrameLayout; } @Override @@ -162,6 +173,12 @@ public final class NewVoicemailFragment extends Fragment implements LoaderCallba @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { LogUtil.i("NewVoicemailFragment.onLoadFinished", "cursor size is %d", data.getCount()); + if (data.getCount() == 0) { + showEmptyVoicemailFragmentView(); + return; + } + showView(recyclerView); + if (recyclerView.getAdapter() == null) { recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); // TODO(uabdullah): Replace getActivity().getFragmentManager() with getChildFragment() @@ -182,9 +199,24 @@ public final class NewVoicemailFragment extends Fragment implements LoaderCallba recyclerView.getAdapter()); ((NewVoicemailAdapter) recyclerView.getAdapter()).updateCursor(data); ((NewVoicemailAdapter) recyclerView.getAdapter()).checkAndPlayVoicemail(); + queryAndUpdateVoicemailStatusAlert(); } + } + + /** Shows the view when there are no voicemails to be displayed * */ + private void showEmptyVoicemailFragmentView() { + LogUtil.enterBlock("NewVoicemailFragmentListener.showEmptyVoicemailFragmentView"); + + showView(emptyContentView); + + emptyContentView.setDescription((R.string.empty_voicemail_tab_text)); + emptyContentView.setImage(R.drawable.quantum_ic_schedule_vd_theme_24); + } - queryAndUpdateVoicemailStatusAlert(); + private void showView(View view) { + LogUtil.i("NewVoicemailFragmentListener.showView", "Showing view: " + view); + emptyContentView.setVisibility(view == emptyContentView ? View.VISIBLE : View.GONE); + recyclerView.setVisibility(view == recyclerView ? View.VISIBLE : View.GONE); } private void registerRefreshAnnotatedCallLogReceiver() { diff --git a/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_call_log_fragment.xml b/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_call_log_fragment.xml index 9daa3e114..fd9e0f2d2 100644 --- a/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_call_log_fragment.xml +++ b/java/com/android/dialer/voicemail/listui/res/layout/new_voicemail_call_log_fragment.xml @@ -15,21 +15,35 @@ ~ limitations under the License --> - <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/fragment_my_frame_layout" - android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:id="@+id/new_voicemail_frame_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" android:orientation="vertical"> - <include layout="@layout/voicemail_tos_fragment"/> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/new_voicemail_call_log_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background_dialer_light" android:paddingBottom="@dimen/floating_action_button_list_bottom_padding" - android:clipToPadding="false"/> + android:background="@color/background_dialer_light" + android:clipToPadding="false" + android:visibility="gone" + /> + + + <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <com.android.dialer.widget.EmptyContentView + android:id="@+id/empty_content_view" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:visibility="gone"/> + + </FrameLayout> </FrameLayout> 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 db33c1909..d12a71ee6 100644 --- a/java/com/android/dialer/voicemail/listui/res/values/strings.xml +++ b/java/com/android/dialer/voicemail/listui/res/values/strings.xml @@ -57,4 +57,7 @@ If you do not accept all of these terms and conditions, do not use Visual Voice <!-- Label indicating who provided the voicemail transcription [CHAR LIMIT=64] --> <string name="voicemail_transcription_branding_text">Transcribed by Google</string> + <!-- Text displayed when the list of voicemails is empty [CHAR LIMIT=NONE] --> + <string name="empty_voicemail_tab_text">Your voicemail inbox is empty.</string> + </resources> diff --git a/java/com/android/dialer/widget/res/layout/empty_content_view.xml b/java/com/android/dialer/widget/res/layout/empty_content_view.xml index 177744385..9aac6f48f 100644 --- a/java/com/android/dialer/widget/res/layout/empty_content_view.xml +++ b/java/com/android/dialer/widget/res/layout/empty_content_view.xml @@ -18,7 +18,7 @@ <ImageView android:id="@+id/empty_list_view_image" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="108dp" android:gravity="center_horizontal"/> <TextView |