summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authortwyen <twyen@google.com>2017-08-17 11:03:39 -0700
committerEric Erfanian <erfanian@google.com>2017-08-30 15:45:22 +0000
commitf4627475c19ea3d3f2ea668b6e402c1f4ab76f9e (patch)
treee034dfac45c0fe72806c9e4347628afebbd32a76 /java
parentc12afe26997b6c4ad9ce8bccdd92228a15886b6c (diff)
Disable auto sync when opening VVM tab if there is an error
Previously we issue a VVM sync command whenever the VVM tab is opened. This will clear the voicemail error message, and the user must wait for it to fail again to see what append (sometimes it take 5 minutes). In this CL, unless the message is "all green", activating, or quota warnings, the sync will not be issued. TEST=OmtpVoicemailMessageCreatorTest, Vvm3VoicemailMessageCreatorTest. VisualVoicemailCallLogFragment is not testable. Bug: 62673906 Test: OmtpVoicemailMessageCreatorTest, Vvm3VoicemailMessageCreatorTest. VisualVoicemailCallLogFragment is not testable. PiperOrigin-RevId: 165600618 Change-Id: I63a4ac60f4811714fcd0f4443d2fc331d8d321c0
Diffstat (limited to 'java')
-rw-r--r--java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java47
-rw-r--r--java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java19
-rw-r--r--java/com/android/dialer/app/voicemail/error/VoicemailErrorMessageCreator.java9
-rw-r--r--java/com/android/dialer/app/voicemail/error/VoicemailStatusWorker.java72
-rw-r--r--java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java21
5 files changed, 164 insertions, 4 deletions
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
index 17018b38d..6882ef9d8 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
@@ -17,12 +17,14 @@
package com.android.dialer.app.calllog;
import android.app.KeyguardManager;
+import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.os.Bundle;
import android.provider.CallLog;
import android.provider.VoicemailContract;
+import android.support.annotation.VisibleForTesting;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -31,15 +33,22 @@ import com.android.dialer.app.list.ListsFragment;
import com.android.dialer.app.voicemail.VoicemailAudioManager;
import com.android.dialer.app.voicemail.VoicemailErrorManager;
import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter;
+import com.android.dialer.app.voicemail.error.VoicemailErrorMessageCreator;
+import com.android.dialer.app.voicemail.error.VoicemailStatus;
+import com.android.dialer.app.voicemail.error.VoicemailStatusWorker;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DialerExecutor;
+import com.android.dialer.common.concurrent.DialerExecutors;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.util.PermissionsUtil;
+import java.util.List;
public class VisualVoicemailCallLogFragment extends CallLogFragment {
private final ContentObserver mVoicemailStatusObserver = new CustomContentObserver();
private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
+ private DialerExecutor<Context> mPreSyncVoicemailStatusCheckExecutor;
private VoicemailErrorManager mVoicemailErrorManager;
@@ -56,7 +65,6 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
public void onActivityCreated(Bundle savedInstanceState) {
mVoicemailPlaybackPresenter =
VoicemailPlaybackPresenter.getInstance(getActivity(), savedInstanceState);
-
if (PermissionsUtil.hasReadVoicemailPermissions(getContext())
&& PermissionsUtil.hasAddVoicemailPermissions(getContext())) {
getActivity()
@@ -69,6 +77,13 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
"read voicemail permission unavailable.");
}
super.onActivityCreated(savedInstanceState);
+
+ mPreSyncVoicemailStatusCheckExecutor =
+ DialerExecutors.createUiTaskBuilder(
+ getFragmentManager(), "fetchVoicemailStatus", new VoicemailStatusWorker())
+ .onSuccess(this::onPreSyncVoicemailStatusChecked)
+ .build();
+
mVoicemailErrorManager =
new VoicemailErrorManager(getContext(), getAdapter().getAlertManager(), mModalAlertManager);
@@ -136,14 +151,38 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
LogUtil.enterBlock("VisualVoicemailCallLogFragment.onVisible");
super.onVisible();
if (getActivity() != null) {
- Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL);
- intent.setPackage(getActivity().getPackageName());
- getActivity().sendBroadcast(intent);
+ mPreSyncVoicemailStatusCheckExecutor.executeParallel(getActivity());
Logger.get(getActivity()).logImpression(DialerImpression.Type.VVM_TAB_VIEWED);
getActivity().setVolumeControlStream(VoicemailAudioManager.PLAYBACK_STREAM);
}
}
+ private void onPreSyncVoicemailStatusChecked(List<VoicemailStatus> statuses) {
+ if (!shouldAutoSync(new VoicemailErrorMessageCreator(), statuses)) {
+ return;
+ }
+
+ Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL);
+ intent.setPackage(getActivity().getPackageName());
+ getActivity().sendBroadcast(intent);
+ }
+
+ @VisibleForTesting
+ static boolean shouldAutoSync(
+ VoicemailErrorMessageCreator errorMessageCreator, List<VoicemailStatus> statuses) {
+ for (VoicemailStatus status : statuses) {
+ if (!status.isActive()) {
+ continue;
+ }
+ if (errorMessageCreator.isSyncBlockingError(status)) {
+ LogUtil.i(
+ "VisualVoicemailCallLogFragment.shouldAutoSync", "auto-sync blocked due to " + status);
+ return false;
+ }
+ }
+ return true;
+ }
+
@Override
public void onNotVisible() {
LogUtil.enterBlock("VisualVoicemailCallLogFragment.onNotVisible");
diff --git a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
index 909de70bb..79e038332 100644
--- a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
@@ -136,6 +136,25 @@ public class OmtpVoicemailMessageCreator {
return null;
}
+ public static boolean isSyncBlockingError(VoicemailStatus status) {
+ if (status.notificationChannelState != Status.NOTIFICATION_CHANNEL_STATE_OK) {
+ return true;
+ }
+
+ if (status.dataChannelState != Status.DATA_CHANNEL_STATE_OK) {
+ return true;
+ }
+
+ switch (status.configurationState) {
+ case Status.CONFIGURATION_STATE_OK:
+ // allow activation to be queued again in case it is interrupted
+ case Status.CONFIGURATION_STATE_CONFIGURING:
+ return false;
+ default:
+ return true;
+ }
+ }
+
@Nullable
private static VoicemailErrorMessage checkQuota(
Context context, VoicemailStatus status, VoicemailStatusReader statusReader) {
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessageCreator.java b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessageCreator.java
index 2048d4958..44ceb893e 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessageCreator.java
@@ -43,4 +43,13 @@ public class VoicemailErrorMessageCreator {
return OmtpVoicemailMessageCreator.create(context, status, statusReader);
}
}
+
+ public boolean isSyncBlockingError(VoicemailStatus status) {
+ switch (status.type) {
+ case VisualVoicemailTypeExtensions.VVM_TYPE_VVM3:
+ return Vvm3VoicemailMessageCreator.isSyncBlockingError(status);
+ default:
+ return OmtpVoicemailMessageCreator.isSyncBlockingError(status);
+ }
+ }
}
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailStatusWorker.java b/java/com/android/dialer/app/voicemail/error/VoicemailStatusWorker.java
new file mode 100644
index 000000000..95b16e8f3
--- /dev/null
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailStatusWorker.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.app.voicemail.error;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.database.Cursor;
+import android.os.Build.VERSION_CODES;
+import android.provider.VoicemailContract.Status;
+import android.support.annotation.Nullable;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import com.android.dialer.database.VoicemailStatusQuery;
+import com.android.dialer.telecom.TelecomUtil;
+import com.android.voicemail.VoicemailComponent;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Worker for {@link com.android.dialer.common.concurrent.DialerExecutors} to fetch voicemail status
+ */
+@TargetApi(VERSION_CODES.M)
+public class VoicemailStatusWorker implements Worker<Context, List<VoicemailStatus>> {
+
+ @Nullable
+ @Override
+ public List<VoicemailStatus> doInBackground(@Nullable Context context) throws Throwable {
+ List<VoicemailStatus> statuses = new ArrayList<>();
+ if (!TelecomUtil.hasReadWriteVoicemailPermissions(context)) {
+ return statuses;
+ }
+ StringBuilder where = new StringBuilder();
+ java.util.List<String> selectionArgs = new ArrayList<>();
+
+ VoicemailComponent.get(context)
+ .getVoicemailClient()
+ .appendOmtpVoicemailStatusSelectionClause(context, where, selectionArgs);
+
+ try (Cursor cursor =
+ context
+ .getContentResolver()
+ .query(
+ Status.CONTENT_URI,
+ VoicemailStatusQuery.getProjection(),
+ where.toString(),
+ selectionArgs.toArray(new String[selectionArgs.size()]),
+ null)) {
+ if (cursor == null) {
+ return statuses;
+ }
+
+ for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
+ statuses.add(new VoicemailStatus(context, cursor));
+ }
+ }
+
+ return statuses;
+ }
+}
diff --git a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
index d3024f4c5..8e8106b44 100644
--- a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build.VERSION_CODES;
+import android.provider.VoicemailContract.Status;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
@@ -257,6 +258,26 @@ public class Vvm3VoicemailMessageCreator {
return OmtpVoicemailMessageCreator.create(context, status, statusReader);
}
+ public static boolean isSyncBlockingError(VoicemailStatus status) {
+ if (status.notificationChannelState != Status.NOTIFICATION_CHANNEL_STATE_OK) {
+ return true;
+ }
+
+ if (status.dataChannelState != Status.DATA_CHANNEL_STATE_OK) {
+ return true;
+ }
+
+ switch (status.configurationState) {
+ case PIN_NOT_SET:
+ case Status.CONFIGURATION_STATE_OK:
+ // allow activation to be queued again in case it is interrupted
+ case Status.CONFIGURATION_STATE_CONFIGURING:
+ return false;
+ default:
+ return true;
+ }
+ }
+
@NonNull
private static CharSequence getCustomerSupportString(Context context, int id) {
// TODO(twyen): get number based on the country the user is currently in.