package net.oschina.app.common; import java.io.File; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import greendroid.widget.MyQuickAction; import greendroid.widget.QuickAction; import net.oschina.app.AppConfig; import net.oschina.app.AppContext; import net.oschina.app.AppException; import net.oschina.app.AppManager; import net.oschina.app.R; import net.oschina.app.adapter.GridViewFaceAdapter; import net.oschina.app.api.ApiClient; import net.oschina.app.bean.AccessInfo; import net.oschina.app.bean.Active; import net.oschina.app.bean.Comment; import net.oschina.app.bean.CommentList; import net.oschina.app.bean.Messages; import net.oschina.app.bean.News; import net.oschina.app.bean.Notice; import net.oschina.app.bean.Result; import net.oschina.app.bean.Tweet; import net.oschina.app.bean.URLs; import net.oschina.app.ui.About; import net.oschina.app.ui.BlogDetail; import net.oschina.app.ui.CommentPub; import net.oschina.app.ui.FeedBack; import net.oschina.app.ui.ImageDialog; import net.oschina.app.ui.ImageZoomDialog; import net.oschina.app.ui.LoginDialog; import net.oschina.app.ui.Main; import net.oschina.app.ui.MessageDetail; import net.oschina.app.ui.MessageForward; import net.oschina.app.ui.MessagePub; import net.oschina.app.ui.NewsDetail; import net.oschina.app.ui.QuestionDetail; import net.oschina.app.ui.QuestionPub; import net.oschina.app.ui.QuestionTag; import net.oschina.app.ui.Search; import net.oschina.app.ui.Setting; import net.oschina.app.ui.SoftwareLib; import net.oschina.app.ui.SoftwareDetail; import net.oschina.app.ui.TweetDetail; import net.oschina.app.ui.TweetPub; import net.oschina.app.ui.UserCenter; import net.oschina.app.ui.UserFavorite; import net.oschina.app.ui.UserFriend; import net.oschina.app.ui.UserInfo; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Handler; import android.os.Message; import android.text.Editable; import android.text.Spannable; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.TextWatcher; import android.text.style.AbsoluteSizeSpan; import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; import android.text.style.StyleSpan; import android.view.Menu; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; /** * 应用程序UI工具包:封装UI相关的一些操作 * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-3-21 */ public class UIHelper { public final static int LISTVIEW_ACTION_INIT = 0x01; public final static int LISTVIEW_ACTION_REFRESH = 0x02; public final static int LISTVIEW_ACTION_SCROLL = 0x03; public final static int LISTVIEW_ACTION_CHANGE_CATALOG = 0x04; public final static int LISTVIEW_DATA_MORE = 0x01; public final static int LISTVIEW_DATA_LOADING = 0x02; public final static int LISTVIEW_DATA_FULL = 0x03; public final static int LISTVIEW_DATA_EMPTY = 0x04; public final static int LISTVIEW_DATATYPE_NEWS = 0x01; public final static int LISTVIEW_DATATYPE_BLOG = 0x02; public final static int LISTVIEW_DATATYPE_POST = 0x03; public final static int LISTVIEW_DATATYPE_TWEET = 0x04; public final static int LISTVIEW_DATATYPE_ACTIVE = 0x05; public final static int LISTVIEW_DATATYPE_MESSAGE = 0x06; public final static int LISTVIEW_DATATYPE_COMMENT = 0x07; public final static int REQUEST_CODE_FOR_RESULT = 0x01; public final static int REQUEST_CODE_FOR_REPLY = 0x02; /** 表情图片匹配 */ private static Pattern facePattern = Pattern.compile("\\[{1}([0-9]\\d*)\\]{1}"); /** 全局web样式 */ public final static String WEB_STYLE = "<style>* {font-size:16px;line-height:20px;} p {color:#333;} a {color:#3E62A6;} img {max-width:310px;} " + "img.alignleft {float:left;max-width:120px;margin:0 10px 5px 0;border:1px solid #ccc;background:#fff;padding:2px;} " + "pre {font-size:9pt;line-height:12pt;font-family:Courier New,Arial;border:1px solid #ddd;border-left:5px solid #6CE26C;background:#f6f6f6;padding:5px;} " + "a.tag {font-size:15px;text-decoration:none;background-color:#bbd6f3;border-bottom:2px solid #3E6D8E;border-right:2px solid #7F9FB6;color:#284a7b;margin:2px 2px 2px 0;padding:2px 4px;white-space:nowrap;}</style>"; /** * 显示首页 * @param activity */ public static void showHome(Activity activity) { Intent intent = new Intent(activity,Main.class); activity.startActivity(intent); activity.finish(); } /** * 显示登录页面 * @param activity */ public static void showLoginDialog(Context context) { Intent intent = new Intent(context,LoginDialog.class); if(context instanceof Main) intent.putExtra("LOGINTYPE", LoginDialog.LOGIN_MAIN); else if(context instanceof Setting) intent.putExtra("LOGINTYPE", LoginDialog.LOGIN_SETTING); else intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } /** * 显示新闻详情 * @param context * @param newsId */ public static void showNewsDetail(Context context, int newsId) { Intent intent = new Intent(context, NewsDetail.class); intent.putExtra("news_id", newsId); context.startActivity(intent); } /** * 显示帖子详情 * @param context * @param postId */ public static void showQuestionDetail(Context context, int postId) { Intent intent = new Intent(context, QuestionDetail.class); intent.putExtra("post_id", postId); context.startActivity(intent); } /** * 显示相关Tag帖子列表 * @param context * @param tag */ public static void showQuestionListByTag(Context context, String tag) { Intent intent = new Intent(context, QuestionTag.class); intent.putExtra("post_tag", tag); context.startActivity(intent); } /** * 显示我要提问页面 * @param context */ public static void showQuestionPub(Context context) { Intent intent = new Intent(context, QuestionPub.class); context.startActivity(intent); } /** * 显示动弹详情及评论 * @param context * @param tweetId */ public static void showTweetDetail(Context context, int tweetId) { Intent intent = new Intent(context, TweetDetail.class); intent.putExtra("tweet_id", tweetId); context.startActivity(intent); } /** * 显示动弹一下页面 * @param context */ public static void showTweetPub(Activity context) { Intent intent = new Intent(context, TweetPub.class); context.startActivityForResult(intent, REQUEST_CODE_FOR_RESULT); } public static void showTweetPub(Activity context,String atme,int atuid) { Intent intent = new Intent(context, TweetPub.class); intent.putExtra("at_me", atme); intent.putExtra("at_uid", atuid); context.startActivityForResult(intent, REQUEST_CODE_FOR_RESULT); } /** * 显示博客详情 * @param context * @param blogId */ public static void showBlogDetail(Context context, int blogId) { Intent intent = new Intent(context, BlogDetail.class); intent.putExtra("blog_id", blogId); context.startActivity(intent); } /** * 显示软件详情 * @param context * @param ident */ public static void showSoftwareDetail(Context context, String ident) { Intent intent = new Intent(context, SoftwareDetail.class); intent.putExtra("ident", ident); context.startActivity(intent); } /** * 新闻超链接点击跳转 * @param context * @param newsId * @param newsType * @param objId */ public static void showNewsRedirect(Context context, News news) { String url = news.getUrl(); //url为空-旧方法 if(StringUtils.isEmpty(url)) { int newsId = news.getId(); int newsType = news.getNewType().type; String objId = news.getNewType().attachment; switch (newsType) { case News.NEWSTYPE_NEWS: showNewsDetail(context, newsId); break; case News.NEWSTYPE_SOFTWARE: showSoftwareDetail(context, objId); break; case News.NEWSTYPE_POST: showQuestionDetail(context, StringUtils.toInt(objId)); break; case News.NEWSTYPE_BLOG: showBlogDetail(context, StringUtils.toInt(objId)); break; } } else { showUrlRedirect(context, url); } } /** * 动态点击跳转到相关新闻、帖子等 * @param context * @param id * @param catalog 0其他 1新闻 2帖子 3动弹 4博客 */ public static void showActiveRedirect(Context context, Active active) { String url = active.getUrl(); //url为空-旧方法 if(StringUtils.isEmpty(url)) { int id = active.getObjectId(); int catalog = active.getActiveType(); switch (catalog) { case Active.CATALOG_OTHER: //其他-无跳转 break; case Active.CATALOG_NEWS: showNewsDetail(context, id); break; case Active.CATALOG_POST: showQuestionDetail(context, id); break; case Active.CATALOG_TWEET: showTweetDetail(context, id); break; case Active.CATALOG_BLOG: showBlogDetail(context, id); break; } } else { showUrlRedirect(context, url); } } /** * 显示评论发表页面 * @param context * @param id 新闻|帖子|动弹的id * @param catalog 1新闻 2帖子 3动弹 4动态 */ public static void showCommentPub(Activity context, int id, int catalog) { Intent intent = new Intent(context, CommentPub.class); intent.putExtra("id", id); intent.putExtra("catalog", catalog); context.startActivityForResult(intent, REQUEST_CODE_FOR_RESULT); } /** * 显示评论回复页面 * @param context * @param id * @param catalog * @param replyid * @param authorid */ public static void showCommentReply(Activity context, int id, int catalog, int replyid, int authorid, String author, String content) { Intent intent = new Intent(context, CommentPub.class); intent.putExtra("id", id); intent.putExtra("catalog", catalog); intent.putExtra("reply_id", replyid); intent.putExtra("author_id", authorid); intent.putExtra("author", author); intent.putExtra("content", content); if(catalog == CommentList.CATALOG_POST) context.startActivityForResult(intent, REQUEST_CODE_FOR_REPLY); else context.startActivityForResult(intent, REQUEST_CODE_FOR_RESULT); } /** * 显示留言对话页面 * @param context * @param catalog * @param friendid */ public static void showMessageDetail(Context context, int friendid, String friendname) { Intent intent = new Intent(context, MessageDetail.class); intent.putExtra("friend_name", friendname); intent.putExtra("friend_id", friendid); context.startActivity(intent); } /** * 显示留言回复界面 * @param context * @param friendId 对方id * @param friendName 对方名称 */ public static void showMessagePub(Activity context, int friendId, String friendName) { Intent intent = new Intent(); intent.putExtra("user_id", ((AppContext)context.getApplication()).getLoginUid()); intent.putExtra("friend_id", friendId); intent.putExtra("friend_name", friendName); intent.setClass(context, MessagePub.class); context.startActivityForResult(intent, REQUEST_CODE_FOR_RESULT); } /** * 显示转发留言界面 * @param context * @param friendName 对方名称 * @param messageContent 留言内容 */ public static void showMessageForward(Activity context, String friendName, String messageContent) { Intent intent = new Intent(); intent.putExtra("user_id", ((AppContext)context.getApplication()).getLoginUid()); intent.putExtra("friend_name", friendName); intent.putExtra("message_content", messageContent); intent.setClass(context, MessageForward.class); context.startActivity(intent); } /** * 调用系统安装了的应用分享 * @param context * @param title * @param url */ public static void showShareMore(Activity context,final String title,final String url) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, "分享:" + title); intent.putExtra(Intent.EXTRA_TEXT, title + " " +url); context.startActivity(Intent.createChooser(intent, "选择分享")); } /** * 分享到'新浪微博'或'腾讯微博'的对话框 * @param context 当前Activity * @param title 分享的标题 * @param url 分享的链接 */ public static void showShareDialog(final Activity context,final String title,final String url) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setIcon(android.R.drawable.btn_star); builder.setTitle(context.getString(R.string.share)); builder.setItems(R.array.app_share_items,new DialogInterface.OnClickListener(){ AppConfig cfgHelper = AppConfig.getAppConfig(context); AccessInfo access = cfgHelper.getAccessInfo(); public void onClick(DialogInterface arg0, int arg1) { switch (arg1) { case 0://新浪微博 //分享的内容 final String shareMessage = title + " " +url; //初始化微博 if(SinaWeiboHelper.isWeiboNull()) { SinaWeiboHelper.initWeibo(); } //判断之前是否登陆过 if(access != null) { SinaWeiboHelper.progressDialog = new ProgressDialog(context); SinaWeiboHelper.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); SinaWeiboHelper.progressDialog.setMessage(context.getString(R.string.sharing)); SinaWeiboHelper.progressDialog.setCancelable(true); SinaWeiboHelper.progressDialog.show(); new Thread() { public void run() { SinaWeiboHelper.setAccessToken(access.getAccessToken(), access.getAccessSecret(), access.getExpiresIn()); SinaWeiboHelper.shareMessage(context, shareMessage); } }.start(); } else { SinaWeiboHelper.authorize(context, shareMessage); } break; case 1://腾讯微博 QQWeiboHelper.shareToQQ(context, title, url); break; case 2://更多 showShareMore(context, title, url); break; } } }); builder.create().show(); } /** * 收藏操作选择框 * @param context * @param thread */ public static void showFavoriteOptionDialog(final Activity context,final Thread thread) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setIcon(R.drawable.ic_dialog_menu); builder.setTitle(context.getString(R.string.select)); builder.setItems(R.array.favorite_options,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1) { switch (arg1) { case 0://删除 thread.start(); break; } } }); builder.create().show(); } /** * 消息列表操作选择框 * @param context * @param msg * @param thread */ public static void showMessageListOptionDialog(final Activity context,final Messages msg,final Thread thread) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setIcon(R.drawable.ic_dialog_menu); builder.setTitle(context.getString(R.string.select)); builder.setItems(R.array.message_list_options,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1) { switch (arg1) { case 0://回复 showMessagePub(context,msg.getFriendId(),msg.getFriendName()); break; case 1://转发 showMessageForward(context,msg.getFriendName(),msg.getContent()); break; case 2://删除 thread.start(); break; } } }); builder.create().show(); } /** * 消息详情操作选择框 * @param context * @param msg * @param thread */ public static void showMessageDetailOptionDialog(final Activity context,final Comment msg,final Thread thread) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setIcon(R.drawable.ic_dialog_menu); builder.setTitle(context.getString(R.string.select)); builder.setItems(R.array.message_detail_options,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1) { switch (arg1) { case 0://转发 showMessageForward(context,msg.getAuthor(),msg.getContent()); break; case 1://删除 thread.start(); break; } } }); builder.create().show(); } /** * 评论操作选择框 * @param context * @param id 某条新闻,帖子,动弹的id 或者某条消息的 friendid * @param catalog 该评论所属类型:1新闻 2帖子 3动弹 4动态 * @param comment 本条评论对象,用于获取评论id&评论者authorid * @param thread 处理删除评论的线程,若无删除操作传null */ public static void showCommentOptionDialog(final Activity context,final int id,final int catalog,final Comment comment,final Thread thread) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setIcon(R.drawable.ic_dialog_menu); builder.setTitle(context.getString(R.string.select)); if(thread != null) { builder.setItems(R.array.comment_options_2,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1) { switch (arg1) { case 0://回复 showCommentReply(context,id,catalog,comment.getId(),comment.getAuthorId(),comment.getAuthor(),comment.getContent()); break; case 1://删除 thread.start(); break; } } }); } else { builder.setItems(R.array.comment_options_1,new DialogInterface.OnClickListener(){ public void onClick(DialogInterface arg0, int arg1) { switch (arg1) { case 0://回复 showCommentReply(context,id,catalog,comment.getId(),comment.getAuthorId(),comment.getAuthor(),comment.getContent()); break; } } }); } builder.create().show(); } /** * 博客列表操作 * @param context * @param thread */ public static void showBlogOptionDialog(final Context context,final Thread thread) { new AlertDialog.Builder(context) .setIcon(android.R.drawable.ic_dialog_info) .setTitle(context.getString(R.string.delete_blog)) .setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if(thread != null) thread.start(); else ToastMessage(context, R.string.msg_noaccess_delete); dialog.dismiss(); } }) .setNegativeButton(R.string.cancle, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create().show(); } /** * 动弹操作选择框 * @param context * @param thread */ public static void showTweetOptionDialog(final Context context,final Thread thread) { new AlertDialog.Builder(context) .setIcon(android.R.drawable.ic_dialog_info) .setTitle(context.getString(R.string.delete_tweet)) .setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if(thread != null) thread.start(); else ToastMessage(context, R.string.msg_noaccess_delete); dialog.dismiss(); } }) .setNegativeButton(R.string.cancle, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create().show(); } /** * 是否重新发布动弹操对话框 * @param context * @param thread */ public static void showResendTweetDialog(final Context context,final Thread thread) { new AlertDialog.Builder(context) .setIcon(android.R.drawable.ic_dialog_info) .setTitle(context.getString(R.string.republish_tweet)) .setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); if(context == TweetPub.mContext && TweetPub.mMessage != null) TweetPub.mMessage.setVisibility(View.VISIBLE); thread.start(); } }) .setNegativeButton(R.string.cancle, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create().show(); } /** * 显示图片对话框 * @param context * @param imgUrl */ public static void showImageDialog(Context context, String imgUrl) { Intent intent = new Intent(context, ImageDialog.class); intent.putExtra("img_url", imgUrl); context.startActivity(intent); } public static void showImageZoomDialog(Context context, String imgUrl) { Intent intent = new Intent(context, ImageZoomDialog.class); intent.putExtra("img_url", imgUrl); context.startActivity(intent); } /** * 显示系统设置界面 * @param context */ public static void showSetting(Context context) { Intent intent = new Intent(context, Setting.class); context.startActivity(intent); } /** * 显示搜索界面 * @param context */ public static void showSearch(Context context) { Intent intent = new Intent(context, Search.class); context.startActivity(intent); } /** * 显示软件界面 * @param context */ public static void showSoftware(Context context) { Intent intent = new Intent(context, SoftwareLib.class); context.startActivity(intent); } /** * 显示我的资料 * @param context */ public static void showUserInfo(Activity context) { AppContext ac = (AppContext)context.getApplicationContext(); if(!ac.isLogin()){ showLoginDialog(context); }else{ Intent intent = new Intent(context, UserInfo.class); context.startActivity(intent); } } /** * 显示用户动态 * @param context * @param uid * @param hisuid * @param hisname */ public static void showUserCenter(Context context, int hisuid, String hisname) { Intent intent = new Intent(context, UserCenter.class); intent.putExtra("his_id", hisuid); intent.putExtra("his_name", hisname); context.startActivity(intent); } /** * 显示用户收藏夹 * @param context */ public static void showUserFavorite(Context context) { Intent intent = new Intent(context, UserFavorite.class); context.startActivity(intent); } /** * 显示用户好友 * @param context */ public static void showUserFriend(Context context, int friendType, int followers, int fans) { Intent intent = new Intent(context, UserFriend.class); intent.putExtra("friend_type", friendType); intent.putExtra("friend_followers", followers); intent.putExtra("friend_fans", fans); context.startActivity(intent); } /** * 加载显示用户头像 * @param imgFace * @param faceURL */ public static void showUserFace(final ImageView imgFace,final String faceURL) { showLoadImage(imgFace,faceURL,imgFace.getContext().getString(R.string.msg_load_userface_fail)); } /** * 加载显示图片 * @param imgFace * @param faceURL * @param errMsg */ public static void showLoadImage(final ImageView imgView,final String imgURL,final String errMsg) { //读取本地图片 if(StringUtils.isEmpty(imgURL) || imgURL.endsWith("portrait.gif")){ Bitmap bmp = BitmapFactory.decodeResource(imgView.getResources(), R.drawable.widget_dface); imgView.setImageBitmap(bmp); return; } //是否有缓存图片 final String filename = FileUtils.getFileName(imgURL); //Environment.getExternalStorageDirectory();返回/sdcard String filepath = imgView.getContext().getFilesDir() + File.separator + filename; File file = new File(filepath); if(file.exists()){ Bitmap bmp = ImageUtils.getBitmap(imgView.getContext(), filename); imgView.setImageBitmap(bmp); return; } //从网络获取&写入图片缓存 String _errMsg = imgView.getContext().getString(R.string.msg_load_image_fail); if(!StringUtils.isEmpty(errMsg)) _errMsg = errMsg; final String ErrMsg = _errMsg; final Handler handler = new Handler(){ public void handleMessage(Message msg) { if(msg.what==1 && msg.obj != null){ imgView.setImageBitmap((Bitmap)msg.obj); try { //写图片缓存 ImageUtils.saveImage(imgView.getContext(), filename, (Bitmap)msg.obj); } catch (IOException e) { e.printStackTrace(); } }else{ ToastMessage(imgView.getContext(), ErrMsg); } } }; new Thread(){ public void run() { Message msg = new Message(); try { Bitmap bmp = ApiClient.getNetBitmap(imgURL); msg.what = 1; msg.obj = bmp; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } handler.sendMessage(msg); } }.start(); } /** * url跳转 * @param context * @param url */ public static void showUrlRedirect(Context context, String url){ URLs urls = URLs.parseURL(url); if(urls != null){ showLinkRedirect(context, urls.getObjType(), urls.getObjId(), urls.getObjKey()); }else{ openBrowser(context, url); } } public static void showLinkRedirect(Context context, int objType, int objId, String objKey){ switch (objType) { case URLs.URL_OBJ_TYPE_NEWS: showNewsDetail(context, objId); break; case URLs.URL_OBJ_TYPE_QUESTION: showQuestionDetail(context, objId); break; case URLs.URL_OBJ_TYPE_QUESTION_TAG: showQuestionListByTag(context, objKey); break; case URLs.URL_OBJ_TYPE_SOFTWARE: showSoftwareDetail(context, objKey); break; case URLs.URL_OBJ_TYPE_ZONE: showUserCenter(context, objId, objKey); break; case URLs.URL_OBJ_TYPE_TWEET: showTweetDetail(context, objId); break; case URLs.URL_OBJ_TYPE_BLOG: showBlogDetail(context, objId); break; case URLs.URL_OBJ_TYPE_OTHER: openBrowser(context, objKey); break; } } /** * 打开浏览器 * @param context * @param url */ public static void openBrowser(Context context, String url){ try { Uri uri = Uri.parse(url); Intent it = new Intent(Intent.ACTION_VIEW, uri); context.startActivity(it); } catch (Exception e) { e.printStackTrace(); ToastMessage(context, "无法浏览此网页", 500); } } /** * 获取webviewClient对象 * @return */ public static WebViewClient getWebViewClient(){ return new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view,String url) { showUrlRedirect(view.getContext(), url); return true; } }; } /** * 获取TextWatcher对象 * @param context * @param tmlKey * @return */ public static TextWatcher getTextWatcher(final Activity context, final String temlKey) { return new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { //保存当前EditText正在编辑的内容 ((AppContext)context.getApplication()).setProperty(temlKey, s.toString()); } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void afterTextChanged(Editable s) {} }; } /** * 编辑器显示保存的草稿 * @param context * @param editer * @param temlKey */ public static void showTempEditContent(Activity context, EditText editer, String temlKey) { String tempContent = ((AppContext)context.getApplication()).getProperty(temlKey); if(!StringUtils.isEmpty(tempContent)) { SpannableStringBuilder builder = parseFaceByText(context, tempContent); editer.setText(builder); editer.setSelection(tempContent.length());//设置光标位置 } } /** * 将[12]之类的字符串替换为表情 * @param context * @param content */ public static SpannableStringBuilder parseFaceByText(Context context, String content) { SpannableStringBuilder builder = new SpannableStringBuilder(content); Matcher matcher = facePattern.matcher(content); while (matcher.find()) { //使用正则表达式找出其中的数字 int position = StringUtils.toInt(matcher.group(1)); int resId = 0; try { if(position > 65 && position < 102) position = position-1; else if(position > 102) position = position-2; resId = GridViewFaceAdapter.getImageIds()[position]; Drawable d = context.getResources().getDrawable(resId); d.setBounds(0, 0, 35, 35);//设置表情图片的显示大小 ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM); builder.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } catch (Exception e) { } } return builder; } /** * 清除文字 * @param cont * @param editer */ public static void showClearWordsDialog(final Context cont, final EditText editer, final TextView numwords) { AlertDialog.Builder builder = new AlertDialog.Builder(cont); builder.setTitle(R.string.clearwords); builder.setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //清除文字 editer.setText(""); numwords.setText("160"); } }); builder.setNegativeButton(R.string.cancle, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } /** * 发送通知广播 * @param context * @param notice */ public static void sendBroadCast(Context context, Notice notice){ if(!((AppContext)context.getApplicationContext()).isLogin() || notice==null) return; Intent intent = new Intent("net.oschina.app.action.APPWIDGET_UPDATE"); intent.putExtra("atmeCount", notice.getAtmeCount()); intent.putExtra("msgCount", notice.getMsgCount()); intent.putExtra("reviewCount", notice.getReviewCount()); intent.putExtra("newFansCount", notice.getNewFansCount()); context.sendBroadcast(intent); } /** * 发送广播-发布动弹 * @param context * @param notice */ public static void sendBroadCastTweet(Context context, int what, Result res, Tweet tweet){ if(res==null && tweet==null) return; Intent intent = new Intent("net.oschina.app.action.APP_TWEETPUB"); intent.putExtra("MSG_WHAT", what); if(what == 1) intent.putExtra("RESULT", res); else intent.putExtra("TWEET", tweet); context.sendBroadcast(intent); } /** * 组合动态的动作文本 * @param objecttype * @param objectcatalog * @param objecttitle * @return */ public static SpannableString parseActiveAction(String author,int objecttype,int objectcatalog,String objecttitle){ String title = ""; int start = 0; int end = 0; if(objecttype==32 && objectcatalog==0){ title = "加入了开源中国"; } else if(objecttype==1 && objectcatalog==0){ title = "添加了开源项目 "+objecttitle; } else if(objecttype==2 && objectcatalog==1){ title = "在讨论区提问:"+objecttitle; } else if(objecttype==2 && objectcatalog==2){ title = "发表了新话题:"+objecttitle; } else if(objecttype==3 && objectcatalog==0){ title = "发表了博客 "+objecttitle; } else if(objecttype==4 && objectcatalog==0){ title = "发表一篇新闻 "+objecttitle; } else if(objecttype==5 && objectcatalog==0){ title = "分享了一段代码 "+objecttitle; } else if(objecttype==6 && objectcatalog==0){ title = "发布了一个职位:"+objecttitle; } else if(objecttype==16 && objectcatalog==0){ title = "在新闻 "+objecttitle+" 发表评论"; } else if(objecttype==17 && objectcatalog==1){ title = "回答了问题:"+objecttitle; } else if(objecttype==17 && objectcatalog==2){ title = "回复了话题:"+objecttitle; } else if(objecttype==17 && objectcatalog==3){ title = "在 "+objecttitle+" 对回帖发表评论"; } else if(objecttype==18 && objectcatalog==0){ title = "在博客 "+objecttitle+" 发表评论"; } else if(objecttype==19 && objectcatalog==0){ title = "在代码 "+objecttitle+" 发表评论"; } else if(objecttype==20 && objectcatalog==0){ title = "在职位 "+objecttitle+" 发表评论"; } else if(objecttype==101 && objectcatalog==0){ title = "回复了动态:"+objecttitle; } else if(objecttype==100){ title = "更新了动态"; } title = author + " " + title; SpannableString sp = new SpannableString(title); //设置用户名字体大小、加粗、高亮 sp.setSpan(new AbsoluteSizeSpan(14,true), 0, author.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, author.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new ForegroundColorSpan(Color.parseColor("#0e5986")), 0, author.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //设置标题字体大小、高亮 if(!StringUtils.isEmpty(objecttitle)){ start = title.indexOf(objecttitle); if(objecttitle.length()>0 && start>0){ end = start + objecttitle.length(); sp.setSpan(new AbsoluteSizeSpan(14,true), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new ForegroundColorSpan(Color.parseColor("#0e5986")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } return sp; } /** * 组合动态的回复文本 * @param name * @param body * @return */ public static SpannableString parseActiveReply(String name,String body){ SpannableString sp = new SpannableString(name+":"+body); //设置用户名字体加粗、高亮 sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new ForegroundColorSpan(Color.parseColor("#0e5986")), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return sp; } /** * 组合消息文本 * @param name * @param body * @return */ public static SpannableString parseMessageSpan(String name,String body,String action){ SpannableString sp = null; int start = 0; int end = 0; if(StringUtils.isEmpty(action)){ sp = new SpannableString(name + ":" + body); end = name.length(); }else{ sp = new SpannableString(action + name + ":" + body); start = action.length(); end = start + name.length(); } //设置用户名字体加粗、高亮 sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new ForegroundColorSpan(Color.parseColor("#0e5986")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return sp; } /** * 组合回复引用文本 * @param name * @param body * @return */ public static SpannableString parseQuoteSpan(String name,String body){ SpannableString sp = new SpannableString("回复:"+name+"\n"+body); //设置用户名字体加粗、高亮 sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 3, 3+name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new ForegroundColorSpan(Color.parseColor("#0e5986")), 3, 3+name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return sp; } /** * 弹出Toast消息 * @param msg */ public static void ToastMessage(Context cont,String msg) { Toast.makeText(cont, msg, Toast.LENGTH_SHORT).show(); } public static void ToastMessage(Context cont,int msg) { Toast.makeText(cont, msg, Toast.LENGTH_SHORT).show(); } public static void ToastMessage(Context cont,String msg,int time) { Toast.makeText(cont, msg, time).show(); } /** * 点击返回监听事件 * @param activity * @return */ public static View.OnClickListener finish(final Activity activity) { return new View.OnClickListener() { public void onClick(View v) { activity.finish(); } }; } /** * 显示关于我们 * @param context */ public static void showAbout(Context context) { Intent intent = new Intent(context, About.class); context.startActivity(intent); } /** * 显示用户反馈 * @param context */ public static void showFeedBack(Context context) { Intent intent = new Intent(context, FeedBack.class); context.startActivity(intent); } /** * 菜单显示登录或登出 * @param activity * @param menu */ public static void showMenuLoginOrLogout(Activity activity,Menu menu) { if(((AppContext)activity.getApplication()).isLogin()){ menu.findItem(R.id.main_menu_user).setTitle(R.string.main_menu_logout); menu.findItem(R.id.main_menu_user).setIcon(R.drawable.ic_menu_logout); }else{ menu.findItem(R.id.main_menu_user).setTitle(R.string.main_menu_login); menu.findItem(R.id.main_menu_user).setIcon(R.drawable.ic_menu_login); } } /** * 快捷栏显示登录与登出 * @param activity * @param qa */ public static void showSettingLoginOrLogout(Activity activity,QuickAction qa) { if(((AppContext)activity.getApplication()).isLogin()){ qa.setIcon(MyQuickAction.buildDrawable(activity, R.drawable.ic_menu_logout)); qa.setTitle(activity.getString(R.string.main_menu_logout)); }else{ qa.setIcon(MyQuickAction.buildDrawable(activity, R.drawable.ic_menu_login)); qa.setTitle(activity.getString(R.string.main_menu_login)); } } /** * 快捷栏是否显示文章图片 * @param activity * @param qa */ public static void showSettingIsLoadImage(Activity activity,QuickAction qa) { if(((AppContext)activity.getApplication()).isLoadImage()){ qa.setIcon(MyQuickAction.buildDrawable(activity, R.drawable.ic_menu_picnoshow)); qa.setTitle(activity.getString(R.string.main_menu_picnoshow)); }else{ qa.setIcon(MyQuickAction.buildDrawable(activity, R.drawable.ic_menu_picshow)); qa.setTitle(activity.getString(R.string.main_menu_picshow)); } } /** * 用户登录或注销 * @param activity */ public static void loginOrLogout(Activity activity) { AppContext ac = (AppContext)activity.getApplication(); if(ac.isLogin()){ ac.Logout(); ToastMessage(activity, "已退出登录"); }else{ showLoginDialog(activity); } } /** * 文章是否加载图片显示 * @param activity */ public static void changeSettingIsLoadImage(Activity activity) { AppContext ac = (AppContext)activity.getApplication(); if(ac.isLoadImage()){ ac.setConfigLoadimage(false); ToastMessage(activity, "已设置文章不加载图片"); }else{ ac.setConfigLoadimage(true); ToastMessage(activity, "已设置文章加载图片"); } } public static void changeSettingIsLoadImage(Activity activity,boolean b) { AppContext ac = (AppContext)activity.getApplication(); ac.setConfigLoadimage(b); } /** * 清除app缓存 * @param activity */ public static void clearAppCache(Activity activity) { final AppContext ac = (AppContext)activity.getApplication(); final Handler handler = new Handler(){ public void handleMessage(Message msg) { if(msg.what==1){ ToastMessage(ac, "缓存清除成功"); }else{ ToastMessage(ac, "缓存清除失败"); } } }; new Thread(){ public void run() { Message msg = new Message(); try { ac.clearAppCache(); msg.what = 1; } catch (Exception e) { e.printStackTrace(); msg.what = -1; } handler.sendMessage(msg); } }.start(); } /** * 发送App异常崩溃报告 * @param cont * @param crashReport */ public static void sendAppCrashReport(final Context cont, final String crashReport) { AlertDialog.Builder builder = new AlertDialog.Builder(cont); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle(R.string.app_error); builder.setMessage(R.string.app_error_message); builder.setPositiveButton(R.string.submit_report, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //发送异常报告 Intent i = new Intent(Intent.ACTION_SEND); //i.setType("text/plain"); //模拟器 i.setType("message/rfc822") ; //真机 i.putExtra(Intent.EXTRA_EMAIL, new String[]{"jxsmallmouse@163.com"}); i.putExtra(Intent.EXTRA_SUBJECT,"开源中国Android客户端 - 错误报告"); i.putExtra(Intent.EXTRA_TEXT,crashReport); cont.startActivity(Intent.createChooser(i, "发送错误报告")); //退出 AppManager.getAppManager().AppExit(cont); } }); builder.setNegativeButton(R.string.sure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //退出 AppManager.getAppManager().AppExit(cont); } }); builder.show(); } /** * 退出程序 * @param cont */ public static void Exit(final Context cont) { AlertDialog.Builder builder = new AlertDialog.Builder(cont); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle(R.string.app_menu_surelogout); builder.setPositiveButton(R.string.sure, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //退出 AppManager.getAppManager().AppExit(cont); } }); builder.setNegativeButton(R.string.cancle, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } }