/** * */ package com.photoshare.fragments; import java.util.ArrayList; import android.app.Fragment; import android.app.FragmentTransaction; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.photoshare.command.Command; import com.photoshare.common.AbstractRequestListener; import com.photoshare.exception.NetworkError; import com.photoshare.fragments.stacktrace.TraceConfig; import com.photoshare.service.photos.PhotoBean; import com.photoshare.service.photos.PhotoType; import com.photoshare.service.photos.views.FeedsFragment; import com.photoshare.service.photos.views.PopularPhotosFragment; import com.photoshare.service.signin.UserSignInRequestParam; import com.photoshare.service.signin.UserSignInResponseBean; import com.photoshare.service.users.UserInfo; import com.photoshare.service.users.views.OtherHomeTitleBarFragment; import com.photoshare.service.users.views.UserHomeTitleBarFragment; import com.photoshare.tabHost.R; import com.photoshare.utils.User; import com.photoshare.utils.Utils; import com.photoshare.utils.async.AsyncUtils; import com.photoshare.view.AppTitleBarView; /** * @author Aron * */ public abstract class BaseFragment extends Fragment { public static final String KEY_FRAGMENT_VIEW_ID = "fragmentViewId"; public static final String KEY_TAG = "tag"; public static final String KEY_WRAPPER_ID = "wrapperId"; public static final String KEY_WRAPPED_ID = "wrappedId"; protected int fragmentViewId; protected AsyncUtils async = AsyncUtils.getInstance(); protected User user = User.getInstance(); private AppTitleBarView titleView; protected String Tag; public int getFragmentViewId() { return fragmentViewId; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } public void setFragmentViewId(int fragmentViewId) { Bundle bundle = new Bundle(); bundle.putInt(KEY_FRAGMENT_VIEW_ID, fragmentViewId); this.setArguments(bundle); this.fragmentViewId = fragmentViewId; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater .inflate(R.layout.app_title_bar_layout, container, false); } // @Override // public void onActivityCreated(Bundle savedInstanceState) { // super.onActivityCreated(savedInstanceState); // } protected void initTitleBar(String leftBtnText, String rightBtnText, String titlebarText) { titleView = new AppTitleBarView(getActivity(), getActivity() .findViewById(R.id.appTitleBarLayoutId), leftBtnText, rightBtnText, titlebarText); titleView.registerListener(onTitleBarBtnClickedListener); titleView.applyView(); } protected void initTitleBar(String leftBtnText, String rightBtnText, String titlebarText, int leftBtnVisibility, int rightBtnVisibility) { titleView = new AppTitleBarView(getActivity(), getActivity() .findViewById(R.id.appTitleBarLayoutId), leftBtnText, rightBtnText, titlebarText, leftBtnVisibility, rightBtnVisibility); titleView.registerListener(onTitleBarBtnClickedListener); titleView.applyView(); } protected void setTitleBarText(String leftBtnText, String rightBtnText, String titlebarText) { if (titleView == null) { throw new IllegalStateException("title hasn't been initialized!"); } titleView.setLeftBtnText(leftBtnText); titleView.setRightBtnText(rightBtnText); titleView.setTitlebarText(titlebarText); } protected void setTitleBarDrawable(int leftRid, int rightRidd) { titleView.setTitleLeftButtonBackground(leftRid); titleView.setTitleRightButtonBackground(rightRidd); } protected void AsyncSignIn() { UserSignInRequestParam param = new UserSignInRequestParam( user.getMail(), user.getPwd()); AbstractRequestListener<UserSignInResponseBean> listener = new AbstractRequestListener<UserSignInResponseBean>() { @Override public void onNetworkError(NetworkError networkError) { getActivity().runOnUiThread(new Runnable() { public void run() { mExceptionHandler.obtainMessage( NetworkError.ERROR_SIGN_IN).sendToTarget(); User.UserAccessToken.clear(getActivity()); } }); } @Override public void onFault(Throwable fault) { getActivity().runOnUiThread(new Runnable() { public void run() { mExceptionHandler.obtainMessage( NetworkError.ERROR_NETWORK).sendToTarget(); } }); } @Override public void onComplete(UserSignInResponseBean bean) { if (bean != null) { UserInfo info = bean.getUserInfo(); if (info != null) { user.setUserInfo(info); user.setLogging(true); User.UserAccessToken.keepAccessToken(getActivity(), user); } } getActivity().runOnUiThread(new Runnable() { public void run() { onLoginSuccess(); } }); } }; async.SignIn(param, listener); } protected void AsyncSignIn(final String mail, final String pwd) { UserSignInRequestParam param = new UserSignInRequestParam(mail, pwd); AbstractRequestListener<UserSignInResponseBean> listener = new AbstractRequestListener<UserSignInResponseBean>() { @Override public void onNetworkError(NetworkError networkError) { getActivity().runOnUiThread(new Runnable() { public void run() { mExceptionHandler.obtainMessage( NetworkError.ERROR_SIGN_IN).sendToTarget(); User.UserAccessToken.clear(getActivity()); } }); } @Override public void onFault(Throwable fault) { getActivity().runOnUiThread(new Runnable() { public void run() { mExceptionHandler.obtainMessage( NetworkError.ERROR_NETWORK).sendToTarget(); } }); } @Override public void onComplete(UserSignInResponseBean bean) { if (bean != null) { UserInfo info = bean.getUserInfo(); if (info != null) { user.setMail(mail); user.setPwd(pwd); user.setUserInfo(info); user.setLogging(true); User.UserAccessToken.keepAccessToken(getActivity(), user); } } getActivity().runOnUiThread(new Runnable() { public void run() { onLoginSuccess(); } }); } }; async.SignIn(param, listener); } /** * */ protected abstract void onRightBtnClicked(); /** * */ protected abstract void onLeftBtnClicked(); protected abstract void onLoginSuccess(); protected final Handler mExceptionHandler = new Handler() { @Override public void handleMessage(Message msg) { String error = ""; switch (msg.what) { case NetworkError.ERROR_SIGN_IN_NULL: error = getSignInNullError(); break; case NetworkError.ERROR_CODE_ILLEGAL_PARAMETER: break; case NetworkError.ERROR_CODE_LOG_ERROR: break; case NetworkError.ERROR_CODE_NULL_PARAMETER: break; case NetworkError.ERROR_CODE_PARAMETER_EXTENDS_LIMIT: break; case NetworkError.ERROR_CODE_UNABLE_PARSE_RESPONSE: break; case NetworkError.ERROR_CODE_UNKNOWN_ERROR: break; case NetworkError.ERROR_COMMENT: error = getCommentError(); break; case NetworkError.ERROR_EDIT_PROFILE: error = getEditProfileError(); break; case NetworkError.ERROR_FOLLOW: error = getFollowError(); break; case NetworkError.ERROR_MAIL_NULL: error = getMailError(); break; case NetworkError.ERROR_NAME_NULL: error = getNameError(); break; case NetworkError.ERROR_PHOTO: error = getPhotoError(); break; case NetworkError.ERROR_PSEUDO_NAME_NULL: error = getPseudoNameError(); break; case NetworkError.ERROR_PWD_NULL: error = getPwdError(); break; case NetworkError.ERROR_REFRESH_DATA: error = getRefreshError(); break; case NetworkError.ERROR_SIGN_IN: error = getSignInError(); break; case NetworkError.ERROR_SIGN_UP: error = getSignUpError(); break; case NetworkError.ERROR_SIGN_UP_MAIL: error = getSignUpMailExistError(); break; case NetworkError.ERROR_LIKE: error = getLikeError(); break; case NetworkError.ERROR_NETWORK: error = getNetworkError(); break; case NetworkError.ERROR_RENREN_AUTHORIZE: error = getRenRenAuthorizeError(); break; case NetworkError.ERROR_RENREN_PUBLISH_PHOTO: error = getRenRenPublishError(); break; case NetworkError.ERROR_SINA_WEIBO_AUTHORIZE: error = getSinaWeiboAuthorizeError(); break; case NetworkError.ERROR_SINA_WEIBO_PUBLISH_PHOTO: error = getSinaWeiboPublishError(); break; case NetworkError.ERROR_TX_WEIBO_AUTHORIZE: error = getTxWeiboAuthorizeError(); break; case NetworkError.ERROR_TX_WEIBO_PUBLISH_PHOTO: error = getTxWeiboPublishError(); break; default: error = getError(); super.handleMessage(msg); } if (!"".equals(error)) { displayErrorMsg(error); } } }; private String getRefreshError() { return getString(R.string.erefreshError); } private String getSignInError() { return getString(R.string.esignInError); } private String getSignInNullError() { return getString(R.string.esignIn); } private String getSignUpError() { return getString(R.string.esignUpError); } private String getSignUpMailExistError() { return getString(R.string.esignUpMailExistError); } private String getNameError() { return getString(R.string.enameError); } private String getMailError() { return getString(R.string.emailError); } private String getPwdError() { return getString(R.string.epwdError); } private String getPseudoNameError() { return getString(R.string.epseudoNameError); } private String getPhotoError() { return getString(R.string.ephotoError); } private String getLikeError() { return getString(R.string.elikeError); } private String getFollowError() { return getString(R.string.efollowError); } private String getCommentError() { return getString(R.string.ecommentError); } private String getEditProfileError() { return getString(R.string.eeditProfileError); } private String getError() { return getString(R.string.eError); } private String getNetworkError() { return getString(R.string.eNetworkError); } private String getRenRenAuthorizeError() { return getString(R.string.error_renren_authorize); } private String getRenRenPublishError() { return getString(R.string.error_renren_publish_photo); } private String getSinaWeiboAuthorizeError() { return getString(R.string.error_sina_weibo_authorize); } private String getSinaWeiboPublishError() { return getString(R.string.error_sina_weibo_publish_photo); } private String getTxWeiboAuthorizeError() { return getString(R.string.error_tx_weibo_authorize); } private String getTxWeiboPublishError() { return getString(R.string.error_tx_weibo_publish_photo); } protected String getRefreshTicker() { return getString(R.string.nRefreshTicker); } protected String getRefreshTag() { return getString(R.string.nRefreshTag); } protected String getSuccessTicker() { return getString(R.string.nSuccessTicker); } protected String getSuccessTag() { return getString(R.string.nSuccessTag); } private void displayErrorMsg(final String error) { getActivity().runOnUiThread(new Runnable() { public void run() { if (titleView != null) { titleView.displayErrorView(error); } } }); } public String getCanonicalTag() { return Tag; } public void setCanonicalTag(String canonicalTag) { this.Tag = canonicalTag; } protected void ShowOtherHomeTitleBarFragment(int fragmentViewId, Bundle args) { OtherHomeTitleBarFragment ohtbf = OtherHomeTitleBarFragment .newInstance(fragmentViewId); ohtbf.setArguments(args); Utils.logger("ShowOtherHomeTitleBarFragment from UserHome"); persist(fragmentViewId, ohtbf); } protected void ShowUserHomeTitleBarFragment(int fragmentViewId, Bundle args) { UserHomeTitleBarFragment uhtbf = UserHomeTitleBarFragment .newInstance(fragmentViewId); uhtbf.setArguments(args); Utils.logger("ShowUserHomeTitleBarFragment from UserHome"); persist(fragmentViewId, uhtbf); } protected void ShowPhotoBarFragment(int fragmentViewId, PhotoType type, UserInfo info, ArrayList<PhotoBean> photos) { PhotoBarFragment pbf = PhotoBarFragment.newInstance(fragmentViewId); Bundle args = new Bundle(); args.putParcelable(UserInfo.KEY_USER_INFO, info); args.putString(PhotoBean.KEY_PHOTO_TYPE, type.toString()); args.putParcelableArrayList(PhotoBean.KEY_PHOTOS, photos); pbf.setArguments(args); persist(fragmentViewId, pbf); } protected void ShowPopularFragment(int fragmentViewId, Bundle args) { PopularPhotosFragment ppf = PopularPhotosFragment .newInstance(fragmentViewId); ppf.setArguments(args); Utils.logger("ShowPopularFragment from UserHome"); persist(fragmentViewId, ppf); } protected void ShowFeedsFragment(int fragmentViewId, Bundle args) { FeedsFragment ff = FeedsFragment.newInstance(fragmentViewId); ff.setArguments(args); persist(fragmentViewId, ff); } private void persist(int fragmentViewId, BaseFragment ff) { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(fragmentViewId, ff); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } /** * Process arguments. Set the result to be true if the arguments contains * backwards action; otherwise, set it false. * {@link TraceConfig#getTrackBackward()} * * @return result */ protected boolean processArguments() { Bundle params = getArguments(); if (params != null) { Utils.logger("Fragment ----------- backward" + params.getBoolean(TraceConfig.getTrackBackward())); if (params.containsKey(TraceConfig.getTrackBackward())) { Utils.logger("Fragment ----------- backward" + params.getBoolean(TraceConfig.getTrackBackward())); return params.getBoolean(TraceConfig.getTrackBackward()) || params.containsKey(KEY_WRAPPER_ID); } } return false; } protected void forward(String invokeName, Bundle args) { Command.forward(this, invokeName, args); } protected void backward(Bundle args) { Utils.logger("Back from " + this.getCanonicalTag()); Command.backward(this, args); } private AppTitleBarView.OnTitleBarBtnClickedListener onTitleBarBtnClickedListener = new AppTitleBarView.OnTitleBarBtnClickedListener() { public void OnRightBtnClick() { onRightBtnClicked(); } public void OnLeftBtnClick() { onLeftBtnClicked(); } }; }