/*
* Copyright (c) 2015 OpenSilk Productions LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.opensilk.common.ui.mortar;
import android.app.Activity;
import android.content.ComponentCallbacks;
import android.content.ComponentCallbacks2;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import org.opensilk.common.core.mortar.HasScope;
import mortar.MortarScope;
/**
* Created by drew on 9/19/15.
*/
public class DrawerOwnerDelegate<A extends Activity & HasScope>
implements DrawerOwnerActivity, ToolbarOwnerDelegate.Callback {
final A mActivity;
final DrawerOwner mDrawerOwner;
final DrawerLayout mDrawerLayout;
final int openContentDesc;
final int closedContentDesc;
Toolbar mToolbar;
Toggle mDrawerToggle;
public DrawerOwnerDelegate(
A mActivity,
DrawerOwner mDrawerOwner,
DrawerLayout mDrawerLayout,
int openContentDesc,
int closedContentDesc
) {
this.mActivity = mActivity;
this.mDrawerOwner = mDrawerOwner;
this.mDrawerLayout = mDrawerLayout;
this.openContentDesc = openContentDesc;
this.closedContentDesc = closedContentDesc;
}
/*
* lifecycle
*/
public void onCreate() {
mDrawerToggle = new Toggle();
mDrawerOwner.takeView(this);
}
public void onDestroy() {
mDrawerOwner.dropView(this);
}
public void onPostCreate(Bundle savedInstanceState) {
mDrawerToggle.syncState();
}
public void onConfigurationChanged(Configuration newConfig) {
mDrawerToggle.onConfigurationChanged(newConfig);
}
public boolean onOptionsItemSelected(MenuItem item) {
return mToolbar != null && mDrawerToggle.onOptionsItemSelected(item);
}
public boolean onBackPressed() {
if (isAnyOpen()) {
closeDrawers();
return true;
} else {
return false;
}
}
/*
* end lifecycle
*/
@Override
public void onToolbarAttached(Toolbar toolbar) {
setNewToolbar(toolbar);
}
@Override
public void onToolbarDetached(Toolbar toolbar) {
setNewToolbar(null);
}
private void setNewToolbar(@Nullable Toolbar toolbar) {
mToolbar = toolbar;
if (mDrawerLayout != null) {
mDrawerToggle = new Toggle();
mDrawerToggle.syncState();
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
}
@Override
public void openDrawer(int gravity) {
if (mDrawerLayout != null && !mDrawerLayout.isDrawerOpen(gravity)) {
mDrawerLayout.openDrawer(gravity);
}
}
@Override
public void openDrawers() {
openDrawer(GravityCompat.START);
openDrawer(GravityCompat.END);
}
@Override
public void closeDrawer(int gravity) {
if (mDrawerLayout != null && mDrawerLayout.isDrawerOpen(gravity)) {
mDrawerLayout.closeDrawer(gravity);
}
}
@Override
public void closeDrawers() {
closeDrawer(GravityCompat.START);
closeDrawer(GravityCompat.END);
}
public void enableDrawer(int gravity, boolean enable) {
int lockmode = enable ? DrawerLayout.LOCK_MODE_UNLOCKED : DrawerLayout.LOCK_MODE_LOCKED_CLOSED;
if (mDrawerLayout != null) mDrawerLayout.setDrawerLockMode(lockmode, gravity);
if (gravity == GravityCompat.START && mDrawerToggle != null && mToolbar != null)
mDrawerToggle.setDrawerIndicatorEnabled(enable);
}
@Override
public void enableDrawers(boolean enable) {
enableDrawer(GravityCompat.START, enable);
enableDrawer(GravityCompat.END, enable);
}
@Override
public MortarScope getScope() {
return mActivity.getScope();
}
private boolean isAnyOpen() {
if (mDrawerLayout != null) {
if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
return true;
} else if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
return true;
}
}
return false;
}
class Toggle extends ActionBarDrawerToggle {
public Toggle() {
super(mActivity, mDrawerLayout, mToolbar, openContentDesc, closedContentDesc);
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
mDrawerOwner.onDrawerSlide(drawerView, slideOffset);
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
mDrawerOwner.onDrawerOpened(drawerView);
}
@Override
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
mDrawerOwner.onDrawerClosed(view);
}
@Override
public void onDrawerStateChanged(int newState) {
super.onDrawerStateChanged(newState);
mDrawerOwner.onDrawerStateChanged(newState);
}
}
}