package org.qii.weiciyuan.ui.main; import com.espian.showcaseview.ShowcaseView; import com.espian.showcaseview.targets.ViewTarget; import com.slidingmenu.lib.SlidingMenu; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.AccountBean; import org.qii.weiciyuan.bean.CommentListBean; import org.qii.weiciyuan.bean.MessageListBean; import org.qii.weiciyuan.bean.UnreadBean; import org.qii.weiciyuan.bean.UserBean; import org.qii.weiciyuan.othercomponent.ConnectionChangeReceiver; import org.qii.weiciyuan.othercomponent.MusicReceiver; import org.qii.weiciyuan.support.database.AccountDBTask; import org.qii.weiciyuan.support.database.DatabaseManager; import org.qii.weiciyuan.support.lib.LongClickableLinkMovementMethod; import org.qii.weiciyuan.support.lib.RecordOperationAppBroadcastReceiver; import org.qii.weiciyuan.support.settinghelper.SettingUtility; import org.qii.weiciyuan.support.utils.AppEventAction; import org.qii.weiciyuan.support.utils.BundleArgsConstants; import org.qii.weiciyuan.support.utils.GlobalContext; import org.qii.weiciyuan.support.utils.Utility; import org.qii.weiciyuan.ui.dm.DMUserListFragment; import org.qii.weiciyuan.ui.maintimeline.FriendsTimeLineFragment; import org.qii.weiciyuan.ui.search.SearchMainParentFragment; import org.qii.weiciyuan.ui.send.WriteWeiboActivity; import org.qii.weiciyuan.ui.userinfo.MyFavListFragment; import org.qii.weiciyuan.ui.userinfo.UserInfoActivity; import org.qii.weiciyuan.ui.userinfo.UserInfoFragment; import android.app.ActionBar; import android.app.AlertDialog; import android.app.Dialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * User: Jiang Qi * Date: 12-7-27 */ public class MainTimeLineActivity extends MainTimeLineParentActivity { public static final int REQUEST_CODE_UPDATE_FRIENDS_TIMELINE_COMMENT_REPOST_COUNT = 0; public static final int REQUEST_CODE_UPDATE_MENTIONS_WEIBO_TIMELINE_COMMENT_REPOST_COUNT = 1; public static final int REQUEST_CODE_UPDATE_MY_FAV_TIMELINE_COMMENT_REPOST_COUNT = 2; private AccountBean accountBean; private NewMsgInterruptBroadcastReceiver newMsgInterruptBroadcastReceiver; private MusicReceiver musicReceiver; private ScrollableListFragment currentFragment; private TextView titleText; private View clickToTop; public static interface ScrollableListFragment { public void scrollToTop(); } public static Intent newIntent() { return new Intent(GlobalContext.getInstance(), MainTimeLineActivity.class); } public static Intent newIntent(AccountBean accountBean) { Intent intent = newIntent(); intent.putExtra(BundleArgsConstants.ACCOUNT_EXTRA, accountBean); return intent; } /* notification bar */ public static Intent newIntent(AccountBean accountBean, MessageListBean mentionsWeiboData, CommentListBean mentionsCommentData, CommentListBean commentsToMeData, UnreadBean unreadBean) { Intent intent = newIntent(); intent.putExtra(BundleArgsConstants.ACCOUNT_EXTRA, accountBean); intent.putExtra(BundleArgsConstants.MENTIONS_WEIBO_EXTRA, mentionsWeiboData); intent.putExtra(BundleArgsConstants.MENTIONS_COMMENT_EXTRA, mentionsCommentData); intent.putExtra(BundleArgsConstants.COMMENTS_TO_ME_EXTRA, commentsToMeData); intent.putExtra(BundleArgsConstants.UNREAD_EXTRA, unreadBean); return intent; } public String getToken() { return accountBean.getAccess_token(); } public void setTitle(String title) { if (TextUtils.isEmpty(title)) { titleText.setVisibility(View.GONE); } else { titleText.setText(title); titleText.setVisibility(View.VISIBLE); } } public void setTitle(int res) { setTitle(getString(res)); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(BundleArgsConstants.ACCOUNT_EXTRA, accountBean); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { accountBean = savedInstanceState.getParcelable(BundleArgsConstants.ACCOUNT_EXTRA); } else { Intent intent = getIntent(); accountBean = intent .getParcelableExtra(BundleArgsConstants.ACCOUNT_EXTRA); } if (accountBean == null) { accountBean = GlobalContext.getInstance().getAccountBean(); } GlobalContext.getInstance().setGroup(null); GlobalContext.getInstance().setAccountBean(accountBean); SettingUtility.setDefaultAccountId(accountBean.getUid()); buildInterface(savedInstanceState); } //build phone ui or table ui private void buildInterface(Bundle savedInstanceState) { getActionBar().setTitle(GlobalContext.getInstance().getCurrentAccountName()); getWindow().setBackgroundDrawable(null); setContentView(R.layout.menu_right); boolean phone = findViewById(R.id.menu_frame) == null; if (phone) { buildPhoneInterface(savedInstanceState); } else { buildPadInterface(savedInstanceState); } buildCustomActionBarTitle(savedInstanceState); if (savedInstanceState == null) { initFragments(); FragmentTransaction secondFragmentTransaction = getSupportFragmentManager() .beginTransaction(); secondFragmentTransaction .replace(R.id.menu_frame, getMenuFragment(), LeftMenuFragment.class.getName()); getSlidingMenu().showContent(); secondFragmentTransaction.commit(); } configSlidingMenu(phone); } //init fragments private void initFragments() { Fragment friend = getFriendsTimeLineFragment(); Fragment mentions = getMentionsTimeLineFragment(); Fragment comments = getCommentsTimeLineFragment(); Fragment fav = getFavFragment(); Fragment myself = getMyProfileFragment(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); if (!friend.isAdded()) { fragmentTransaction .add(R.id.menu_right_fl, friend, FriendsTimeLineFragment.class.getName()); fragmentTransaction.hide(friend); } if (!mentions.isAdded()) { fragmentTransaction.add(R.id.menu_right_fl, mentions, MentionsTimeLine.class.getName()); fragmentTransaction.hide(mentions); } if (!comments.isAdded()) { fragmentTransaction.add(R.id.menu_right_fl, comments, CommentsTimeLine.class.getName()); fragmentTransaction.hide(comments); } if (!fav.isAdded()) { fragmentTransaction.add(R.id.menu_right_fl, fav, MyFavListFragment.class.getName()); fragmentTransaction.hide(fav); } if (!myself.isAdded()) { fragmentTransaction .add(R.id.menu_right_fl, myself, UserInfoFragment.class.getName()); fragmentTransaction.hide(myself); } if (GlobalContext.getInstance().getAccountBean().isBlack_magic()) { Fragment search = getSearchFragment(); Fragment dm = getDMFragment(); if (!search.isAdded()) { fragmentTransaction .add(R.id.menu_right_fl, search, SearchMainParentFragment.class.getName()); fragmentTransaction.hide(search); } if (!dm.isAdded()) { fragmentTransaction.add(R.id.menu_right_fl, dm, DMUserListFragment.class.getName()); fragmentTransaction.hide(dm); } } if (!fragmentTransaction.isEmpty()) { fragmentTransaction.commit(); getSupportFragmentManager().executePendingTransactions(); } } //configure left menu private void configSlidingMenu(boolean phone) { SlidingMenu slidingMenu = getSlidingMenu(); slidingMenu.setShadowWidthRes(R.dimen.shadow_width); slidingMenu.setShadowDrawable(R.drawable.shadow_slidingmenu); if (phone) { slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset); } else { slidingMenu.setBehindOffset(Utility.getScreenWidth()); } slidingMenu.setFadeDegree(0.35f); slidingMenu.setOnPageScrollListener(new SlidingMenu.OnPageScrollListener() { @Override public void onPageScroll() { LongClickableLinkMovementMethod.getInstance().setLongClickable(false); (getFriendsTimeLineFragment()).clearActionMode(); (getFavFragment()).clearActionMode(); (getCommentsTimeLineFragment()).clearActionMode(); (getMentionsTimeLineFragment()).clearActionMode(); (getMyProfileFragment()).clearActionMode(); if (GlobalContext.getInstance().getAccountBean().isBlack_magic()) { (getSearchFragment()).clearActionMode(); (getDMFragment()).clearActionMode(); } } }); slidingMenu.setOnClosedListener(new SlidingMenu.OnClosedListener() { @Override public void onClosed() { LongClickableLinkMovementMethod.getInstance().setLongClickable(true); LocalBroadcastManager.getInstance(MainTimeLineActivity.this) .sendBroadcast(new Intent(AppEventAction.SLIDING_MENU_CLOSED_BROADCAST)); } }); } private void buildCustomActionBarTitle(Bundle savedInstanceState) { View title = getLayoutInflater().inflate(R.layout.maintimelineactivity_title_layout, null); titleText = (TextView) title.findViewById(R.id.tv_title); clickToTop = title.findViewById(R.id.tv_click_to_top); clickToTop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { scrollCurrentListViewToTop(); } }); View write = title.findViewById(R.id.btn_write); write.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = WriteWeiboActivity .newIntent(GlobalContext.getInstance().getAccountBean()); startActivity(intent); } }); ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, Gravity.RIGHT); getActionBar().setCustomView(title, layoutParams); getActionBar().setDisplayShowCustomEnabled(true); } private void buildPhoneInterface(Bundle savedInstanceState) { setBehindContentView(R.layout.menu_frame); getSlidingMenu().setSlidingEnabled(true); getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); getActionBar().setDisplayHomeAsUpEnabled(true); getSlidingMenu().setMode(SlidingMenu.LEFT); getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN); } private void buildPadInterface(Bundle savedInstanceState) { View v = new View(this); setBehindContentView(v); getSlidingMenu().setSlidingEnabled(false); getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); } private void scrollCurrentListViewToTop() { if (this.currentFragment != null) { this.currentFragment.scrollToTop(); } } public View getClickToTopView() { return clickToTop; } public void setCurrentFragment(ScrollableListFragment fragment) { this.currentFragment = fragment; } @Override protected void onResumeFragments() { super.onResumeFragments(); if (SettingUtility.isClickToTopTipFirstShow()) { ViewTarget target = new ViewTarget(getClickToTopView()); ShowcaseView.insertShowcaseView(target, this, R.string.tip, R.string.click_to_top_tip); } } @Override protected void onDestroy() { super.onDestroy(); DatabaseManager.close(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); AccountBean intentAccountBean = intent .getParcelableExtra(BundleArgsConstants.ACCOUNT_EXTRA); if (intentAccountBean == null) { return; } if (accountBean.equals(intentAccountBean)) { accountBean = intentAccountBean; GlobalContext.getInstance().setAccountBean(accountBean); setIntent(intent); } else { finish(); overridePendingTransition(0, 0); startActivity(intent); overridePendingTransition(0, 0); } } @Override public void onBackPressed() { super.onBackPressed(); GlobalContext.getInstance().getBitmapCache().evictAll(); finish(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: getSlidingMenu().showMenu(); return true; } return super.onOptionsItemSelected(item); } public UserBean getUser() { return accountBean.getInfo(); } public AccountBean getAccount() { return accountBean; } //read clipboard to know whether there are any string link can be opened private void readClipboard() { ClipboardManager cm = (ClipboardManager) getApplicationContext().getSystemService( Context.CLIPBOARD_SERVICE); ClipData cmContent = cm.getPrimaryClip(); if (cmContent == null) { return; } ClipData.Item item = cmContent.getItemAt(0); if (item != null) { String url = item.coerceToText(this).toString(); boolean a = !TextUtils.isEmpty(url) && !url .equals(SettingUtility.getLastFoundWeiboAccountLink()); boolean b = Utility.isWeiboAccountIdLink(url) || Utility.isWeiboAccountDomainLink(url); if (a && b) { OpenWeiboAccountLinkDialog dialog = OpenWeiboAccountLinkDialog.newInstance(url); dialog.show(getSupportFragmentManager(), ""); SettingUtility.setLastFoundWeiboAccountLink(url); } } } public static class OpenWeiboAccountLinkDialog extends DialogFragment { public static OpenWeiboAccountLinkDialog newInstance(String url) { OpenWeiboAccountLinkDialog dialog = new OpenWeiboAccountLinkDialog(); Bundle bundle = new Bundle(); bundle.putString("url", url); dialog.setArguments(bundle); return dialog; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final String url = getArguments().getString("url"); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.find_weibo_account_link) .setMessage(url) .setPositiveButton(R.string.open, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (Utility.isWeiboAccountIdLink(url)) { Intent intent = new Intent(getActivity(), UserInfoActivity.class); intent.putExtra("id", Utility.getIdFromWeiboAccountLink(url)); startActivity(intent); } else if (Utility.isWeiboAccountDomainLink(url)) { Intent intent = new Intent(getActivity(), UserInfoActivity.class); intent.putExtra("domain", Utility.getDomainFromWeiboAccountLink(url)); startActivity(intent); } } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); return builder.create(); } } @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(AppEventAction.NEW_MSG_PRIORITY_BROADCAST); filter.setPriority(1); newMsgInterruptBroadcastReceiver = new NewMsgInterruptBroadcastReceiver(); Utility.registerReceiverIgnoredReceiverHasRegisteredHereException(this, newMsgInterruptBroadcastReceiver, filter); musicReceiver = new MusicReceiver(); Utility.registerReceiverIgnoredReceiverHasRegisteredHereException(this, musicReceiver, AppEventAction.getSystemMusicBroadcastFilterAction()); readClipboard(); //ensure timeline picture type is correct ConnectionChangeReceiver.judgeNetworkStatus(this, false); } @Override protected void onPause() { super.onPause(); Utility.unregisterReceiverIgnoredReceiverNotRegisteredException(this, newMsgInterruptBroadcastReceiver); Utility.unregisterReceiverIgnoredReceiverNotRegisteredException(this, musicReceiver); if (isFinishing()) { saveNavigationPositionToDB(); } } public void saveNavigationPositionToDB() { int navPosition = getMenuFragment().getCurrentIndex() * 10; ActionBar actionBar = getActionBar(); int second = 0; if (actionBar.getNavigationMode() != ActionBar.NAVIGATION_MODE_STANDARD) { second = actionBar.getSelectedNavigationIndex(); } int result = navPosition + second; GlobalContext.getInstance().getAccountBean().setNavigationPosition(result); AccountDBTask .updateNavigationPosition(GlobalContext.getInstance().getAccountBean(), result); } public LeftMenuFragment getMenuFragment() { LeftMenuFragment fragment = ((LeftMenuFragment) getSupportFragmentManager() .findFragmentByTag( LeftMenuFragment.class.getName())); if (fragment == null) { fragment = LeftMenuFragment.newInstance(); } return fragment; } public FriendsTimeLineFragment getFriendsTimeLineFragment() { FriendsTimeLineFragment fragment = ((FriendsTimeLineFragment) getSupportFragmentManager() .findFragmentByTag( FriendsTimeLineFragment.class.getName())); if (fragment == null) { fragment = FriendsTimeLineFragment.newInstance(getAccount(), getUser(), getToken()); } return fragment; } public MentionsTimeLine getMentionsTimeLineFragment() { MentionsTimeLine fragment = ((MentionsTimeLine) getSupportFragmentManager() .findFragmentByTag( MentionsTimeLine.class.getName())); if (fragment == null) { fragment = MentionsTimeLine.newInstance(); } return fragment; } public CommentsTimeLine getCommentsTimeLineFragment() { CommentsTimeLine fragment = ((CommentsTimeLine) getSupportFragmentManager() .findFragmentByTag( CommentsTimeLine.class.getName())); if (fragment == null) { fragment = CommentsTimeLine.newInstance(); } return fragment; } public SearchMainParentFragment getSearchFragment() { SearchMainParentFragment fragment = ((SearchMainParentFragment) getSupportFragmentManager() .findFragmentByTag( SearchMainParentFragment.class.getName())); if (fragment == null) { fragment = SearchMainParentFragment.newInstance(); } return fragment; } public DMUserListFragment getDMFragment() { DMUserListFragment fragment = ((DMUserListFragment) getSupportFragmentManager() .findFragmentByTag( DMUserListFragment.class.getName())); if (fragment == null) { fragment = DMUserListFragment.newInstance(); } return fragment; } public MyFavListFragment getFavFragment() { MyFavListFragment fragment = ((MyFavListFragment) getSupportFragmentManager() .findFragmentByTag( MyFavListFragment.class.getName())); if (fragment == null) { fragment = MyFavListFragment.newInstance(); } return fragment; } public UserInfoFragment getMyProfileFragment() { UserInfoFragment fragment = ((UserInfoFragment) getSupportFragmentManager() .findFragmentByTag( UserInfoFragment.class.getName())); if (fragment == null) { fragment = UserInfoFragment.newInstance( GlobalContext.getInstance().getAccountBean().getInfo(), GlobalContext.getInstance().getSpecialToken()); } return fragment; } //todo private class NewMsgInterruptBroadcastReceiver extends RecordOperationAppBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { AccountBean intentAccount = intent .getParcelableExtra(BundleArgsConstants.ACCOUNT_EXTRA); // if (accountBean.equals(intentAccount)) { // MessageListBean mentionsWeibo = intent // .getParcelableExtra(BundleArgsConstants.MENTIONS_WEIBO_EXTRA); // CommentListBean mentionsComment = intent // .getParcelableExtra(BundleArgsConstants.MENTIONS_COMMENT_EXTRA); // CommentListBean commentsToMe = intent // .getParcelableExtra(BundleArgsConstants.COMMENTS_TO_ME_EXTRA); // int unreadCount = (mentionsWeibo != null ? mentionsWeibo.getSize() : 0) + ( // mentionsComment != null ? mentionsComment.getSize() : 0) + ( // commentsToMe != null ? commentsToMe // .getSize() : 0); // String tip = String.format(context.getString(R.string.you_have_new_unread_count), // String.valueOf(unreadCount)); // Toast.makeText(MainTimeLineActivity.this, tip, // Toast.LENGTH_LONG).show(); // abortBroadcast(); // } } } public void setMentionsWeiboCount(int count) { LeftMenuFragment fragment = getMenuFragment(); fragment.setMentionWeiboUnreadCount(count); } public void setMentionsCommentCount(int count) { LeftMenuFragment fragment = getMenuFragment(); fragment.setMentionCommentUnreadCount(count); } public void setCommentsToMeCount(int count) { LeftMenuFragment fragment = getMenuFragment(); fragment.setCommentUnreadCount(count); } }