/* * 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() { @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; } } }