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.annotation.TargetApi;
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.Build;
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
*/
@TargetApi(Build.VERSION_CODES.ECLAIR)
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();
}
}