/*
* Copyright 2015 Rayco AraƱa
*
* 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.raycoarana.baindo;
import android.content.Intent;
import android.os.Bundle;
import com.raycoarana.baindo.binding.FinalBindTarget;
import com.raycoarana.baindo.events.AbstractEventBind;
import com.raycoarana.baindo.events.OnCreateEventBind;
import com.raycoarana.baindo.events.OnDestroyEventBind;
import com.raycoarana.baindo.events.OnPauseEventBind;
import com.raycoarana.baindo.events.OnResumeEventBind;
import com.raycoarana.baindo.events.OnStartEventBind;
import com.raycoarana.baindo.events.OnStopEventBind;
import com.raycoarana.baindo.intent.IntentBind;
import com.raycoarana.baindo.observables.AbstractProperty;
import com.raycoarana.baindo.state.StateBind;
import com.raycoarana.baindo.viewmodel.Command;
import java.util.ArrayList;
import java.util.List;
public class LifecycleBinderCollector {
private final ArrayList<IntentBind> mIntentBinds = new ArrayList<>();
private final ArrayList<StateBind> mStateBinds = new ArrayList<>();
private final ArrayList<AbstractEventBind> mOnCreateEventBinds = new ArrayList<>();
private final ArrayList<AbstractEventBind> mOnDestroyEventBinds = new ArrayList<>();
private final ArrayList<AbstractEventBind> mOnPauseEventBinds = new ArrayList<>();
private final ArrayList<AbstractEventBind> mOnResumeEventBinds = new ArrayList<>();
private final ArrayList<AbstractEventBind> mOnStartEventBinds = new ArrayList<>();
private final ArrayList<AbstractEventBind> mOnStopEventBinds = new ArrayList<>();
private Intent mCurrentIntent;
private Bundle mSavedInstanceState;
public AbstractEventBind collect(OnCreateEventBind eventBind) {
collectEvent(eventBind, mOnCreateEventBinds);
return eventBind;
}
public AbstractEventBind collect(OnDestroyEventBind eventBind) {
collectEvent(eventBind, mOnDestroyEventBinds);
return eventBind;
}
public AbstractEventBind collect(OnPauseEventBind eventBind) {
collectEvent(eventBind, mOnPauseEventBinds);
return eventBind;
}
public AbstractEventBind collect(OnResumeEventBind eventBind) {
collectEvent(eventBind, mOnResumeEventBinds);
return eventBind;
}
public AbstractEventBind collect(OnStartEventBind eventBind) {
collectEvent(eventBind, mOnStartEventBinds);
return eventBind;
}
public AbstractEventBind collect(OnStopEventBind eventBind) {
collectEvent(eventBind, mOnStopEventBinds);
return eventBind;
}
private void collectEvent(AbstractEventBind eventBind, List<AbstractEventBind> eventBinds) {
synchronized (mIntentBinds) {
eventBinds.add(eventBind);
}
}
public <T> FinalBindTarget<AbstractProperty<T>> collect(IntentBind<T> intentBind) {
synchronized (mIntentBinds) {
mIntentBinds.add(intentBind);
intentBind.onNewIntent(mCurrentIntent);
}
return intentBind;
}
public void updateIntent(Intent intent) {
mCurrentIntent = intent;
synchronized (mIntentBinds) {
for(IntentBind intentBind : mIntentBinds) {
intentBind.onNewIntent(intent);
}
}
}
public <T> FinalBindTarget<AbstractProperty<T>> collect(StateBind<T> stateBind) {
synchronized (mStateBinds) {
mStateBinds.add(stateBind);
if(mSavedInstanceState != null) {
stateBind.onUpdate(mSavedInstanceState);
}
}
return stateBind;
}
public void updateSavedInstanceState(Bundle bundle) {
synchronized (mStateBinds) {
mSavedInstanceState = bundle;
if(mSavedInstanceState != null) {
for (StateBind stateBind : mStateBinds) {
stateBind.onUpdate(bundle);
}
}
}
}
public void saveInstanceState(Bundle bundle) {
synchronized (mStateBinds) {
for(StateBind stateBind : mStateBinds) {
stateBind.onSave(bundle);
}
}
}
public void onCreate() {
dispatchEvent(mOnCreateEventBinds);
}
public void onDestroy() {
dispatchEvent(mOnDestroyEventBinds);
}
public void onResume() {
dispatchEvent(mOnResumeEventBinds);
}
public void onPause() {
dispatchEvent(mOnPauseEventBinds);
}
public void onStart() {
dispatchEvent(mOnStartEventBinds);
}
public void onStop() {
dispatchEvent(mOnStopEventBinds);
}
private void dispatchEvent(List<AbstractEventBind> eventBinds) {
synchronized (eventBinds) {
for(AbstractEventBind eventBind : eventBinds) {
eventBind.execute();
}
}
}
}