mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-14 10:11:58 +00:00
Display current avatar customization
This commit is contained in:
parent
921b14183c
commit
ca2f89087f
11 changed files with 292 additions and 10 deletions
1
Habitica/assets/migrations/Habitica/5.sql
Normal file
1
Habitica/assets/migrations/Habitica/5.sql
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE Hair ADD COLUMN 'flower' INTEGER DEFAULT 0;
|
||||||
45
Habitica/res/layout/avatar_overview_card.xml
Normal file
45
Habitica/res/layout/avatar_overview_card.xml
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:bind="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<data>
|
||||||
|
<variable name="title" type="String"/>
|
||||||
|
<variable name="value" type="String"/>
|
||||||
|
<variable name="valueInt" type="int"/>
|
||||||
|
<variable name="imageNamed" type="String"/>
|
||||||
|
</data>
|
||||||
|
<android.support.v7.widget.CardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="5dp">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
bind:imageName='@{imageNamed == null ? "head_0" : imageNamed}'
|
||||||
|
android:contentDescription="@{imageNamed}"
|
||||||
|
android:alpha="@{imageNamed == null ? 0.4f : 1.0f}"
|
||||||
|
android:scaleType="fitEnd"/>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<TextView android:layout_margin="5dp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@{title}"
|
||||||
|
tools:text="Title"
|
||||||
|
android:textStyle="bold"/>
|
||||||
|
<TextView android:layout_margin="5dp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/task_gray"
|
||||||
|
tools:text="Value"
|
||||||
|
android:text="@{value != null ? value : (valueInt != 0 ? String.valueOf(valueInt) : @string/avatar_nothing)}" />
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</android.support.v7.widget.CardView>
|
||||||
|
</layout>
|
||||||
111
Habitica/res/layout/fragment_avatar_overview.xml
Normal file
111
Habitica/res/layout/fragment_avatar_overview.xml
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layout xmlns:bind="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<data>
|
||||||
|
<import type="com.magicmicky.habitrpgwrapper.lib.models.Preferences" />
|
||||||
|
<import type="android.view.View" />
|
||||||
|
|
||||||
|
<variable
|
||||||
|
name="preferences"
|
||||||
|
type="Preferences" />
|
||||||
|
</data>
|
||||||
|
|
||||||
|
|
||||||
|
<android.support.v4.widget.NestedScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:scrollbarSize="3dp"
|
||||||
|
android:scrollbarThumbVertical="@color/md_grey_500"
|
||||||
|
|
||||||
|
android:scrollbars="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="5dp"
|
||||||
|
android:text="@string/avatar_body"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||||
|
|
||||||
|
<android.support.v7.widget.CardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="5dp">
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="40dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:id="@+id/textView3"
|
||||||
|
android:layout_marginStart="8dp"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:text="@string/avatar_size"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<Spinner
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/avatar_size_spinner"
|
||||||
|
android:spinnerMode="dropdown"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:entries="@array/avatar_sizes"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</android.support.v7.widget.CardView>
|
||||||
|
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_shirt}"
|
||||||
|
bind:value="@{preferences.getShirt}"
|
||||||
|
bind:imageNamed='@{preferences.getSize + "_shirt_" + preferences.getShirt}'/>
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_skin}"
|
||||||
|
bind:value="@{preferences.getSkin}"
|
||||||
|
bind:imageNamed='@{"skin_" + preferences.getSkin}' />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/avatar_hair"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:layout_margin="5dp"/>
|
||||||
|
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_color}"
|
||||||
|
bind:value="@{preferences.getHair.getColor}"
|
||||||
|
bind:imageNamed='@{"hair_bangs_1_" + preferences.getHair.getColor}' />
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_base}"
|
||||||
|
bind:valueInt="@{preferences.getHair.getBase}"
|
||||||
|
bind:imageNamed='@{preferences.getHair.getBase == 0 ? null : "hair_base_" + preferences.getHair.getBase + "_" + preferences.getHair.getColor}' />
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_bangs}"
|
||||||
|
bind:valueInt="@{preferences.getHair.getBangs}"
|
||||||
|
bind:imageNamed='@{preferences.getHair.getBangs == 0 ? null : "hair_bangs_" + preferences.getHair.getBangs + "_" + preferences.getHair.getColor}' />
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_flower}"
|
||||||
|
bind:valueInt="@{preferences.getHair.getFlower}"
|
||||||
|
bind:imageNamed='@{preferences.getHair.getFlower == 0 ? null : "hair_flower_" + preferences.getHair.getFlower}' />
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_beard}"
|
||||||
|
bind:valueInt="@{preferences.getHair.getBeard}"
|
||||||
|
bind:imageNamed='@{preferences.getHair.getBeard == 0 ? null : "hair_beard_" + preferences.getHair.getBeard + "_" + preferences.getHair.getColor}' />
|
||||||
|
<include layout="@layout/avatar_overview_card"
|
||||||
|
bind:title="@{@string/avatar_mustache}"
|
||||||
|
bind:valueInt="@{preferences.getHair.getMustache}"
|
||||||
|
bind:imageNamed='@{preferences.getHair.getMustache == 0 ? null : "hair_mustache_" + preferences.getHair.getMustache + "_" + preferences.getHair.getColor}' />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</android.support.v4.widget.NestedScrollView>
|
||||||
|
</layout>
|
||||||
|
|
@ -83,7 +83,7 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginBottom="8dp"
|
android:layout_marginBottom="8dp"
|
||||||
bind:imageName='@{"quest_"+ quest.key}'
|
bind:questImageName='@{"quest_"+ quest.key}'
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
|
|
||||||
|
|
@ -140,4 +140,19 @@
|
||||||
<string name="yes">Yes</string>
|
<string name="yes">Yes</string>
|
||||||
<string name="no">No</string>
|
<string name="no">No</string>
|
||||||
<string name="quest">Quest</string>
|
<string name="quest">Quest</string>
|
||||||
|
<string name="avatar_body">Body</string>
|
||||||
|
<string name="avatar_hair">Hair</string>
|
||||||
|
<string name="avatar_shirt">Shirt</string>
|
||||||
|
<string name="avatar_skin">Skin</string>
|
||||||
|
<string name="avatar_ears">Animal Ears</string>
|
||||||
|
<string name="avatar_base">Base</string>
|
||||||
|
<string name="avatar_color">Color</string>
|
||||||
|
<string name="avatar_beard">Beard</string>
|
||||||
|
<string name="avatar_mustache">Mustache</string>
|
||||||
|
<string name="avatar_flower">Flower</string>
|
||||||
|
<string name="avatar_bangs">Bangs</string>
|
||||||
|
<string name="avatar_nothing">Nothing set</string>
|
||||||
|
<string name="avatar_size">Size</string>
|
||||||
|
<string name="avatar_size_slim">Slim</string>
|
||||||
|
<string name="avatar_size_broad">Broad</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
@ -29,4 +29,9 @@
|
||||||
<item>@string/saturday</item>
|
<item>@string/saturday</item>
|
||||||
<item>@string/sunday</item>
|
<item>@string/sunday</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="avatar_sizes">
|
||||||
|
<item>@string/avatar_size_slim</item>
|
||||||
|
<item>@string/avatar_size_broad</item>
|
||||||
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
|
|
@ -10,5 +10,5 @@ public class HabitDatabase {
|
||||||
|
|
||||||
public static final String NAME = "Habitica";
|
public static final String NAME = "Habitica";
|
||||||
|
|
||||||
public static final int VERSION = 4;
|
public static final int VERSION = 5;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import com.habitrpg.android.habitica.ui.activities.AboutActivity;
|
||||||
import com.habitrpg.android.habitica.ui.activities.MainActivity;
|
import com.habitrpg.android.habitica.ui.activities.MainActivity;
|
||||||
import com.habitrpg.android.habitica.R;
|
import com.habitrpg.android.habitica.R;
|
||||||
import com.habitrpg.android.habitica.ui.activities.PrefsActivity;
|
import com.habitrpg.android.habitica.ui.activities.PrefsActivity;
|
||||||
|
import com.habitrpg.android.habitica.ui.fragments.AvatarOverviewFragment;
|
||||||
import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
|
import com.habitrpg.android.habitica.ui.fragments.BaseFragment;
|
||||||
import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
|
import com.habitrpg.android.habitica.ui.fragments.GemsPurchaseFragment;
|
||||||
import com.habitrpg.android.habitica.ui.fragments.PartyFragment;
|
import com.habitrpg.android.habitica.ui.fragments.PartyFragment;
|
||||||
|
|
@ -37,9 +38,12 @@ public class MainDrawerBuilder {
|
||||||
public static final int SIDEBAR_SKILLS = 1;
|
public static final int SIDEBAR_SKILLS = 1;
|
||||||
public static final int SIDEBAR_TAVERN = 3;
|
public static final int SIDEBAR_TAVERN = 3;
|
||||||
public static final int SIDEBAR_PARTY = 4;
|
public static final int SIDEBAR_PARTY = 4;
|
||||||
public static final int SIDEBAR_PURCHASE = 5;
|
public static final int SIDEBAR_AVATAR = 5;
|
||||||
public static final int SIDEBAR_SETTINGS = 7;
|
public static final int SIDEBAR_EQUIPMENT = 6;
|
||||||
public static final int SIDEBAR_ABOUT = 8;
|
public static final int SIDEBAR_STABLE = 7;
|
||||||
|
public static final int SIDEBAR_PURCHASE = 8;
|
||||||
|
public static final int SIDEBAR_SETTINGS = 9;
|
||||||
|
public static final int SIDEBAR_ABOUT = 10;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -82,9 +86,9 @@ public class MainDrawerBuilder {
|
||||||
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_challenges)),*/
|
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_challenges)),*/
|
||||||
|
|
||||||
new SectionDrawerItem().withName(activity.getString(R.string.sidebar_section_inventory)),
|
new SectionDrawerItem().withName(activity.getString(R.string.sidebar_section_inventory)),
|
||||||
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_avatar)).withEnabled(false).withBadge(R.string.coming_soon),
|
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_avatar)).withIdentifier(SIDEBAR_AVATAR),
|
||||||
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_equipment)).withEnabled(false).withBadge(R.string.coming_soon),
|
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_equipment)).withIdentifier(SIDEBAR_EQUIPMENT).withEnabled(false).withBadge(R.string.coming_soon),
|
||||||
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_stable)).withEnabled(false).withBadge(R.string.coming_soon),
|
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_stable)).withIdentifier(SIDEBAR_STABLE).withEnabled(false).withBadge(R.string.coming_soon),
|
||||||
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_purchaseGems)).withIdentifier(SIDEBAR_PURCHASE),
|
new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_purchaseGems)).withIdentifier(SIDEBAR_PURCHASE),
|
||||||
|
|
||||||
new DividerDrawerItem(),
|
new DividerDrawerItem(),
|
||||||
|
|
@ -117,6 +121,10 @@ public class MainDrawerBuilder {
|
||||||
fragment = new TavernFragment();
|
fragment = new TavernFragment();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case SIDEBAR_AVATAR: {
|
||||||
|
fragment = new AvatarOverviewFragment();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case SIDEBAR_PURCHASE: {
|
case SIDEBAR_PURCHASE: {
|
||||||
fragment = new GemsPurchaseFragment();
|
fragment = new GemsPurchaseFragment();
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
package com.habitrpg.android.habitica.ui.fragments;
|
||||||
|
|
||||||
|
import android.databinding.DataBindingUtil;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.Spinner;
|
||||||
|
|
||||||
|
import com.habitrpg.android.habitica.R;
|
||||||
|
import com.habitrpg.android.habitica.callbacks.HabitRPGUserCallback;
|
||||||
|
import com.habitrpg.android.habitica.databinding.FragmentAvatarOverviewBinding;
|
||||||
|
import com.habitrpg.android.habitica.databinding.FragmentPartyInfoBinding;
|
||||||
|
import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import butterknife.Bind;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by viirus on 12/01/16.
|
||||||
|
*/
|
||||||
|
public class AvatarOverviewFragment extends BaseFragment implements AdapterView.OnItemSelectedListener {
|
||||||
|
|
||||||
|
FragmentAvatarOverviewBinding viewBinding;
|
||||||
|
|
||||||
|
@Bind(R.id.avatar_size_spinner)
|
||||||
|
Spinner avatarSizeSpinner;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
super.onCreateView(inflater, container, savedInstanceState);
|
||||||
|
View v = inflater.inflate(R.layout.fragment_avatar_overview, container, false);
|
||||||
|
|
||||||
|
viewBinding = DataBindingUtil.bind(v);
|
||||||
|
viewBinding.setPreferences(this.user.getPreferences());
|
||||||
|
|
||||||
|
ButterKnife.bind(this, v);
|
||||||
|
|
||||||
|
this.setSize(this.user.getPreferences().getSize());
|
||||||
|
avatarSizeSpinner.setOnItemSelectedListener(this);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateUserData(HabitRPGUser user) {
|
||||||
|
super.updateUserData(user);
|
||||||
|
viewBinding.setPreferences(user.getPreferences());
|
||||||
|
this.setSize(user.getPreferences().getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSize(String size) {
|
||||||
|
if (size.equals("slim")) {
|
||||||
|
avatarSizeSpinner.setSelection(0, false);
|
||||||
|
} else {
|
||||||
|
avatarSizeSpinner.setSelection(1, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
String newSize;
|
||||||
|
if (position == 0) {
|
||||||
|
newSize = "slim";
|
||||||
|
} else {
|
||||||
|
newSize = "broad";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.user.getPreferences().getSize().equals(newSize)) {
|
||||||
|
Map<String, String> updateData = new HashMap<String, String>();
|
||||||
|
updateData.put("preferences.size", newSize);
|
||||||
|
mAPIHelper.apiService.updateUser(updateData, new HabitRPGUserCallback(activity));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNothingSelected(AdapterView<?> parent) {}
|
||||||
|
}
|
||||||
|
|
@ -24,6 +24,15 @@ public class DataBindingUtils {
|
||||||
|
|
||||||
@BindingAdapter("bind:imageName")
|
@BindingAdapter("bind:imageName")
|
||||||
public static void loadImage(ImageView view, String imageName) {
|
public static void loadImage(ImageView view, String imageName) {
|
||||||
|
if (view.getVisibility() == View.VISIBLE) {
|
||||||
|
Picasso.with(view.getContext())
|
||||||
|
.load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + imageName + ".png")
|
||||||
|
.into(view);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@BindingAdapter("bind:questImageName")
|
||||||
|
public static void loadQuestImage(ImageView view, String imageName) {
|
||||||
if (view.getVisibility() == View.VISIBLE) {
|
if (view.getVisibility() == View.VISIBLE) {
|
||||||
Picasso.with(view.getContext())
|
Picasso.with(view.getContext())
|
||||||
.load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + imageName + ".png")
|
.load("https://habitica-assets.s3.amazonaws.com/mobileApp/images/" + imageName + ".png")
|
||||||
|
|
|
||||||
|
|
@ -16,19 +16,20 @@ public class Hair extends BaseModel {
|
||||||
public String userId;
|
public String userId;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private int mustache,beard, bangs,base;
|
private int mustache,beard, bangs,base, flower;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String color;
|
private String color;
|
||||||
|
|
||||||
public Hair() {
|
public Hair() {
|
||||||
}
|
}
|
||||||
public Hair(int mustache, int beard, int bangs, int base, String color) {
|
public Hair(int mustache, int beard, int bangs, int base, String color, int flower) {
|
||||||
this.mustache = mustache;
|
this.mustache = mustache;
|
||||||
this.beard = beard;
|
this.beard = beard;
|
||||||
this.bangs = bangs;
|
this.bangs = bangs;
|
||||||
this.base = base;
|
this.base = base;
|
||||||
this.color = color;
|
this.color = color;
|
||||||
|
this.flower = flower;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMustache() {
|
public int getMustache() {
|
||||||
|
|
@ -70,4 +71,8 @@ public class Hair extends BaseModel {
|
||||||
public void setColor(String color) {
|
public void setColor(String color) {
|
||||||
this.color = color;
|
this.color = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getFlower() { return flower; }
|
||||||
|
|
||||||
|
public void setFlower(int flower) { this.flower = flower; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue