diff options
Diffstat (limited to 'InCallUI')
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 + }; +} |