diff options
author | Santos Cordon <santoscordon@google.com> | 2013-08-08 16:59:44 -0700 |
---|---|---|
committer | Santos Cordon <santoscordon@google.com> | 2013-08-09 15:58:01 -0700 |
commit | b8eedb3b9796873eaa22847205239a51092f1a43 (patch) | |
tree | 5067b9a9b61500f5fa35d6e6fea6b7efcef5ff90 /InCallUI | |
parent | 1b3e3f1056317fca5be4e7535d722da8876b2cbf (diff) |
Singletons are hard, lets go chopping...them out of the code.
After this change, there remains only one singleton (InCallPresenter).
The whole system needs to be reworked in a better manner in terms of
build up and tear down.
Change-Id: I393ec648526bc28a3ae709004aed6d4627670549
Diffstat (limited to 'InCallUI')
9 files changed, 110 insertions, 60 deletions
diff --git a/InCallUI/src/com/android/incallui/AudioModeProvider.java b/InCallUI/src/com/android/incallui/AudioModeProvider.java index abbbfb6e6..6ac8e23c2 100644 --- a/InCallUI/src/com/android/incallui/AudioModeProvider.java +++ b/InCallUI/src/com/android/incallui/AudioModeProvider.java @@ -33,17 +33,7 @@ import java.util.List; private int mSupportedModes = AudioMode.ALL_MODES; private final List<AudioModeListener> mListeners = Lists.newArrayList(); - public static synchronized AudioModeProvider getInstance() { - if (sAudioModeProvider == null) { - sAudioModeProvider = new AudioModeProvider(); - } - return sAudioModeProvider; - } - - /** - * Access only through getInstance() - */ - private AudioModeProvider() { + public AudioModeProvider() { } public void onAudioModeChange(int newMode) { @@ -65,6 +55,8 @@ import java.util.List; public void addListener(AudioModeListener listener) { if (!mListeners.contains(listener)) { mListeners.add(listener); + listener.onSupportedAudioMode(mSupportedModes); + listener.onAudioMode(mAudioMode); } } diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java index de2cb137a..21bfb1cf5 100644 --- a/InCallUI/src/com/android/incallui/CallButtonFragment.java +++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java @@ -57,7 +57,7 @@ public class CallButtonFragment extends BaseFragment<CallButtonPresenter> CallButtonPresenter createPresenter() { // TODO: find a cleaner way to include audio mode provider than // having a singleton instance. - return new CallButtonPresenter(AudioModeProvider.getInstance()); + return new CallButtonPresenter(); } @Override diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java index a307009f9..3c1ada1fc 100644 --- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java +++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java @@ -32,25 +32,24 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto implements InCallStateListener, AudioModeListener { private Call mCall; - private final AudioModeProvider mAudioModeProvider; + private AudioModeProvider mAudioModeProvider; - public CallButtonPresenter(AudioModeProvider audioModeProvider) { - - // AudioModeProvider works effectively as a pass through. However, if we - // had this presenter listen for changes directly, it would have to live forever - // or risk missing important updates. - mAudioModeProvider = audioModeProvider; - mAudioModeProvider.addListener(this); + public CallButtonPresenter() { } @Override public void onUiReady(CallButtonUi ui) { super.onUiReady(ui); + if (mAudioModeProvider != null) { + mAudioModeProvider.addListener(this); + } } @Override public void onUiUnready(CallButtonUi ui) { - mAudioModeProvider.removeListener(this); + if (mAudioModeProvider != null) { + mAudioModeProvider.removeListener(this); + } } @Override @@ -78,11 +77,18 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto } public int getAudioMode() { - return mAudioModeProvider.getAudioMode(); + if (mAudioModeProvider != null) { + return mAudioModeProvider.getAudioMode(); + } + return AudioMode.EARPIECE; } public int getSupportedAudio() { - return mAudioModeProvider.getSupportedModes(); + if (mAudioModeProvider != null) { + return mAudioModeProvider.getSupportedModes(); + } + + return 0; } public void setAudioMode(int mode) { @@ -100,18 +106,18 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto */ public void toggleSpeakerphone() { // this function should not be called if bluetooth is available - if (0 != (AudioMode.BLUETOOTH & mAudioModeProvider.getSupportedModes())) { + if (0 != (AudioMode.BLUETOOTH & getSupportedAudio())) { - // It's clear the UI is off, so update the supported mode once again. + // It's clear the UI is wrong, so update the supported mode once again. Logger.e(this, "toggling speakerphone not allowed when bluetooth supported."); - getUi().setSupportedAudio(mAudioModeProvider.getSupportedModes()); + getUi().setSupportedAudio(getSupportedAudio()); return; } int newMode = AudioMode.SPEAKER; // if speakerphone is already on, change to wired/earpiece - if (mAudioModeProvider.getAudioMode() == AudioMode.SPEAKER) { + if (getAudioMode() == AudioMode.SPEAKER) { newMode = AudioMode.WIRED_OR_EARPIECE; } @@ -191,6 +197,14 @@ public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButto } } + public void setAudioModeProvider(AudioModeProvider audioModeProvider) { + // AudioModeProvider works effectively as a pass through. However, if we + // had this presenter listen for changes directly, it would have to live forever + // or risk missing important updates. + mAudioModeProvider = audioModeProvider; + mAudioModeProvider.addListener(this); + } + public interface CallButtonUi extends Ui { void setVisible(boolean on); void setMute(boolean on); diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java index 0fd8e357d..b4fc852cf 100644 --- a/InCallUI/src/com/android/incallui/CallCardFragment.java +++ b/InCallUI/src/com/android/incallui/CallCardFragment.java @@ -52,7 +52,7 @@ public class CallCardFragment extends BaseFragment<CallCardPresenter> @Override CallCardPresenter createPresenter() { - return new CallCardPresenter(AudioModeProvider.getInstance()); + return new CallCardPresenter(); } @Override diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java index e53151188..d4a39eaab 100644 --- a/InCallUI/src/com/android/incallui/CallCardPresenter.java +++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java @@ -54,23 +54,26 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> i // Track the state for the photo. private ContactsAsyncHelper.ImageTracker mPhotoTracker; - public CallCardPresenter(AudioModeProvider audioModeProvider) { + public CallCardPresenter() { mPhotoTracker = new ContactsAsyncHelper.ImageTracker(); - mAudioModeProvider = audioModeProvider; } @Override public void onUiReady(CallCardUi ui) { super.onUiReady(ui); - mAudioModeProvider.addListener(this); + if (mAudioModeProvider != null) { + mAudioModeProvider.addListener(this); + } } @Override public void onUiUnready(CallCardUi ui) { super.onUiUnready(ui); - mAudioModeProvider.removeListener(this); + if (mAudioModeProvider != null) { + mAudioModeProvider.removeListener(this); + } mPrimary = null; } @@ -112,9 +115,11 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> i updateDisplayByCallerInfo(primary, primaryCallInfo, primary.getNumberPresentation(), true); + final boolean bluetoothOn = mAudioModeProvider != null && + mAudioModeProvider.getAudioMode() == AudioMode.BLUETOOTH; + ui.setNumber(primary.getNumber()); - ui.setCallState(primary.getState(), primary.getDisconnectCause(), - (mAudioModeProvider.getAudioMode() == AudioMode.BLUETOOTH)); + ui.setCallState(primary.getState(), primary.getDisconnectCause(), bluetoothOn); } else { ui.setNumber(""); ui.setCallState(Call.State.INVALID, Call.DisconnectCause.UNKNOWN, false); @@ -425,6 +430,11 @@ public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi> i ui.setNumberLabel(label); } + public void setAudioModeProvider(AudioModeProvider audioModeProvider) { + mAudioModeProvider = audioModeProvider; + mAudioModeProvider.addListener(this); + } + public String getPresentationString(int presentation) { String name = mContext.getString(R.string.unknown); if (presentation == Call.PRESENTATION_RESTRICTED) { diff --git a/InCallUI/src/com/android/incallui/CallHandlerService.java b/InCallUI/src/com/android/incallui/CallHandlerService.java index 0b2be5663..3b8631bc7 100644 --- a/InCallUI/src/com/android/incallui/CallHandlerService.java +++ b/InCallUI/src/com/android/incallui/CallHandlerService.java @@ -54,14 +54,20 @@ public class CallHandlerService extends Service { public void onCreate() { super.onCreate(); - mCallList = CallList.getInstance(); + mCallList = new CallList(); mMainHandler = new MainHandler(); - mInCallPresenter = InCallPresenter.init(this); - mAudioModeProvider = AudioModeProvider.getInstance(); + mAudioModeProvider = new AudioModeProvider(); + mInCallPresenter = InCallPresenter.getInstance(); + mInCallPresenter.setUp(getApplicationContext(), mCallList, mAudioModeProvider); } @Override public void onDestroy() { + mInCallPresenter.tearDown(); + mInCallPresenter = null; + mAudioModeProvider = null; + mMainHandler = null; + mCallList = null; } @Override diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java index d788d51c1..3041fa7fc 100644 --- a/InCallUI/src/com/android/incallui/CallList.java +++ b/InCallUI/src/com/android/incallui/CallList.java @@ -56,17 +56,17 @@ public class CallList { /** * Static singleton accessor method. */ - public static synchronized CallList getInstance() { + /*public static synchronized CallList getInstance() { if (sInstance == null) { sInstance = new CallList(); } return sInstance; - } + }*/ /** * Private constructor. Instance should only be acquired through getInstance(). */ - private CallList() { + public CallList() { } /** diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java index 8ff43d5a1..8ae37bd21 100644 --- a/InCallUI/src/com/android/incallui/InCallActivity.java +++ b/InCallUI/src/com/android/incallui/InCallActivity.java @@ -269,6 +269,11 @@ public class InCallActivity extends Activity { private void setUpPresenters() { InCallPresenter mainPresenter = InCallPresenter.getInstance(); + mCallButtonFragment.getPresenter().setAudioModeProvider( + mainPresenter.getAudioModeProvider()); + mCallCardFragment.getPresenter().setAudioModeProvider( + mainPresenter.getAudioModeProvider()); + mainPresenter.addListener(mCallButtonFragment.getPresenter()); mainPresenter.addListener(mCallCardFragment.getPresenter()); mainPresenter.addListener(mAnswerFragment.getPresenter()); diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java index a7954ede5..17889d0e6 100644 --- a/InCallUI/src/com/android/incallui/InCallPresenter.java +++ b/InCallUI/src/com/android/incallui/InCallPresenter.java @@ -39,22 +39,49 @@ public class InCallPresenter implements CallList.Listener { private static InCallPresenter sInCallPresenter; - private final StatusBarNotifier mStatusBarNotifier; private final Set<InCallStateListener> mListeners = Sets.newHashSet(); - private final Context mContext; - private InCallState mInCallState = InCallState.HIDDEN; + private AudioModeProvider mAudioModeProvider; + private StatusBarNotifier mStatusBarNotifier; + private Context mContext; + private CallList mCallList; private InCallActivity mInCallActivity; - public static InCallPresenter getInstance() { - Preconditions.checkNotNull(sInCallPresenter); + private InCallState mInCallState = InCallState.HIDDEN; + + public static synchronized InCallPresenter getInstance() { + if (sInCallPresenter == null) { + sInCallPresenter = new InCallPresenter(); + } return sInCallPresenter; } - public static synchronized InCallPresenter init(Context context) { - Preconditions.checkState(sInCallPresenter == null); - sInCallPresenter = new InCallPresenter(context); - return sInCallPresenter; + public void setUp(Context context, CallList callList, AudioModeProvider audioModeProvider) { + Preconditions.checkNotNull(context); + mContext = context; + + mCallList = callList; + mCallList.addListener(this); + + mStatusBarNotifier = new StatusBarNotifier(context); + addListener(mStatusBarNotifier); + + mAudioModeProvider = audioModeProvider; + } + + public void tearDown() { + mAudioModeProvider = null; + + removeListener(mStatusBarNotifier); + mStatusBarNotifier = null; + + mCallList.removeListener(this); + mCallList = null; + + mContext = null; + mInCallActivity = null; + + mListeners.clear(); } public void setActivity(InCallActivity inCallActivity) { @@ -64,7 +91,7 @@ public class InCallPresenter implements CallList.Listener { // Since the UI just came up, imitate an update from the call list // to set the proper UI state. - onCallListChange(CallList.getInstance()); + onCallListChange(mCallList); } /** @@ -91,7 +118,7 @@ public class InCallPresenter implements CallList.Listener { /** * Given the call list, return the state in which the in-call screen should be. */ - public InCallState getPotentialStateFromCallList(CallList callList) { + public static InCallState getPotentialStateFromCallList(CallList callList) { InCallState newState = InCallState.HIDDEN; if (callList.getIncomingCall() != null) { @@ -117,6 +144,10 @@ public class InCallPresenter implements CallList.Listener { mListeners.remove(listener); } + public AudioModeProvider getAudioModeProvider() { + return mAudioModeProvider; + } + /** * When the state of in-call changes, this is the first method to get called. It determines if * the UI needs to be started or finished depending on the new state and does it. @@ -206,15 +237,7 @@ public class InCallPresenter implements CallList.Listener { /** * Private constructor. Must use getInstance() to get this singleton. */ - private InCallPresenter(Context context) { - Preconditions.checkNotNull(context); - - mContext = context; - - mStatusBarNotifier = new StatusBarNotifier(context); - addListener(mStatusBarNotifier); - - CallList.getInstance().addListener(this); + private InCallPresenter() { } /** |