/* * Copyright 2016 Hannes Dorfmann. * * 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.hannesdorfmann.mosby3.sample.mvi; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.MainMenuItem; import com.hannesdorfmann.mosby3.sample.mvi.dependencyinjection.DependencyInjection; import com.hannesdorfmann.mosby3.sample.mvi.view.category.CategoryFragment; import com.hannesdorfmann.mosby3.sample.mvi.view.home.HomeFragment; import com.hannesdorfmann.mosby3.sample.mvi.view.menu.MenuViewState; import com.hannesdorfmann.mosby3.sample.mvi.view.search.SearchFragment; import com.hannesdorfmann.mosby3.sample.mvi.view.selectedcounttoolbar.SelectedCountToolbar; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import io.reactivex.disposables.Disposable; import io.reactivex.subjects.PublishSubject; import timber.log.Timber; public class MainActivity extends AppCompatActivity { private static final String KEY_TOOLBAR_TITLE = "toolbarTitle"; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.drawerLayout) DrawerLayout drawer; @BindView(R.id.sliding_layout) SlidingUpPanelLayout slidingUpPanel; private Unbinder unbinder; private Disposable disposable; private String title; private PublishSubject<Boolean> clearSelectionRelay; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); unbinder = ButterKnife.bind(this); toolbar.setTitle("Mosby MVI"); toolbar.inflateMenu(R.menu.activity_main_toolbar); toolbar.setOnMenuItemClickListener(item -> { getSupportFragmentManager().beginTransaction() .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out) .add(R.id.drawerLayout, new SearchFragment()) .addToBackStack("Search") .commit(); return true; }); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); if (savedInstanceState == null) { showCategoryItems(MainMenuItem.HOME); } else { title = savedInstanceState.getString(KEY_TOOLBAR_TITLE); toolbar.setTitle(title); } // TODO Create a Presenter & ViewState for this Activity DependencyInjection dependencyInjection = SampleApplication.getDependencyInjection(this); disposable = dependencyInjection.getMainMenuPresenter() .getViewStateObservable() .filter(state -> state instanceof MenuViewState.DataState) .cast(MenuViewState.DataState.class) .map(this::findSelectedMenuItem) .subscribe(this::showCategoryItems); clearSelectionRelay = dependencyInjection.getClearSelectionRelay(); } @Override protected void onDestroy() { super.onDestroy(); unbinder.unbind(); disposable.dispose(); Timber.d("------- Destroyed -------"); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Timber.d("Activity onSaveInstanceState()"); outState.putString(KEY_TOOLBAR_TITLE, toolbar.getTitle().toString()); } private String findSelectedMenuItem(MenuViewState.DataState state) { for (MainMenuItem item : state.getCategories()) if (item.isSelected()) return item.getName(); throw new IllegalStateException("No category is selected in Main Menu" + state); } @Override public void onBackPressed() { SelectedCountToolbar selectedCountToolbar = (SelectedCountToolbar) findViewById(R.id.selectedCountToolbar); if (!closeDrawerIfOpen()) { if (selectedCountToolbar.getVisibility() == View.VISIBLE) { clearSelectionRelay.onNext(true); } else if (!closeSlidingUpPanelIfOpen()) super.onBackPressed(); } } private boolean closeSlidingUpPanelIfOpen() { if (slidingUpPanel.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { slidingUpPanel.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); return true; } return false; } private boolean closeDrawerIfOpen() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawerLayout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); return true; } return false; } public void showCategoryItems(String categoryName) { closeDrawerIfOpen(); String currentCategory = toolbar.getTitle().toString(); if (!currentCategory.equals(categoryName)) { toolbar.setTitle(categoryName); Fragment f; if (categoryName.equals(MainMenuItem.HOME)) { f = new HomeFragment(); } else { f = CategoryFragment.newInstance(categoryName); } getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, f).commit(); } } }