package com.pinthecloud.athere.fragment; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import android.app.Activity; 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.provider.MediaStore.Images.Media; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.pinthecloud.athere.AhGlobalVariable; import com.pinthecloud.athere.R; import com.pinthecloud.athere.activity.SquareListActivity; import com.pinthecloud.athere.dialog.AhAlertListDialog; import com.pinthecloud.athere.exception.AhException; import com.pinthecloud.athere.helper.BlobStorageHelper; import com.pinthecloud.athere.interfaces.AhDialogCallback; import com.pinthecloud.athere.interfaces.AhEntityCallback; import com.pinthecloud.athere.model.AhUser; import com.pinthecloud.athere.util.AsyncChainer; import com.pinthecloud.athere.util.AsyncChainer.Chainable; import com.pinthecloud.athere.util.BitmapUtil; import com.pinthecloud.athere.util.FileUtil; public class BasicProfileFragment extends AhFragment{ private ProgressBar progressBar; private ImageView profileImageView; private Uri imageUri; private Bitmap profileImageBitmap; private Bitmap smallProfileImageBitmap; private TextView nickNameWarningText; private EditText nickNameEditText; private TextView ageText; private TextView genderText; private ImageButton startButton; private boolean isTypedNickName = false; private boolean isTakenProfileImage = false; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View view = inflater.inflate(R.layout.fragment_basic_profile, container, false); AhUser user = userHelper.getMyUserInfo(); findComponent(view); setComponent(user); setEditText(); setButtonEvent(); setProfileImageEvent(); return view; } @Override public void onStart() { super.onStart(); if(!isTakenProfileImage){ profileImageView.setImageResource(R.drawable.profile_edit_profile_default_ico); }else{ profileImageView.setImageBitmap(profileImageBitmap); } } @Override public void onStop() { profileImageView.setImageBitmap(null); super.onStop(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK){ // Get Profile Image from gallery or camera String imagePath = null; switch(requestCode){ case FileUtil.MEDIA_TYPE_GALLERY: imageUri = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(imageUri, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); imagePath = cursor.getString(columnIndex); cursor.close(); break; case FileUtil.MEDIA_TYPE_CAMERA: Uri tempImageUri = null; if(imageUri == null){ if(data == null){ tempImageUri = FileUtil.getLastCaptureBitmapUri(context); } else{ tempImageUri = data.getData(); // Intent pass data as Bitmap if(tempImageUri == null){ Bitmap bitmap = (Bitmap) data.getExtras().get("data"); tempImageUri = FileUtil.getOutputMediaFileUri(FileUtil.MEDIA_TYPE_IMAGE); FileUtil.saveBitmapToFile(context, tempImageUri, bitmap); } } } else{ tempImageUri = imageUri; } imageUri = tempImageUri; imagePath = imageUri.getPath(); break; } // Set Profile Image try { profileImageBitmap = BitmapUtil.decodeInSampleSize(context, imageUri, BitmapUtil.BIG_PIC_SIZE, BitmapUtil.BIG_PIC_SIZE); int width = profileImageBitmap.getWidth(); int height = profileImageBitmap.getHeight(); if(height < width){ profileImageBitmap = BitmapUtil.crop(profileImageBitmap, width/2-height/2, 0, height, height); } else{ profileImageBitmap = BitmapUtil.crop(profileImageBitmap, 0, height/2-width/2, width, width); } int degree = BitmapUtil.getImageOrientation(imagePath); profileImageBitmap = BitmapUtil.rotate(profileImageBitmap, degree); } catch (FileNotFoundException e) { // Do nothing } catch (IOException e) { // Do nothing } isTakenProfileImage = true; startButton.setEnabled(isStartButtonEnable()); if(requestCode == FileUtil.MEDIA_TYPE_CAMERA){ File file = new File(imagePath); file.delete(); } } } @Override public void handleException(final AhException ex) { if(ex.getType().equals(AhException.TYPE.DUPLICATED_NICK_NAME)){ // Restore resources AsyncChainer.clearChain(thisFragment); progressBar.setVisibility(View.GONE); profileImageView.setEnabled(true); nickNameEditText.setEnabled(true); startButton.setEnabled(true); // Show warning text String message = getResources().getString(R.string.duplicated_nick_name_message); nickNameWarningText.setText(message); }else{ super.handleException(ex); } } private void findComponent(View view){ progressBar = (ProgressBar) view.findViewById(R.id.basic_profile_frag_progress_bar); profileImageView = (ImageView) view.findViewById(R.id.basic_profile_frag_profile_image); nickNameWarningText = (TextView) view.findViewById(R.id.basic_profile_frag_nick_name_warning_text); nickNameEditText = (EditText) view.findViewById(R.id.basic_profile_frag_nick_name_text); ageText = (TextView) view.findViewById(R.id.basic_profile_frag_age_text); genderText = (TextView) view.findViewById(R.id.basic_profile_frag_gender_text); startButton = (ImageButton) view.findViewById(R.id.basic_profile_frag_start_button); } private void setComponent(AhUser user){ int age = user.getAge(); String gender = user.getGenderString(context); ageText.setText(""+age); genderText.setText(gender); if(user.isMale()){ genderText.setTextColor(getResources().getColor(R.color.blue_man)); }else{ genderText.setTextColor(getResources().getColor(R.color.brand_red_color_dark)); } } private void setEditText(){ nickNameEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { String nickName = s.toString().trim(); if(nickName.length() < 1){ isTypedNickName = false; }else{ isTypedNickName = true; } startButton.setEnabled(isStartButtonEnable()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); } private void setProfileImageEvent(){ profileImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String title = getResources().getString(R.string.select); String[] list = null; if(isTakenProfileImage){ list = getResources().getStringArray(R.array.profile_image_select_delete_string_array); }else{ list = getResources().getStringArray(R.array.profile_image_select_string_array); } AhDialogCallback[] callbacks = new AhDialogCallback[list.length]; callbacks[0] = new AhDialogCallback() { @Override public void doPositiveThing(Bundle bundle) { // Get image from gallery Intent intent = new Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult(intent, FileUtil.MEDIA_TYPE_GALLERY); } @Override public void doNegativeThing(Bundle bundle) { // Do nothing } }; callbacks[1] = new AhDialogCallback() { @Override public void doPositiveThing(Bundle bundle) { // Get image from camera Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); imageUri = FileUtil.getOutputMediaFileUri(FileUtil.MEDIA_TYPE_IMAGE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, FileUtil.MEDIA_TYPE_CAMERA); } @Override public void doNegativeThing(Bundle bundle) { // Do nothing } }; if(list.length == 3){ callbacks[2] = new AhDialogCallback() { @Override public void doPositiveThing(Bundle bundle) { // Set profile image default profileImageView.setImageResource(R.drawable.profile_edit_profile_default_ico); isTakenProfileImage = false; startButton.setEnabled(isStartButtonEnable()); } @Override public void doNegativeThing(Bundle bundle) { // Do nothing } }; } AhAlertListDialog listDialog = new AhAlertListDialog(title, list, callbacks); listDialog.show(getFragmentManager(), AhGlobalVariable.DIALOG_KEY); } }); } private void setButtonEvent(){ startButton.setEnabled(false); startButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final String nickName = nickNameEditText.getText().toString().trim(); nickNameEditText.setText(nickName); nickNameEditText.setSelection(nickName.length()); /* * Unproper nick name * Show warning message for each situation */ String message = app.checkNickName(nickName); if(!message.equals("")){ nickNameWarningText.setText(message); return; } /* * Proper nick name * Show progress bar * Disable UI components for preventing double click * Save this setting and go to next activity */ progressBar.setVisibility(View.VISIBLE); progressBar.bringToFront(); profileImageView.setEnabled(false); nickNameEditText.setEnabled(false); startButton.setEnabled(false); nickNameWarningText.setText(""); AsyncChainer.asyncChain(thisFragment, new Chainable(){ @Override public void doNext(AhFragment frag) { userHelper.setMyNickName(nickName) .setChatEnable(true) .setMyChupaEnable(true); AhUser user = userHelper.getMyUserInfo(); userHelper.addUserAsync(thisFragment, user, new AhEntityCallback<AhUser>() { @Override public void onCompleted(AhUser entity) { userHelper.setMyId(entity.getId()) .setLoggedInUser(true); } }); } }, new Chainable() { @Override public void doNext(AhFragment frag) { // Upload big and small profile images AhUser user = userHelper.getMyUserInfo(); smallProfileImageBitmap = BitmapUtil.decodeInSampleSize(profileImageBitmap, BitmapUtil.SMALL_PIC_SIZE, BitmapUtil.SMALL_PIC_SIZE); blobStorageHelper.uploadBitmapAsync(frag, BlobStorageHelper.USER_PROFILE, user.getId(), profileImageBitmap, null); blobStorageHelper.uploadBitmapAsync(frag, BlobStorageHelper.USER_PROFILE, user.getId()+AhGlobalVariable.SMALL, smallProfileImageBitmap, null); } }, new Chainable() { @Override public void doNext(AhFragment frag) { AhUser user = userHelper.getMyUserInfo(); gaHelper.sendEventGA( thisFragment.getClass().getSimpleName(), "CheckGender", user.getGenderString(context)); gaHelper.sendEventGA( thisFragment.getClass().getSimpleName(), "CheckAge", ""+user.getAge()); // Save profile images to internal storage FileUtil.saveBitmapToInternalStorage(app, user.getId(), profileImageBitmap); FileUtil.saveBitmapToInternalStorage(app, user.getId()+AhGlobalVariable.SMALL, smallProfileImageBitmap); // Move to next activity Intent intent = new Intent(context, SquareListActivity.class); startActivity(intent); activity.finish(); } }); } }); } private boolean isStartButtonEnable(){ return isTypedNickName && isTakenProfileImage; } }