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 net.wolfcs.network.RequestManager; 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; import com.android.volley.toolbox.NetworkImageView; /** * 用户资料 * * @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 NetworkImageView 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 = (NetworkImageView) 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; face.setImageUrl(user.getFace(), RequestManager .getRequestManager(getApplicationContext()).getImageLoader()); // 加载用户头像 // 用户性别 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); } }; // 裁剪头像的绝对路径 private Uri getUploadTempFile(Uri uri) { 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 null; } String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String thePath = ImageUtils.getAbsolutePathFromNoStandardUri(uri); // 如果是标准Uri if (StringUtils.isEmpty(thePath)) { thePath = ImageUtils.getAbsoluteImagePath(UserInfo.this, uri); } String ext = FileUtils.getFileFormat(thePath); ext = StringUtils.isEmpty(ext) ? "jpg" : ext; // 照片命名 String cropFileName = "osc_crop_" + timeStamp + "." + ext; // 裁剪头像的绝对路径 protraitPath = FILE_SAVEPATH + cropFileName; protraitFile = new File(protraitPath); cropUri = Uri.fromFile(protraitFile); return this.cropUri; } // 拍照保存的绝对路径 private Uri getCameraTempFile() { 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 null; } String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); // 照片命名 String cropFileName = "osc_camera_" + timeStamp + ".jpg"; // 裁剪头像的绝对路径 protraitPath = FILE_SAVEPATH + cropFileName; protraitFile = new File(protraitPath); cropUri = Uri.fromFile(protraitFile); this.origUri = this.cropUri; return this.cropUri; } /** * 操作选择 * * @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) { // 相册选图 if (item == 0) { startImagePick(); } // 手机拍照 else if (item == 1) { startActionCamera(); } } }).create(); imageDialog.show(); } /** * 选择图片裁剪 * * @param output */ private void startImagePick() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent, "选择图片"), ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP); } /** * 相机拍照 * * @param output */ private void startActionCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, this.getCameraTempFile()); startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYCAMERA); } /** * 拍照后裁剪 * * @param data * 原始图片 * @param output * 裁剪后图片 */ private void startActionCrop(Uri data) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(data, "image/*"); intent.putExtra("output", this.getUploadTempFile(data)); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1);// 裁剪框比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", CROP);// 输出图片大小 intent.putExtra("outputY", CROP); intent.putExtra("scale", true);// 去黑边 intent.putExtra("scaleUpIfNeeded", true);// 去黑边 startActivityForResult(intent, ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD); } /** * 上传新照片 */ 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); } else { loading.setLoadText("图像不存在,上传失败·"); loading.hide(); } 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) { loading.setLoadText("上传出错·"); loading.hide(); msg.what = -1; msg.obj = e; } catch (IOException e) { e.printStackTrace(); } handler.sendMessage(msg); } else { loading.setLoadText("图像不存在,上传失败·"); loading.hide(); } }; }.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);// 拍照后裁剪 break; case ImageUtils.REQUEST_CODE_GETIMAGE_BYCROP: startActionCrop(data.getData());// 选图后裁剪 break; case ImageUtils.REQUEST_CODE_GETIMAGE_BYSDCARD: uploadNewPhoto();// 上传新照片 break; } } }