/**
* Copyright (c) 2013, Redsolution LTD. All rights reserved.
*
* This file is part of Xabber project; you can redistribute it and/or
* modify it under the terms of the GNU General Public License, Version 3.
*
* Xabber 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.xabber.android.data.extension.avatar;
import android.content.res.TypedArray;
import com.xabber.android.data.Application;
import com.xabber.android.data.OnLowMemoryListener;
import com.xabber.android.data.entity.UserJid;
import java.util.HashMap;
import java.util.Map;
/**
* Set of default avatars.
* <p/>
* Calculation takes not much time, so we don't use locks.
*
* @author alexander.ivanov
*/
public class BaseAvatarSet implements OnLowMemoryListener {
/**
* Default resources.
*/
private final int[] avatarIconsResources;
private final int[] colors;
/**
* Map with resource ids for specified uses.
*/
private final Map<UserJid, DefaultAvatar> resources;
public static class DefaultAvatar {
public DefaultAvatar(int iconResource, int backgroundColor) {
this.iconResource = iconResource;
this.backgroundColor = backgroundColor;
}
public int getIconResource() {
return iconResource;
}
public int getBackgroundColor() {
return backgroundColor;
}
private int iconResource;
private int backgroundColor;
}
public BaseAvatarSet(Application application, int avatarIconsArrayId, int avatarColorsArrayId) {
TypedArray defaultAvatars = application.getResources().obtainTypedArray(avatarIconsArrayId);
avatarIconsResources = new int[defaultAvatars.length()];
for (int index = 0; index < defaultAvatars.length(); index++) {
avatarIconsResources[index] = defaultAvatars.getResourceId(index, -1);
}
defaultAvatars.recycle();
colors = application.getResources().getIntArray(avatarColorsArrayId);
resources = new HashMap<>();
}
/**
* Calculate avatar index for specified user.
*
*/
protected int getIndex(UserJid user) {
return user.hashCode();
}
/**
* Get drawable with default avatar of user.
*
* @param user
* @return
*/
public DefaultAvatar getResourceId(UserJid user) {
DefaultAvatar avatar = resources.get(user);
if (avatar == null) {
avatar = getElement(getIndex(user));
resources.put(user, avatar);
}
return avatar;
}
/**
* Gets element from array by index.
*
* @return Always return element even if array's length is less then index.
*/
private DefaultAvatar getElement(int index) {
int uniqueCombinationsNumber = avatarIconsResources.length * colors.length;
index = index % uniqueCombinationsNumber;
if (index < 0) {
index += uniqueCombinationsNumber;
}
return new DefaultAvatar(avatarIconsResources[index / colors.length], colors[index % colors.length]);
}
@Override
public void onLowMemory() {
resources.clear();
}
}