package cheng.app.cnbeta; import cheng.app.cnbeta.PageDetailFragment.Callbacks; import cheng.app.cnbeta.lib.SlidingUpPanelLayout; import cheng.app.cnbeta.lib.SlidingUpPanelLayout.PanelSlideListener; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.NavUtils; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout.DrawerListener; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ShareActionProvider; import android.widget.TextView; import android.widget.Toast; /** * An activity representing a single Page detail screen. * <p> * This activity is mostly just a 'shell' activity containing nothing more than * a {@link PageDetailFragment}. */ public class PageDetailActivity extends ThemedFragmentActivity implements PanelSlideListener, Callbacks, DrawerListener { static final String TAG = "PageDetailActivity"; private static final String STATE_SLIDINGPANE_OPEN = "slidingpane_open"; private static final int LAYOUT_SLIDINGUP = 1; private static final int LAYOUT_DRAWER = 2; public static final String TAG_CMT_FRAGMENT = "tag_cmt_fragment"; private int mLayoutState; SlidingUpPanelLayout mSlidingUpPanelLayout; DrawerLayout mDrawerLayout; LinearLayout mCommentsLayout; TextView mCommentTitleView; EditText mCommentEditView; ImageButton mSendButton; private Menu mOptionsMenu; private int mCmtNumber; private long mNewsId; private PageCommentsFragment mCommentsFragment; private PostCommentFragment mPostCommentFragment; private ShareActionProvider mShareActionProvider; private OnClickListener mSendClickListener = new OnClickListener() { @Override public void onClick(View v) { String text = mCommentEditView.getText().toString(); if (TextUtils.isEmpty(text)) { Toast.makeText(PageDetailActivity.this, R.string.empty_tip, Toast.LENGTH_SHORT).show(); return; } mPostCommentFragment = (PostCommentFragment) getSupportFragmentManager().findFragmentByTag(TAG_CMT_FRAGMENT); if (mPostCommentFragment == null) { mPostCommentFragment = new PostCommentFragment(); mPostCommentFragment.setCancelable(false); } FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); mPostCommentFragment.show(ft, TAG_CMT_FRAGMENT); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); setContentView(R.layout.activity_page_detail); // Show the Up button in the action bar. getActionBar().setDisplayHomeAsUpEnabled(true); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mSlidingUpPanelLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); mCommentsLayout = (LinearLayout) findViewById(R.id.page_detail_comments); mCommentEditView = (EditText) findViewById(R.id.embedded_text_editor); mSendButton = (ImageButton) findViewById(R.id.send_button); mSendButton.setOnClickListener(mSendClickListener); if (mSlidingUpPanelLayout != null) { mLayoutState = LAYOUT_SLIDINGUP; mSlidingUpPanelLayout.setPanelHeight(getResources().getDimensionPixelSize( R.dimen.slidingup_panel_height)); mCommentTitleView = (TextView) findViewById(R.id.page_detail_comments_title); mSlidingUpPanelLayout.setDragView(mCommentTitleView); mSlidingUpPanelLayout .setShadowDrawable(getResources().getDrawable(R.drawable.above_shadow)); mSlidingUpPanelLayout.setPanelSlideListener(this); } else if (mDrawerLayout != null) { mLayoutState = LAYOUT_DRAWER; mDrawerLayout.setDrawerListener(this); } else { throw new IllegalStateException("must setup a SlidingUpPanelLayout or DrawerLayout."); } // savedInstanceState is non-null when there is fragment state // saved from previous configurations of this activity // (e.g. when rotating the screen from portrait to landscape). // In this case, the fragment will automatically be re-added // to its container so we don't need to manually add it. // For more information, see the Fragments API guide at: // // http://developer.android.com/guide/components/fragments.html // FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); if (savedInstanceState == null) { // Create the detail fragment and add it to the activity // using a fragment transaction. Bundle arguments = new Bundle(); arguments.putLong(PageDetailFragment.ARG_ITEM_ID, getIntent().getLongExtra(PageDetailFragment.ARG_ITEM_ID, -1)); arguments.putInt( PageDetailFragment.ARG_PAGE_ID, getIntent().getIntExtra(PageDetailFragment.ARG_PAGE_ID, PageListFragment.PAGE_NEWS)); PageDetailFragment fragment = new PageDetailFragment(); fragment.setArguments(arguments); ft.add(R.id.page_detail_container, fragment); } else { if(savedInstanceState.containsKey(STATE_SLIDINGPANE_OPEN)) { boolean isExpanded = savedInstanceState.getBoolean(STATE_SLIDINGPANE_OPEN); if (mLayoutState == LAYOUT_SLIDINGUP && isExpanded) { getActionBar().hide(); } } } mCommentsFragment = new PageCommentsFragment(); ft.replace(R.id.page_detail_comments_list, mCommentsFragment); ft.commit(); } @Override protected void onStop() { super.onStop(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mLayoutState == LAYOUT_SLIDINGUP) outState.putBoolean(STATE_SLIDINGPANE_OPEN, mSlidingUpPanelLayout.isExpanded()); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.detail_activity_actions, menu); mOptionsMenu = menu; MenuItem item = menu.findItem(R.id.action_share); // Fetch and store ShareActionProvider mShareActionProvider = (ShareActionProvider) item.getActionProvider(); return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { setShareIntent(); MenuItem menuItem = menu.findItem(R.id.action_cmt); if (mCmtNumber < 0) { menuItem.setTitle(R.string.cmt_closed); } else { menuItem.setTitle(getString(R.string.display_cmt, mCmtNumber)); } menuItem.setVisible(mLayoutState == LAYOUT_DRAWER); if (mLayoutState == LAYOUT_DRAWER) { boolean drawerOpen = mDrawerLayout.isDrawerOpen(mCommentsLayout); menu.findItem(R.id.action_refresh).setVisible(!drawerOpen); menu.findItem(R.id.action_share).setVisible(!drawerOpen); } return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // This ID represents the Home or Up button. In the case of this // activity, the Up button is shown. Use NavUtils to allow users // to navigate up one level in the application structure. For // more details, see the Navigation pattern on Android Design: // // http://developer.android.com/design/patterns/navigation.html#up-vs-back // NavUtils.navigateUpTo(this, new Intent(this, PageListActivity.class)); return true; case R.id.action_cmt: if (mDrawerLayout.isDrawerVisible(GravityCompat.END)) { mDrawerLayout.closeDrawer(GravityCompat.END); } else { mDrawerLayout.openDrawer(GravityCompat.END); } return true; } return super.onOptionsItemSelected(item); } private void setShareIntent() { if (mShareActionProvider != null) { StringBuilder sb = new StringBuilder(); sb.append("http://www.cnbeta.com/articles/" + mNewsId); Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra("android.intent.extra.TEXT", sb.toString()); mShareActionProvider.setShareIntent(shareIntent); } } private void triggerRefresh(boolean refreshing) { if (mOptionsMenu == null) { return; } final MenuItem menuItem = mOptionsMenu.findItem(R.id.action_refresh); if (menuItem != null) { if (refreshing) { menuItem.setActionView(R.layout.actionbar_indeterminate_progress); } else { menuItem.setActionView(null); } } } @Override public void onPanelCollapsed(View arg0) { Log.d(TAG, "onPanelCollapsed"); } @Override public void onPanelExpanded(View arg0) { Log.d(TAG, "onPanelExpanded"); if (mNewsId > 0 && mCommentsFragment != null) { mCommentsFragment.LoadData(mNewsId); } } @Override public void onPanelSlide(View panel, float slideOffset) { if (slideOffset < 0.2) { if (getActionBar().isShowing()) { getActionBar().hide(); } } else { if (!getActionBar().isShowing()) { getActionBar().show(); } } } @Override public void onDrawerClosed(View arg0) { Log.d(TAG, "onDrawerClosed"); invalidateOptionsMenu(); } @Override public void onDrawerOpened(View arg0) { Log.d(TAG, "onDrawerOpened"); invalidateOptionsMenu(); if (mNewsId > 0 && mCommentsFragment != null) { mCommentsFragment.LoadData(mNewsId); } } @Override public void onDrawerSlide(View arg0, float arg1) { // TODO Auto-generated method stub } @Override public void onDrawerStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onLoaded(int cmt, long newsId) { mNewsId = newsId; if (mLayoutState == LAYOUT_SLIDINGUP) { if (mCommentTitleView != null) { if (cmt < 0) { mCommentTitleView.setText(R.string.cmt_closed); mCommentEditView.setEnabled(false); mSendButton.setEnabled(false); } else { mCommentTitleView.setText(getString(R.string.display_cmt, cmt)); } } } else { if (cmt < 0) { mCommentEditView.setEnabled(false); mSendButton.setEnabled(false); } mCmtNumber = cmt; invalidateOptionsMenu(); } } @Override public void onUpdateLoading(boolean loading) { triggerRefresh(loading); } @Override public void onBackPressed() { if (mLayoutState == LAYOUT_SLIDINGUP && mSlidingUpPanelLayout.isExpanded()) { mSlidingUpPanelLayout.collapsePane(); return; } if (mLayoutState == LAYOUT_DRAWER && mDrawerLayout.isDrawerOpen(mCommentsLayout)) { mDrawerLayout.closeDrawer(mCommentsLayout); return; } super.onBackPressed(); } }