/** * Wire * Copyright (C) 2016 Wire Swiss GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.waz.zclient.core.api.scala; import com.waz.api.AccentColor; import com.waz.api.CredentialsUpdateListener; import com.waz.api.ImageAsset; import com.waz.api.KindOfAccess; import com.waz.api.KindOfVerification; import com.waz.api.User; import com.waz.api.ZMessagingApi; import com.waz.api.impl.AccentColors; import com.waz.zclient.core.stores.appentry.AppEntryError; import com.waz.zclient.core.stores.profile.ProfileStore; public class ScalaProfileStore extends ProfileStore { public static final String TAG = ScalaProfileStore.class.getName(); private ZMessagingApi zMessagingApi; private final AccentColor[] accentColors; private String myName; private String myEmail; private String myPhoneNumber; private String myUsername; private int myColor; private boolean emailIsVerified; private boolean phoneIsVerified; public ScalaProfileStore(ZMessagingApi zMessagingApi) { this.zMessagingApi = zMessagingApi; accentColors = AccentColors.getColors(); setUser(zMessagingApi.getSelf()); } @Override public void tearDown() { if (selfUser != null) { selfUser.removeUpdateListener(this); selfUser = null; } myName = null; myEmail = null; myPhoneNumber = null; zMessagingApi = null; myUsername = null; emailIsVerified = false; phoneIsVerified = false; } @Override public String getMyName() { return myName; } @Override public void setMyName(String myName) { if (this.myName.equals(myName)) { return; } selfUser.setName(myName); } @Override public String getMyEmail() { return selfUser.getEmail(); } @Override public String getMyPhoneNumber() { return selfUser.getPhone(); } @Override public void setMyPhoneNumber(final String myPhone, final CredentialsUpdateListener credentialsUpdateListener) { selfUser.setPhone(myPhone, credentialsUpdateListener); } @Override public void deleteMyPhoneNumber(CredentialsUpdateListener credentialsUpdateListener) { selfUser.clearPhone(credentialsUpdateListener); } @Override public void setMyEmail(final String email, final CredentialsUpdateListener credentialsUpdateListener) { selfUser.setEmail(email, credentialsUpdateListener); } @Override public void deleteMyEmail(CredentialsUpdateListener credentialsUpdateListener) { selfUser.clearEmail(credentialsUpdateListener); } @Override public void setMyEmailAndPassword(final String email, final String password, final CredentialsUpdateListener credentialsUpdateListener) { selfUser.setPassword(password, new CredentialsUpdateListener() { @Override public void onUpdated() { selfUser.setEmail(email, credentialsUpdateListener); } @Override public void onUpdateFailed(int errorCode, String message, String label) { if (errorCode == AppEntryError.FORBIDDEN.errorCode) { // Ignore error when password is already set selfUser.setEmail(email, credentialsUpdateListener); } else { credentialsUpdateListener.onUpdateFailed(errorCode, message, label); } } }); } @Override public void resendVerificationEmail(String myEmail) { selfUser.resendVerificationEmail(myEmail); } @Override public void resendPhoneVerificationCode(String myPhoneNumber, final ZMessagingApi.PhoneConfirmationCodeRequestListener confirmationListener) { zMessagingApi.requestPhoneConfirmationCode(myPhoneNumber, KindOfAccess.REGISTRATION, confirmationListener); } @Override public User getSelfUser() { return selfUser.getUser(); } @Override public int getAccentColor() { return selfUser.getAccent().getColor(); } @Override public void setAccentColor(Object sender, int myColor) { this.myColor = myColor; // identify color if (accentColors.length <= 0) { return; } AccentColor selectedColor = accentColors[0]; for (AccentColor accentColor : accentColors) { if (myColor == accentColor.getColor()) { selectedColor = accentColor; break; } } selfUser.setAccent(selectedColor); } @Override public void setUserPicture(ImageAsset imageAsset) { selfUser.setPicture(imageAsset); } @Override public boolean hasProfileImage() { return !selfUser.getPicture().isEmpty(); } @Override public boolean isEmailVerified() { return selfUser.isEmailVerified(); } @Override public boolean isPhoneVerified() { return selfUser.isPhoneVerified(); } @Override public void addEmailAndPassword(final String email, final String password, final CredentialsUpdateListener credentialUpdateListener) { selfUser.setPassword(password, new CredentialsUpdateListener() { @Override public void onUpdated() { selfUser.setEmail(email, credentialUpdateListener); } @Override public void onUpdateFailed(int errorCode, String message, String label) { // Edge case where password was set on another device while email/pw // were being added on this one. if (errorCode == AppEntryError.FORBIDDEN.errorCode) { selfUser.setEmail(email, credentialUpdateListener); } else { credentialUpdateListener.onUpdateFailed(AppEntryError.PHONE_ADD_PASSWORD.errorCode, "", AppEntryError.PHONE_ADD_PASSWORD.label); } } }); } @Override public void submitCode(String myPhoneNumber, String code, ZMessagingApi.PhoneNumberVerificationListener verificationListener) { zMessagingApi.verifyPhoneNumber(myPhoneNumber, code, KindOfVerification.VERIFY_ON_UPDATE, verificationListener); } /** * User has been updated in core. */ @Override public void updated() { if (selfUser == null) { return; } if (!selfUser.getName().equals(myName)) { this.myName = selfUser.getName(); notifyNameHasChanged(this, myName); } if (!selfUser.getUsername().equals(myUsername)) { this.myUsername = selfUser.getUsername(); notifyUsernameHasChanged(myUsername); } if (!selfUser.getEmail().equals(myEmail) || selfUser.isEmailVerified() != emailIsVerified) { this.myEmail = selfUser.getEmail(); this.emailIsVerified = selfUser.isEmailVerified(); notifyEmailHasChanged(myEmail, this.emailIsVerified); } if (!selfUser.getPhone().equals(myPhoneNumber) || selfUser.isPhoneVerified() != phoneIsVerified) { this.myPhoneNumber = selfUser.getPhone(); this.phoneIsVerified = selfUser.isPhoneVerified(); notifyPhoneHasChanged(myPhoneNumber, this.phoneIsVerified); } if (selfUser.getAccent().getColor() != myColor) { myColor = selfUser.getAccent().getColor(); notifyMyColorHasChanged(this, myColor); } } }