package net.oschina.gitapp.ui; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.os.Message; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import net.oschina.gitapp.AppContext; import net.oschina.gitapp.AppException; import net.oschina.gitapp.R; import net.oschina.gitapp.bean.URLs; import net.oschina.gitapp.bean.UpLoadFile; import net.oschina.gitapp.bean.User; import net.oschina.gitapp.common.BroadcastController; import net.oschina.gitapp.common.FileUtils; import net.oschina.gitapp.common.ImageUtils; import net.oschina.gitapp.common.StringUtils; import net.oschina.gitapp.common.UIHelper; import net.oschina.gitapp.ui.baseactivity.BaseActionBarActivity; /** * 用户信息详情页面 * @created 2014-07-01 * @author 火蚁(http://my.oschina.net/LittleDY) * */ public class MySelfInfoActivity extends BaseActionBarActivity implements View.OnClickListener { private final static String FILE_SAVEPATH = Environment .getExternalStorageDirectory().getAbsolutePath() + "/OSChina/Git/Portrait/"; private final static int CROP = 200; private Uri origUri; private Uri cropUri; private File protraitFile; private Bitmap protraitBitmap; private String protraitPath; private User mUser; private ImageView mUserFace; private TextView mUserName; private Button mEditFace; private View mFollowersLL; private TextView mFollowers; private View mStarredLL; private TextView mStarred; private View mFolloweringLL; private TextView mFollowering; private View mWatchedLL; private TextView mWatched; private TextView mJoinTime; private TextView mWeiBo; private TextView mBlog; private TextView mIntro; private Button mLoginOut; private AppContext mAppContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_myselfinfo_detail); mAppContext = getGitApplication(); initView(); initData(); } private void initView() { mUserFace = (ImageView) findViewById(R.id.user_info_userface); mUserName = (TextView) findViewById(R.id.user_info_username); mEditFace = (Button) findViewById(R.id.user_info_editer); mFollowersLL = findViewById(R.id.user_info_followers_ll); mFollowers = (TextView) findViewById(R.id.user_info_followers); mStarredLL = findViewById(R.id.user_info_starred_ll); mStarred = (TextView) findViewById(R.id.user_info_starred); mFolloweringLL = findViewById(R.id.user_info_following_ll); mFollowering = (TextView) findViewById(R.id.user_info_following); mWatchedLL = findViewById(R.id.user_info_watched_ll); mWatched = (TextView) findViewById(R.id.user_info_watched); mJoinTime = (TextView) findViewById(R.id.user_info_jointime); mWeiBo = (TextView) findViewById(R.id.user_info_weibo); mBlog = (TextView) findViewById(R.id.user_info_blog); mIntro = (TextView) findViewById(R.id.user_info_intro); mLoginOut = (Button) findViewById(R.id.user_info_logout); mEditFace.setOnClickListener(this); // mFollowersLL.setOnClickListener(this); // mStarredLL.setOnClickListener(this); // mFolloweringLL.setOnClickListener(this); // mWatchedLL.setOnClickListener(this); mLoginOut.setOnClickListener(this); } private void initData() { mUser = getGitApplication().getLoginInfo(); if (mUser != null) { mUserName.setText(mUser.getName()); mJoinTime.setText(mUser.getCreated_at().substring(0, 10)); if (mUser.getWeibo().equals("null")) { } else { mWeiBo.setText(mUser.getWeibo()); } if (mUser.getBlog().equals("null")) { } else { mBlog.setText(mUser.getBlog()); } if (mUser.getBio().equals("null")) { } else { mIntro.setText(mUser.getBio()); } String portrait = mUser.getPortrait() == null || mUser.getPortrait().equals("null") ? "" : mUser.getPortrait(); if (portrait.endsWith("portrait.gif") || StringUtils.isEmpty(portrait)) { mUserFace.setImageResource(R.drawable.widget_dface); } else { // 加载用户头像 String faceUrl = URLs.HTTPS + URLs.HOST + URLs.URL_SPLITTER + mUser.getPortrait(); UIHelper.showUserFace(mUserFace, faceUrl); } mFollowers.setText(mUser.getFollow().getFollowers() + ""); mStarred.setText(mUser.getFollow().getStarred() + ""); mFollowering.setText(mUser.getFollow().getFollowing() + ""); mWatched.setText(mUser.getFollow().getWatched() + ""); } } @Override public void onClick(View v) { int id = v.getId(); switch (id) { // 编辑用户头像 case R.id.user_info_editer: CharSequence[] items = { getString(R.string.img_from_album), getString(R.string.img_from_camera) }; imageChooseItem(items); break; case R.id.user_info_logout: loginOut(); break; // 其他 default: break; } } private void loginOut() { getGitApplication().loginout(); BroadcastController.sendUserChangeBroadcase(getGitApplication()); this.finish(); } private 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); } // 拍照保存的绝对路径 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(getGitApplication(), "无法保存上传的头像,请检查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; } // 裁剪头像的绝对路径 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(getGitApplication(), "无法保存上传的头像,请检查SD卡是否挂载"); return null; } String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss") .format(new Date()); String thePath = ImageUtils.getAbsolutePathFromNoStandardUri(uri); // 如果是标准Uri if (StringUtils.isEmpty(thePath)) { thePath = ImageUtils.getAbsoluteImagePath(MySelfInfoActivity.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; } /** * 拍照后裁剪 * * @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 ProgressDialog dialog = new ProgressDialog(getActivity()); dialog.setCanceledOnTouchOutside(false); dialog.setMessage("正在上传头像..."); new AsyncTask<Void, Void, Message>() { @Override protected void onPreExecute() { super.onPreExecute(); dialog.show(); } @Override protected void onPostExecute(Message msg) { super.onPostExecute(msg); dialog.dismiss(); if (msg.what == 1) { UpLoadFile file = (UpLoadFile) msg.obj; if (file == null) { Log.i("Test", "返回的结果为空"); } //UIHelper.ToastMessage(mAppContext, file.getMsg()); mUserFace.setImageBitmap(protraitBitmap); } else { UIHelper.ToastMessage(getGitApplication(), "上次头像失败"); } } @Override protected Message doInBackground(Void... params) { Message msg = new Message(); // 获取头像缩略图 if (!StringUtils.isEmpty(protraitPath) && protraitFile.exists()) { protraitBitmap = ImageUtils.loadImgThumbnail(protraitPath, 200, 200); } else { UIHelper.ToastMessage(getActivity(), "图像不存在"); } if (protraitBitmap != null && protraitFile != null) { try { UpLoadFile file = mAppContext.upLoad(protraitFile); msg.what = 1; msg.obj = file; } catch (AppException e) { dialog.dismiss(); msg.what = -1; msg.obj = e; } } return msg; } }.execute(); } @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; } } }