summaryrefslogtreecommitdiff
path: root/InCallUI/src/com/android
diff options
context:
space:
mode:
authorChristine Chen <christinech@google.com>2013-10-07 16:30:57 -0700
committerChristine Chen <christinech@google.com>2013-10-07 17:14:09 -0700
commitabbeb67a123055af1d140bb8aff259dc210ccfd0 (patch)
tree56fe7c93bbf64bc75405dd5f375513619ab65a9a /InCallUI/src/com/android
parent5a405a7d5ebce3601d15dc1dea80330e357e0866 (diff)
Adds support for texting after phone disconnects.
Bug: 11111553 Change-Id: I8abcae4439e7b9697d7b4a4335e093d7ad13a1b3
Diffstat (limited to 'InCallUI/src/com/android')
-rw-r--r--InCallUI/src/com/android/incallui/AnswerFragment.java69
-rw-r--r--InCallUI/src/com/android/incallui/AnswerPresenter.java20
-rw-r--r--InCallUI/src/com/android/incallui/CallCommandClient.java9
-rw-r--r--InCallUI/src/com/android/incallui/InCallActivity.java6
4 files changed, 85 insertions, 19 deletions
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java
index 29a458656..1b249f29f 100644
--- a/InCallUI/src/com/android/incallui/AnswerFragment.java
+++ b/InCallUI/src/com/android/incallui/AnswerFragment.java
@@ -51,6 +51,11 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
*/
private Dialog mCannedResponsePopup = null;
+ /**
+ * The popup showing a text field for users to type in their custom message.
+ */
+ private AlertDialog mCustomMessagePopup = null;
+
private ArrayAdapter<String> mTextResponsesAdapter = null;
private GlowPadWrapper mGlowpad;
@@ -125,13 +130,27 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
mCannedResponsePopup.show();
}
+ private boolean isCannedResponsePopupShowing() {
+ if (mCannedResponsePopup != null) {
+ return mCannedResponsePopup.isShowing();
+ }
+ return false;
+ }
+
+ private boolean isCustomMessagePopupShowing() {
+ if (mCustomMessagePopup != null) {
+ return mCustomMessagePopup.isShowing();
+ }
+ return false;
+ }
+
/**
- * Dismiss currently visible popups.
+ * Dismiss the canned response list popup.
*
* This is safe to call even if the popup is already dismissed, and even if you never called
* showRespondViaSmsPopup() in the first place.
*/
- private void dismissPopup() {
+ private void dismissCannedResponsePopup() {
if (mCannedResponsePopup != null) {
mCannedResponsePopup.dismiss(); // safe even if already dismissed
mCannedResponsePopup = null;
@@ -139,6 +158,30 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
}
/**
+ * Dismiss the custom compose message popup.
+ */
+ private void dismissCustomMessagePopup() {
+ if (mCustomMessagePopup != null) {
+ mCustomMessagePopup.dismiss();
+ mCustomMessagePopup = null;
+ }
+ }
+
+ public void dismissPendingDialogues() {
+ if (isCannedResponsePopupShowing()) {
+ dismissCannedResponsePopup();
+ }
+
+ if (isCustomMessagePopupShowing()) {
+ dismissCustomMessagePopup();
+ }
+ }
+
+ public boolean hasPendingDialogs() {
+ return !(mCannedResponsePopup == null && mCustomMessagePopup == null);
+ }
+
+ /**
* Shows the custom message entry dialog.
*/
public void showCustomMessageDialog() {
@@ -150,41 +193,49 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- getPresenter().rejectCallWithMessage(et.getText().toString().trim());
+ // The order is arranged in a way that the popup will be destroyed when the
+ // InCallActivity is about to finish.
+ final String textMessage = et.getText().toString().trim();
+ dismissCustomMessagePopup();
+ getPresenter().rejectCallWithMessage(textMessage);
}
})
.setNegativeButton(R.string.custom_message_cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
+ dismissCustomMessagePopup();
+ getPresenter().onDismissDialog();
}
})
.setTitle(R.string.respond_via_sms_custom_message);
- final AlertDialog customResponseDialog = builder.create();
+ mCustomMessagePopup = builder.create();
// Enable/disable the send button based on whether there is a message in the EditText
et.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
+
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
+
@Override
public void afterTextChanged(Editable s) {
- final Button sendButton = customResponseDialog.getButton(
+ final Button sendButton = mCustomMessagePopup.getButton(
DialogInterface.BUTTON_POSITIVE);
sendButton.setEnabled(s != null && s.toString().trim().length() != 0);
}
});
// Keyboard up, show the dialog
- customResponseDialog.getWindow().setSoftInputMode(
+ mCustomMessagePopup.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
- customResponseDialog.show();
+ mCustomMessagePopup.show();
// Send button starts out disabled
- final Button sendButton = customResponseDialog.getButton(DialogInterface.BUTTON_POSITIVE);
+ final Button sendButton = mCustomMessagePopup.getButton(DialogInterface.BUTTON_POSITIVE);
sendButton.setEnabled(false);
}
@@ -228,7 +279,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
Log.d(this, "RespondViaSmsItemClickListener.onItemClick(" + position + ")...");
final String message = (String) parent.getItemAtPosition(position);
Log.v(this, "- message: '" + message + "'");
- dismissPopup();
+ dismissCannedResponsePopup();
// The "Custom" choice is a special case.
// (For now, it's guaranteed to be the last item.)
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
index 6d70f8185..bfe8405a0 100644
--- a/InCallUI/src/com/android/incallui/AnswerPresenter.java
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -29,6 +29,7 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
private static final String TAG = AnswerPresenter.class.getSimpleName();
private int mCallId = Call.INVALID_CALL_ID;
+ private Call mCall = null;
@Override
public void onUiReady(AnswerUi ui) {
@@ -82,6 +83,7 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
private void processIncomingCall(Call call) {
mCallId = call.getCallId();
+ mCall = call;
// Listen for call updates for the current call.
CallList.getInstance().addCallUpdateListener(mCallId, this);
@@ -108,6 +110,9 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
CallList.getInstance().removeCallUpdateListener(mCallId, this);
getUi().showAnswerUi(false);
+
+ // mCallId will hold the state of the call. We don't clear the mCall variable here as
+ // it may be useful for sending text messages after phone disconnects.
mCallId = Call.INVALID_CALL_ID;
}
}
@@ -123,13 +128,9 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
}
public void onDecline() {
- if (mCallId == Call.INVALID_CALL_ID) {
- return;
- }
-
Log.d(this, "onDecline " + mCallId);
- CallCommandClient.getInstance().rejectCall(mCallId, false, null);
+ CallCommandClient.getInstance().rejectCall(mCall, false, null);
}
public void onText() {
@@ -140,7 +141,14 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
public void rejectCallWithMessage(String message) {
Log.d(this, "sendTextToDefaultActivity()...");
- CallCommandClient.getInstance().rejectCall(mCallId, true, message);
+
+ CallCommandClient.getInstance().rejectCall(mCall, true, message);
+
+ onDismissDialog();
+ }
+
+ public void onDismissDialog() {
+ InCallPresenter.getInstance().onDismissDialog();
}
interface AnswerUi extends Ui {
diff --git a/InCallUI/src/com/android/incallui/CallCommandClient.java b/InCallUI/src/com/android/incallui/CallCommandClient.java
index 3f4ee7781..52d2100c8 100644
--- a/InCallUI/src/com/android/incallui/CallCommandClient.java
+++ b/InCallUI/src/com/android/incallui/CallCommandClient.java
@@ -18,8 +18,10 @@ package com.android.incallui;
import android.os.RemoteException;
+
import com.android.services.telephony.common.AudioMode;
import com.android.services.telephony.common.ICallCommandService;
+import com.android.services.telephony.common.Call;
/**
* Main interface for phone related commands.
@@ -57,14 +59,15 @@ public class CallCommandClient {
}
}
- public void rejectCall(int callId, boolean rejectWithMessage, String message) {
- Log.i(this, "rejectCall: " + callId + ", with rejectMessage? " + rejectWithMessage);
+ public void rejectCall(Call call, boolean rejectWithMessage, String message) {
+ Log.i(this, "rejectCall: " + call.getCallId() +
+ ", with rejectMessage? " + rejectWithMessage);
if (mCommandService == null) {
Log.e(this, "Cannot reject call; CallCommandService == null");
return;
}
try {
- mCommandService.rejectCall(callId, rejectWithMessage, message);
+ mCommandService.rejectCall(call, rejectWithMessage, message);
} catch (RemoteException e) {
Log.e(this, "Error rejecting call.", e);
}
diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
index 32d1f5538..ac21d52a2 100644
--- a/InCallUI/src/com/android/incallui/InCallActivity.java
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -138,6 +138,9 @@ public class InCallActivity extends Activity {
return mIsForegroundActivity;
}
+ private boolean hasPendingErrorDialog() {
+ return mDialog != null;
+ }
/**
* Dismisses the in-call screen.
*
@@ -158,7 +161,7 @@ public class InCallActivity extends Activity {
Log.i(this, "finish(). Dialog showing: " + (mDialog != null));
// skip finish if we are still showing a dialog.
- if (mDialog == null) {
+ if (!hasPendingErrorDialog() && !mAnswerFragment.hasPendingDialogs()) {
super.finish();
}
}
@@ -427,6 +430,7 @@ public class InCallActivity extends Activity {
mDialog.dismiss();
mDialog = null;
}
+ mAnswerFragment.dismissPendingDialogues();
}
/**