package com.xabber.android.ui.fragment; import android.app.Activity; import android.app.DatePickerDialog; import android.app.Fragment; import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.support.annotation.Nullable; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.DatePicker; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupMenu; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.soundcloud.android.crop.Crop; import com.xabber.android.R; import com.xabber.android.data.Application; import com.xabber.android.data.log.LogManager; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.extension.avatar.AvatarManager; import com.xabber.android.data.extension.file.FileManager; import com.xabber.android.data.extension.vcard.OnVCardListener; import com.xabber.android.data.extension.vcard.OnVCardSaveListener; import com.xabber.android.data.extension.vcard.VCardManager; import com.xabber.android.ui.activity.ChatActivity; import com.xabber.android.ui.helper.PermissionsRequester; import com.xabber.xmpp.vcard.AddressProperty; import com.xabber.xmpp.vcard.TelephoneType; import com.xabber.xmpp.vcard.VCardProperty; import org.jivesoftware.smackx.vcardtemp.packet.VCard; import org.jxmpp.jid.Jid; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; public class AccountInfoEditorFragment extends Fragment implements OnVCardSaveListener, OnVCardListener, DatePickerDialog.OnDateSetListener, TextWatcher { public static final String ARGUMENT_ACCOUNT = "com.xabber.android.ui.fragment.AccountInfoEditorFragment.ARGUMENT_ACCOUNT"; public static final String ARGUMENT_VCARD = "com.xabber.android.ui.fragment.AccountInfoEditorFragment.ARGUMENT_USER"; public static final String SAVE_NEW_AVATAR_IMAGE_URI = "com.xabber.android.ui.fragment.AccountInfoEditorFragment.SAVE_NEW_AVATAR_IMAGE_URI"; public static final String SAVE_PHOTO_FILE_URI = "com.xabber.android.ui.fragment.AccountInfoEditorFragment.SAVE_PHOTO_FILE_URI"; public static final String SAVE_REMOVE_AVATAR_FLAG = "com.xabber.android.ui.fragment.AccountInfoEditorFragment.SAVE_REMOVE_AVATAR_FLAG"; public static final int REQUEST_NEED_VCARD = 2; public static final int REQUEST_TAKE_PHOTO = 3; private static final int REQUEST_PERMISSION_GALLERY = 4; public static final int MAX_AVATAR_SIZE_PIXELS = 192; public static final String TEMP_FILE_NAME = "cropped"; public static final String ROTATE_FILE_NAME = "rotated"; public static final int KB_SIZE_IN_BYTES = 1024; public static final String DATE_FORMAT = "yyyy-mm-dd"; public static final String DATE_FORMAT_INT_TO_STRING = "%d-%02d-%02d"; public static final int MAX_IMAGE_SIZE = 512; private VCard vCard; private AccountJid account; private View progressBar; private boolean isSaveSuccess; private Listener listener; private boolean updateFromVCardFlag = true; private TextView account_jid; private LinearLayout fields; private EditText formattedName; private EditText prefixName; private EditText givenName; private EditText middleName; private EditText familyName; private EditText suffixName; private EditText nickName; private EditText title; private EditText role; private EditText organizationUnit; private EditText organization; private EditText url; private EditText description; private EditText emailHome; private EditText emailWork; private EditText phoneHome; private EditText phoneWork; private EditText addressHomePostOfficeBox; private EditText addressHomePostExtended; private EditText addressHomePostStreet; private EditText addressHomeLocality; private EditText addressHomeRegion; private EditText addressHomeCountry; private EditText addressHomePostalCode; private EditText addressWorkPostOfficeBox; private EditText addressWorkPostExtended; private EditText addressWorkPostStreet; private EditText addressWorkLocality; private EditText addressWorkRegion; private EditText addressWorkCountry; private EditText addressWorkPostalCode; private ImageView avatar; private TextView avatarSize; private View changeAvatarButton; private Uri newAvatarImageUri; private Uri photoFileUri; private boolean removeAvatarFlag = false; private TextView birthDate; private DatePickerDialog datePicker; private View birthDateRemoveButton; public interface Listener { void onProgressModeStarted(String message); void onProgressModeFinished(); void enableSave(); } public static AccountInfoEditorFragment newInstance(AccountJid account, String vCard) { AccountInfoEditorFragment fragment = new AccountInfoEditorFragment(); Bundle arguments = new Bundle(); arguments.putParcelable(ARGUMENT_ACCOUNT, account); arguments.putString(ARGUMENT_VCARD, vCard); fragment.setArguments(arguments); return fragment; } public AccountInfoEditorFragment() { } @Override public void onAttach(Activity activity) { super.onAttach(activity); listener = (Listener) activity; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); account = args.getParcelable(ARGUMENT_ACCOUNT); String vCardString = args.getString(ARGUMENT_VCARD, null); if (vCardString != null) { try { vCard = ContactVcardViewerFragment.parseVCard(vCardString); } catch (Exception e) { LogManager.exception(this, e); } } if (savedInstanceState != null) { final String avatarImageUriString = savedInstanceState.getString(SAVE_NEW_AVATAR_IMAGE_URI); if (avatarImageUriString != null) { newAvatarImageUri = Uri.parse(avatarImageUriString); } final String photoFileUriString = savedInstanceState.getString(SAVE_PHOTO_FILE_URI); if (photoFileUriString != null) { photoFileUri = Uri.parse(photoFileUriString); } removeAvatarFlag = savedInstanceState.getBoolean(SAVE_REMOVE_AVATAR_FLAG); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_account_info_editor, container, false); fields = (LinearLayout)view.findViewById(R.id.vcard_fields_layout); progressBar = view.findViewById(R.id.vcard_save_progress_bar); account_jid = (TextView) view.findViewById(R.id.vcard_jid); prefixName = setUpInputField(view, R.id.vcard_prefix_name); formattedName = setUpInputField(view, R.id.vcard_formatted_name); givenName = setUpInputField(view, R.id.vcard_given_name); middleName = setUpInputField(view, R.id.vcard_middle_name); familyName = setUpInputField(view, R.id.vcard_family_name); suffixName = setUpInputField(view, R.id.vcard_suffix_name); nickName = setUpInputField(view, R.id.vcard_nickname); avatar = (ImageView) view.findViewById(R.id.vcard_avatar); avatarSize = (TextView) view.findViewById(R.id.vcard_avatar_size_text_view); changeAvatarButton = view.findViewById(R.id.vcard_change_avatar); changeAvatarButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { changeAvatar(); } } ); birthDate = (TextView) view.findViewById(R.id.vcard_birth_date); birthDate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { datePicker.show(); } }); birthDate.addTextChangedListener(this); birthDateRemoveButton = view.findViewById(R.id.vcard_birth_date_remove_button); birthDateRemoveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setBirthDate(null); } }); title = setUpInputField(view, R.id.vcard_title); role = setUpInputField(view, R.id.vcard_role); organization = setUpInputField(view, R.id.vcard_organization_name); organizationUnit = setUpInputField(view, R.id.vcard_organization_unit); url = setUpInputField(view, R.id.vcard_url); description = setUpInputField(view, R.id.vcard_decsription); phoneHome = setUpInputField(view, R.id.vcard_phone_home); phoneWork = setUpInputField(view, R.id.vcard_phone_work); emailHome = setUpInputField(view, R.id.vcard_email_home); emailWork = setUpInputField(view, R.id.vcard_email_work); addressHomePostOfficeBox = setUpInputField(view, R.id.vcard_address_home_post_office_box); addressHomePostExtended = setUpInputField(view, R.id.vcard_address_home_post_extended); addressHomePostStreet = setUpInputField(view, R.id.vcard_address_home_post_street); addressHomeLocality = setUpInputField(view, R.id.vcard_address_home_locality); addressHomeRegion = setUpInputField(view, R.id.vcard_address_home_region); addressHomeCountry = setUpInputField(view, R.id.vcard_address_home_country); addressHomePostalCode = setUpInputField(view, R.id.vcard_address_home_postal_code); addressWorkPostOfficeBox = setUpInputField(view, R.id.vcard_address_work_post_office_box); addressWorkPostExtended = setUpInputField(view, R.id.vcard_address_work_post_extended); addressWorkPostStreet = setUpInputField(view, R.id.vcard_address_work_post_street); addressWorkLocality = setUpInputField(view, R.id.vcard_address_work_locality); addressWorkRegion = setUpInputField(view, R.id.vcard_address_work_region); addressWorkCountry = setUpInputField(view, R.id.vcard_address_work_country); addressWorkPostalCode = setUpInputField(view, R.id.vcard_address_work_postal_code); setFieldsFromVCard(); return view; } private EditText setUpInputField(View rootView, int resourceId) { EditText inputField = (EditText) rootView.findViewById(resourceId); inputField.addTextChangedListener(this); return inputField; } @Override public void onResume() { super.onResume(); Application.getInstance().addUIListener(OnVCardSaveListener.class, this); Application.getInstance().addUIListener(OnVCardListener.class, this); VCardManager vCardManager = VCardManager.getInstance(); if (vCardManager.isVCardRequested(account.getFullJid()) || vCardManager.isVCardSaveRequested(account)) { enableProgressMode(getString(R.string.saving)); } updateFromVCardFlag = false; } @Override public void onPause() { super.onPause(); Application.getInstance().removeUIListener(OnVCardListener.class, this); Application.getInstance().removeUIListener(OnVCardSaveListener.class, this); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (newAvatarImageUri != null) { outState.putString(SAVE_NEW_AVATAR_IMAGE_URI, newAvatarImageUri.toString()); } if (photoFileUri != null) { outState.putString(SAVE_PHOTO_FILE_URI, photoFileUri.toString()); } outState.putBoolean(SAVE_REMOVE_AVATAR_FLAG, removeAvatarFlag); } @Override public void onDetach() { super.onDetach(); listener = null; } private void setFieldsFromVCard() { account_jid.setText(account.getFullJid().asBareJid().toString()); formattedName.setText(vCard.getField(VCardProperty.FN.name())); prefixName.setText(vCard.getPrefix()); givenName.setText(vCard.getFirstName()); middleName.setText(vCard.getMiddleName()); familyName.setText(vCard.getLastName()); suffixName.setText(vCard.getSuffix()); nickName.setText(vCard.getNickName()); setUpAvatarView(); setBirthDate(vCard.getField(VCardProperty.BDAY.name())); updateDatePickerDialog(); title.setText(vCard.getField(VCardProperty.TITLE.name())); role.setText(vCard.getField(VCardProperty.ROLE.name())); organization.setText(vCard.getOrganization()); organizationUnit.setText(vCard.getOrganizationUnit()); url.setText(vCard.getField(VCardProperty.URL.name())); description.setText(vCard.getField(VCardProperty.DESC.name())); for (TelephoneType telephoneType : TelephoneType.values() ) { String phone = vCard.getPhoneHome(telephoneType.name()); if (phone != null && !phone.isEmpty()) { phoneHome.setText(phone); } } for (TelephoneType telephoneType : TelephoneType.values() ) { String phone = vCard.getPhoneWork(telephoneType.name()); if (phone != null && !phone.isEmpty()) { phoneWork.setText(phone); } } emailHome.setText(vCard.getEmailHome()); emailWork.setText(vCard.getEmailWork()); addressHomePostOfficeBox.setText(vCard.getAddressFieldHome(AddressProperty.POBOX.name())); addressHomePostExtended.setText(vCard.getAddressFieldHome(AddressProperty.EXTADR.name())); addressHomePostStreet.setText(vCard.getAddressFieldHome(AddressProperty.STREET.name())); addressHomeLocality.setText(vCard.getAddressFieldHome(AddressProperty.LOCALITY.name())); addressHomeRegion.setText(vCard.getAddressFieldHome(AddressProperty.REGION.name())); addressHomeCountry.setText(vCard.getAddressFieldHome(AddressProperty.CTRY.name())); addressHomePostalCode.setText(vCard.getAddressFieldHome(AddressProperty.PCODE.name())); addressWorkPostOfficeBox.setText(vCard.getAddressFieldWork(AddressProperty.POBOX.name())); addressWorkPostExtended.setText(vCard.getAddressFieldWork(AddressProperty.EXTADR.name())); addressWorkPostStreet.setText(vCard.getAddressFieldWork(AddressProperty.STREET.name())); addressWorkLocality.setText(vCard.getAddressFieldWork(AddressProperty.LOCALITY.name())); addressWorkRegion.setText(vCard.getAddressFieldWork(AddressProperty.REGION.name())); addressWorkCountry.setText(vCard.getAddressFieldWork(AddressProperty.CTRY.name())); addressWorkPostalCode.setText(vCard.getAddressFieldWork(AddressProperty.PCODE.name())); } public void updateDatePickerDialog() { Calendar calendar = null; String vCardBirthDate = vCard.getField(VCardProperty.BDAY.name()); if (vCardBirthDate != null) { DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.US); Date result = null; try { result = dateFormat.parse(vCardBirthDate); } catch (ParseException e) { LogManager.exception(this, e); } if (result != null) { calendar = new GregorianCalendar(); calendar.setTime(result); } } if (calendar == null) { calendar = Calendar.getInstance(TimeZone.getDefault()); } datePicker = new DatePickerDialog(getActivity(), AccountInfoEditorFragment.this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); datePicker.setCancelable(false); } private void changeAvatar() { PopupMenu menu = new PopupMenu(getActivity(), changeAvatarButton); menu.inflate(R.menu.change_avatar); menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.action_choose_from_gallery: onChooseFromGalleryClick(); return true; case R.id.action_take_photo: onTakePhotoClick(); return true; case R.id.action_remove_avatar: removeAvatar(); return true; default: return false; } } }); menu.show(); } private void onTakePhotoClick() { takePhoto(); } private void onChooseFromGalleryClick() { if (PermissionsRequester.requestFileReadPermissionIfNeeded(this, REQUEST_PERMISSION_GALLERY)) { chooseFromGallery(); } } private void chooseFromGallery() { Crop.pickImage(getActivity()); } private void takePhoto() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { File imageFile = null; try { imageFile = FileManager.createTempImageFile(TEMP_FILE_NAME); } catch (IOException e) { LogManager.exception(this, e); } if (imageFile != null) { photoFileUri = FileManager.getFileUri(imageFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoFileUri); startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); } } } private void removeAvatar() { newAvatarImageUri = null; removeAvatarFlag = true; setUpAvatarView(); listener.enableSave(); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case REQUEST_PERMISSION_GALLERY: if (PermissionsRequester.isPermissionGranted(grantResults)) { chooseFromGallery(); } else { Toast.makeText(getActivity(), R.string.no_permission_to_read_files, Toast.LENGTH_SHORT).show(); } break; } } @Override public void onActivityResult(int requestCode, int resultCode, Intent result) { if (requestCode == Crop.REQUEST_PICK && resultCode == Activity.RESULT_OK) { beginCrop(result.getData()); } else if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) { beginCrop(photoFileUri); } else if (requestCode == Crop.REQUEST_CROP) { handleCrop(resultCode, result); } } private void beginCrop(final Uri source) { newAvatarImageUri = Uri.fromFile(new File(getActivity().getCacheDir(), TEMP_FILE_NAME)); Application.getInstance().runInBackgroundUserRequest(new Runnable() { @Override public void run() { final boolean isImageNeedPreprocess = FileManager.isImageSizeGreater(source, MAX_IMAGE_SIZE) || FileManager.isImageNeedRotation(source); Application.getInstance().runOnUiThread(new Runnable() { @Override public void run() { if (isImageNeedPreprocess) { preprocessAndStartCrop(source); } else { startImageCropActivity(source); } } }); } }); } private void preprocessAndStartCrop(Uri source) { enableProgressMode(getString(R.string.processing_image)); Glide.with(this).load(source).asBitmap().toBytes().override(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE).into(new SimpleTarget<byte[]>() { @Override public void onResourceReady(final byte[] data, GlideAnimation anim) { Application.getInstance().runInBackgroundUserRequest(new Runnable() { @Override public void run() { final Uri rotatedImage = FileManager.saveImage(data, ROTATE_FILE_NAME); if (rotatedImage == null) return; Application.getInstance().runOnUiThread(new Runnable() { @Override public void run() { startImageCropActivity(rotatedImage); disableProgressMode(); } }); } }); } @Override public void onLoadFailed(Exception e, Drawable errorDrawable) { super.onLoadFailed(e, errorDrawable); disableProgressMode(); Toast.makeText(getActivity(), R.string.error_during_image_processing, Toast.LENGTH_SHORT).show(); } }); } private void startImageCropActivity(Uri srcUri) { final Activity activity = getActivity(); if (activity == null) { return; } Crop.of(srcUri, newAvatarImageUri) .asSquare() .withMaxSize(MAX_AVATAR_SIZE_PIXELS, MAX_AVATAR_SIZE_PIXELS) .start(activity); } private void handleCrop(int resultCode, Intent result) { switch (resultCode) { case Activity.RESULT_OK: setUpAvatarView(); break; case Crop.RESULT_ERROR: avatarSize.setVisibility(View.INVISIBLE); Toast.makeText(getActivity(), R.string.error_during_crop, Toast.LENGTH_SHORT).show(); // no break! default: newAvatarImageUri = null; } } private void setUpAvatarView() { if (newAvatarImageUri != null) { // null prompts image view to reload file. avatar.setImageURI(null); avatar.setImageURI(newAvatarImageUri); removeAvatarFlag = false; File file = new File(newAvatarImageUri.getPath()); avatarSize.setText(file.length() / KB_SIZE_IN_BYTES + "KB"); avatarSize.setVisibility(View.VISIBLE); if (listener != null) { listener.enableSave(); } } else if (removeAvatarFlag) { avatar.setImageDrawable(AvatarManager.getInstance().getDefaultAccountAvatar(account)); avatarSize.setVisibility(View.INVISIBLE); } else { avatar.setImageDrawable(AvatarManager.getInstance().getAccountAvatar(account)); avatarSize.setVisibility(View.INVISIBLE); } } String getValueFromEditText(TextView editText) { String trimText = editText.getText().toString().trim(); if (trimText.isEmpty()) { return null; } return trimText; } @Override public void onStop() { super.onStop(); } private void updateVCardFromFields() { vCard.setPrefix(getValueFromEditText(prefixName)); vCard.setFirstName(getValueFromEditText(givenName)); vCard.setMiddleName(getValueFromEditText(middleName)); vCard.setLastName(getValueFromEditText(familyName)); vCard.setSuffix(getValueFromEditText(suffixName)); vCard.setNickName(getValueFromEditText(nickName)); String formattedNameText = getValueFromEditText(formattedName); if (formattedNameText != null) { vCard.setField(VCardProperty.FN.name(), formattedNameText); } if (removeAvatarFlag) { vCard.removeAvatar(); } else if (newAvatarImageUri != null) { try { vCard.setAvatar(new URL(newAvatarImageUri.toString())); } catch (MalformedURLException e) { LogManager.exception(this, e); } } vCard.setField(VCardProperty.BDAY.name(), getValueFromEditText(birthDate)); vCard.setField(VCardProperty.TITLE.name(), getValueFromEditText(title)); vCard.setField(VCardProperty.ROLE.name(), getValueFromEditText(role)); vCard.setOrganization(getValueFromEditText(organization)); vCard.setOrganizationUnit(getValueFromEditText(organizationUnit)); vCard.setField(VCardProperty.URL.name(), getValueFromEditText(url)); vCard.setField(VCardProperty.DESC.name(), getValueFromEditText(description)); vCard.setPhoneHome(TelephoneType.VOICE.name(), getValueFromEditText(phoneHome)); vCard.setPhoneWork(TelephoneType.VOICE.name(), getValueFromEditText(phoneWork)); vCard.setEmailHome(getValueFromEditText(emailHome)); vCard.setEmailWork(getValueFromEditText(emailWork)); vCard.setAddressFieldHome(AddressProperty.POBOX.name(), getValueFromEditText(addressHomePostOfficeBox)); vCard.setAddressFieldHome(AddressProperty.EXTADR.name(), getValueFromEditText(addressHomePostExtended)); vCard.setAddressFieldHome(AddressProperty.STREET.name(), getValueFromEditText(addressHomePostStreet)); vCard.setAddressFieldHome(AddressProperty.LOCALITY.name(), getValueFromEditText(addressHomeLocality)); vCard.setAddressFieldHome(AddressProperty.REGION.name(), getValueFromEditText(addressHomeRegion)); vCard.setAddressFieldHome(AddressProperty.CTRY.name(), getValueFromEditText(addressHomeCountry)); vCard.setAddressFieldHome(AddressProperty.PCODE.name(), getValueFromEditText(addressHomePostalCode)); vCard.setAddressFieldWork(AddressProperty.POBOX.name(), getValueFromEditText(addressWorkPostOfficeBox)); vCard.setAddressFieldWork(AddressProperty.EXTADR.name(), getValueFromEditText(addressWorkPostExtended)); vCard.setAddressFieldWork(AddressProperty.STREET.name(), getValueFromEditText(addressWorkPostStreet)); vCard.setAddressFieldWork(AddressProperty.LOCALITY.name(), getValueFromEditText(addressWorkLocality)); vCard.setAddressFieldWork(AddressProperty.REGION.name(), getValueFromEditText(addressWorkRegion)); vCard.setAddressFieldWork(AddressProperty.CTRY.name(), getValueFromEditText(addressWorkCountry)); vCard.setAddressFieldWork(AddressProperty.PCODE.name(), getValueFromEditText(addressWorkPostalCode)); } public void saveVCard() { ChatActivity.hideKeyboard(getActivity()); updateVCardFromFields(); enableProgressMode(getString(R.string.saving)); VCardManager.getInstance().saveVCard(account, vCard); isSaveSuccess = false; } public void enableProgressMode(String message) { setEnabledRecursive(false, fields); progressBar.setVisibility(View.VISIBLE); if (listener != null) { listener.onProgressModeStarted(message); } } public void disableProgressMode() { progressBar.setVisibility(View.GONE); setEnabledRecursive(true, fields); if (listener != null) { listener.onProgressModeFinished(); } } private void setEnabledRecursive(boolean enabled, ViewGroup viewGroup){ for (int i = 0; i < viewGroup.getChildCount(); i++){ View child = viewGroup.getChildAt(i); child.setEnabled(enabled); if (child instanceof ViewGroup){ setEnabledRecursive(enabled, (ViewGroup) child); } } } @Override public void onVCardSaveSuccess(AccountJid account) { if (!this.account.equals(account)) { return; } enableProgressMode(getString(R.string.saving)); VCardManager.getInstance().request(account, account.getFullJid()); isSaveSuccess = true; } @Override public void onVCardSaveFailed(AccountJid account) { if (!this.account.equals(account)) { return; } disableProgressMode(); listener.enableSave(); Toast.makeText(getActivity(), getString(R.string.account_user_info_save_fail), Toast.LENGTH_LONG).show(); isSaveSuccess = false; } @Override public void onVCardReceived(AccountJid account, Jid bareAddress, VCard vCard) { if (!account.getFullJid().asBareJid().equals(bareAddress.asBareJid())) { return; } if (isSaveSuccess) { Toast.makeText(getActivity(), getString(R.string.account_user_info_save_success), Toast.LENGTH_LONG).show(); isSaveSuccess = false; Intent data = new Intent(); data.putExtra(ARGUMENT_VCARD, vCard.getChildElementXML().toString()); getActivity().setResult(Activity.RESULT_OK, data); getActivity().finish(); } else { disableProgressMode(); this.vCard = vCard; updateFromVCardFlag = true; setFieldsFromVCard(); updateFromVCardFlag = false; } } @Override public void onVCardFailed(AccountJid account, Jid bareAddress) { if (!account.getFullJid().asBareJid().equals(bareAddress.asBareJid())) { return; } if (isSaveSuccess) { Toast.makeText(getActivity(), getString(R.string.account_user_info_save_success), Toast.LENGTH_LONG).show(); isSaveSuccess = false; getActivity().setResult(REQUEST_NEED_VCARD); getActivity().finish(); } } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { setBirthDate(String.format(DATE_FORMAT_INT_TO_STRING, year, monthOfYear + 1, dayOfMonth)); } public void setBirthDate(String date) { birthDate.setText(date); if (date == null) { birthDateRemoveButton.setVisibility(View.INVISIBLE); } else { birthDateRemoveButton.setVisibility(View.VISIBLE); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!updateFromVCardFlag && listener != null) { listener.enableSave(); } } @Override public void afterTextChanged(Editable s) { } }