diff options
Diffstat (limited to 'src/com/android/phone/InCallUiState.java')
-rw-r--r-- | src/com/android/phone/InCallUiState.java | 453 |
1 files changed, 0 insertions, 453 deletions
diff --git a/src/com/android/phone/InCallUiState.java b/src/com/android/phone/InCallUiState.java deleted file mode 100644 index 3b700d7a..00000000 --- a/src/com/android/phone/InCallUiState.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Copyright (C) 2011 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.phone; - -import com.android.phone.Constants.CallStatusCode; - -import android.content.Context; -import android.content.Intent; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - - -/** - * Helper class to keep track of "persistent state" of the in-call UI. - * - * The onscreen appearance of the in-call UI mostly depends on the current - * Call/Connection state, which is owned by the telephony framework. But - * there's some application-level "UI state" too, which lives here in the - * phone app. - * - * This application-level state information is *not* maintained by the - * InCallScreen, since it needs to persist throughout an entire phone call, - * not just a single resume/pause cycle of the InCallScreen. So instead, that - * state is stored here, in a singleton instance of this class. - * - * The state kept here is a high-level abstraction of in-call UI state: we - * don't know about implementation details like specific widgets or strings or - * resources, but we do understand higher level concepts (for example "is the - * dialpad visible") and high-level modes (like InCallScreenMode) and error - * conditions (like CallStatusCode). - * - * @see InCallControlState for a separate collection of "UI state" that - * controls all the onscreen buttons of the in-call UI, based on the state of - * the telephony layer. - * - * The singleton instance of this class is owned by the PhoneApp instance. - */ -public class InCallUiState { - private static final String TAG = "InCallUiState"; - private static final boolean DBG = false; - - /** The singleton InCallUiState instance. */ - private static InCallUiState sInstance; - - private Context mContext; - - /** - * Initialize the singleton InCallUiState instance. - * - * This is only done once, at startup, from PhoneApp.onCreate(). - * From then on, the InCallUiState instance is available via the - * PhoneApp's public "inCallUiState" field, which is why there's no - * getInstance() method here. - */ - /* package */ static InCallUiState init(Context context) { - synchronized (InCallUiState.class) { - if (sInstance == null) { - sInstance = new InCallUiState(context); - } else { - Log.wtf(TAG, "init() called multiple times! sInstance = " + sInstance); - } - return sInstance; - } - } - - /** - * Private constructor (this is a singleton). - * @see init() - */ - private InCallUiState(Context context) { - mContext = context; - } - - - // - // (1) High-level state of the whole in-call UI - // - - /** High-level "modes" of the in-call UI. */ - public enum InCallScreenMode { - /** - * Normal in-call UI elements visible. - */ - NORMAL, - /** - * "Manage conference" UI is visible, totally replacing the - * normal in-call UI. - */ - MANAGE_CONFERENCE, - /** - * Non-interactive UI state. Call card is visible, - * displaying information about the call that just ended. - */ - CALL_ENDED, - /** - * Normal OTA in-call UI elements visible. - */ - OTA_NORMAL, - /** - * OTA call ended UI visible, replacing normal OTA in-call UI. - */ - OTA_ENDED, - /** - * Default state when not on call - */ - UNDEFINED - } - - /** Current high-level "mode" of the in-call UI. */ - InCallScreenMode inCallScreenMode = InCallScreenMode.UNDEFINED; - - - // - // (2) State of specific UI elements - // - - /** - * Is the onscreen twelve-key dialpad visible? - */ - boolean showDialpad; - - /** - * The contents of the twelve-key dialpad's "digits" display, which is - * visible only when the dialpad itself is visible. - * - * (This is basically the "history" of DTMF digits you've typed so far - * in the current call. It's cleared out any time a new call starts, - * to make sure the digits don't persist between two separate calls.) - */ - String dialpadDigits; - - /** - * The contact/dialed number information shown in the DTMF digits text - * when the user has not yet typed any digits. - * - * Currently only used for displaying "Voice Mail" since voicemail calls - * start directly in the dialpad view. - */ - String dialpadContextText; - - // - // (3) Error / diagnostic indications - // - - // This section provides an abstract concept of an "error status - // indication" for some kind of exceptional condition that needs to be - // communicated to the user, in the context of the in-call UI. - // - // If mPendingCallStatusCode is any value other than SUCCESS, that - // indicates that the in-call UI needs to display a dialog to the user - // with the specified title and message text. - // - // When an error occurs outside of the InCallScreen itself (like - // during CallController.placeCall() for example), we inform the user - // by doing the following steps: - // - // (1) set the "pending call status code" to a value other than SUCCESS - // (based on the specific error that happened) - // (2) force the InCallScreen to be launched (or relaunched) - // (3) InCallScreen.onResume() will notice that pending call status code - // is set, and will actually bring up the desired dialog. - // - // Watch out: any time you set (or change!) the pending call status code - // field you must be sure to always (re)launch the InCallScreen. - // - // Finally, the InCallScreen itself is responsible for resetting the - // pending call status code, when the user dismisses the dialog (like by - // hitting the OK button or pressing Back). The pending call status code - // field is NOT cleared simply by the InCallScreen being paused or - // finished, since the resulting dialog needs to persist across - // orientation changes or if the screen turns off. - - // TODO: other features we might eventually need here: - // - // - Some error status messages stay in force till reset, - // others may automatically clear themselves after - // a fixed delay - // - // - Some error statuses may be visible as a dialog with an OK - // button (like "call failed"), others may be an indefinite - // progress dialog (like "turning on radio for emergency call"). - // - // - Eventually some error statuses may have extra actions (like a - // "retry call" button that we might provide at the bottom of the - // "call failed because you have no signal" dialog.) - - /** - * The current pending "error status indication" that we need to - * display to the user. - * - * If this field is set to a value other than SUCCESS, this indicates to - * the InCallScreen that we need to show some kind of message to the user - * (usually an error dialog) based on the specified status code. - */ - private CallStatusCode mPendingCallStatusCode = CallStatusCode.SUCCESS; - - /** - * @return true if there's a pending "error status indication" - * that we need to display to the user. - */ - public boolean hasPendingCallStatusCode() { - if (DBG) log("hasPendingCallStatusCode() ==> " - + (mPendingCallStatusCode != CallStatusCode.SUCCESS)); - return (mPendingCallStatusCode != CallStatusCode.SUCCESS); - } - - /** - * @return the pending "error status indication" code - * that we need to display to the user. - */ - public CallStatusCode getPendingCallStatusCode() { - if (DBG) log("getPendingCallStatusCode() ==> " + mPendingCallStatusCode); - return mPendingCallStatusCode; - } - - /** - * Sets the pending "error status indication" code. - */ - public void setPendingCallStatusCode(CallStatusCode status) { - if (DBG) log("setPendingCallStatusCode( " + status + " )..."); - if (mPendingCallStatusCode != CallStatusCode.SUCCESS) { - // Uh oh: mPendingCallStatusCode is already set to some value - // other than SUCCESS (which indicates that there was some kind of - // failure), and now we're trying to indicate another (potentially - // different) failure. But we can only indicate one failure at a - // time to the user, so the previous pending code is now going to - // be lost. - Log.w(TAG, "setPendingCallStatusCode: setting new code " + status - + ", but a previous code " + mPendingCallStatusCode - + " was already pending!"); - } - mPendingCallStatusCode = status; - } - - /** - * Clears out the pending "error status indication" code. - * - * This indicates that there's no longer any error or "exceptional - * condition" that needs to be displayed to the user. (Typically, this - * method is called when the user dismisses the error dialog that came up - * because of a previous call status code.) - */ - public void clearPendingCallStatusCode() { - if (DBG) log("clearPendingCallStatusCode()..."); - mPendingCallStatusCode = CallStatusCode.SUCCESS; - } - - /** - * Flag used to control the CDMA-specific "call lost" dialog. - * - * If true, that means that if the *next* outgoing call fails with an - * abnormal disconnection cause, we need to display the "call lost" - * dialog. (Normally, in CDMA we handle some types of call failures - * by automatically retrying the call. This flag is set to true when - * we're about to auto-retry, which means that if the *retry* also - * fails we'll give up and display an error.) - * See the logic in InCallScreen.onDisconnect() for the full story. - * - * TODO: the state machine that maintains the needToShowCallLostDialog - * flag in InCallScreen.onDisconnect() should really be moved into the - * CallController. Then we can get rid of this extra flag, and - * instead simply use the CallStatusCode value CDMA_CALL_LOST to - * trigger the "call lost" dialog. - */ - boolean needToShowCallLostDialog; - - - // - // Progress indications - // - - /** - * Possible messages we might need to display along with - * an indefinite progress spinner. - */ - public enum ProgressIndicationType { - /** - * No progress indication needs to be shown. - */ - NONE, - - /** - * Shown when making an emergency call from airplane mode; - * see CallController$EmergencyCallHelper. - */ - TURNING_ON_RADIO, - - /** - * Generic "retrying" state. (Specifically, this is shown while - * retrying after an initial failure from the "emergency call from - * airplane mode" sequence.) - */ - RETRYING - } - - /** - * The current progress indication that should be shown - * to the user. Any value other than NONE will cause the InCallScreen - * to bring up an indefinite progress spinner along with a message - * corresponding to the specified ProgressIndicationType. - */ - private ProgressIndicationType progressIndication = ProgressIndicationType.NONE; - - /** Sets the current progressIndication. */ - public void setProgressIndication(ProgressIndicationType value) { - progressIndication = value; - } - - /** Clears the current progressIndication. */ - public void clearProgressIndication() { - progressIndication = ProgressIndicationType.NONE; - } - - /** - * @return the current progress indication type, or ProgressIndicationType.NONE - * if no progress indication is currently active. - */ - public ProgressIndicationType getProgressIndication() { - return progressIndication; - } - - /** @return true if a progress indication is currently active. */ - public boolean isProgressIndicationActive() { - return (progressIndication != ProgressIndicationType.NONE); - } - - - // - // (4) Optional info when a 3rd party "provider" is used. - // @see InCallScreen#requestRemoveProviderInfoWithDelay() - // @see CallCard#updateCallStateWidgets() - // - - // TODO: maybe isolate all the provider-related stuff out to a - // separate inner class? - boolean providerInfoVisible; - CharSequence providerLabel; - Drawable providerIcon; - Uri providerGatewayUri; - // The formatted address extracted from mProviderGatewayUri. User visible. - String providerAddress; - - /** - * Set the fields related to the provider support - * based on the specified intent. - */ - public void setProviderInfo(Intent intent) { - providerLabel = PhoneUtils.getProviderLabel(mContext, intent); - providerIcon = PhoneUtils.getProviderIcon(mContext, intent); - providerGatewayUri = PhoneUtils.getProviderGatewayUri(intent); - providerAddress = PhoneUtils.formatProviderUri(providerGatewayUri); - providerInfoVisible = true; - - // ...but if any of the "required" fields are missing, completely - // disable the overlay. - if (TextUtils.isEmpty(providerLabel) || providerIcon == null || - providerGatewayUri == null || TextUtils.isEmpty(providerAddress)) { - clearProviderInfo(); - } - } - - /** - * Clear all the fields related to the provider support. - */ - public void clearProviderInfo() { - providerInfoVisible = false; - providerLabel = null; - providerIcon = null; - providerGatewayUri = null; - providerAddress = null; - } - - /** - * "Call origin" of the most recent phone call. - * - * Watch out: right now this is only used to determine where the user should go after the phone - * call. See also {@link InCallScreen} for more detail. There is *no* specific specification - * about how this variable will be used. - * - * @see PhoneGlobals#setLatestActiveCallOrigin(String) - * @see PhoneGlobals#createPhoneEndIntentUsingCallOrigin() - * - * TODO: we should determine some public behavior for this variable. - */ - String latestActiveCallOrigin; - - /** - * Timestamp for "Call origin". This will be used to preserve when the call origin was set. - * {@link android.os.SystemClock#elapsedRealtime()} will be used. - */ - long latestActiveCallOriginTimeStamp; - - /** - * Flag forcing Phone app to show in-call UI even when there's no phone call and thus Phone - * is in IDLE state. This will be turned on only when: - * - * - the last phone call is hung up, and - * - the screen is being turned off in the middle of in-call UI (and thus when the screen being - * turned on in-call UI is expected to be the next foreground activity) - * - * At that moment whole UI should show "previously disconnected phone call" for a moment and - * exit itself. {@link InCallScreen#onPause()} will turn this off and prevent possible weird - * cases which may happen with that exceptional case. - */ - boolean showAlreadyDisconnectedState; - - // - // Debugging - // - - public void dumpState() { - log("dumpState():"); - log(" - showDialpad: " + showDialpad); - log(" - dialpadContextText: " + dialpadContextText); - if (hasPendingCallStatusCode()) { - log(" - status indication is pending!"); - log(" - pending call status code = " + mPendingCallStatusCode); - } else { - log(" - pending call status code: none"); - } - log(" - progressIndication: " + progressIndication); - if (providerInfoVisible) { - log(" - provider info VISIBLE: " - + providerLabel + " / " - + providerIcon + " / " - + providerGatewayUri + " / " - + providerAddress); - } else { - log(" - provider info: none"); - } - log(" - latestActiveCallOrigin: " + latestActiveCallOrigin); - } - - private static void log(String msg) { - Log.d(TAG, msg); - } -} |