summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/postcall/PostCall.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/postcall/PostCall.java')
-rw-r--r--java/com/android/dialer/postcall/PostCall.java182
1 files changed, 182 insertions, 0 deletions
diff --git a/java/com/android/dialer/postcall/PostCall.java b/java/com/android/dialer/postcall/PostCall.java
new file mode 100644
index 000000000..cfe7c867b
--- /dev/null
+++ b/java/com/android/dialer/postcall/PostCall.java
@@ -0,0 +1,182 @@
+/*
+ * 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.postcall;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.support.design.widget.BaseTransientBottomBar.BaseCallback;
+import android.support.design.widget.Snackbar;
+import android.view.View;
+import android.view.View.OnClickListener;
+import com.android.dialer.buildtype.BuildType;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.ConfigProvider;
+import com.android.dialer.common.ConfigProviderBindings;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.nano.DialerImpression;
+import com.android.dialer.util.DialerUtils;
+import com.android.dialer.util.IntentUtil;
+
+/** Helper class to handle all post call actions. */
+public class PostCall {
+
+ private static final String KEY_POST_CALL_CALL_CONNECT_TIME = "post_call_call_connect_time";
+ private static final String KEY_POST_CALL_CALL_DISCONNECT_TIME = "post_call_call_disconnect_time";
+ private static final String KEY_POST_CALL_CALL_NUMBER = "post_call_call_number";
+ private static final String KEY_POST_CALL_MESSAGE_SENT = "post_call_message_sent";
+
+ public static void promptUserForMessageIfNecessary(Activity activity, View rootView) {
+ if (isEnabled(activity)) {
+ if (shouldPromptUserToViewSentMessage(activity)) {
+ promptUserToViewSentMessage(activity, rootView);
+ } else if (shouldPromptUserToSendMessage(activity)) {
+ promptUserToSendMessage(activity, rootView);
+ }
+ }
+ }
+
+ private static void promptUserToSendMessage(Activity activity, View rootView) {
+ LogUtil.i("PostCall.promptUserToSendMessage", "returned from call, showing post call SnackBar");
+ String message = activity.getString(R.string.post_call_message);
+ String addMessage = activity.getString(R.string.post_call_add_message);
+ OnClickListener onClickListener =
+ v -> {
+ Logger.get(activity)
+ .logImpression(DialerImpression.Type.POST_CALL_PROMPT_USER_TO_SEND_MESSAGE_CLICKED);
+ activity.startActivity(PostCallActivity.newIntent(activity, getPhoneNumber(activity)));
+ };
+
+ Snackbar.make(rootView, message, Snackbar.LENGTH_INDEFINITE)
+ .setAction(addMessage, onClickListener)
+ .setActionTextColor(
+ activity.getResources().getColor(R.color.dialer_snackbar_action_text_color))
+ .show();
+ Logger.get(activity).logImpression(DialerImpression.Type.POST_CALL_PROMPT_USER_TO_SEND_MESSAGE);
+ PreferenceManager.getDefaultSharedPreferences(activity)
+ .edit()
+ .remove(KEY_POST_CALL_CALL_DISCONNECT_TIME)
+ .apply();
+ }
+
+ private static void promptUserToViewSentMessage(Activity activity, View rootView) {
+ LogUtil.i(
+ "PostCall.promptUserToViewSentMessage",
+ "returned from sending a post call message, message sent.");
+ String message = activity.getString(R.string.post_call_message_sent);
+ String addMessage = activity.getString(R.string.view);
+ OnClickListener onClickListener =
+ v -> {
+ Logger.get(activity)
+ .logImpression(
+ DialerImpression.Type.POST_CALL_PROMPT_USER_TO_VIEW_SENT_MESSAGE_CLICKED);
+ Intent intent = IntentUtil.getSendSmsIntent(getPhoneNumber(activity));
+ DialerUtils.startActivityWithErrorToast(activity, intent);
+ };
+
+ Snackbar.make(rootView, message, Snackbar.LENGTH_INDEFINITE)
+ .setAction(addMessage, onClickListener)
+ .setActionTextColor(
+ activity.getResources().getColor(R.color.dialer_snackbar_action_text_color))
+ .addCallback(
+ new BaseCallback<Snackbar>() {
+ @Override
+ public void onDismissed(Snackbar snackbar, int i) {
+ super.onDismissed(snackbar, i);
+ clear(snackbar.getContext());
+ }
+ })
+ .show();
+ Logger.get(activity)
+ .logImpression(DialerImpression.Type.POST_CALL_PROMPT_USER_TO_VIEW_SENT_MESSAGE);
+ PreferenceManager.getDefaultSharedPreferences(activity)
+ .edit()
+ .remove(KEY_POST_CALL_MESSAGE_SENT)
+ .apply();
+ }
+
+ public static void onCallDisconnected(Context context, String number, long callConnectedMillis) {
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit()
+ .putLong(KEY_POST_CALL_CALL_CONNECT_TIME, callConnectedMillis)
+ .putLong(KEY_POST_CALL_CALL_DISCONNECT_TIME, System.currentTimeMillis())
+ .putString(KEY_POST_CALL_CALL_NUMBER, number)
+ .apply();
+ }
+
+ public static void onMessageSent(Context context, String number) {
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit()
+ .putString(KEY_POST_CALL_CALL_NUMBER, number)
+ .putBoolean(KEY_POST_CALL_MESSAGE_SENT, true)
+ .apply();
+ }
+
+ private static void clear(Context context) {
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit()
+ .remove(KEY_POST_CALL_CALL_DISCONNECT_TIME)
+ .remove(KEY_POST_CALL_CALL_NUMBER)
+ .remove(KEY_POST_CALL_MESSAGE_SENT)
+ .remove(KEY_POST_CALL_CALL_CONNECT_TIME)
+ .apply();
+ }
+
+ private static boolean shouldPromptUserToSendMessage(Context context) {
+ SharedPreferences manager = PreferenceManager.getDefaultSharedPreferences(context);
+ long disconnectTimeMillis = manager.getLong(KEY_POST_CALL_CALL_DISCONNECT_TIME, -1);
+ long connectTimeMillis = manager.getLong(KEY_POST_CALL_CALL_CONNECT_TIME, -1);
+
+ long timeSinceDisconnect = System.currentTimeMillis() - disconnectTimeMillis;
+ long callDurationMillis = disconnectTimeMillis - connectTimeMillis;
+
+ ConfigProvider binding = ConfigProviderBindings.get(context);
+ return disconnectTimeMillis != -1
+ && connectTimeMillis != -1
+ && binding.getLong("postcall_last_call_threshold", 30_000) > timeSinceDisconnect
+ && binding.getLong("postcall_call_duration_threshold", 60_000) > callDurationMillis;
+ }
+
+ private static boolean shouldPromptUserToViewSentMessage(Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(KEY_POST_CALL_MESSAGE_SENT, false);
+ }
+
+ private static String getPhoneNumber(Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context)
+ .getString(KEY_POST_CALL_CALL_NUMBER, null);
+ }
+
+ private static boolean isEnabled(Context context) {
+ @BuildType.Type int type = BuildType.get();
+ switch (type) {
+ case BuildType.BUGFOOD:
+ case BuildType.DOGFOOD:
+ case BuildType.FISHFOOD:
+ case BuildType.TEST:
+ return ConfigProviderBindings.get(context).getBoolean("enable_post_call", true);
+ case BuildType.RELEASE:
+ return ConfigProviderBindings.get(context).getBoolean("enable_post_call_prod", true);
+ default:
+ Assert.fail();
+ return false;
+ }
+ }
+}