package net.oschina.app.ui;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import net.oschina.app.AppContext;
import net.oschina.app.AppException;
import net.oschina.app.R;
import net.oschina.app.bean.FriendList;
import net.oschina.app.bean.MyInformation;
import net.oschina.app.bean.Result;
import net.oschina.app.common.FileUtils;
import net.oschina.app.common.ImageUtils;
import net.oschina.app.common.StringUtils;
import net.oschina.app.common.UIHelper;
import net.oschina.app.widget.LoadingDialog;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* 用户资料
* @author liux (http://my.oschina.net/liux)
* @version 1.0
* @created 2012-3-21
*/
public class UserInfo extends BaseActivity{
private ImageView back;
private ImageView refresh;
private ImageView face;
private ImageView gender;
private Button editer;
private TextView name;
private TextView jointime;
private TextView from;
private TextView devplatform;
private TextView expertise;
private TextView followers;
private TextView fans;
private TextView favorites;
private LinearLayout favorites_ll;
private LinearLayout followers_ll;
private LinearLayout fans_ll;
private LoadingDialog loading;
private MyInformation user;
private Handler mHandler;
private final static int CROP = 200;
private final static String FILE_SAVEPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/OSChina/Portrait/";
private Uri origUri;
private Uri cropUri;
private File protraitFile;
private Bitmap protraitBitmap;
private String protraitPath;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_info);
//初始化视图控件
this.initView();
//初始化视图数据
this.initData();
}
private void initView(){
back = (ImageView)findViewById(R.id.user_info_back);
refresh = (ImageView)findViewById(R.id.user_info_refresh);
editer = (Button)findViewById(R.id.user_info_editer);
back.setOnClickListener(UIHelper.finish(this));
refresh.setOnClickListener(refreshClickListener);
editer.setOnClickListener(editerClickListener);
face = (ImageView)findViewById(R.id.user_info_userface);
gender = (ImageView)findViewById(R.id.user_info_gender);
name = (TextView)findViewById(R.id.user_info_username);
jointime = (TextView)findViewById(R.id.user_info_jointime);
from = (TextView)findViewById(R.id.user_info_from);
devplatform = (TextView)findViewById(R.id.user_info_devplatform);
expertise = (TextView)findViewById(R.id.user_info_expertise);
followers = (TextView)findViewById(R.id.user_info_followers);
fans = (TextView)findViewById(R.id.user_info_fans);
favorites = (TextView)findViewById(R.id.user_info_favorites);
favorites_ll = (LinearLayout)findViewById(R.id.user_info_favorites_ll);
followers_ll = (LinearLayout)findViewById(R.id.user_info_followers_ll);
fans_ll = (LinearLayout)findViewById(R.id.user_info_fans_ll);
}
private void initData(){
mHandler = new Handler(){
public void handleMessage(Message msg) {
if(loading != null) loading.dismiss();
if(msg.what == 1 && msg.obj != null){
user = (MyInformation)msg.obj;
//加载用户头像
UIHelper.showUserFace(face, user.getFace());
//用户性别
if(user.getGender() == 1)
gender.setImageResource(R.drawable.widget_gender_man);
else
gender.setImageResource(R.drawable.widget_gender_woman);
//其他资料
name.setText(user.getName());
jointime.setText(StringUtils.friendly_time(user.getJointime()));
from.setText(user.getFrom());
devplatform.setText(user.getDevplatform());
expertise.setText(user.getExpertise());
followers.setText(user.getFollowerscount()+"");
fans.setText(user.getFanscount()+"");
favorites.setText(user.getFavoritecount()+"");
favorites_ll.setOnClickListener(favoritesClickListener);
fans_ll.setOnClickListener(fansClickListener);
followers_ll.setOnClickListener(followersClickListener);
}else if(msg.obj != null){
((AppException)msg.obj).makeToast(UserInfo.this);
}
}
};
this.loadUserInfoThread(false);
}
private void loadUserInfoThread(final boolean isRefresh){
loading = new LoadingDialog(this);
loading.show();
new Thread(){
public void run() {
Message msg = new Message();
try {
MyInformation user = ((AppContext)getApplication()).getMyInformation(isRefresh);
msg.what = 1;
msg.obj = user;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
}
mHandler.sendMessage(msg);
}
}.start();
}
private View.OnClickListener editerClickListener = new View.OnClickListener(){
public void onClick(View v) {
CharSequence[] items = {
getString(R.string.img_from_album),
getString(R.string.img_from_camera)
};
imageChooseItem(items);
}
};
private View.OnClickListener refreshClickListener = new View.OnClickListener(){
public void onClick(View v) {
loadUserInfoThread(true);
}
};
private View.OnClickListener favoritesClickListener = new View.OnClickListener(){
public void onClick(View v) {
UIHelper.showUserFavorite(v.getContext());
}
};
private View.OnClickListener fansClickListener = new View.OnClickListener(){
public void onClick(View v) {
int followers = user!=null ? user.getFollowerscount() : 0;
int fans = user!=null ? user.getFanscount() : 0;
UIHelper.showUserFriend(v.getContext(), FriendList.TYPE_FANS, followers, fans);
}
};
private View.OnClickListener followersClickListener = new View.OnClickListener(){
public void onClick(View v) {
int followers = user!=null ? user.getFollowerscount() : 0;
int fans = user!=null ? user.getFanscount() : 0;
UIHelper.showUserFriend(v.getContext(), FriendList.TYPE_FOLLOWER, followers, fans);
}
};
/**
* 操作选择
* @param items
*/
public void imageChooseItem(CharSequence[] items )
{
AlertDialog imageDialog = new AlertDialog.Builder(this).setTitle("上传头像").setIcon(android.R.drawable.btn_star).setItems(items,
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int item)
{
//判断是否挂载了SD卡
String storageState = Environment.getExternalStorageState();
if(storageState.equals(Environment.MEDIA_MOUNTED)){
File savedir = new File(FILE_SAVEPATH);
if (!savedir.exists()) {
savedir.mkdirs();
}
}
else{
UIHelper.ToastMessage(UserInfo.this, "无法保存上传的头像,请检查SD卡是否挂载");
return;
}
//输出裁剪的临时文件
String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
//照片命名
String origFileName = "osc_" + timeStamp + ".jpg";
String cropFileName = "osc_crop_" + timeStamp + ".jpg";
//裁剪头像的绝对路径
protraitPath = FILE_SAVEPATH + cropFileName;
protraitFile = new File(protraitPath);
origUri = Uri.fromFile(new File(FILE_SAVEPATH, origFileName));
cropUri = Uri.fromFile(protraitFile);
//相册选图
if(item == 0) {
startActionPickCrop(cropUri);
}
//手机拍照
else if(item == 1){
startActionCamera(origUri);
}
}}).create();
imageDialog.show();
}
/**
* 选择图片裁剪
* @param output
*/
private void startActionPickCrop(Uri output) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
intent.putExtra("output", output);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", CROP);// 输出图片大小
intent.putExtra("outputY", CROP);
startActivityForResult(Intent.createChooser(intent, "选择图片"),ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD);
}
/**
* 相机拍照
* @param output
*/
private void startActionCamera(Uri output) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, output);
startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA);
}
/**
* 拍照后裁剪
* @param data 原始图片
* @param output 裁剪后图片
*/
private void startActionCrop(Uri data, Uri output) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(data, "image/*");
intent.putExtra("output", output);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", CROP);// 输出图片大小
intent.putExtra("outputY", CROP);
startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP);
}
/**
* 上传新照片
*/
private void uploadNewPhoto() {
final Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(loading != null) loading.dismiss();
if(msg.what == 1 && msg.obj != null){
Result res = (Result)msg.obj;
//提示信息
UIHelper.ToastMessage(UserInfo.this, res.getErrorMessage());
if(res.OK()){
//显示新头像
face.setImageBitmap(protraitBitmap);
}
}else if(msg.what == -1 && msg.obj != null){
((AppException)msg.obj).makeToast(UserInfo.this);
}
}
};
if(loading != null){
loading.setLoadText("正在上传头像···");
loading.show();
}
new Thread(){
public void run()
{
//获取头像缩略图
if(!StringUtils.isEmpty(protraitPath) && protraitFile.exists())
{
protraitBitmap = ImageUtils.loadImgThumbnail(protraitPath, 200, 200);
}
if(protraitBitmap != null)
{
Message msg = new Message();
try {
Result res = ((AppContext)getApplication()).updatePortrait(protraitFile);
if(res!=null && res.OK()){
//保存新头像到缓存
String filename = FileUtils.getFileName(user.getFace());
ImageUtils.saveImage(UserInfo.this, filename, protraitBitmap);
}
msg.what = 1;
msg.obj = res;
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
msg.obj = e;
} catch(IOException e) {
e.printStackTrace();
}
handler.sendMessage(msg);
}
};
}.start();
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data)
{
if(resultCode != RESULT_OK) return;
switch(requestCode){
case ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA:
startActionCrop(origUri, cropUri);//拍照后裁剪
break;
case ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD:
case ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP:
uploadNewPhoto();//上传新照片
break;
}
}
}