package com.zhuinden.simplestackdemoexamplemvp.application;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.zhuinden.simplestack.navigator.DefaultStateChanger;
import com.zhuinden.simplestack.navigator.Navigator;
import com.zhuinden.simplestackdemoexamplemvp.R;
import com.zhuinden.simplestackdemoexamplemvp.data.manager.DatabaseManager;
import com.zhuinden.simplestackdemoexamplemvp.presentation.paths.tasks.TasksKey;
import com.zhuinden.simplestackdemoexamplemvp.util.BackstackHolder;
import com.zhuinden.simplestack.Backstack;
import com.zhuinden.simplestack.HistoryBuilder;
import com.zhuinden.simplestack.StateChange;
import com.zhuinden.simplestack.StateChanger;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity
extends AppCompatActivity
implements StateChanger, DefaultStateChanger.ViewChangeCompletionListener {
@BindView(R.id.drawer_layout)
MainView mainView;
@BindView(R.id.root)
RelativeLayout root;
public interface OptionsItemSelectedListener {
boolean onOptionsItemSelected(MenuItem menuItem);
}
public static final String TAG = "MainActivity";
public static MainActivity get(Context context) {
// noinspection ResourceType
return (MainActivity) context.getSystemService(TAG);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return mainView.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return mainView.onCreateOptionsMenu(menu);
}
@Inject
DatabaseManager databaseManager;
@Inject
BackstackHolder backstackHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
CustomApplication.get(this).initialize();
CustomApplication.get(this).getComponent().inject(this);
databaseManager.init(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Backstack backstack = Navigator.configure()
.setDeferredInitialization(true)
.setStateChanger(DefaultStateChanger.configure()
.setExternalStateChanger(this)
.setViewChangeCompletionListener(this)
.create(this, root))
.install(this, root, HistoryBuilder.single(TasksKey.create()));
backstackHolder.setBackstack(backstack);
MainScopeListener mainScopeListener = (MainScopeListener) getSupportFragmentManager().findFragmentByTag(
"MAIN_SCOPE_LISTENER");
if(mainScopeListener == null) {
mainScopeListener = new MainScopeListener();
getSupportFragmentManager().beginTransaction().add(mainScopeListener, "MAIN_SCOPE_LISTENER").commit();
}
mainView.onCreate();
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
Navigator.executeDeferredInitialization(this);
mainView.onPostCreate();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mainView.onConfigChanged(newConfig);
}
@Override
public void onBackPressed() {
if(mainView.onBackPressed()) {
return;
}
if(!Navigator.onBackPressed(this)) {
super.onBackPressed();
}
}
@Override
public Object getSystemService(String name) {
if(TAG.equals(name)) {
return this;
}
return super.getSystemService(name);
}
@Override
public void handleStateChange(StateChange stateChange, StateChanger.Callback completionCallback) {
if(stateChange.topNewState().equals(stateChange.topPreviousState())) {
completionCallback.stateChangeComplete();
return;
}
mainView.handleStateChange(stateChange, () -> {
});
completionCallback.stateChangeComplete();
}
@Override
public void handleViewChangeComplete(@NonNull StateChange stateChange, //
@NonNull ViewGroup container, //
@Nullable View previousView, //
@NonNull View newView, //
@NonNull DefaultStateChanger.ViewChangeCompletionListener.Callback completionCallback) {
mainView.setupViewsForKey(Backstack.getKey(newView.getContext()), newView);
completionCallback.viewChangeComplete();
}
}