package com.mapsaurus.paneslayout; import java.lang.ref.WeakReference; import java.util.ArrayList; import com.actionbarsherlock.R; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.MenuItem; import com.slidingmenu.lib.SlidingMenu; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentManager.OnBackStackChangedListener; import android.util.Log; @SuppressWarnings("unused") public class PhoneDelegate extends ActivityDelegate implements SlidingMenu.OnOpenListener, SlidingMenu.OnCloseListener, OnBackStackChangedListener { private SlidingMenu menu; public PhoneDelegate(PanesActivity a) { super(a); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putBoolean("PhoneLayout_menuOpen", menu.isMenuShowing()); } @Override public void onCreate(Bundle savedInstanceState) { if (findViewById(R.id.content_frame) == null) setContentView(R.layout.panes_content_frame); getSupportActionBar().setDisplayHomeAsUpEnabled(true); // initialize sliding menu menu = new SlidingMenu(getActivity()); menu.setMode(SlidingMenu.LEFT); menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN); int shadowWidth = getResources().getDimensionPixelSize(R.dimen.shadow_size); int menuOffset = getResources().getDimensionPixelSize(R.dimen.menu_offset); menu.setShadowWidth(shadowWidth); menu.setShadowDrawable(R.drawable.panes_shadow_left); menu.setBehindOffset(menuOffset); menu.setOnCloseListener(this); menu.setOnOpenListener(this); menu.setMenu(R.layout.panes_menu_frame); FragmentManager fm = getSupportFragmentManager(); fm.addOnBackStackChangedListener(this); if (savedInstanceState != null) { updateFragment(getTopFragment()); updateFragment(getMenuFragment()); } menu.attachToActivity(getActivity(), SlidingMenu.SLIDING_CONTENT); if (savedInstanceState == null) { menu.showContent(); } else { if (savedInstanceState.getBoolean("PhoneLayout_menuOpen")) menu.showMenu(); else menu.showContent(); } } /* ********************************************************************* * Interactions with menu/back/etc * ********************************************************************* */ @Override public void onClose() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public void onOpen() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); } @Override public boolean onBackPressed() { FragmentManager fm = getSupportFragmentManager(); if (menu.isMenuShowing() == false) { if (fm.getBackStackEntryCount() > 0) { return false; } else { menu.showMenu(); return true; } } else { return false; } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (!menu.isMenuShowing()) menu.showMenu(); return true; } return false; } @Override public void onBackStackChanged() { updateFragment(getTopFragment()); updateFragment(getMenuFragment()); } /* ********************************************************************* * Adding, removing, getting fragments * ********************************************************************* */ /** * Save the menu fragment. The reason to do this is because sometimes when * we need to retrieve a fragment, that fragment has not yet been added. */ private WeakReference<Fragment> wMenuFragment = new WeakReference<Fragment>(null); @Override public void addFragment(Fragment prevFragment, Fragment newFragment) { boolean addToBackStack = false; if (prevFragment == getMenuFragment() || prevFragment == null) { clearFragments(); } else { addToBackStack = true; } if (menu.isMenuShowing()) menu.showContent(); if (newFragment != null) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out); ft.replace(R.id.content_frame, newFragment); if (addToBackStack) ft.addToBackStack(newFragment.toString()); ft.commit(); updateFragment(newFragment); } } @Override public void clearFragments() { FragmentManager fm = getSupportFragmentManager(); for(int i = 0; i < fm.getBackStackEntryCount(); i ++) fm.popBackStack(); } @Override public void setMenuFragment(Fragment f) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.menu_frame, f); ft.commit(); wMenuFragment = new WeakReference<Fragment>(f); updateFragment(f); } @Override public Fragment getMenuFragment() { Fragment f = wMenuFragment.get(); if (f == null) { f = getSupportFragmentManager().findFragmentById(R.id.menu_frame); wMenuFragment = new WeakReference<Fragment>(f); } return f; } @Override public Fragment getTopFragment() { return getSupportFragmentManager().findFragmentById(R.id.content_frame); } @Override public void showMenu() { menu.showMenu(true); } }