blob: e83fcd4c7710343e67635b94c158a34a73530b4a [file] [log] [blame]
Eric Erfanianccca3152017-02-22 16:32:36 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.dialer.app.calllog;
18
Eric Erfanianff2ad7f2017-07-27 10:45:54 -070019import android.app.KeyguardManager;
Eric Erfanianfc0eb8c2017-08-31 06:57:16 -070020import android.content.Context;
Eric Erfanianfc37b022017-03-21 10:11:17 -070021import android.content.Intent;
Eric Erfanianccca3152017-02-22 16:32:36 -080022import android.database.ContentObserver;
23import android.media.AudioManager;
24import android.os.Bundle;
25import android.provider.CallLog;
26import android.provider.VoicemailContract;
Eric Erfanianfc0eb8c2017-08-31 06:57:16 -070027import android.support.annotation.VisibleForTesting;
Eric Erfanianccca3152017-02-22 16:32:36 -080028import android.view.LayoutInflater;
29import android.view.View;
30import android.view.ViewGroup;
31import com.android.dialer.app.R;
32import com.android.dialer.app.list.ListsFragment;
33import com.android.dialer.app.voicemail.VoicemailAudioManager;
34import com.android.dialer.app.voicemail.VoicemailErrorManager;
35import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter;
36import com.android.dialer.common.LogUtil;
Eric Erfanianfc0eb8c2017-08-31 06:57:16 -070037import com.android.dialer.common.concurrent.DialerExecutor;
zachh0cd36a62017-10-31 12:04:05 -070038import com.android.dialer.common.concurrent.DialerExecutorComponent;
Eric Erfanian8369df02017-05-03 10:27:13 -070039import com.android.dialer.logging.DialerImpression;
Eric Erfanian9a090c82017-03-16 19:22:24 -070040import com.android.dialer.logging.Logger;
Eric Erfanianc857f902017-05-15 14:05:33 -070041import com.android.dialer.util.PermissionsUtil;
uabdullah4deaebc2018-01-22 18:19:07 -080042import com.android.dialer.voicemail.listui.error.VoicemailErrorMessageCreator;
43import com.android.dialer.voicemail.listui.error.VoicemailStatus;
44import com.android.dialer.voicemail.listui.error.VoicemailStatusWorker;
Eric Erfanianfc0eb8c2017-08-31 06:57:16 -070045import java.util.List;
Eric Erfanianccca3152017-02-22 16:32:36 -080046
47public class VisualVoicemailCallLogFragment extends CallLogFragment {
48
linyuh183cb712017-12-27 17:02:37 -080049 private final ContentObserver voicemailStatusObserver = new CustomContentObserver();
50 private VoicemailPlaybackPresenter voicemailPlaybackPresenter;
51 private DialerExecutor<Context> preSyncVoicemailStatusCheckExecutor;
Eric Erfanianccca3152017-02-22 16:32:36 -080052
linyuh183cb712017-12-27 17:02:37 -080053 private VoicemailErrorManager voicemailErrorManager;
Eric Erfanianccca3152017-02-22 16:32:36 -080054
Eric Erfaniand5e47f62017-03-15 14:41:07 -070055 public VisualVoicemailCallLogFragment() {
56 super(CallLog.Calls.VOICEMAIL_TYPE);
57 }
58
Eric Erfanianccca3152017-02-22 16:32:36 -080059 @Override
Eric Erfanianccca3152017-02-22 16:32:36 -080060 protected VoicemailPlaybackPresenter getVoicemailPlaybackPresenter() {
linyuh183cb712017-12-27 17:02:37 -080061 return voicemailPlaybackPresenter;
Eric Erfanianccca3152017-02-22 16:32:36 -080062 }
63
64 @Override
65 public void onActivityCreated(Bundle savedInstanceState) {
linyuh183cb712017-12-27 17:02:37 -080066 voicemailPlaybackPresenter =
Eric Erfanian10b34a52017-05-04 08:23:17 -070067 VoicemailPlaybackPresenter.getInstance(getActivity(), savedInstanceState);
Eric Erfanianc857f902017-05-15 14:05:33 -070068 if (PermissionsUtil.hasReadVoicemailPermissions(getContext())
69 && PermissionsUtil.hasAddVoicemailPermissions(getContext())) {
70 getActivity()
71 .getContentResolver()
72 .registerContentObserver(
linyuh183cb712017-12-27 17:02:37 -080073 VoicemailContract.Status.CONTENT_URI, true, voicemailStatusObserver);
Eric Erfanianc857f902017-05-15 14:05:33 -070074 } else {
75 LogUtil.w(
76 "VisualVoicemailCallLogFragment.onActivityCreated",
77 "read voicemail permission unavailable.");
78 }
Eric Erfanianccca3152017-02-22 16:32:36 -080079 super.onActivityCreated(savedInstanceState);
Eric Erfanianfc0eb8c2017-08-31 06:57:16 -070080
linyuh183cb712017-12-27 17:02:37 -080081 preSyncVoicemailStatusCheckExecutor =
zachh0cd36a62017-10-31 12:04:05 -070082 DialerExecutorComponent.get(getContext())
83 .dialerExecutorFactory()
84 .createUiTaskBuilder(
Eric Erfanianfc0eb8c2017-08-31 06:57:16 -070085 getActivity().getFragmentManager(),
86 "fetchVoicemailStatus",
87 new VoicemailStatusWorker())
88 .onSuccess(this::onPreSyncVoicemailStatusChecked)
89 .build();
90
linyuh183cb712017-12-27 17:02:37 -080091 voicemailErrorManager =
92 new VoicemailErrorManager(getContext(), getAdapter().getAlertManager(), modalAlertManager);
Eric Erfanianc857f902017-05-15 14:05:33 -070093
94 if (PermissionsUtil.hasReadVoicemailPermissions(getContext())
95 && PermissionsUtil.hasAddVoicemailPermissions(getContext())) {
96 getActivity()
97 .getContentResolver()
98 .registerContentObserver(
99 VoicemailContract.Status.CONTENT_URI,
100 true,
linyuh183cb712017-12-27 17:02:37 -0800101 voicemailErrorManager.getContentObserver());
Eric Erfanianc857f902017-05-15 14:05:33 -0700102 } else {
103 LogUtil.w(
104 "VisualVoicemailCallLogFragment.onActivityCreated",
105 "read voicemail permission unavailable.");
106 }
Eric Erfanianccca3152017-02-22 16:32:36 -0800107 }
108
109 @Override
110 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
111 View view = inflater.inflate(R.layout.call_log_fragment, container, false);
112 setupView(view);
113 return view;
114 }
115
116 @Override
117 public void onResume() {
118 super.onResume();
linyuh183cb712017-12-27 17:02:37 -0800119 voicemailPlaybackPresenter.onResume();
120 voicemailErrorManager.onResume();
Eric Erfanianccca3152017-02-22 16:32:36 -0800121 }
122
123 @Override
124 public void onPause() {
linyuh183cb712017-12-27 17:02:37 -0800125 voicemailPlaybackPresenter.onPause();
126 voicemailErrorManager.onPause();
Eric Erfanianccca3152017-02-22 16:32:36 -0800127 super.onPause();
128 }
129
130 @Override
131 public void onDestroy() {
wangqif87dbfb2017-10-27 16:47:14 -0700132 if (isAdded()) {
133 getActivity()
134 .getContentResolver()
linyuh183cb712017-12-27 17:02:37 -0800135 .unregisterContentObserver(voicemailErrorManager.getContentObserver());
136 voicemailPlaybackPresenter.onDestroy();
137 voicemailErrorManager.onDestroy();
138 getActivity().getContentResolver().unregisterContentObserver(voicemailStatusObserver);
wangqif87dbfb2017-10-27 16:47:14 -0700139 }
Eric Erfanianccca3152017-02-22 16:32:36 -0800140 super.onDestroy();
141 }
142
143 @Override
144 public void onSaveInstanceState(Bundle outState) {
145 super.onSaveInstanceState(outState);
linyuh183cb712017-12-27 17:02:37 -0800146 if (voicemailPlaybackPresenter != null) {
147 voicemailPlaybackPresenter.onSaveInstanceState(outState);
wangqif87dbfb2017-10-27 16:47:14 -0700148 }
Eric Erfanianccca3152017-02-22 16:32:36 -0800149 }
150
151 @Override
152 public void fetchCalls() {
153 super.fetchCalls();
154 ((ListsFragment) getParentFragment()).updateTabUnreadCounts();
155 }
156
157 @Override
Eric Erfaniand8046e52017-04-06 09:41:50 -0700158 public void onVisible() {
Eric Erfanianff2ad7f2017-07-27 10:45:54 -0700159 LogUtil.enterBlock("VisualVoicemailCallLogFragment.onVisible");
Eric Erfaniand8046e52017-04-06 09:41:50 -0700160 super.onVisible();
161 if (getActivity() != null) {
linyuh183cb712017-12-27 17:02:37 -0800162 preSyncVoicemailStatusCheckExecutor.executeParallel(getActivity());
Eric Erfaniand8046e52017-04-06 09:41:50 -0700163 Logger.get(getActivity()).logImpression(DialerImpression.Type.VVM_TAB_VIEWED);
164 getActivity().setVolumeControlStream(VoicemailAudioManager.PLAYBACK_STREAM);
Eric Erfanianccca3152017-02-22 16:32:36 -0800165 }
166 }
167
Eric Erfanianfc0eb8c2017-08-31 06:57:16 -0700168 private void onPreSyncVoicemailStatusChecked(List<VoicemailStatus> statuses) {
169 if (!shouldAutoSync(new VoicemailErrorMessageCreator(), statuses)) {
170 return;
171 }
172
173 Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL);
174 intent.setPackage(getActivity().getPackageName());
175 getActivity().sendBroadcast(intent);
176 }
177
178 @VisibleForTesting
179 static boolean shouldAutoSync(
180 VoicemailErrorMessageCreator errorMessageCreator, List<VoicemailStatus> statuses) {
181 for (VoicemailStatus status : statuses) {
182 if (!status.isActive()) {
183 continue;
184 }
185 if (errorMessageCreator.isSyncBlockingError(status)) {
186 LogUtil.i(
187 "VisualVoicemailCallLogFragment.shouldAutoSync", "auto-sync blocked due to " + status);
188 return false;
189 }
190 }
191 return true;
192 }
193
Eric Erfanianccca3152017-02-22 16:32:36 -0800194 @Override
Eric Erfaniand8046e52017-04-06 09:41:50 -0700195 public void onNotVisible() {
Eric Erfanianff2ad7f2017-07-27 10:45:54 -0700196 LogUtil.enterBlock("VisualVoicemailCallLogFragment.onNotVisible");
Eric Erfaniand8046e52017-04-06 09:41:50 -0700197 super.onNotVisible();
198 if (getActivity() != null) {
199 getActivity().setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
Eric Erfanianff2ad7f2017-07-27 10:45:54 -0700200 // onNotVisible will be called in the lock screen when the call ends
201 if (!getActivity().getSystemService(KeyguardManager.class).inKeyguardRestrictedInputMode()) {
202 LogUtil.i("VisualVoicemailCallLogFragment.onNotVisible", "clearing all new voicemails");
203 CallLogNotificationsService.markAllNewVoicemailsAsOld(getActivity());
204 }
Eric Erfanianccca3152017-02-22 16:32:36 -0800205 }
206 }
207}