summaryrefslogtreecommitdiff
path: root/InCallUI
diff options
context:
space:
mode:
authorSantos Cordon <santoscordon@google.com>2013-08-02 16:11:32 -0700
committerSantos Cordon <santoscordon@google.com>2013-08-03 16:17:50 -0700
commit9a43aba1cbbff7f7d443afa327de5c5cd602e39f (patch)
tree0ad20bef815b5c609acdcf5a82650702232fd004 /InCallUI
parent75c86b55d45b1725c46ed2e5d77c9c43fcfd93da (diff)
Fixing incoming call sequence, adding InCallPresenter
Moved handling of AnswerWidget from AnswerPresenter and into the new InCallPresenter class. InCallPresenter now also manages a high-level in-call UI state to be expanded in subsequent CLs. Change-Id: Ia4fee84db68f7eaedea307b25329dadb8cf754e5
Diffstat (limited to 'InCallUI')
-rw-r--r--InCallUI/src/com/android/incallui/AnswerFragment.java43
-rw-r--r--InCallUI/src/com/android/incallui/AnswerPresenter.java20
-rw-r--r--InCallUI/src/com/android/incallui/CallHandlerService.java18
-rw-r--r--InCallUI/src/com/android/incallui/CallList.java4
-rw-r--r--InCallUI/src/com/android/incallui/InCallActivity.java68
-rw-r--r--InCallUI/src/com/android/incallui/InCallPresenter.java105
6 files changed, 157 insertions, 101 deletions
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java
index 76c925163..cbdd8012e 100644
--- a/InCallUI/src/com/android/incallui/AnswerFragment.java
+++ b/InCallUI/src/com/android/incallui/AnswerFragment.java
@@ -30,16 +30,8 @@ import android.view.ViewGroup;
*/
public class AnswerFragment extends BaseFragment<AnswerPresenter> implements
GlowPadWrapper.AnswerListener, AnswerPresenter.AnswerUi {
- final private IFragmentHost mFragmentHost;
- public AnswerFragment(IFragmentHost fragmentHost) {
- mFragmentHost = fragmentHost;
-
- // Normally called with onCreateView, however, AnswerPresenter's interaction
- // begins before any UI is displayed.
- // Order matters with this call because mFragmentHost mustn't be null when the presenter
- // asks AnswerFragment to display itself (see showAnswerWidget).
- getPresenter().onUiReady(this);
+ public AnswerFragment() {
}
@Override
@@ -52,7 +44,10 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter> implements
Bundle savedInstanceState) {
final GlowPadWrapper glowPad = (GlowPadWrapper) inflater.inflate(R.layout.answer_fragment,
container, false);
+
glowPad.setAnswerListener(this);
+ getPresenter().onUiReady(this);
+
return glowPad;
}
@@ -70,34 +65,4 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter> implements
public void onText() {
getPresenter().onText();
}
-
- @Override
- public void showAnswerWidget(boolean show) {
- Preconditions.checkNotNull(mFragmentHost);
-
- if (show) {
- mFragmentHost.addFragment(this);
- } else {
- close();
- }
- }
-
- private void close() {
- // TODO(klp): With a proper main presenter, we will not need to check for isAdded.
- if (isAdded()) {
- final FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
- fragmentTransaction.remove(this);
- fragmentTransaction.commit();
- }
- }
-
- // Stop gap until we can consolidate presenters and make InCallActivity a UI Class that relies
- // on it's the consolidated presenter.
- //
- // TODO(klp): Remove individual presenters for button/answer/callcard and have a single
- // presenter that interacts directly with this activity. This will allow us to remove
- // this unnecessary interface.
- static interface IFragmentHost {
- public void addFragment(Fragment fragment);
- }
}
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
index a406b0a2b..66e371f20 100644
--- a/InCallUI/src/com/android/incallui/AnswerPresenter.java
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -16,29 +16,16 @@
package com.android.incallui;
+import android.util.Log;
+
/**
* Presenter for the Incoming call widget.
*/
-public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
- implements CallList.Listener {
+public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi> {
@Override
public void onUiReady(AnswerUi ui) {
super.onUiReady(ui);
- CallList.getInstance().addListener(this);
- }
-
- @Override
- public void onCallListChange(CallList callList) {
- // TODO(klp): The answer widget and call cards are independently managing their behavior
- // from CallList events. We need to create a class to manage the behavior of all the
- // Presenters from a single place.
- final boolean showWidget = (callList.getIncomingCall() != null);
-
- final AnswerUi ui = getUi();
- if (ui != null) {
- ui.showAnswerWidget(showWidget);
- }
}
public void onAnswer() {
@@ -55,6 +42,5 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
}
interface AnswerUi extends Ui {
- public void showAnswerWidget(boolean show);
}
}
diff --git a/InCallUI/src/com/android/incallui/CallHandlerService.java b/InCallUI/src/com/android/incallui/CallHandlerService.java
index a9516e8ad..ebb69d732 100644
--- a/InCallUI/src/com/android/incallui/CallHandlerService.java
+++ b/InCallUI/src/com/android/incallui/CallHandlerService.java
@@ -42,6 +42,7 @@ public class CallHandlerService extends Service {
private CallList mCallList;
private Handler mMainHandler;
+ private InCallPresenter mInCallPresenter;
@Override
public void onCreate() {
@@ -49,6 +50,9 @@ public class CallHandlerService extends Service {
mCallList = CallList.getInstance();
mMainHandler = new MainHandler();
+ mInCallPresenter = InCallPresenter.getInstance();
+
+ mInCallPresenter.init(this);
}
@Override
@@ -69,23 +73,13 @@ public class CallHandlerService extends Service {
}
@Override
- public void onIncomingCall(Call call) {
- // TODO(klp): New presenter manager should launch this task...not this service.
- // TODO(klp): Update the flags to match the only activity
- final Intent intent = new Intent(getApplication(), InCallActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
-
- mMainHandler.sendMessage(mMainHandler.obtainMessage(ON_UPDATE_CALL, 0, 0, call));
- }
-
- @Override
public void onDisconnect(Call call) {
mMainHandler.sendMessage(mMainHandler.obtainMessage(ON_UPDATE_CALL, 0, 0, call));
}
@Override
- public void onUpdate(List<Call> calls) {
+ public void onUpdate(List<Call> calls, boolean fullUpdate) {
+ // TODO(klp): Add use of fullUpdate to message
mMainHandler.sendMessage(mMainHandler.obtainMessage(ON_UPDATE_MULTI_CALL, 0, 0, calls));
}
};
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
index f41af930b..abc250afc 100644
--- a/InCallUI/src/com/android/incallui/CallList.java
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -22,8 +22,6 @@ import com.google.android.collect.Sets;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
-import android.util.Log;
-
import com.android.services.telephony.common.Call;
import java.util.HashMap;
@@ -36,8 +34,6 @@ import java.util.Set;
* changes to calls.
*/
public class CallList {
- private static String TAG = CallList.class.getSimpleName();
-
private static CallList sInstance;
private final HashMap<Integer, Call> mCallMap = Maps.newHashMap();
diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
index 9732203bd..f7663e3c7 100644
--- a/InCallUI/src/com/android/incallui/InCallActivity.java
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -18,6 +18,7 @@ package com.android.incallui;
import android.app.Activity;
import android.app.Fragment;
+import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
@@ -31,8 +32,7 @@ import android.widget.Toast;
/**
* Phone app "in call" screen.
*/
-public class InCallActivity extends Activity implements AnswerFragment.IFragmentHost,
- CallList.Listener {
+public class InCallActivity extends Activity {
private static final String TAG = InCallActivity.class.getSimpleName();
@@ -42,6 +42,7 @@ public class InCallActivity extends Activity implements AnswerFragment.IFragment
private CallButtonFragment mCallButtonFragment;
private CallCardFragment mCallCardFragment;
private AnswerFragment mAnswerFragment;
+ private boolean mFragmentsAdded = false;
@Override
protected void onCreate(Bundle icicle) {
@@ -70,8 +71,28 @@ public class InCallActivity extends Activity implements AnswerFragment.IFragment
@Override
protected void onResume() {
logD("onResume()...");
-
super.onResume();
+
+ if (!mFragmentsAdded) {
+ getFragmentManager().beginTransaction()
+ .add(R.id.main, mAnswerFragment)
+ .commit();
+
+ mFragmentsAdded = true;
+ }
+
+ InCallPresenter.getInstance().setActivity(this);
+ }
+
+ @Override
+ public void onAttachFragment(Fragment fragment) {
+ if (fragment instanceof AnswerFragment) {
+ mAnswerFragment = (AnswerFragment) fragment;
+
+ getFragmentManager().beginTransaction()
+ .hide(mAnswerFragment)
+ .commit();
+ }
}
// onPause is guaranteed to be called when the InCallActivity goes
@@ -195,8 +216,21 @@ public class InCallActivity extends Activity implements AnswerFragment.IFragment
return super.onKeyDown(keyCode, event);
}
- private void initializeInCall() {
+ /**
+ * Called to show the incoming call widget.
+ */
+ /* package */ void showIncoming(boolean show) {
+ final FragmentTransaction trans = getFragmentManager().beginTransaction();
+ if (show) {
+ trans.show(mAnswerFragment);
+ } else {
+ trans.hide(mAnswerFragment);
+ }
+
+ trans.commitAllowingStateLoss();
+ }
+ private void initializeInCall() {
// TODO(klp): Make sure that this doesn't need to move back to onResume() since they are
// statically added fragments.
if (mCallButtonFragment == null) {
@@ -210,10 +244,8 @@ public class InCallActivity extends Activity implements AnswerFragment.IFragment
}
if (mAnswerFragment == null) {
- mAnswerFragment = new AnswerFragment(this);
+ mAnswerFragment = new AnswerFragment();
}
-
- CallList.getInstance().addListener(this);
}
private void toast(String text) {
@@ -227,26 +259,4 @@ public class InCallActivity extends Activity implements AnswerFragment.IFragment
Log.d(TAG, msg);
}
}
-
- @Override
- public void addFragment(Fragment fragment) {
- Log.d(TAG, "AddFragment");
-
- // TODO(klp): Do a check to make sure the fragment isn't already added before trying to
- // add it again.
- // TODO(klp): IsResumed check only required because CallList notifications are coming in
- // an indeterminate order. This should no longer be required with a main Presenter class.
- if (this.isResumed()) {
- final FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
- fragmentTransaction.add(R.id.main, fragment);
- fragmentTransaction.commit();
- }
- }
-
- @Override
- public void onCallListChange(CallList callList) {
- if (!callList.existsLiveCall()) {
- finish();
- }
- }
}
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
new file mode 100644
index 000000000..74f898d68
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2006 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.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+
+/**
+ * Takes updates from the CallList and notifies the InCallActivity (UI)
+ * of the changes. Also responsible for starting the InCallActivity when a call comes in.
+ */
+public class InCallPresenter implements CallList.Listener {
+ private static final String TAG = InCallPresenter.class.getSimpleName();
+
+ private static InCallPresenter sInCallPresenter;
+
+ private Context mContext;
+ private InCallState mInCallState = InCallState.HIDDEN;
+ private InCallActivity mInCallActivity;
+
+ public static synchronized InCallPresenter getInstance() {
+ if (sInCallPresenter == null) {
+ sInCallPresenter = new InCallPresenter();
+ }
+ return sInCallPresenter;
+ }
+
+ public void init(Context context) {
+ Log.i(TAG, "InCallPresenter initialized with context " + context);
+ Preconditions.checkState(mContext == null);
+
+ mContext = context;
+ CallList.getInstance().addListener(this);
+ }
+
+ public void setActivity(InCallActivity inCallActivity) {
+ mInCallActivity = inCallActivity;
+
+ mInCallActivity.showIncoming(CallList.getInstance().getIncomingCall() != null);
+ }
+
+ /**
+ * Called when there is a change to the call list. Responsible for starting and hiding
+ * the InCall UI.
+ */
+ @Override
+ public void onCallListChange(CallList callList) {
+ // TODO: Organize this code a little better. Too hard to read.
+
+ final boolean showInCall = callList.existsLiveCall();
+
+ if (showInCall && mInCallState == InCallState.HIDDEN) {
+
+ // TODO(klp): Update the flags to match the PhoneApp activity
+ final Intent intent = new Intent(mContext, InCallActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(intent);
+
+ } else if (!showInCall && mInCallState == InCallState.SHOWING_INCALL) {
+ if (mInCallActivity != null) {
+ mInCallActivity.finish();
+ }
+ }
+
+ if (mInCallActivity != null) {
+ boolean showIncoming = callList.getIncomingCall() != null;
+ mInCallActivity.showIncoming(showIncoming);
+ }
+
+ mInCallState = showInCall ? InCallState.SHOWING_INCALL : InCallState.HIDDEN;
+ }
+
+ /**
+ * Private constructor. Must use getInstance() to get this singleton.
+ */
+ private InCallPresenter() {
+ CallList.getInstance().addListener(this);
+ }
+
+ /**
+ * All the main states of InCallActivity.
+ */
+ private enum InCallState {
+ HIDDEN,
+ SHOWING_INCALL
+ };
+}