package im.actor.sdk.controllers.profile; import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SwitchCompat; import android.util.StateSet; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber; import java.util.ArrayList; import im.actor.core.entity.Peer; import im.actor.core.viewmodel.UserEmail; import im.actor.core.viewmodel.UserPhone; import im.actor.core.viewmodel.UserVM; import im.actor.runtime.mvvm.Value; import im.actor.runtime.mvvm.ValueChangedListener; import im.actor.sdk.ActorSDK; import im.actor.sdk.R; import im.actor.sdk.controllers.BaseFragment; import im.actor.sdk.controllers.Intents; import im.actor.sdk.controllers.compose.ComposeActivity; import im.actor.sdk.controllers.fragment.preview.ViewAvatarActivity; import im.actor.sdk.util.Screen; import im.actor.sdk.util.ViewUtils; import im.actor.sdk.view.avatar.AvatarView; import static im.actor.sdk.util.ActorSDKMessenger.messenger; import static im.actor.sdk.util.ActorSDKMessenger.users; public class ProfileFragment extends BaseFragment { public static int SOUND_PICKER_REQUEST_CODE = 122; public static final String EXTRA_UID = "uid"; private View recordFieldWithIcon; public static ProfileFragment create(int uid) { Bundle bundle = new Bundle(); bundle.putInt(EXTRA_UID, uid); ProfileFragment res = new ProfileFragment(); res.setArguments(bundle); return res; } private AvatarView avatarView; private int uid; public ProfileFragment() { setRootFragment(true); setHomeAsUp(true); setTitle(null); } @Override public void onConfigureActionBar(ActionBar actionBar) { super.onConfigureActionBar(actionBar); actionBar.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { uid = getArguments().getInt(EXTRA_UID); final UserVM user = users().get(uid); ArrayList<UserPhone> phones = user.getPhones().get(); ArrayList<UserEmail> emails = user.getEmails().get(); String about = user.getAbout().get(); final String userName = user.getNick().get(); final View res = inflater.inflate(R.layout.fragment_profile, container, false); // // Style Background // res.findViewById(R.id.container).setBackgroundColor(style.getMainBackgroundColor()); res.findViewById(R.id.avatarContainer).setBackgroundColor(style.getToolBarColor()); // // User Avatar // avatarView = (AvatarView) res.findViewById(R.id.avatar); avatarView.init(Screen.dp(48), 22); avatarView.bind(user.getAvatar().get(), user.getName().get(), user.getId()); avatarView.setOnClickListener(v -> { startActivity(ViewAvatarActivity.viewAvatar(user.getId(), getActivity())); }); // // User Name // TextView nameText = (TextView) res.findViewById(R.id.name); nameText.setTextColor(style.getProfileTitleColor()); bind(nameText, user.getName()); // // User Last Seen // TextView lastSeen = (TextView) res.findViewById(R.id.lastSeen); lastSeen.setTextColor(style.getProfileSubtitleColor()); bind(lastSeen, user); // // Fab // FloatingActionButton fab = (FloatingActionButton) res.findViewById(R.id.fab); fab.setBackgroundTintList(new ColorStateList(new int[][]{ new int[]{android.R.attr.state_pressed}, StateSet.WILD_CARD, }, new int[]{ ActorSDK.sharedActor().style.getFabPressedColor(), ActorSDK.sharedActor().style.getFabColor(), })); fab.setRippleColor(ActorSDK.sharedActor().style.getFabPressedColor()); fab.setOnClickListener(v -> startActivity(new Intent(getActivity(), ComposeActivity.class))); // // Remove Contact // final View removeContact = res.findViewById(R.id.addContact); final TextView addContactTitle = (TextView) removeContact.findViewById(R.id.addContactTitle); addContactTitle.setText(getString(R.string.profile_contacts_added)); addContactTitle.setTextColor(style.getTextPrimaryColor()); removeContact.setOnClickListener(v -> { execute(ActorSDK.sharedActor().getMessenger().removeContact(user.getId())); }); bind(user.isContact(), (isContact, valueModel) -> { if (isContact) { removeContact.setVisibility(View.VISIBLE); //fab fab.setImageResource(R.drawable.ic_message_white_24dp); fab.setOnClickListener(view -> startActivity(Intents.openPrivateDialog(user.getId(), true, getActivity()))); } else { removeContact.setVisibility(View.GONE); //fab fab.setImageResource(R.drawable.ic_person_add_white_24dp); fab.setOnClickListener(view -> execute(ActorSDK.sharedActor().getMessenger().addContact(user.getId()))); } }); // // New Message // View newMessageView = res.findViewById(R.id.newMessage); ImageView newMessageIcon = (ImageView) newMessageView.findViewById(R.id.newMessageIcon); TextView newMessageTitle = (TextView) newMessageView.findViewById(R.id.newMessageText); { Drawable drawable = getResources().getDrawable(R.drawable.ic_chat_black_24dp); drawable.mutate().setColorFilter(style.getSettingsIconColor(), PorterDuff.Mode.SRC_IN); newMessageIcon.setImageDrawable(drawable); newMessageTitle.setTextColor(style.getTextPrimaryColor()); } newMessageView.setOnClickListener(v -> { startActivity(Intents.openPrivateDialog(user.getId(), true, getActivity())); }); // // Voice Call // View voiceCallDivider = res.findViewById(R.id.voiceCallDivider); View voiceCallView = res.findViewById(R.id.voiceCall); if (ActorSDK.sharedActor().isCallsEnabled() && !user.isBot()) { ImageView voiceViewIcon = (ImageView) voiceCallView.findViewById(R.id.actionIcon); TextView voiceViewTitle = (TextView) voiceCallView.findViewById(R.id.actionText); Drawable drawable = getResources().getDrawable(R.drawable.ic_phone_white_24dp); drawable.mutate().setColorFilter(style.getSettingsIconColor(), PorterDuff.Mode.SRC_IN); voiceViewIcon.setImageDrawable(drawable); voiceViewTitle.setTextColor(style.getTextPrimaryColor()); voiceCallView.setOnClickListener(v -> { execute(ActorSDK.sharedActor().getMessenger().doCall(user.getId())); }); } else { voiceCallView.setVisibility(View.GONE); voiceCallDivider.setVisibility(View.GONE); } // // Video Call // View videoCallDivider = res.findViewById(R.id.videoCallDivider); View videoCallView = res.findViewById(R.id.videoCall); if (ActorSDK.sharedActor().isCallsEnabled() && !user.isBot()) { ImageView voiceViewIcon = (ImageView) videoCallView.findViewById(R.id.videoCallIcon); TextView voiceViewTitle = (TextView) videoCallView.findViewById(R.id.videoCallText); Drawable drawable = getResources().getDrawable(R.drawable.ic_videocam_white_24dp); drawable.mutate().setColorFilter(style.getSettingsIconColor(), PorterDuff.Mode.SRC_IN); voiceViewIcon.setImageDrawable(drawable); voiceViewTitle.setTextColor(style.getTextPrimaryColor()); videoCallView.setOnClickListener(v -> { execute(ActorSDK.sharedActor().getMessenger().doVideoCall(user.getId())); }); } else { videoCallView.setVisibility(View.GONE); videoCallDivider.setVisibility(View.GONE); } // // Contact Information // final LinearLayout contactsContainer = (LinearLayout) res.findViewById(R.id.contactsContainer); String aboutString = user.getAbout().get(); boolean isFirstContact = aboutString == null || aboutString.isEmpty(); // // About // bind(user.getAbout(), new ValueChangedListener<String>() { private View userAboutRecord; @Override public void onChanged(final String newUserAbout, Value<String> valueModel) { if (newUserAbout != null && newUserAbout.length() > 0) { if (userAboutRecord == null) { userAboutRecord = buildRecordBig(newUserAbout, R.drawable.ic_info_outline_black_24dp, true, false, inflater, contactsContainer); } else { ((TextView) userAboutRecord.findViewById(R.id.value)).setText(newUserAbout); } if (recordFieldWithIcon != null) { recordFieldWithIcon.findViewById(R.id.recordIcon).setVisibility(View.INVISIBLE); } } } }); if (!ActorSDK.sharedActor().isOnClientPrivacyEnabled() || user.isInPhoneBook().get()) { // // Phones // for (int i = 0; i < phones.size(); i++) { final UserPhone userPhone = phones.get(i); // Formatting Phone Number String _phoneNumber; try { Phonenumber.PhoneNumber number = PhoneNumberUtil.getInstance().parse("+" + userPhone.getPhone(), "us"); _phoneNumber = PhoneNumberUtil.getInstance().format(number, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL); } catch (NumberParseException e) { e.printStackTrace(); _phoneNumber = "+" + userPhone.getPhone(); } final String phoneNumber = _phoneNumber; String phoneTitle = userPhone.getTitle(); // "Mobile phone" is default value for non specified title // Trying to localize this if (phoneTitle.toLowerCase().equals("mobile phone")) { phoneTitle = getString(R.string.settings_mobile_phone); } View view = buildRecord(phoneTitle, phoneNumber, R.drawable.ic_import_contacts_black_24dp, isFirstContact, false, inflater, contactsContainer); if (isFirstContact) { recordFieldWithIcon = view; } view.setOnClickListener(v -> { new AlertDialog.Builder(getActivity()) .setItems(new CharSequence[]{ getString(R.string.phone_menu_call).replace("{0}", phoneNumber), getString(R.string.phone_menu_sms).replace("{0}", phoneNumber), getString(R.string.phone_menu_share).replace("{0}", phoneNumber), getString(R.string.phone_menu_copy) }, (dialog, which) -> { if (which == 0) { startActivity(new Intent(Intent.ACTION_DIAL) .setData(Uri.parse("tel:+" + userPhone.getPhone()))); } else if (which == 1) { startActivity(new Intent(Intent.ACTION_VIEW) .setData(Uri.parse("sms:+" + userPhone.getPhone()))); } else if (which == 2) { startActivity(new Intent(Intent.ACTION_SEND) .setType("text/plain") .putExtra(Intent.EXTRA_TEXT, getString(R.string.settings_share_text) .replace("{0}", phoneNumber) .replace("{1}", user.getName().get()))); } else if (which == 3) { ClipboardManager clipboard = (ClipboardManager) getActivity() .getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Phone number", phoneNumber); clipboard.setPrimaryClip(clip); Snackbar.make(res, R.string.toast_phone_copied, Snackbar.LENGTH_SHORT) .show(); } }) .show() .setCanceledOnTouchOutside(true); }); view.setOnLongClickListener(v -> { ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Phone number", "+" + userPhone.getPhone()); clipboard.setPrimaryClip(clip); Snackbar.make(res, R.string.toast_phone_copied, Snackbar.LENGTH_SHORT) .show(); return true; }); isFirstContact = false; } // // Emails // for (int i = 0; i < emails.size(); i++) { final UserEmail userEmail = emails.get(i); View view = buildRecord(userEmail.getTitle(), userEmail.getEmail(), R.drawable.ic_import_contacts_black_24dp, isFirstContact, false, inflater, contactsContainer); if (isFirstContact) { recordFieldWithIcon = view; } view.setOnClickListener(v -> { new AlertDialog.Builder(getActivity()) .setItems(new CharSequence[]{ getString(R.string.email_menu_email).replace("{0}", userEmail.getEmail()), getString(R.string.phone_menu_copy) }, (dialog, which) -> { if (which == 0) { startActivity(new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", userEmail.getEmail(), null))); } else if (which == 1) { ClipboardManager clipboard = (ClipboardManager) getActivity() .getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Email", userEmail.getEmail()); clipboard.setPrimaryClip(clip); Snackbar.make(res, R.string.toast_email_copied, Snackbar.LENGTH_SHORT) .show(); } }) .show() .setCanceledOnTouchOutside(true); }); view.setOnLongClickListener(v -> { ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Email", "+" + userEmail.getEmail()); clipboard.setPrimaryClip(clip); Snackbar.make(res, R.string.toast_email_copied, Snackbar.LENGTH_SHORT) .show(); return true; }); isFirstContact = false; } } // // Username // final boolean finalIsFirstContact = isFirstContact; bind(user.getNick(), new ValueChangedListener<String>() { private View userNameRecord; @Override public void onChanged(final String newUserName, Value<String> valueModel) { if (newUserName != null && newUserName.length() > 0) { if (userNameRecord == null) { userNameRecord = buildRecord(getString(R.string.nickname), "@" + newUserName, R.drawable.ic_import_contacts_black_24dp, finalIsFirstContact, false, inflater, contactsContainer); } else { ((TextView) userNameRecord.findViewById(R.id.value)).setText(newUserName); } userNameRecord.setOnLongClickListener(v -> { ClipboardManager clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Username", newUserName); clipboard.setPrimaryClip(clip); Snackbar.make(res, R.string.toast_nickname_copied, Snackbar.LENGTH_SHORT) .show(); return true; }); if (finalIsFirstContact) { recordFieldWithIcon = userNameRecord; } } } }); // // Settings // { // // Notifications // View notificationContainer = res.findViewById(R.id.notificationsCont); View notificationPickerContainer = res.findViewById(R.id.notificationsPickerCont); ((TextView) notificationContainer.findViewById(R.id.settings_notifications_title)).setTextColor(style.getTextPrimaryColor()); final SwitchCompat notificationEnable = (SwitchCompat) res.findViewById(R.id.enableNotifications); Peer peer = Peer.user(user.getId()); notificationEnable.setChecked(messenger().isNotificationsEnabled(peer)); if (messenger().isNotificationsEnabled(peer)) { ViewUtils.showView(notificationPickerContainer, false); } else { ViewUtils.goneView(notificationPickerContainer, false); } notificationEnable.setOnCheckedChangeListener((buttonView, isChecked) -> { messenger().changeNotificationsEnabled(Peer.user(user.getId()), isChecked); if (isChecked) { ViewUtils.showView(notificationPickerContainer, false); } else { ViewUtils.goneView(notificationPickerContainer, false); } }); notificationContainer.setOnClickListener(v -> notificationEnable.setChecked(!notificationEnable.isChecked())); ImageView iconView = (ImageView) res.findViewById(R.id.settings_notification_icon); Drawable drawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_list_black_24dp)); drawable.mutate(); DrawableCompat.setTint(drawable, style.getSettingsIconColor()); iconView.setImageDrawable(drawable); ((TextView) notificationPickerContainer.findViewById(R.id.settings_notifications_picker_title)).setTextColor(style.getTextPrimaryColor()); notificationPickerContainer.setOnClickListener(view -> { Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); Uri currentSound = null; String defaultPath = null; Uri defaultUri = Settings.System.DEFAULT_NOTIFICATION_URI; if (defaultUri != null) { defaultPath = defaultUri.getPath(); } String path = messenger().getPreferences().getString("userNotificationSound_" + uid); if (path == null) { path = defaultPath; } if (path != null && !path.equals("none")) { if (path.equals(defaultPath)) { currentSound = defaultUri; } else { currentSound = Uri.parse(path); } } intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currentSound); startActivityForResult(intent, SOUND_PICKER_REQUEST_CODE); }); // // Block // View blockContainer = res.findViewById(R.id.blockCont); final TextView blockTitle = (TextView) blockContainer.findViewById(R.id.settings_block_title); blockTitle.setTextColor(style.getTextPrimaryColor()); bind(user.getIsBlocked(), (val, valueModel) -> { blockTitle.setText(val ? R.string.profile_settings_unblock : R.string.profile_settings_block); }); blockContainer.setOnClickListener(v -> { if (!user.getIsBlocked().get()) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(getString(R.string.profile_settings_block_confirm).replace("{user}", user.getName().get())) .setPositiveButton(R.string.dialog_yes, (dialog, which) -> { execute(messenger().blockUser(user.getId())); dialog.dismiss(); }) .setNegativeButton(R.string.dialog_cancel, (dialog, which) -> { dialog.dismiss(); }) .show(); } else { execute(messenger().unblockUser(user.getId())); } }); ImageView blockIconView = (ImageView) res.findViewById(R.id.settings_block_icon); Drawable blockDrawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_block_white_24dp)); drawable.mutate(); DrawableCompat.setTint(blockDrawable, style.getSettingsIconColor()); blockIconView.setImageDrawable(blockDrawable); } // // Scroll Coordinate // final ScrollView scrollView = ((ScrollView) res.findViewById(R.id.scrollContainer)); scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> updateBar(scrollView.getScrollY())); updateBar(scrollView.getScrollY()); return res; } private void checkInfiIcon() { } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && requestCode == SOUND_PICKER_REQUEST_CODE) { Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (ringtone != null) { messenger().getPreferences().putString("userNotificationSound_" + uid, ringtone.toString()); } else { messenger().getPreferences().putString("userNotificationSound_" + uid, "none"); } } } @Override public void onResume() { super.onResume(); messenger().onProfileOpen(uid); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.profile_menu, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { getActivity().finish(); return true; } else if (item.getItemId() == R.id.edit) { startActivity(Intents.editUserName(uid, getActivity())); return true; } else { return super.onOptionsItemSelected(item); } } private void updateBar(int offset) { ActionBar bar = ((AppCompatActivity) getActivity()).getSupportActionBar(); if (bar != null) { int fullColor = style.getToolBarColor(); if (Math.abs(offset) > Screen.dp(248 - 56)) { bar.setBackgroundDrawable(new ColorDrawable(fullColor)); } else { float alpha = Math.abs(offset) / (float) Screen.dp(248 - 56); bar.setBackgroundDrawable(new ColorDrawable(Color.argb( (int) (255 * alpha), Color.red(fullColor), Color.green(fullColor), Color.blue(fullColor) ))); } } } @Override public void onPause() { super.onPause(); messenger().onProfileClosed(uid); } @Override public void onDestroyView() { super.onDestroyView(); if (avatarView != null) { avatarView.unbind(); avatarView = null; } } }