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();
}
}