diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml
index ebac87b19..722a4a578 100644
--- a/Habitica/AndroidManifest.xml
+++ b/Habitica/AndroidManifest.xml
@@ -13,10 +13,10 @@
+ />
+ />
-
+
@@ -107,8 +107,8 @@
-
+
@@ -122,30 +122,29 @@
+
-
-
+
-
+
-
@@ -154,6 +153,7 @@
+
diff --git a/Habitica/assets/paperboy/changelog.json b/Habitica/assets/paperboy/changelog.json
index a6cad9096..a3c1df1ee 100644
--- a/Habitica/assets/paperboy/changelog.json
+++ b/Habitica/assets/paperboy/changelog.json
@@ -1,4 +1,21 @@
[
+ {
+ "name": "Version 0.0.4",
+ "items":[
+ {
+ "type": "F",
+ "title": "Party :)"
+ },
+ {
+ "type": "B",
+ "title": "Avatar-Drawing: Position without a mount/met"
+ },
+ {
+ "type": "N",
+ "title": "Generated avatar images are now cached"
+ }
+ ]
+ },
{
"name": "Version 0.0.3",
"items":[
diff --git a/Habitica/res/layout/fragment_party_memberlist.xml b/Habitica/res/layout/fragment_party_memberlist.xml
new file mode 100644
index 000000000..666b9f08f
--- /dev/null
+++ b/Habitica/res/layout/fragment_party_memberlist.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Habitica/res/layout/party_member.xml b/Habitica/res/layout/party_member.xml
new file mode 100644
index 000000000..20d24ae6a
--- /dev/null
+++ b/Habitica/res/layout/party_member.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/values/colors.classes.xml b/Habitica/res/values/colors.classes.xml
new file mode 100644
index 000000000..6efdbdfaa
--- /dev/null
+++ b/Habitica/res/values/colors.classes.xml
@@ -0,0 +1,7 @@
+
+
+ #FFFF00
+ #FF0000
+ #0000FF
+ #7736205D
+
\ No newline at end of file
diff --git a/Habitica/src/com/habitrpg/android/habitica/PartyActivity.java b/Habitica/src/com/habitrpg/android/habitica/PartyActivity.java
index e818471a0..a75d5a6ca 100644
--- a/Habitica/src/com/habitrpg/android/habitica/PartyActivity.java
+++ b/Habitica/src/com/habitrpg/android/habitica/PartyActivity.java
@@ -9,13 +9,20 @@ import com.habitrpg.android.habitica.events.commands.CreateTagCommand;
import com.habitrpg.android.habitica.prefs.PrefsActivity;
import com.habitrpg.android.habitica.ui.MainDrawerBuilder;
import com.habitrpg.android.habitica.ui.fragments.ChatListFragment;
+import com.habitrpg.android.habitica.ui.fragments.PartyInformationFragment;
+import com.habitrpg.android.habitica.ui.fragments.PartyMemberListFragment;
+import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.raizlabs.android.dbflow.sql.builder.Condition;
import com.raizlabs.android.dbflow.sql.language.Select;
+import java.util.ArrayList;
import java.util.HashMap;
import butterknife.InjectView;
+import retrofit.Callback;
+import retrofit.RetrofitError;
+import retrofit.client.Response;
public class PartyActivity extends AvatarActivityBase implements AppBarLayout.OnOffsetChangedListener {
@@ -44,8 +51,9 @@ public class PartyActivity extends AvatarActivityBase implements AppBarLayout.On
mAPIHelper = new APIHelper(this, hostConfig);
-
updateUserAvatars();
+
+
}
@Override
@@ -74,9 +82,18 @@ public class PartyActivity extends AvatarActivityBase implements AppBarLayout.On
Fragment fragment;
switch (position) {
- case 1:
+ case 0: {
+ fragment = new PartyInformationFragment();
+ break;
+ }
+ case 1: {
fragment = new ChatListFragment(PartyActivity.this, "party", mAPIHelper, User, false);
break;
+ }
+ case 2: {
+ fragment = new PartyMemberListFragment(PartyActivity.this, mAPIHelper.apiService);
+ break;
+ }
default:
fragment = new Fragment();
}
@@ -125,10 +142,10 @@ public class PartyActivity extends AvatarActivityBase implements AppBarLayout.On
public void onOffsetChanged(AppBarLayout appBarLayout, int i) {
Fragment fragment = fragmentDictionary.get(viewPager.getCurrentItem());
- if(!(fragment instanceof ChatListFragment))
+ if (!(fragment instanceof ChatListFragment))
return;
- ChatListFragment chatFragment = (ChatListFragment)fragment ;
+ ChatListFragment chatFragment = (ChatListFragment) fragment;
// Disable Refresh if Header is collapsed
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java b/Habitica/src/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java
index f0306bc69..9bebabc10 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/AvatarWithBarsViewModel.java
@@ -56,17 +56,28 @@ public class AvatarWithBarsViewModel {
public void UpdateData(HabitRPGUser user)
{
Stats stats = user.getStats();
-
- SetValueBar(hpBar, stats.getHp().floatValue(), stats.getMaxHealth(), context.getString(R.string.HP_default), context.getResources().getColor(R.color.hpColor));
+
+ SetHpBarData(hpBar, stats, context);
SetValueBar(xpBar, stats.getExp().floatValue(), stats.getToNextLevel(), context.getString(R.string.XP_default), context.getResources().getColor(R.color.xpColor));
SetValueBar(mpBar, stats.getMp().floatValue(), stats.getMaxMP(), context.getString(R.string.MP_default), context.getResources().getColor(R.color.mpColor));
new UserPicture(user, this.context).setPictureOn(image);
}
+ public static void SetHpBarData(ValueBarBinding valueBar, Stats stats, Context ctx)
+ {
+ int maxHP = stats.getMaxHealth();
+ if(maxHP == 0)
+ {
+ maxHP = 50;
+ }
+
+ SetValueBar(valueBar, stats.getHp().floatValue(), maxHP, ctx.getString(R.string.HP_default), ctx.getResources().getColor(R.color.hpColor));
+ }
+
// Layout_Weight don't accepts 0.7/0.3 to have 70% filled instead it shows the 30% , so I had to switch the values
// but on a 1.0/0.0 which switches to 0.0/1.0 it shows the blank part full size...
- private void SetValueBar(ValueBarBinding valueBar, float value, float valueMax, String description, int color)
+ private static void SetValueBar(ValueBarBinding valueBar, float value, float valueMax, String description, int color)
{
double percent = Math.min(1, value / valueMax);
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/TavernRecyclerViewAdapter.java b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/ChatRecyclerViewAdapter.java
similarity index 90%
rename from Habitica/src/com/habitrpg/android/habitica/ui/adapter/TavernRecyclerViewAdapter.java
rename to Habitica/src/com/habitrpg/android/habitica/ui/adapter/ChatRecyclerViewAdapter.java
index 2a210f4eb..bb1a7a8d3 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/adapter/TavernRecyclerViewAdapter.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/adapter/ChatRecyclerViewAdapter.java
@@ -40,7 +40,7 @@ import de.greenrobot.event.EventBus;
/**
* Created by Negue on 20.08.2015.
*/
-public class TavernRecyclerViewAdapter extends RecyclerView.Adapter {
+public class ChatRecyclerViewAdapter extends RecyclerView.Adapter {
static final int TYPE_DANIEL = 0;
static final int TYPE_NEW_MESSAGE = 1;
static final int TYPE_MESSAGE = 2;
@@ -48,15 +48,23 @@ public class TavernRecyclerViewAdapter extends RecyclerView.Adapter messages;
private Context viewContext;
private String uuid;
+ private String groupId;
+ private boolean isTavern;
- public TavernRecyclerViewAdapter(List messages, Context viewContext, String uuid) {
+ public ChatRecyclerViewAdapter(List messages, Context viewContext, String uuid, String groupId, boolean isTavern) {
this.messages = messages;
this.viewContext = viewContext;
this.uuid = uuid;
+ this.groupId = groupId;
+ this.isTavern = isTavern;
}
@Override
public int getItemViewType(int position) {
+ if(!isTavern){
+ return TYPE_MESSAGE;
+ }
+
switch (position) {
case 0: {
return TYPE_DANIEL;
@@ -71,19 +79,17 @@ public class TavernRecyclerViewAdapter extends RecyclerView.Adapter 1) {
holder.bind(messages.get(position - 2));
}
@@ -103,10 +114,10 @@ public class TavernRecyclerViewAdapter extends RecyclerView.Adapter {
+
+
+ private ArrayList memberList;
+
+ public void setMemberList(ArrayList memberList) {
+ this.memberList = memberList;
+ this.notifyDataSetChanged();
+ }
+
+
+ @Override
+ public MemberViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ View view = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.party_member, parent, false);
+
+ return new MemberViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(MemberViewHolder holder, int position) {
+ holder.bind(memberList.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return memberList == null ? 0 : memberList.size();
+ }
+
+ class MemberViewHolder extends RecyclerView.ViewHolder {
+
+ @InjectView(R.id.avatar)
+ ImageView imageView;
+
+ @InjectView(R.id.username)
+ TextView userName;
+
+ @InjectView(R.id.user_lvl)
+ TextView lvl;
+
+ @InjectView(R.id.class_label)
+ TextView classLabel;
+
+ @InjectView(R.id.class_background_layout)
+ View classBackground;
+
+ ValueBarBinding hpBar;
+
+ Resources resources;
+
+ public MemberViewHolder(View itemView) {
+ super(itemView);
+
+ ButterKnife.inject(this, itemView);
+
+ View hpBarView = itemView.findViewById(R.id.hpBar);
+
+ hpBar = DataBindingUtil.bind(hpBarView);
+
+ resources = itemView.getResources();
+ }
+
+ public void bind(HabitRPGUser user) {
+ android.content.Context ctx = itemView.getContext();
+
+ UserPicture userPicture = new UserPicture(user, ctx);
+ userPicture.setPictureOn(imageView);
+
+ AvatarWithBarsViewModel.SetHpBarData(hpBar, user.getStats(), ctx);
+
+ lvl.setText("LVL " + user.getStats().getLvl());
+
+ classLabel.setText(user.getStats()._class.toString());
+
+
+ switch (user.getStats()._class) {
+ case healer: {
+ ViewHelper.SetBackgroundTint(classBackground, resources.getColor(R.color.class_healer));
+ break;
+ }
+ case warrior: {
+ ViewHelper.SetBackgroundTint(classBackground, resources.getColor(R.color.class_warrior));
+ break;
+ }
+ case rogue: {
+ ViewHelper.SetBackgroundTint(classBackground, resources.getColor(R.color.class_rogue));
+ break;
+ }
+ case wizard: {
+ ViewHelper.SetBackgroundTint(classBackground, resources.getColor(R.color.class_wizard));
+ break;
+ }
+ }
+
+ userName.setText(user.getProfile().getName());
+ }
+ }
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ChatListFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ChatListFragment.java
index 5a5735576..4e58b03ef 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ChatListFragment.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/ChatListFragment.java
@@ -21,7 +21,7 @@ import com.habitrpg.android.habitica.events.commands.FlagChatMessageCommand;
import com.habitrpg.android.habitica.events.commands.SendNewGroupMessageCommand;
import com.habitrpg.android.habitica.events.commands.ToggleInnCommand;
import com.habitrpg.android.habitica.events.commands.ToggleLikeMessageCommand;
-import com.habitrpg.android.habitica.ui.adapter.TavernRecyclerViewAdapter;
+import com.habitrpg.android.habitica.ui.adapter.ChatRecyclerViewAdapter;
import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.PostChatMessageResult;
@@ -127,7 +127,7 @@ public class ChatListFragment extends Fragment implements SwipeRefreshLayout.OnR
}
}
- TavernRecyclerViewAdapter tavernAdapter = new TavernRecyclerViewAdapter(chatMessages, ctx, userId);
+ ChatRecyclerViewAdapter tavernAdapter = new ChatRecyclerViewAdapter(chatMessages, ctx, userId, groupId, isTavern);
mRecyclerView.setAdapter(tavernAdapter);
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PartyInformationFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PartyInformationFragment.java
new file mode 100644
index 000000000..e01e0af55
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PartyInformationFragment.java
@@ -0,0 +1,9 @@
+package com.habitrpg.android.habitica.ui.fragments;
+
+import android.support.v4.app.Fragment;
+
+/**
+ * Created by Negue on 16.09.2015.
+ */
+public class PartyInformationFragment extends Fragment {
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PartyMemberListFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PartyMemberListFragment.java
new file mode 100644
index 000000000..837194275
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PartyMemberListFragment.java
@@ -0,0 +1,80 @@
+package com.habitrpg.android.habitica.ui.fragments;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.habitrpg.android.habitica.R;
+import com.habitrpg.android.habitica.ui.adapter.PartyMemberRecyclerViewAdapter;
+import com.magicmicky.habitrpgwrapper.lib.api.ApiService;
+import com.magicmicky.habitrpgwrapper.lib.models.Group;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+import retrofit.Callback;
+import retrofit.RetrofitError;
+import retrofit.client.Response;
+
+/**
+ * Created by Negue on 15.09.2015.
+ */
+public class PartyMemberListFragment extends Fragment {
+
+ private Context ctx;
+ private ApiService apiService;
+
+ private PartyMemberRecyclerViewAdapter viewAdapter;
+
+ public PartyMemberListFragment(Context ctx, ApiService apiService){
+ this.ctx = ctx;
+
+ this.apiService = apiService;
+
+ viewAdapter = new PartyMemberRecyclerViewAdapter();
+ }
+
+ private View view;
+
+ @InjectView(R.id.recyclerView)
+ RecyclerView mRecyclerView;
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ if (view == null)
+ view = inflater.inflate(R.layout.fragment_party_memberlist, container, false);
+
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ ButterKnife.inject(this, view);
+
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(ctx));
+ mRecyclerView.setAdapter(viewAdapter);
+
+ // Get the full group data
+ apiService.getGroup("party", new Callback() {
+ @Override
+ public void success(Group group, Response response) {
+ viewAdapter.setMemberList(group.members);
+ }
+
+ @Override
+ public void failure(RetrofitError error) {
+
+ }
+ });
+
+
+ }
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java b/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
index ac473a74f..f0eae1c8f 100644
--- a/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
+++ b/Habitica/src/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.java
@@ -5,7 +5,6 @@ import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.widget.CardView;
-import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
@@ -16,7 +15,6 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.habitrpg.android.habitica.R;
-import com.habitrpg.android.habitica.ui.helpers.ViewHelper;
import com.squareup.picasso.Picasso;
/**
@@ -73,8 +71,6 @@ public class DataBindingUtils {
public static void setLayoutWeight(View view, float weight) {
LinearLayout.LayoutParams layout = (LinearLayout.LayoutParams)view.getLayoutParams();
- Log.d("setLayoutWeight", weight + "");
-
layout.weight = weight;
view.setLayoutParams(layout);
@@ -82,6 +78,11 @@ public class DataBindingUtils {
@BindingAdapter("app:layout_weight_anim")
public static void setLayoutWeightAnim(View view, float weight) {
+ if(weight == 0.0f || weight == 1.0f){
+ setLayoutWeight(view, weight);
+ return;
+ }
+
LayoutWeightAnimation anim = new LayoutWeightAnimation(view, weight);
anim.setDuration(1250);
diff --git a/Habitica/src/com/habitrpg/android/habitica/userpicture/BitmapUtils.java b/Habitica/src/com/habitrpg/android/habitica/userpicture/BitmapUtils.java
new file mode 100644
index 000000000..965b9d400
--- /dev/null
+++ b/Habitica/src/com/habitrpg/android/habitica/userpicture/BitmapUtils.java
@@ -0,0 +1,52 @@
+package com.habitrpg.android.habitica.userpicture;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Environment;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+public class BitmapUtils {
+ public static String getSavePath() {
+ String path;
+ if (hasSDCard()) {
+ path = Environment.getExternalStorageDirectory().getAbsolutePath();
+ } else {
+ path = Environment.getDownloadCacheDirectory().getAbsolutePath();
+ }
+ return path+"/HabiticaImageCache";
+ }
+
+ public static Bitmap loadFromFile(String filename) {
+ try {
+ filename = getSavePath() +"/"+ filename;
+
+ File f = new File(filename);
+ if (!f.exists()) { return null; }
+ Bitmap tmp = BitmapFactory.decodeFile(filename);
+ return tmp;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public static void saveToFile(String filename,Bitmap bmp) {
+ try {
+ File myDir = new File(getSavePath());
+ boolean res = myDir.mkdirs();
+
+ filename = getSavePath() +"/"+ filename;
+
+ FileOutputStream out = new FileOutputStream(filename);
+ bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
+ out.flush();
+ out.close();
+ } catch(Exception e) {}
+ }
+
+ public static boolean hasSDCard() {
+ String status = Environment.getExternalStorageState();
+ return status.equals(Environment.MEDIA_MOUNTED);
+ }
+}
diff --git a/Habitica/src/com/habitrpg/android/habitica/userpicture/UserPicture.java b/Habitica/src/com/habitrpg/android/habitica/userpicture/UserPicture.java
index 8f72277ca..037039ba5 100644
--- a/Habitica/src/com/habitrpg/android/habitica/userpicture/UserPicture.java
+++ b/Habitica/src/com/habitrpg/android/habitica/userpicture/UserPicture.java
@@ -7,12 +7,15 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.util.Log;
import android.widget.ImageView;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@@ -29,6 +32,8 @@ public class UserPicture {
private boolean hasBackground, hasMount, hasPet;
+ private String currentCacheFileName;
+
List layers = new ArrayList();
public UserPicture(HabitRPGUser user, Context context) {
@@ -36,21 +41,16 @@ public class UserPicture {
this.context = context;
}
- public void addTask(){
- numOfTasks.incrementAndGet();
- }
-
public void removeTask(){
numOfTasks.decrementAndGet();
}
public void allTasksComplete(){
-
if(this.numOfTasks.get() == 0){
BitmapFactory.Options o = new BitmapFactory.Options();
o.inScaled = false;
- Bitmap res = Bitmap.createBitmap(140, 147, Bitmap.Config.ARGB_8888);
+ Bitmap res = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas myCanvas = new Canvas(res);
Integer layerNumber = 0;
for (Object layer : this.layers) {
@@ -60,41 +60,95 @@ public class UserPicture {
}
layerNumber++;
}
+
+ BitmapUtils.saveToFile(currentCacheFileName, res);
this.imageView.setImageBitmap(res);
}
-
}
public void setPictureOn(ImageView imageView) {
this.imageView = imageView;
List layerNames = this.user.getAvatarLayerNames();
- if (this.user.getItems().getCurrentMount() != null) {
- layerNames.add(0, "Mount_Body_" + this.user.getItems().getCurrentMount());
- layerNames.add("Mount_Head_" + this.user.getItems().getCurrentMount());
+ String mountName = this.user.getItems().getCurrentMount();
+
+ if (mountName != null && !mountName.isEmpty()) {
+ layerNames.add(0, "Mount_Body_" + mountName);
+ layerNames.add("Mount_Head_" + mountName);
this.hasMount = true;
}
- if (this.user.getItems().getCurrentPet() != null) {
- layerNames.add("Pet-" + this.user.getItems().getCurrentPet());
+ String petName = this.user.getItems().getCurrentPet();
+
+ if (petName != null && !petName.isEmpty()) {
+ layerNames.add("Pet-" + petName);
this.hasPet = true;
}
- if (this.user.getPreferences().getBackground() != null) {
- layerNames.add(0, "background_" + this.user.getPreferences().getBackground());
+ String backgroundName = this.user.getPreferences().getBackground();
+
+ if (backgroundName != null && !backgroundName.isEmpty()) {
+ layerNames.add(0, "background_" + backgroundName);
this.hasBackground = true;
}
+ // get layer hash value
+ String fullLayerString = "";
+
+ for(String l : layerNames){
+ fullLayerString = fullLayerString.concat(l);
+ }
+
+ String layersHash = generateHashCode(fullLayerString);
+ currentCacheFileName = layersHash.concat(".png");
+
+ // does it already exist?
+ Bitmap cache = BitmapUtils.loadFromFile(currentCacheFileName);
+
+ // yes => load image to bitmap
+ if(cache != null){
+ imageView.setImageBitmap(cache);
+ return;
+ }
+
+ // no => generate it
Integer layerNumber = 0;
this.numOfTasks.set(layerNames.size());
for (String layer : layerNames) {
layers.add(0);
- SpriteTarget target = new SpriteTarget(layerNumber);
+ SpriteTarget target = new SpriteTarget(layerNumber, layer);
Picasso.with(this.context).load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/"+ layer +".png").into(target);
layerNumber = layerNumber + 1;
}
}
+ private static String generateHashCode(String value){
+
+ MessageDigest md = null;
+ byte[] digest = new byte[0];
+ try {
+ md = MessageDigest.getInstance("MD5");
+
+ md.update(value.getBytes());
+ digest = md.digest();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+
+ return bytesToHex(digest);
+ }
+
+ final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
+ public static String bytesToHex(byte[] bytes) {
+ char[] hexChars = new char[bytes.length * 2];
+ for ( int j = 0; j < bytes.length; j++ ) {
+ int v = bytes[j] & 0xFF;
+ hexChars[j * 2] = hexArray[v >>> 4];
+ hexChars[j * 2 + 1] = hexArray[v & 0x0F];
+ }
+ return new String(hexChars);
+ }
+
private void modifyCanvas(Bitmap img, Canvas canvas, Integer layerNumber) {
Paint paint = new Paint();
paint.setFilterBitmap(false);
@@ -127,9 +181,11 @@ public class UserPicture {
private class SpriteTarget implements Target {
private Integer layerNumber;
+ private String layer;
- public SpriteTarget(Integer layerNumber) {
+ public SpriteTarget(Integer layerNumber, String layer) {
this.layerNumber = layerNumber;
+ this.layer = layer;
}
@Override
@@ -141,6 +197,8 @@ public class UserPicture {
@Override
public void onBitmapFailed(Drawable errorDrawable) {
+ Log.w("SpriteTarget", layer + " not on S3");
+
removeTask();
allTasksComplete();
}
@@ -150,4 +208,8 @@ public class UserPicture {
}
}
-}
\ No newline at end of file
+}
+
+
+
+
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
index 29818d699..b0342f3f4 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/api/ApiService.java
@@ -2,6 +2,7 @@ package com.magicmicky.habitrpgwrapper.lib.api;
import com.magicmicky.habitrpgwrapper.lib.models.ChatMessage;
import com.magicmicky.habitrpgwrapper.lib.models.ContentResult;
+import com.magicmicky.habitrpgwrapper.lib.models.Group;
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
import com.magicmicky.habitrpgwrapper.lib.models.PostChatMessageResult;
import com.magicmicky.habitrpgwrapper.lib.models.Status;
@@ -11,8 +12,8 @@ import com.magicmicky.habitrpgwrapper.lib.models.UserAuth;
import com.magicmicky.habitrpgwrapper.lib.models.UserAuthResponse;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.ItemData;
import com.magicmicky.habitrpgwrapper.lib.models.tasks.Task;
-import com.squareup.okhttp.Call;
+import java.util.ArrayList;
import java.util.List;
import retrofit.Callback;
@@ -87,6 +88,12 @@ public interface ApiService {
/* Group API */
+ @GET("/groups")
+ void listGroups(@Query("type") String type, Callback> cb);
+
+ @GET("/groups/{gid}")
+ void getGroup(@Path("gid") String groupId, Callback cb);
+
@GET("/groups/{gid}/chat")
void listGroupChat(@Path("gid") String groupId, Callback> cb);
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Group.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Group.java
new file mode 100644
index 000000000..0edc97d63
--- /dev/null
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Group.java
@@ -0,0 +1,41 @@
+package com.magicmicky.habitrpgwrapper.lib.models;
+
+import com.google.gson.annotations.SerializedName;
+import com.raizlabs.android.dbflow.structure.BaseModel;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Negue on 16.09.2015.
+ */
+public class Group extends BaseModel {
+
+ @SerializedName("_id")
+ public String id;
+
+ public double balance;
+
+ public String description;
+
+ // TODO Leader
+ // GET /groups?type={0} => leader is string
+ // GET /groups/{gid} => leader is user-object
+
+ public String name;
+
+ public int memberCount;
+
+ public String type;
+
+ public String logo;
+
+ public Quest quest;
+
+ public ArrayList chat;
+
+ public ArrayList members;
+
+ public int challengeCount;
+
+ // TODO Challenges
+}
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java
index 09c272d50..a0b56320b 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/HabitRPGUser.java
@@ -55,7 +55,7 @@ public class HabitRPGUser extends BaseModel {
@ForeignKey(references = {@ForeignKeyReference(columnName = "party_id",
columnType = String.class,
foreignColumnName = "id")})
- private Party party;
+ private UserParty party;
@Column
@@ -116,11 +116,11 @@ public class HabitRPGUser extends BaseModel {
this.profile = profile;
}
- public Party getParty() {
+ public UserParty getParty() {
return party;
}
- public void setParty(Party party) {
+ public void setParty(UserParty party) {
this.party = party;
}
@@ -211,8 +211,10 @@ public class HabitRPGUser extends BaseModel {
layerNames.add("head_0");
if (outfit != null) {
- if (outfit.getArmor() != null && !outfit.getArmor().equals("armor_base_0")) {
- layerNames.add(prefs.getSize() + "_armor_" + outfit.getArmor());
+ String armor = outfit.getArmor();
+
+ if (armor != null && !armor.equals("armor_base_0")) {
+ layerNames.add(prefs.getSize() + "_" + armor);
}
if (outfit.getBody() != null && !outfit.getBody().equals("body_base_0")) {
layerNames.add(outfit.getBody());
@@ -221,10 +223,13 @@ public class HabitRPGUser extends BaseModel {
Preferences.Hair hair = prefs.getHair();
if (hair != null) {
- if (hair.getBase() > 0) {layerNames.add("hair_base_"+hair.getBase() + hair.getColor());}
- if (hair.getBangs() > 0) {layerNames.add("hair_bangs_"+hair.getBangs() + hair.getColor());}
- if (hair.getMustache() > 0) {layerNames.add("hair_mustache_"+hair.getMustache() + hair.getColor());}
- if (hair.getBeard() > 0) {layerNames.add("hair_beard_"+hair.getBeard() + hair.getColor());}
+ String hairColor = hair.getColor();
+
+
+ if (hair.getBase() > 0) {layerNames.add("hair_base_"+hair.getBase() +"_" + hairColor);}
+ if (hair.getBangs() > 0) {layerNames.add("hair_bangs_"+hair.getBangs() +"_" + hairColor);}
+ if (hair.getMustache() > 0) {layerNames.add("hair_mustache_"+hair.getMustache() +"_" + hairColor);}
+ if (hair.getBeard() > 0) {layerNames.add("hair_beard_"+hair.getBeard() +"_" + hairColor);}
}
if (outfit != null) {
diff --git a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Party.java b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/UserParty.java
similarity index 56%
rename from Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Party.java
rename to Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/UserParty.java
index ae6d3f19b..b852fa8f5 100644
--- a/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/Party.java
+++ b/Habitica/src/com/magicmicky/habitrpgwrapper/lib/models/UserParty.java
@@ -1,5 +1,6 @@
package com.magicmicky.habitrpgwrapper.lib.models;
+import com.google.gson.annotations.SerializedName;
import com.habitrpg.android.habitica.HabitDatabase;
import com.raizlabs.android.dbflow.annotation.Column;
import com.raizlabs.android.dbflow.annotation.ForeignKey;
@@ -9,74 +10,38 @@ import com.raizlabs.android.dbflow.annotation.Table;
import com.raizlabs.android.dbflow.structure.BaseModel;
/**
- * Created by MagicMicky on 16/03/14.
+ * Created by Negue on 16.09.2015.
*/
-
@Table(databaseName = HabitDatabase.NAME)
-public class Party extends BaseModel {
-
+public class UserParty extends BaseModel {
@Column
@PrimaryKey
+ @SerializedName("_id")
public String id; //id
- @Column
- private String invitation;
- @Column
- private String lastMessageSeen;
- @Column
- private boolean leader;
@Column
@ForeignKey(references = {@ForeignKeyReference(columnName = "quest_id",
columnType = String.class,
foreignColumnName = "key")})
private Quest quest;
+
@Column
private String order;//Order to display ppl
- public Party() {
+ @Column
+ private String orderAscending;//Order type
+
+ public UserParty() {
}
- public Party(String id, String invitation, String lastMessageSeen, boolean leader, Quest quest, String order) {
+ public UserParty(String id, Quest quest, String order, String orderAscending) {
this.id = id;
- this.invitation = invitation;
- this.lastMessageSeen = lastMessageSeen;
- this.leader = leader;
this.quest = quest;
this.order = order;
+ this.orderAscending = orderAscending;
}
- public String getInvitation() {
- return invitation;
- }
-
- public void setInvitation(String invitation) {
- this.invitation = invitation;
- }
-
- public String getLastMessageSeen() {
- return lastMessageSeen;
- }
-
- public void setLastMessageSeen(String lastMessageSeen) {
- this.lastMessageSeen = lastMessageSeen;
- }
-
- public boolean getLeader() {
- return leader;
- }
-
- public void setLeader(boolean leader) {
- this.leader = leader;
- }
-
- public Quest getQuest() {
- return quest;
- }
-
- public void setQuest(Quest quest) {
- this.quest = quest;
- }
public String getOrder() {
return order;
@@ -86,4 +51,20 @@ public class Party extends BaseModel {
this.order = order;
}
+
+ public String getOrderAscending() {
+ return orderAscending;
+ }
+
+ public void setOrderAscending(String order) {
+ this.orderAscending = order;
+ }
+
+ public Quest getQuest() {
+ return quest;
+ }
+
+ public void setQuest(Quest quest) {
+ this.quest = quest;
+ }
}