package com.tencent.weibo.ui;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.BitmapFactory.Options;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.ipcplayer.R;
import com.example.ipcplayer.setting.SettingManager;
import com.example.ipcplayer.setting.SettingManagerFactory;
import com.example.ipcplayer.utils.LogUtil;
import com.example.ipcplayer.utils.StringUtil;
import com.tencent.weibo.api.TAPI;
import com.tencent.weibo.constants.OAuthConstants;
import com.tencent.weibo.oauthv2.OAuthV2;
import com.tencent.weibo.oauthv2.OAuthV2Client;
/**
* 腾讯微博分享界面
*
* @version 1.0
* @data 2012-8-22
*/
public class ShareTencentActivity extends Activity implements TextWatcher, OnClickListener
{
private final static String TAG = "ShareTencentActivity";
/**
* 新闻文本内容
*/
public static final String CONTENT = "content";
/**
* 图片url,是ArrayList,可以包含多张本地图的路径
*/
public static final String EXTRA_PIC_URI = "pic.uri";
/**
* 标题
*/
public static final String EXTRA_TITLE = "title";
/**
* 新闻url
*/
public static final String EXTRA_URL = "url";
/*
* 申请APP KEY的具体介绍,可参见
* http://wiki.open.t.qq.com/index.php/应用接入指引
* http://wiki.open.t.qq.com/index.php/腾讯微博移动应用接入规范#.E6.8E.A5.E5.85.A5.E6.B5.81.E7.A8.8B
*/
//!!!请根据您的实际情况修改!!! 认证成功后浏览器会被重定向到这个url中 必须与注册时填写的一致
private String redirectUri="http://app.news.baidu.com";
//!!!请根据您的实际情况修改!!! 换为您为自己的应用申请到的APP KEY
private String clientId = "801250859";
//!!!请根据您的实际情况修改!!! 换为您为自己的应用申请到的APP SECRET
private String clientSecret="1831bf8cb20b3fadd173340170a50e80";
private final static int REQUEST_AUTH = 2;
/**
* 微博发送成功
*/
private final static int MSG_SHARE_SUCCESS = -1;
/**
* 微博分享失败
*/
private final static int MSG_SHARE_FAIL = -2;
private SettingManager mSettingManager = null;
private TextView mNameTxt = null;
private EditText mContentTxt = null;
private LinearLayout mImageLayout = null;
private TextView mNumTxt = null;
private Button mCloseBtn = null;
private Button mShareBtn = null;
private LoadingView mLoadingView = null;
private TextView mTitleTxt = null;
private TextView mShareToWeiboTxt = null;
private AsyncTask mAddTask = null;
private AsyncTask mAddPicTask = null;
private OAuthV2 oAuthV2;
private ArrayList<String> mPicPaths = new ArrayList<String>();
private ArrayList<String> mShowPaths = new ArrayList<String>();
private ArrayList<Bitmap> mBitmaps = new ArrayList<Bitmap>();
private HashMap<String, RelativeLayout> mHashMap = new HashMap<String, RelativeLayout>();
private String mContent = "";
private String mTitle = "";
private String mUrl = "";
private int mSelected = 0; // 默认选择第一个
private boolean mAutoSend = false;
private int mPreviewImageWidth = 0;
private int mPreviewImageHeight = 0;
private int mPreviewImageGap = 0;
private int mPreviewImageCardWidth = 0;
private int mPreviewImageCardHeight = 0;
private static final int WEIBO_MAX_LENGTH = 140;
private static final int MAX_IMAGE_SIZE = 5; // 最多显示5个图片
private long mForegroundStartTime = 0;
private ShareTencentController mShareTencentController;
private boolean mIsBackFromAuthed = false;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.share_tencent);
getWindow().setBackgroundDrawableResource(R.color.list_bg_color);
mPreviewImageWidth = getResources().getDimensionPixelSize(R.dimen.share_image_preview_width);
mPreviewImageHeight = getResources().getDimensionPixelSize(R.dimen.share_image_preview_height);
mPreviewImageGap = getResources().getDimensionPixelSize(R.dimen.share_image_preview_gap);
mPreviewImageCardWidth = getResources().getDimensionPixelSize(R.dimen.share_image_preview_card_width);
mPreviewImageCardHeight = getResources().getDimensionPixelSize(R.dimen.share_image_preview_card_height);
Intent in = this.getIntent();
mPicPaths = in.getStringArrayListExtra(EXTRA_PIC_URI);
mContent = in.getStringExtra(CONTENT);
mUrl = in.getStringExtra(EXTRA_URL);
mTitle = in.getStringExtra(EXTRA_TITLE);
// 读取设置
mSettingManager = (SettingManager) (SettingManager) SettingManagerFactory.getComponent(getApplicationContext());
String token = mSettingManager.getTencentAccessToken();
oAuthV2=new OAuthV2(redirectUri);
oAuthV2.setClientId(clientId);
oAuthV2.setClientSecret(clientSecret);
//关闭OAuthV2Client中的默认开启的QHttpClient。
OAuthV2Client.getQHttpClient().shutdownConnection();
setupViews();
mContentTxt.setText(buildWeiboContent());
mContentTxt.requestFocus();
mContentTxt.setSelection(0);
if(!StringUtil.isEmpty(token))
{
OAuthV2Client.parseAccessTokenAndOpenId(token, oAuthV2);
if(oAuthV2.getStatus() != 0)
{
goAuth();
}
}
else
{
goAuth();
}
if(mPicPaths.size() == 0)
{
mImageLayout.setVisibility(View.INVISIBLE);
}
else
{
int index = 0;
mImageLayout.setVisibility(View.VISIBLE);
int size = Math.min(MAX_IMAGE_SIZE, mPicPaths.size());
for(int i = 0;i < size; ++i)
{
final String localPath = mPicPaths.get(i);
LogUtil.d("localPath = " + localPath);
if(!StringUtil.isEmpty(localPath))
{
Bitmap bitmap = createBitmap(localPath);
if(bitmap != null)
{
mBitmaps.add(bitmap);
final View view = buildViewByPath(localPath, bitmap, index == mSelected);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(mPreviewImageCardWidth, mPreviewImageCardHeight);
llp.rightMargin = mPreviewImageGap;
view.setLayoutParams(llp);
mImageLayout.addView(view);
mShowPaths.add(localPath);
index ++;
}
}
}
}
mShareTencentController = new ShareTencentController(getApplicationContext(), mHandler);
}
@Override
public void onResume() {
super.onResume();
LogUtil.d(TAG,"onResume....mIsBackFromAuthed: "+mIsBackFromAuthed);
if(mIsBackFromAuthed){
mContentTxt.setSelection(0);
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.showSoftInput(mContentTxt, 0); //显示软键盘
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); //显示软键盘
mIsBackFromAuthed = false;
}
mForegroundStartTime = System.currentTimeMillis();
}
@Override
public void onPause() {
super.onPause();
if (mShareTencentController != null) {
mShareTencentController.setAppForegroundTime(System.currentTimeMillis() - mForegroundStartTime);
}
}
private void goAuth()
{
Intent intent = new Intent(this, AuthTencentActivity.class);//创建Intent,使用WebView让用户授权
intent.putExtra("oauth", oAuthV2);
startActivityForResult(intent, REQUEST_AUTH);
}
private View buildViewByPath(String localPath, Bitmap bitmap, boolean selected)
{
RelativeLayout viewGroup = (RelativeLayout)getLayoutInflater().inflate(R.layout.share_preview_image, null);
viewGroup.setTag(localPath);
viewGroup.setClickable(true);
viewGroup.setOnClickListener(this);
ImageView imageView = (ImageView)viewGroup.findViewById(R.id.image);
imageView.setImageBitmap(bitmap);
ImageView picView = (ImageView)viewGroup.findViewById(R.id.pic);
picView.setVisibility(selected ? View.VISIBLE : View.GONE);
mHashMap.put(localPath, viewGroup);
return viewGroup;
}
private Bitmap createBitmap(String localPath)
{
Options options = new Options();
options.outWidth = mPreviewImageWidth;
options.outHeight = mPreviewImageHeight;
return BitmapFactory.decodeFile(localPath, options);
}
private void setupViews()
{
mTitleTxt = (TextView)findViewById(R.id.title);
// mTitleTxt.setTypeface(TypefaceHelper.getInstance(getApplicationContext()).getTypeface());
mShareToWeiboTxt = (TextView)findViewById(R.id.share_to_weibo);
// mShareToWeiboTxt.setTypeface(TypefaceHelper.getInstance(getApplicationContext()).getTypeface());
mCloseBtn = (Button)findViewById(R.id.close);
mCloseBtn.setOnClickListener(this);
mShareBtn = (Button)findViewById(R.id.share);
mShareBtn.setOnClickListener(this);
mNameTxt = (TextView)findViewById(R.id.name);
// mNameTxt.setTypeface(TypefaceHelper.getInstance(getApplicationContext()).getTypeface());
mNumTxt = (TextView)findViewById(R.id.num);
// mNumTxt.setTypeface(TypefaceHelper.getInstance(getApplicationContext()).getTypeface());
mImageLayout = (LinearLayout)findViewById(R.id.gallery);
mContentTxt = (EditText)findViewById(R.id.content);
// mContentTxt.setTypeface(TypefaceHelper.getInstance(getApplicationContext()).getTypeface());
mContentTxt.addTextChangedListener(this);
mLoadingView = (LoadingView)findViewById(R.id.loading);
mLoadingView.setDefaultImageViewVisible(View.GONE);
mLoadingView.setLoadingText(getString(R.string.weibo_sharing));
mLoadingView.setVisibility(View.GONE);
}
private class AddTask extends AsyncTask<Void, Void, String>
{
private String mContent = null;
public AddTask(String content)
{
mContent = content;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
mLoadingView.startLoading();
}
@Override
protected String doInBackground(Void... params)
{
String content = mContent;
TAPI tAPI= new TAPI(OAuthConstants.OAUTH_VERSION_2_A);
String response = null;
try {
response=tAPI.add(oAuthV2, "json", content, "127.0.0.1");
handleAddReponse(response);
} catch (Exception e) {
e.printStackTrace();
}
tAPI.shutdownConnection();
return response;
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
mLoadingView.startLoading();
if(StringUtil.isEmpty(result))
{
Toast.makeText(getApplicationContext(),
R.string.network_exception, Toast.LENGTH_LONG).show();
return;
}
try
{
handleAddReponse(result);
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
mAddTask = null;
}
}
private void add(String content)
{
if(mAddTask != null)
{
mAddTask.cancel(false);
}
mAddTask = new AddTask(content);
Void[] o = null;
mAddTask.execute(o);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
if(mLoadingView.getVisibility() == View.VISIBLE)
{
if(mAddTask != null)
{
mAddTask.cancel(false);
}
if(mAddPicTask != null)
{
mAddPicTask.cancel(false);
}
mLoadingView.stopLoading();
return true;
}
else
{
return false;
}
}
return false;
}
private void handleAddReponse(String response) throws JSONException
{
JSONObject json = new JSONObject(response);
String errorCode = json.optString("errcode");
final int code = Integer.parseInt(errorCode);
final String msg = json.optString("msg");
final String ret = json.optString("ret");
final int retCode = Integer.parseInt(ret);
if(retCode == 0)
{
// 微博发送成功
runOnUiThread(new Runnable()
{
@Override
public void run() {
Toast.makeText(ShareTencentActivity.this, R.string.share_weibo_success, Toast.LENGTH_LONG).show();
}
});
this.finish();
}
else if(retCode == 3)
{
// 鉴权失败,需要重新授权
runOnUiThread(new Runnable()
{
@Override
public void run() {
Toast.makeText(ShareTencentActivity.this, ShareTencentActivity.this.getString(R.string.need_reauth),
Toast.LENGTH_LONG).show();
mAutoSend = true;
goAuth();
}
});
}
else
{
// 服务端错误
runOnUiThread(new Runnable()
{
@Override
public void run()
{
Toast.makeText(ShareTencentActivity.this, ShareTencentActivity.this.getString(R.string.share_weibo_fail),
Toast.LENGTH_LONG).show();
}
});
}
}
private class AddPicTask extends AsyncTask<Void, Void, String>
{
private String mContent = null;
private String mFilePath = null;
public AddPicTask(String content, String filePath)
{
mContent = content;
mFilePath = filePath;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
mLoadingView.startLoading();
}
@Override
protected String doInBackground(Void... params)
{
String content = mContent;
String filePath = mFilePath;
String response = null;
TAPI tAPI= new TAPI(OAuthConstants.OAUTH_VERSION_2_A);
try {
response = tAPI.addPic(oAuthV2, "json", content, "127.0.0.1", filePath);
} catch (Exception e) {
e.printStackTrace();
}
tAPI.shutdownConnection();
return response;
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
mLoadingView.stopLoading();
if(StringUtil.isEmpty(result))
{
// 网络异常
Toast.makeText(getApplicationContext(),
R.string.network_exception, Toast.LENGTH_LONG).show();
return;
}
try
{
handleAddReponse(result);
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
mAddPicTask = null;
}
}
private void addPic(String content, String filePath)
{
if(mAddPicTask != null)
{
mAddPicTask.cancel(false);
}
mAddPicTask = new AddPicTask(content, filePath);
Void[] o = null;
mAddPicTask.execute(o);
}
@Override
protected void onDestroy()
{
super.onDestroy();
// 回收图片
if(mBitmaps != null && mBitmaps.size() > 0)
{
final int size = mBitmaps.size();
for(int i = 0;i < size; i++)
{
Bitmap bitmap = mBitmaps.get(i);
if(!bitmap.isRecycled())
{
bitmap.recycle();
}
}
}
mBitmaps.clear();
}
private String buildWeiboContent()
{
if(StringUtil.isEmpty(mContent))
{
return " 【" + mTitle + "】" + " " + mUrl + " " + getString(R.string.weibo_share_source);
}
else
{
String suffix = " 【" + mTitle + "】" + " " + mUrl + " " + getString(R.string.weibo_share_source);
int len = suffix.length();
int contentLen = mContent.length();
int diff = len + contentLen - WEIBO_MAX_LENGTH;
if(diff > 0)
{
return mContent.substring(0, contentLen - diff) + suffix;
}
else
{
return mContent + suffix;
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after)
{
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
String mText = mContentTxt.getText().toString();
int len = mText.length();
int color = Color.BLACK;
if (len > WEIBO_MAX_LENGTH) {
color = Color.RED;
}
len = WEIBO_MAX_LENGTH - len;
mNumTxt.setTextColor(color);
mNumTxt.setText(String.valueOf(len));
}
@Override
public void afterTextChanged(Editable s)
{
// TODO Auto-generated method stub
}
private void shareWeibo()
{
mLoadingView.startLoading();
String content = mContentTxt.getText().toString();
if (mShowPaths.size() > 0 && mSelected > -1 && mSelected < mPicPaths.size() &&
!TextUtils.isEmpty(mShowPaths.get(mSelected)))
{
addPic(content, mShowPaths.get(mSelected));
}
else
{
// Just update a text weibo!
add(content);
}
mAutoSend = false;
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.close:
finish();
break;
case R.id.share:
{
if(mContentTxt.getText().length() > WEIBO_MAX_LENGTH){
Toast toast = Toast.makeText(getApplicationContext(),
getString(R.string.content_more_than_140), Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}else{
shareWeibo();
}
}
break;
default:
if(v instanceof RelativeLayout)
{
if(v.getTag() == null)break;
final String localPath = v.getTag().toString();
for(int i = 0;i < mShowPaths.size(); ++i)
{
final String path = mShowPaths.get(i);
RelativeLayout viewGroup = mHashMap.get(path);
if(path.equals(localPath))
{
if(mSelected == i)
{
mSelected = -1;
viewGroup.findViewById(R.id.pic).setVisibility(View.GONE);
}
else
{
mSelected = i;
viewGroup.findViewById(R.id.pic).setVisibility(View.VISIBLE);
}
}
else
{
viewGroup.findViewById(R.id.pic).setVisibility(View.GONE);
}
}
}
break;
}
}
/*
* 通过读取OAuthV2AuthorizeWebView返回的Intent,获取用户授权信息
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
mIsBackFromAuthed = true;
LogUtil.d(TAG, "onActivityResult.....mIsBackFromAuthed: "+mIsBackFromAuthed);
if (requestCode==REQUEST_AUTH)
{
if (resultCode == AuthTencentActivity.RESULT_CODE)
{
oAuthV2=(OAuthV2) data.getExtras().getSerializable("oauth");
if(oAuthV2.getStatus()!=0)
{
//Toast.makeText(getApplicationContext(),"Auth error : " + oAuthV2.getMsg(), Toast.LENGTH_LONG).show();
finish();
}
else
{
Toast.makeText(getApplicationContext(), getString(R.string.auth_weibo_success), Toast.LENGTH_LONG).show();
// 绑定成功
//Toast.makeText(getApplicationContext(),"Auth success : access_token = " + oAuthV2.getAccessToken() +", expires = " + oAuthV2.getExpiresIn(), Toast.LENGTH_LONG).show();
if(mAutoSend)
{
shareWeibo();
mAutoSend = false;
}
}
}
else
{
//Toast.makeText(getApplicationContext(), "Auth cancel", Toast.LENGTH_LONG).show();
finish();
}
}
}
}