package org.qii.weiciyuan.ui.userinfo; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.UserBean; import org.qii.weiciyuan.dao.show.ShowUserDao; import org.qii.weiciyuan.dao.user.EditMyProfileDao; import org.qii.weiciyuan.support.asyncdrawable.ProfileAvatarReadWorker; import org.qii.weiciyuan.support.database.AccountDBTask; import org.qii.weiciyuan.support.error.WeiboException; import org.qii.weiciyuan.support.imageutility.ImageUtility; import org.qii.weiciyuan.support.lib.MyAsyncTask; import org.qii.weiciyuan.support.utils.GlobalContext; import org.qii.weiciyuan.support.utils.Utility; import org.qii.weiciyuan.ui.interfaces.AbstractAppActivity; import org.qii.weiciyuan.ui.main.MainTimeLineActivity; import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.Toast; /** * User: qii * Date: 13-2-28 */ public class EditMyProfileActivity extends AbstractAppActivity implements DialogInterface.OnClickListener { private static final int CAMERA_RESULT = 0; private static final int PIC_RESULT = 1; private UserBean userBean; private Layout layout; private MenuItem save; private ProfileAvatarReadWorker avatarTask; private SaveAsyncTask saveAsyncTask; private NewProfileAvatarReaderWorker newProfileAvatarReaderWorker; private Uri imageFileUri; private String picPath; @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("picPath", picPath); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().setDisplayShowHomeEnabled(false); getActionBar().setDisplayShowTitleEnabled(true); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setTitle(getString(R.string.edit_my_profile)); setContentView(R.layout.editmyprofileactivity_layout); initLayout(); userBean = (UserBean) getIntent().getParcelableExtra("userBean"); initValue(savedInstanceState); } private void initLayout() { layout = new Layout(); layout.avatar = (ImageView) findViewById(R.id.avatar); layout.avatar.setOnClickListener(avatarOnClickListener); layout.nickname = (EditText) findViewById(R.id.nickname); layout.website = (EditText) findViewById(R.id.website); layout.info = (EditText) findViewById(R.id.info); } private View.OnClickListener avatarOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { SelectProfilePictureDialog dialog = new SelectProfilePictureDialog(); dialog.show(getFragmentManager(), ""); } }; private void initValue(Bundle savedInstanceState) { if (savedInstanceState == null || TextUtils .isEmpty(savedInstanceState.getString("picPath"))) { String avatarUrl = userBean.getAvatar_large(); if (!TextUtils.isEmpty(avatarUrl)) { avatarTask = new ProfileAvatarReadWorker(layout.avatar, avatarUrl); avatarTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } else if (!TextUtils.isEmpty(savedInstanceState.getString("picPath"))) { displayPic(); } layout.nickname.setText(userBean.getScreen_name()); layout.nickname.setSelection(layout.nickname.getText().toString().length()); layout.nickname.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { isNicknameEmpty(); } }); layout.website.setText(userBean.getUrl()); layout.info.setText(userBean.getDescription()); } private boolean isNicknameEmpty() { int sum = Utility.length(layout.nickname.getText().toString()); if (sum == 0) { layout.nickname.setError(getString(R.string.nickname_cant_be_empty)); } return sum == 0; } private boolean doesNicknameHaveSpace() { boolean result = layout.nickname.getText().toString().contains(" "); if (result) { layout.nickname.setError(getString(R.string.nickname_cant_have_space)); } return result; } private void save() { if (Utility.isTaskStopped(saveAsyncTask) && !isNicknameEmpty() && !doesNicknameHaveSpace()) { saveAsyncTask = new SaveAsyncTask(); saveAsyncTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: imageFileUri = getContentResolver() .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); if (imageFileUri != null) { Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); if (Utility.isIntentSafe(EditMyProfileActivity.this, i)) { startActivityForResult(i, CAMERA_RESULT); } else { Toast.makeText(EditMyProfileActivity.this, getString(R.string.dont_have_camera_app), Toast.LENGTH_SHORT) .show(); } } else { Toast.makeText(EditMyProfileActivity.this, getString(R.string.cant_insert_album), Toast.LENGTH_SHORT).show(); } break; case 1: Intent choosePictureIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(choosePictureIntent, PIC_RESULT); break; } } protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (resultCode == RESULT_OK) { switch (requestCode) { case CAMERA_RESULT: picPath = Utility.getPicPathFromUri(imageFileUri, this); break; case PIC_RESULT: Uri imageFileUri = intent.getData(); picPath = Utility.getPicPathFromUri(imageFileUri, this); break; } } if (!TextUtils.isEmpty(picPath)) { displayPic(); } } private void displayPic() { if (Utility.isTaskStopped(newProfileAvatarReaderWorker)) { newProfileAvatarReaderWorker = new NewProfileAvatarReaderWorker(); newProfileAvatarReaderWorker.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } private void startSaveAnimation() { LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE); ProgressBar pb = (ProgressBar) inflater .inflate(R.layout.editmyprofileactivity_refresh_actionbar_view_layout, null); save.setActionView(pb); layout.nickname.setEnabled(false); layout.website.setEnabled(false); layout.info.setEnabled(false); layout.avatar.setOnClickListener(null); } private void stopSaveAnimation() { if (save.getActionView() != null) { save.getActionView().clearAnimation(); save.setActionView(null); } layout.nickname.setEnabled(true); layout.website.setEnabled(true); layout.info.setEnabled(true); layout.avatar.setOnClickListener(avatarOnClickListener); } private class SaveAsyncTask extends MyAsyncTask<Void, UserBean, UserBean> { String screenName; String url; String description; WeiboException e; @Override protected void onPreExecute() { super.onPreExecute(); screenName = layout.nickname.getText().toString(); url = layout.website.getText().toString(); description = layout.info.getText().toString(); startSaveAnimation(); } @Override protected UserBean doInBackground(Void... params) { EditMyProfileDao dao = new EditMyProfileDao( GlobalContext.getInstance().getSpecialToken(), screenName); dao.setUrl(url); dao.setDescription(description); dao.setAvatar(picPath); try { return dao.update(); } catch (WeiboException e) { this.e = e; e.printStackTrace(); cancel(true); } return null; } /** * sina weibo have a bug, after modify your profile, the return UserBean object dont have * large avatar url * so must refresh to get actual data; */ @Override protected void onPostExecute(UserBean userBean) { super.onPostExecute(userBean); if (userBean != null) { Toast.makeText(EditMyProfileActivity.this, R.string.edit_successfully, Toast.LENGTH_SHORT).show(); new RefreshTask().executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } @Override protected void onCancelled(UserBean userBean) { super.onCancelled(userBean); if (this.e != null) { Toast.makeText(EditMyProfileActivity.this, e.getError(), Toast.LENGTH_SHORT).show(); } stopSaveAnimation(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.actionbar_menu_editmyprofileactivity, menu); save = menu.findItem(R.id.menu_save); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent; switch (item.getItemId()) { case android.R.id.home: intent = MainTimeLineActivity.newIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); return true; case R.id.menu_save: save(); return true; } return false; } private class Layout { ImageView avatar; EditText nickname; EditText website; EditText info; } private class NewProfileAvatarReaderWorker extends MyAsyncTask<String, Integer, Bitmap> { @Override protected Bitmap doInBackground(String... url) { if (isCancelled()) { return null; } int avatarWidth = getResources().getDimensionPixelSize(R.dimen.profile_avatar_width); int avatarHeight = getResources().getDimensionPixelSize(R.dimen.profile_avatar_height); return ImageUtility.getRoundedCornerPic(picPath, avatarWidth, avatarHeight); } @Override protected void onPostExecute(Bitmap bitmap) { if (bitmap != null) { layout.avatar.setImageBitmap(bitmap); } else { layout.avatar.setImageDrawable(new ColorDrawable(Color.TRANSPARENT)); } } } private class RefreshTask extends MyAsyncTask<Object, UserBean, UserBean> { WeiboException e; @Override protected UserBean doInBackground(Object... params) { UserBean user = null; try { ShowUserDao dao = new ShowUserDao(GlobalContext.getInstance().getSpecialToken()); dao.setUid(GlobalContext.getInstance().getAccountBean().getUid()); user = dao.getUserInfo(); } catch (WeiboException e) { this.e = e; cancel(true); } if (user != null) { AccountDBTask.updateMyProfile(GlobalContext.getInstance().getAccountBean(), user); } else { cancel(true); } return user; } @Override protected void onCancelled(UserBean userBean) { super.onCancelled(userBean); Toast.makeText(EditMyProfileActivity.this, e.getError(), Toast.LENGTH_SHORT).show(); stopSaveAnimation(); } @Override protected void onPostExecute(UserBean userBean) { super.onPostExecute(userBean); stopSaveAnimation(); GlobalContext.getInstance().updateUserInfo(userBean); finish(); } } }