package net.dev123.yibo; import java.io.File; import java.util.Arrays; import java.util.Date; import net.dev123.commons.util.DateTimeUtil; import net.dev123.commons.util.StringUtil; import net.dev123.mblog.entity.User; import net.dev123.yibo.common.CompatibilityUtil; import net.dev123.yibo.common.Constants; import net.dev123.yibo.common.FileModifiedTimeComparator; import net.dev123.yibo.common.GlobalResource; import net.dev123.yibo.common.GlobalVars; import net.dev123.yibo.common.ResourceBook; import net.dev123.yibo.common.theme.Theme; import net.dev123.yibo.common.theme.ThemeUtil; import net.dev123.yibo.db.LocalAccount; import net.dev123.yibo.service.listener.EditMicroBlogCameraClickListener; import net.dev123.yibo.service.listener.ProfileTextWatcher; import net.dev123.yibo.service.task.ImageLoad4HeadTask; import net.dev123.yibo.service.task.UpdateProfilePhotoTask; import net.dev123.yibo.service.task.UpdateProfileTask; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; public class ProfileEditActivity extends BaseActivity { private static final String TAG = ProfileEditActivity.class.getSimpleName(); private User user; private boolean updateSuccess; private TextView tvScreenName; private ImageView ivVerify; private TextView tvImpress; private EditText etScreenName; private EditText etDescription; private ProfileTextWatcher profileTextWatcher; private String imagePath; private YiBoApplication yibo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.profile_edit); if (getIntent().hasExtra("USER")) { this.user = (User)getIntent().getSerializableExtra("USER"); } else { this.finish(); } this.yibo = (YiBoApplication) getApplication(); restoreFromInstanceState(savedInstanceState); initComponents(); bindEvent(); updateViewContent(); } private void initComponents() { LinearLayout llHeaderBase = (LinearLayout)findViewById(R.id.llHeaderBase); ThemeUtil.setSecondaryHeader(llHeaderBase); //个人资料头部 LinearLayout llProfileHeader = (LinearLayout)findViewById(R.id.llProfileHeader); tvScreenName = (TextView)findViewById(R.id.tvScreenName); ivVerify = (ImageView)findViewById(R.id.ivVerify); tvImpress = (TextView)findViewById(R.id.tvImpress); ThemeUtil.setHeaderProfile(llProfileHeader); Theme theme = ThemeUtil.createTheme(this); tvScreenName.setTextColor(theme.getColor("highlight")); ivVerify.setImageDrawable(GlobalResource.getIconVerification(this)); tvImpress.setTextColor(theme.getColor("content")); //内容编辑 ScrollView llContentPanel = (ScrollView)findViewById(R.id.llContentPanel); LinearLayout llChangeProfilePhoto = (LinearLayout)findViewById(R.id.llChangeProfilePhoto); ImageView ivProfileEdit = (ImageView)findViewById(R.id.ivProfileEdit); TextView tvProfileEdit = (TextView)findViewById(R.id.tvProfileEdit); etScreenName = (EditText) this.findViewById(R.id.etProfileScreenName); etDescription = (EditText) this.findViewById(R.id.etProfileDescription); llContentPanel.setBackgroundColor(theme.getColor("background_content")); llChangeProfilePhoto.setBackgroundDrawable(theme.getDrawable("selector_btn_action_negative")); ivProfileEdit.setImageDrawable(theme.getDrawable("icon_profile_edit")); tvProfileEdit.setTextColor(theme.getColorStateList("selector_btn_action_negative")); etScreenName.setBackgroundDrawable(theme.getDrawable("selector_input_frame")); int content = theme.getColor("content"); etScreenName.setTextColor(content); etDescription.setBackgroundDrawable(theme.getDrawable("selector_input_frame")); etDescription.setTextColor(content); //工具条 LinearLayout llToolbar = (LinearLayout)findViewById(R.id.llToolbar); Button btnProfileUpdate = (Button)findViewById(R.id.btnProfileUpdate); Button btnProfileReset = (Button)findViewById(R.id.btnProfileReset); llToolbar.setBackgroundDrawable(theme.getDrawable("bg_toolbar")); llToolbar.setGravity(Gravity.CENTER); int padding4 = theme.dip2px(4); llToolbar.setPadding(padding4, padding4, padding4, padding4); ThemeUtil.setBtnActionPositive(btnProfileUpdate); ThemeUtil.setBtnActionNegative(btnProfileReset); profileTextWatcher = new ProfileTextWatcher(this); Button btnFollow = (Button) this.findViewById(R.id.btnFollow); btnFollow.setVisibility(View.INVISIBLE); } private void updateViewContent() { if (user == null) { return; } TextView tvTitle = (TextView) this.findViewById(R.id.tvTitle); tvTitle.setText(user.getScreenName()); tvScreenName.setText(user.getScreenName()); if (user.isVerified()) { ivVerify.setVisibility(View.VISIBLE); } else { ivVerify.setVisibility(View.INVISIBLE); } if (StringUtil.isEmpty(user.getLocation()) || ",".equals(user.getLocation())) { String gender = ResourceBook.getGenderValue(user.getGender(), this); tvImpress.setText(gender); } else { String gender = ResourceBook.getGenderValue(user.getGender(), this); tvImpress.setText(gender + "," + user.getLocation()); } etScreenName.setText(user.getScreenName()); etDescription.setText(user.getDescription()); updateProfileImage(user.getProfileImageUrl()); } private void bindEvent() { Button btnBack = (Button) this.findViewById(R.id.btnBack); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (updateSuccess) { ProfileEditActivity.this.setResult(Constants.RESULT_CODE_SUCCESS); } ProfileEditActivity.this.finish(); } }); final Button btnSubmit = (Button) this.findViewById(R.id.btnProfileUpdate); btnSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new UpdateProfileTask( ProfileEditActivity.this, etScreenName.getText().toString(), etDescription.getText().toString()).execute(); } }); Button btnReset = (Button) this.findViewById(R.id.btnProfileReset); btnReset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { etScreenName.setText(user.getScreenName()); etDescription.setText(user.getDescription()); } }); etScreenName.addTextChangedListener(profileTextWatcher); etDescription.addTextChangedListener(profileTextWatcher); LinearLayout llChangeProfilePhoto = (LinearLayout) findViewById(R.id.llChangeProfilePhoto); llChangeProfilePhoto.setOnClickListener(new EditMicroBlogCameraClickListener(this)); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { Log.d(TAG, "onActivityResult……"); super.onActivityResult(requestCode, resultCode, intent); switch(requestCode) { case Constants.REQUEST_CODE_IMG_SELECTOR: if (resultCode == RESULT_OK) { startImageCropActivity(intent.getData()); } break; case Constants.REQUEST_CODE_CAMERA: if (resultCode != RESULT_OK) { break; } Uri imageUri = null; Bitmap bitmap = null; if (CompatibilityUtil.hasImageCaptureBug()) { Bundle extras = intent.getExtras(); bitmap = (Bitmap) extras.get("data"); //如果以这种方式传递,宽高肯定不大,否则占内存 imagePath = getImageFilePath_CameraBug(); if (StringUtil.isEmpty(imagePath)) { imageUri = saveCameraImage(bitmap); } else { imageUri = Uri.parse(imagePath); } } else { if (intent == null) { Log.v(TAG, "data intent is null!"); } if (StringUtil.isNotEmpty(imagePath)) { imageUri = Uri.fromFile(new File(imagePath)); } } if (imageUri != null) { startImageCropActivity(imageUri); } break; case Constants.REQUEST_CODE_IMAGE_CROP: if (resultCode != RESULT_OK) { break; } String filePath = null; if (StringUtil.isNotEmpty(intent.getAction())) { filePath = getImagePathFromUri(Uri.parse(intent.getAction())); } if (StringUtil.isNotEmpty(filePath)) { new UpdateProfilePhotoTask(ProfileEditActivity.this, new File(filePath)).execute(); } break; default: break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (updateSuccess) { this.setResult(Constants.RESULT_CODE_SUCCESS); } this.finish(); } return super.onKeyUp(keyCode, event); } public void updateUser(User user) { if (user == null) { return; } this.updateSuccess = true; this.user = user; updateViewContent(); yibo.getCurrentAccount().setUser(user); profileTextWatcher.setUser(user); } public void updateProfileImage(String imageUrl) { ImageView ivProfilePicture = (ImageView) this.findViewById(R.id.ivProfilePicture); if (StringUtil.isNotEmpty(imageUrl)) { ImageLoad4HeadTask loadTask = new ImageLoad4HeadTask(ivProfilePicture, imageUrl, false); loadTask.execute(); } } public void setImagePath(String imagePath) { this.imagePath = imagePath; } private void startImageCropActivity(Uri uri) { if (uri != null) { Intent intent = new Intent(); intent.setData(uri); intent.setClass(this, CropImageActivity.class); startActivityForResult(intent, Constants.REQUEST_CODE_IMAGE_CROP); } } private String getImagePathFromUri(Uri uri) { if (uri == null) { return null; } String path = null; Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { path = cursor.getString(columnIndex); //图片文件路径 } cursor.close(); } else { path = uri.toString(); } return path; } /* * 存在照相bug的版本,采用获取最新相机文件夹中最新图片的方法 */ private String getImageFilePath_CameraBug() { String imgPath = ""; File dcimFolder = new File(Constants.DCIM_PATH); if (!dcimFolder.exists()) { return imgPath; } File[] cameraFolders = dcimFolder.listFiles(); if (cameraFolders == null || cameraFolders.length < 1) { return imgPath; } FileModifiedTimeComparator comparator = new FileModifiedTimeComparator(); Arrays.sort(cameraFolders, comparator); File cameraFolder = cameraFolders[0]; if (!cameraFolder.isDirectory()) { return imgPath; } File[] imgFiles = cameraFolder.listFiles(); if (imgFiles == null || imgFiles.length < 1) { return imgPath; } Arrays.sort(imgFiles, comparator); //获取最新拍照的图片文件; File imgFile = imgFiles[0]; imgPath = imgFile.getAbsolutePath(); return imgPath; } private Uri saveCameraImage(Bitmap bitmap) { String name = Constants.PICTURE_NAME_PREFIX + DateTimeUtil.getShortFormat(new Date()) + ".jpg"; ContentResolver resolver = this.getContentResolver(); String uriStr = MediaStore.Images.Media.insertImage(resolver, bitmap, name, null); return Uri.parse(uriStr); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (outState == null) { return; } if (yibo.getCurrentAccount() != null) { outState.putLong(Constants.PREFS_KEY_CURRENT_ACCOUNT, yibo.getCurrentAccount().getAccountId()); } if (StringUtil.isNotEmpty(imagePath)) { outState.putString(Constants.PREFS_KEY_IMAGE_PATH, imagePath); } if (Constants.DEBUG) { Log.v(TAG, "onSaveInstanceState……"); } } private void restoreFromInstanceState(Bundle savedInstanceState) { if (savedInstanceState == null) { return; } if (Constants.DEBUG) { Log.v(TAG, "restoreFromInstanceState……"); } if (savedInstanceState.containsKey(Constants.PREFS_KEY_CURRENT_ACCOUNT)) { long accountId = savedInstanceState.getLong(Constants.PREFS_KEY_CURRENT_ACCOUNT); if (Constants.DEBUG) { Log.v(TAG, "Restore AccountId : " + accountId); } LocalAccount currentAccount = GlobalVars.getAccount(accountId); if (currentAccount != null) { yibo.setCurrentAccount(currentAccount); } } if (savedInstanceState.containsKey(Constants.PREFS_KEY_IMAGE_PATH)) { this.imagePath = savedInstanceState.getString(Constants.PREFS_KEY_IMAGE_PATH); } } public User getUser() { return user; } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop……"); } }