From 05ae46565abfff83a10ddd243f093aece80b3392 Mon Sep 17 00:00:00 2001 From: Slimexsan <Filip.Stanicak@Student.Reutlingen-University.de> Date: Fri, 5 Jun 2020 20:41:07 +0200 Subject: [PATCH] Added Transaction items with different types --- Frontend/app/build.gradle | 1 + .../Recycler_View_Adapter_Transaction.java | 30 ++++- .../mobileapp/Recycler_View_Adapter_User.java | 27 ++++ .../com/example/mobileapp/Single_Trip.java | 1 + .../mobileapp/TransactionFragment.java | 77 ++++++++++-- .../main/res/drawable-anydpi/get_symbol.xml | 14 +++ .../src/main/res/drawable-hdpi/get_symbol.png | Bin 179 -> 169 bytes .../src/main/res/drawable-mdpi/get_symbol.png | Bin 159 -> 147 bytes .../main/res/drawable-xhdpi/get_symbol.png | Bin 227 -> 178 bytes .../main/res/drawable-xxhdpi/get_symbol.png | Bin 244 -> 231 bytes .../main/res/drawable-xxxhdpi/get_symbol.png | Bin 273 -> 323 bytes .../app/src/main/res/drawable/give_symbol.xml | 6 + .../main/res/layout/layout_transaction.xml | 86 ------------- .../res/layout/layout_transaction_receive.xml | 119 ++++++++++++++++++ .../src/main/res/layout/layout_user_group.xml | 2 +- .../app/src/main/res/layout/single_trip.xml | 2 + Images/+.png | Bin 0 -> 347 bytes Images/drawable-hdpi/+.png | Bin 2023 -> 317 bytes Images/drawable-ldpi/+.png | Bin 502 -> 226 bytes Images/drawable-mdpi/+.png | Bin 1008 -> 215 bytes Images/drawable-xhdpi/+.png | Bin 2814 -> 426 bytes Images/drawable-xxhdpi/+.png | Bin 5452 -> 502 bytes Images/drawable-xxxhdpi/+.png | Bin 8532 -> 1008 bytes 23 files changed, 267 insertions(+), 98 deletions(-) create mode 100644 Frontend/app/src/main/res/drawable-anydpi/get_symbol.xml create mode 100644 Frontend/app/src/main/res/drawable/give_symbol.xml delete mode 100644 Frontend/app/src/main/res/layout/layout_transaction.xml create mode 100644 Frontend/app/src/main/res/layout/layout_transaction_receive.xml create mode 100644 Images/+.png diff --git a/Frontend/app/build.gradle b/Frontend/app/build.gradle index ea9e735..443a246 100644 --- a/Frontend/app/build.gradle +++ b/Frontend/app/build.gradle @@ -28,6 +28,7 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.11.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + implementation 'com.android.volley:volley:1.1.1' implementation 'de.hdodenhof:circleimageview:3.1.0' implementation 'androidx.appcompat:appcompat:1.1.0' implementation "androidx.recyclerview:recyclerview:1.1.0" diff --git a/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_Transaction.java b/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_Transaction.java index 1c66c73..5149cd0 100644 --- a/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_Transaction.java +++ b/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_Transaction.java @@ -3,6 +3,7 @@ package com.example.mobileapp; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; @@ -16,10 +17,12 @@ class Recycler_View_Adapter_Transaction extends RecyclerView.Adapter<Recycler_Vi private ArrayList <String> mTitles = new ArrayList<>(); private ArrayList <Boolean> mGiveOrGet = new ArrayList<>(); private ArrayList <String> mAmount = new ArrayList<>(); + private ArrayList <String> mAmount_Converted = new ArrayList<>(); + private ArrayList <String> mCurrency_Converted = new ArrayList<>(); private ArrayList <String> mCurrency = new ArrayList<>(); private TransactionFragment mContext; - public Recycler_View_Adapter_Transaction(TransactionFragment mContext, ArrayList<String> mUserNamesOne, ArrayList<String> mUserNamesTwo, ArrayList<String> mTitles, ArrayList<Boolean> mGiveOrGet, ArrayList<String> mAmount, ArrayList<String> mCurrency) { + public Recycler_View_Adapter_Transaction(TransactionFragment mContext, ArrayList<String> mUserNamesOne, ArrayList<String> mUserNamesTwo, ArrayList<String> mTitles, ArrayList<Boolean> mGiveOrGet, ArrayList<String> mAmount, ArrayList<String> mCurrency, ArrayList<String> mAmount_Converted, ArrayList<String> mCurrency_Converted) { this.mUserNamesOne = mUserNamesOne; this.mUserNamesTwo = mUserNamesTwo; this.mTitles = mTitles; @@ -27,12 +30,15 @@ class Recycler_View_Adapter_Transaction extends RecyclerView.Adapter<Recycler_Vi this.mAmount = mAmount; this.mCurrency = mCurrency; this.mContext = mContext; + this.mAmount_Converted = mAmount_Converted; + this.mCurrency_Converted = mCurrency_Converted; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_transaction, parent, false); + + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_transaction_receive, parent, false); ViewHolder holder = new ViewHolder(view); return holder; } @@ -44,6 +50,18 @@ class Recycler_View_Adapter_Transaction extends RecyclerView.Adapter<Recycler_Vi holder.title.setText(mTitles.get(position)); holder.amount.setText(mAmount.get(position)); holder.currency.setText(mCurrency.get(position)); + + if (!mCurrency.get(position).equals(mCurrency_Converted.get(position))) { + holder.currency_converted.setText(mCurrency_Converted.get(position)); + holder.amount_converted.setText(mAmount_Converted.get(position)); + } + + if (mGiveOrGet.get(position)) { + holder.giveOrGet.setImageResource(R.drawable.get_symbol); + } else { + holder.giveOrGet.setImageResource(R.drawable.give_symbol); + } + } @Override @@ -56,16 +74,22 @@ class Recycler_View_Adapter_Transaction extends RecyclerView.Adapter<Recycler_Vi TextView userName; TextView title; TextView amount; + ImageView giveOrGet; + TextView amount_converted; + TextView currency_converted; TextView currency; LinearLayout transactionLayout; public ViewHolder(@NonNull View itemView) { super(itemView); + giveOrGet = itemView.findViewById(R.id.give_or_get); userName = itemView.findViewById(R.id.person_two); title = itemView.findViewById(R.id.transaction_title); amount = itemView.findViewById(R.id.transaction_amount); - currency = itemView.findViewById(R.id.transaction_currency); + amount_converted = itemView.findViewById(R.id.transaction_amount_converted); + currency_converted = itemView.findViewById(R.id.transaction_currency); + currency = itemView.findViewById(R.id.transaction_currency_basis); transactionLayout = itemView.findViewById(R.id.transaction_layout); } } diff --git a/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_User.java b/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_User.java index da97e91..dfa7d2f 100644 --- a/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_User.java +++ b/Frontend/app/src/main/java/com/example/mobileapp/Recycler_View_Adapter_User.java @@ -1,5 +1,7 @@ package com.example.mobileapp; +import android.app.Activity; +import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -7,6 +9,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import java.util.ArrayList; @@ -26,6 +29,8 @@ public class Recycler_View_Adapter_User extends RecyclerView.Adapter<Recycler_Vi this.mContext = mContext; } + + @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_user_group, parent, false); @@ -47,6 +52,28 @@ public class Recycler_View_Adapter_User extends RecyclerView.Adapter<Recycler_Vi holder.userAdmin.setImageResource(R.drawable.no_admin_crown); } + + holder.userAdmin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(changeAdminStatus(position)) { + mUserAdmin.set(position,true); + Recycler_View_Adapter_User.this.notifyItemChanged(position); + } else { + mUserAdmin.set(position,false); + Recycler_View_Adapter_User.this.notifyItemChanged(position); + } + } + }); + } + + + public boolean changeAdminStatus(int position) { + if (mUserAdmin.get(position)) { + return false; + } else { + return true; + } } @Override diff --git a/Frontend/app/src/main/java/com/example/mobileapp/Single_Trip.java b/Frontend/app/src/main/java/com/example/mobileapp/Single_Trip.java index 36398dc..c37b9e7 100644 --- a/Frontend/app/src/main/java/com/example/mobileapp/Single_Trip.java +++ b/Frontend/app/src/main/java/com/example/mobileapp/Single_Trip.java @@ -8,6 +8,7 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import androidx.viewpager.widget.ViewPager; +import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; diff --git a/Frontend/app/src/main/java/com/example/mobileapp/TransactionFragment.java b/Frontend/app/src/main/java/com/example/mobileapp/TransactionFragment.java index c46301b..be69a38 100644 --- a/Frontend/app/src/main/java/com/example/mobileapp/TransactionFragment.java +++ b/Frontend/app/src/main/java/com/example/mobileapp/TransactionFragment.java @@ -11,18 +11,39 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; + +import org.json.JSONException; +import org.json.JSONObject; + import java.util.ArrayList; public class TransactionFragment extends Fragment { - private static final String TAG = "Debug"; + //First User participating in the transaction, its the Accountuser himself, name is needed for admin private ArrayList <String> mUserNamesOne = new ArrayList<>(); + + //Second User participating in the transaction private ArrayList <String> mUserNamesTwo = new ArrayList<>(); + + //Title of the transaction private ArrayList <String> mTitles = new ArrayList<>(); + + //Decider if money is received or has to be given private ArrayList <Boolean> mGiveOrGet = new ArrayList<>(); - private ArrayList <String> mAmount = new ArrayList<>(); + + //Displaying the amount in the groups currency + private ArrayList <String> mAmount_Converted = new ArrayList<>(); private ArrayList <String> mCurrency = new ArrayList<>(); + private ArrayList <String> mAmount = new ArrayList<>(); + private ArrayList <String> mCurrency_Converted = new ArrayList<>(); + //private RequestQueue mQueue; @Override public void onCreate(Bundle savedInstanceState) { @@ -37,7 +58,7 @@ public class TransactionFragment extends Fragment { View rootView = inflater.inflate(R.layout.fragment_transaction_fragement, container, false); RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_transaction_view); - Recycler_View_Adapter_Transaction adapter = new Recycler_View_Adapter_Transaction(this,mUserNamesOne,mUserNamesTwo,mTitles,mGiveOrGet,mAmount,mCurrency); + Recycler_View_Adapter_Transaction adapter = new Recycler_View_Adapter_Transaction(this,mUserNamesOne,mUserNamesTwo,mTitles,mGiveOrGet,mAmount,mCurrency,mAmount_Converted,mCurrency_Converted); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); @@ -48,21 +69,26 @@ public class TransactionFragment extends Fragment { private void initImageBitmaps() { + //mQueue = Volley.newRequestQueue(getActivity()); + //jsonParse(); + mUserNamesOne.add("Filip"); mUserNamesTwo.add("Bruno"); mTitles.add("Restaurant"); mGiveOrGet.add(true); mAmount.add("50.00"); mCurrency.add("€"); - - + mAmount_Converted.add("2.00"); + mCurrency_Converted.add("€"); mUserNamesOne.add("Dennis"); mUserNamesTwo.add("Jan"); mTitles.add("Themenpark"); mGiveOrGet.add(false); mAmount.add("120.00"); - mCurrency.add("$"); + mCurrency.add("€"); + mAmount_Converted.add("2.00"); + mCurrency_Converted.add("$"); @@ -71,7 +97,9 @@ public class TransactionFragment extends Fragment { mTitles.add("Einkaufen"); mGiveOrGet.add(false); mAmount.add("1680.00"); - mCurrency.add("¥"); + mCurrency.add("€"); + mAmount_Converted.add("2.00"); + mCurrency_Converted.add("¥"); mUserNamesOne.add("Dennis"); @@ -79,7 +107,40 @@ public class TransactionFragment extends Fragment { mTitles.add("Bar"); mGiveOrGet.add(true); mAmount.add("20.00"); - mCurrency.add("£"); + mCurrency.add("€"); + mAmount_Converted.add("2.00"); + mCurrency_Converted.add("£"); } + + + + + /* + private void jsonParse() { + String url = "https://api.exchangeratesapi.io/latest"; + + JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { + @Override + public void onResponse(JSONObject response) { + try { + JSONObject rates = response.getJSONObject("rates"); + int canada = rates.getInt("CAD"); + int hongkong = rates.getInt("HKD"); + int island = rates.getInt("ISK"); + int denmark = rates.getInt("DKK"); + int hungary = rates.getInt("HUF"); + } catch (JSONException e) { + e.printStackTrace(); + } + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + error.printStackTrace(); + } + }); + + mQueue.add(request); + } */ } diff --git a/Frontend/app/src/main/res/drawable-anydpi/get_symbol.xml b/Frontend/app/src/main/res/drawable-anydpi/get_symbol.xml new file mode 100644 index 0000000..c038432 --- /dev/null +++ b/Frontend/app/src/main/res/drawable-anydpi/get_symbol.xml @@ -0,0 +1,14 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="19.2" + android:viewportHeight="19.2" + android:tint="#136A10" + android:alpha="0.8"> + <group android:translateX="-2.4" + android:translateY="-2.4"> + <path + android:fillColor="#136A10" + android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> + </group> +</vector> diff --git a/Frontend/app/src/main/res/drawable-hdpi/get_symbol.png b/Frontend/app/src/main/res/drawable-hdpi/get_symbol.png index 9a966ac5caca0555cff13c05be22ac5f767a7a06..e1022a7fbfdd2aa9ddfb91a0c93f47db8d127011 100644 GIT binary patch delta 141 zcmdnYxRP;#N_~N+i(^Q|t>gp=*2M`8jXp;6C%CL@(coyl!Te5PqE4gTL!HK>3Oq^u zRvA|u7xPJ#URcrWHmBL)tKf-*q>TlA2b^X!JLCj?5eog@sO7nX)#RAM?zVZ&Y_U^% opKS_c?}cmgc<t5SB*@S3`}^~is%NBm7=XajmCes(ol`;+0BZ3%eE<Le delta 151 zcmV;I0BHZI0kZ*+B!7BIL_t(|+GAiC1*2dTjDk@x3P!;w7zM)*h~)7b3uW?I3>pUs zX9-Rg&JkER>Yz~v5d-+r`BX)+1Xm(sp)7$z!dU`G(ZxY(Y3?9_Yyo+ZOo4u640OzH z;Y@-3=;9!?qiJZ=K||6(pxh*!!>ch`iH?F%Fbc>309QdT;SiepfSdpT002ovPDHLk FV1j5|JaGU3 diff --git a/Frontend/app/src/main/res/drawable-mdpi/get_symbol.png b/Frontend/app/src/main/res/drawable-mdpi/get_symbol.png index fc09a4a2d834a62faa2ccf6cee4bb3fe0f18ae8b..595fb5f1bed9b6c2c383c90d054a5a6d15a67e30 100644 GIT binary patch delta 118 zcmV-+0Ez#f0h0lcByU<tL_t(|+GAiC1=Iq9`GRu7*@9Id3}RE=0^uwkP2nto#SqM+ zIcmYE1$dGo*dR<SmLud2vjD=zt`2V!2B&klE6Kz_GX~BAng`KnG99&mwieL5!Wp>$ Y0L+<r%}Q0qpa1{>07*qoM6N<$f>QA?TmS$7 delta 130 zcmV-|0Db?H0iOYoBztB_L_t(|+GAiC1*2dTi~{Ndfm{K7h6V;ETA9x%oF#Bdrcj1+ z2wBj;z#^EzqXWh{g1R6JMDqBJVPYV8ip&>^7UBaMx&#TI5z69U2IGU|M|vEfSs;=n kxI!gYg?%)`jsiFU08M`zmRZTBW&i*H07*qoM6N<$g5{(!#Q*>R diff --git a/Frontend/app/src/main/res/drawable-xhdpi/get_symbol.png b/Frontend/app/src/main/res/drawable-xhdpi/get_symbol.png index 4fe7e7f17fc03b3f050e09fd91a6b4a8d22df8b4..3d0765f63faa38787c99c176707f5bc8ae6f38a5 100644 GIT binary patch delta 150 zcmaFNxQTIsN`0lLi(^Q|t+zKfayA$UI0Uk92$*xI)X445fzp_e3tp}qf>S1ce>h9z z5jP97S+C09b&A^`PuN{Dr;LZ?MqHJpFB1a{R1~S|%~?5LzoB;RyGqmWkF#U{WC<}G s_}%cJ{YE)V5rcx3!Vi5lPpv%GWp`G(^zbWr>w@GwUHx3vIVCg!0J_XKjQ{`u delta 199 zcmV;&0671$0pkIXB!8+&L_t(|+U?dc3c@fHfZ^!mASN#{c5x_pDjif5icP#h9mGMr zn&P2s1{dulNUQuGye)zEQwmWE000000014+bHOZKX;%3<AN=0>N7Z-HT<eJYbUU&H z5I{gjNg-N-%-?1&i+cH63b4^`8qd^sTMy8Mo~0!}nRK`HfIw`QO<a)bb$n?K&o3|z z=G1g1-Q^!3fB*u%_ZpQ_pM8{z4}Qqw8~}iS^Z<($Uc|6h)z<(3002ovPDHLkV1llS BR;>U4 diff --git a/Frontend/app/src/main/res/drawable-xxhdpi/get_symbol.png b/Frontend/app/src/main/res/drawable-xxhdpi/get_symbol.png index b0d0224ec460a2524e13ba33c44864961c7d73e7..2decfdc149f43d0207a1a6ab80ea3028965e01b9 100644 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!>pWc?Ln>~)y=~3s;2`1<$Q>YY z`E`1x#+R~1+XDAb3z#7ATy6a<CmGh0-8z$1JSW|Yc;O^E+ve@rqHom;ZnW8%9o=F5 zSyI8Ffq{{Ug+l;?apCK=t7nRo`F$eWA97^aR=?P_echC8wpR}Z|9kU<6RiF(<B9Bh q?MfJ0;f7uCta~+8#q*N-Y=*B}x}!K2h@AtvoWax8&t;ucLK6U^Wln<t delta 216 zcmaFP_=RzTO8st67srr_TW_z}@-aFxv?Z!<uzviUB}!bOkVA`4p=a$~hlPa<TW@*F zoa$@oXli3RKe^^^%B0H8H{F;SVBkmE+)&G`<weu4dp(Vq$i9$kv(=fGn^r|=D@|}< z;#2_=f174JQqbu>yZLG&-*$(UHv6pRzyC9Ly>e^d%e#;7Z>m}D@Ly=f%vpQiDf!J? zJN3}FUq5CX`giqb&GPvs5Cb?>F4VKUI-Y8H{&iU53J##n2i)f{Uiz?Y?ctD;=OBl8 My85}Sb4q9e05sWQ&j0`b diff --git a/Frontend/app/src/main/res/drawable-xxxhdpi/get_symbol.png b/Frontend/app/src/main/res/drawable-xxxhdpi/get_symbol.png index f7e14028958020448378a2a9f2b51d29b3ba5f50..cf3c227470efc2c8ec0cb0580501b4819cad8e83 100644 GIT binary patch delta 297 zcmbQpbeL&^ay=uLr;B4q#jUqDHhLWn5NUY0PRZ=M+Q!INuU<Sz{=v~SJ0V|bnwYrw z!Gq!-X1c8T5wMFzNY;mK>D2el#`m87d8n3R#K?dK8vbkNZ#r$%`n;@b%H5l%<h6oh zL`p02)%_pd3u6&rU}SM%U=(m*V7VcCwLW*NeZ24Ig~7`<ykqOotd=RR+c)d|%_{e} z_SC?1{pRJIv-29xS4tP##T_q>ejls(SN+%Z<ul`M>|(gRIHG0tyZ2A$FI(|AyMAG! z@v}YJFK$~a*lW#xQ}UywU7vB@u{rZ~)2FWe%_EAi6li~$ibHWhO@-+BTb)Xp^KNiK boqziY^TZgx&uaOz>Omr&u6{1-oD!M<5Egn0 delta 246 zcmX@iG?8h7ay`QhPZ!6Kid%258LndtlxR!jo=}+9cOkN2H;;FK=9WX2CR}S(Z*<?& z&C3n+n9!Lea%Adr&woi>Cspp>_F2u!fDZ1jHeY|tu>JmTU2Eypdje;k^7MIFv0JNk zZ77QX10#zA1EYWg1B*aITaw<gyCUE6ef6IeRB(Lwe&_emE3dvXtn~Qm7+>$YX%_=i z!PWWSt3&hto9un3wB~j5y!qwl_tgKKcl9qTX9EM1LIVSb0s|9A1H*rn18ZcC+>yMy jE^2Fg7$d|%4<^rH`25eBJ3ssDOpu7DtDnm{r-UW|I<#a| diff --git a/Frontend/app/src/main/res/drawable/give_symbol.xml b/Frontend/app/src/main/res/drawable/give_symbol.xml new file mode 100644 index 0000000..6f344cb --- /dev/null +++ b/Frontend/app/src/main/res/drawable/give_symbol.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="line"> + <stroke android:width="4dp" + android:color="#B81313"/> +</shape> \ No newline at end of file diff --git a/Frontend/app/src/main/res/layout/layout_transaction.xml b/Frontend/app/src/main/res/layout/layout_transaction.xml deleted file mode 100644 index 10eb7fd..0000000 --- a/Frontend/app/src/main/res/layout/layout_transaction.xml +++ /dev/null @@ -1,86 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <LinearLayout - android:id="@+id/transaction_layout" - android:layout_width="match_parent" - android:layout_marginTop="10dp" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:text="+" - android:layout_marginTop="-10dp" - android:layout_marginLeft="20dp" - android:layout_marginRight="20dp" - android:textSize="60dp" - android:textColor="#136A10" /> - - - - <View - android:layout_width="1dp" - android:layout_height="70dp" - android:background="#C5B358" /> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="5dp" - android:orientation="vertical"> - - - <TextView - android:id="@+id/person_two" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="20dp" - android:textSize="24dp" - android:text="Placeholder" - android:textColor="#C5B358"/> - - <TextView - android:id="@+id/transaction_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="20dp" - android:textSize="18dp" - android:text="Placeholder" - android:textColor="#716528"/> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginRight="20dp" - android:gravity="right|center"> - - <TextView - android:id="@+id/transaction_amount" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="00,00" - android:textColor="#C5B358" - android:textSize="30dp" /> - - <TextView - android:id="@+id/transaction_currency" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="5dp" - android:text="$" - android:textColor="#C5B358" - android:textSize="30dp" - /> - - </LinearLayout> - - </LinearLayout> - -</LinearLayout> \ No newline at end of file diff --git a/Frontend/app/src/main/res/layout/layout_transaction_receive.xml b/Frontend/app/src/main/res/layout/layout_transaction_receive.xml new file mode 100644 index 0000000..59686d2 --- /dev/null +++ b/Frontend/app/src/main/res/layout/layout_transaction_receive.xml @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + + <LinearLayout + android:id="@+id/transaction_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <ImageView + android:id="@+id/give_or_get" + android:layout_width="34dp" + android:layout_height="match_parent" + android:layout_marginLeft="20dp" + android:layout_marginRight="20dp" + android:gravity="center" + android:src="@drawable/get_symbol"/> + + + <View + android:layout_width="1dp" + android:layout_height="70dp" + android:background="#C5B358" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="5dp" + android:orientation="vertical"> + + + <TextView + android:id="@+id/person_two" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="20dp" + android:text="Placeholder" + android:textColor="#C5B358" + android:textSize="24dp" /> + + <TextView + android:id="@+id/transaction_title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="20dp" + android:text="Placeholder" + android:textColor="#716528" + android:textSize="18dp" /> + + </LinearLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="5dp" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginRight="20dp" + android:gravity="right|center"> + + <TextView + android:id="@+id/transaction_amount" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="00,00" + android:textColor="#C5B358" + android:textSize="24dp" /> + + <TextView + android:id="@+id/transaction_currency_basis" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="5dp" + android:text="$" + android:textColor="#C5B358" + android:textSize="24dp" /> + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginRight="20dp" + android:gravity="right|center"> + + + <TextView + android:id="@+id/transaction_amount_converted" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="#716528" + android:textSize="18dp" /> + + <TextView + android:id="@+id/transaction_currency" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="5dp" + android:textColor="#716528" + android:textSize="18dp" /> + + </LinearLayout> + </LinearLayout> + + </LinearLayout> + + <ImageView + android:layout_width="12dp" + android:layout_height="12dp" + android:src="@drawable/rnd_button" + android:layout_marginLeft="69dp"/> + +</LinearLayout> \ No newline at end of file diff --git a/Frontend/app/src/main/res/layout/layout_user_group.xml b/Frontend/app/src/main/res/layout/layout_user_group.xml index 15cc562..eec983d 100644 --- a/Frontend/app/src/main/res/layout/layout_user_group.xml +++ b/Frontend/app/src/main/res/layout/layout_user_group.xml @@ -39,7 +39,7 @@ android:layout_height="35dp" android:layout_gravity="center_vertical" android:layout_marginLeft="-50dp" - android:src="@drawable/admin_crown" /> + /> </LinearLayout> diff --git a/Frontend/app/src/main/res/layout/single_trip.xml b/Frontend/app/src/main/res/layout/single_trip.xml index 92da475..e489308 100644 --- a/Frontend/app/src/main/res/layout/single_trip.xml +++ b/Frontend/app/src/main/res/layout/single_trip.xml @@ -21,6 +21,8 @@ android:clickable="true" android:onClick="backButton"/> + + <LinearLayout android:layout_width="match_parent" android:gravity="center_horizontal" diff --git a/Images/+.png b/Images/+.png new file mode 100644 index 0000000000000000000000000000000000000000..bcca4ed9409fce3e06a856de97724839f7d51ea2 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^DnJ~-!3HD?H(&P$QY^(zo*^7SP{WbZ!N9;M<muuV zlHvUJ`o^q70TOKw|BEl@Te={4w{_{eQW2RscSOCW$8~z^EjGWDy)i;x!Cl5h;IOo3 zn@9Zh_j8_{FSZjpBXL8Y-OS%YU~Y#K*F=V=Wgdz`3-0h~x-d<-t=Q_(P-MMCfHNSk zT||lT)Y}P8Dh@kkgF09=wmbj#&)8J;r{`iuan+~Xt*=9x{bu(&TL?@Ifao%jSorez z;o_CY^-TggV^W@6uZ;ccR^9h=+pYgG(bs=0+xNz8_Ut>Gmc0}%c4uBY|DN|WRlCxY zk!gG8U7M<Le}}qK-Rk{6eci7;TT~ZwTjOVvifSv^2?Cs7=a&DAf96ojec`K(5t<9x buP<cI6v_^qWgOQJ3@rvvS3j3^P6<r_=Ut41 literal 0 HcmV?d00001 diff --git a/Images/drawable-hdpi/+.png b/Images/drawable-hdpi/+.png index b83ffad3aa5c066bc0e0f66a4ce44f86e33409af..60831c07817ee73fa8f3059a65e23362602d25fc 100644 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^N<i$*!3HEn_k;!jDVAa<&kznEsNqQI0P??hx;Tbp zIKQ24$k*f`;9A}>wN)+asbtRHjw)8^q(`wjSG+U!G_5_p;rNQJH%%jizBp%G`;d{& zS$}_@<bfEK>8_Iw3ofY;5@_sr<tKAcP$rP2z(p{r?*T`j29w1i4ny|>7IzUwnZTAA z$`+US+}Se!C!9;0f46G?xo_utZ~fd}wRoMPhoH8L!lI~+wtYQecMB^@#kxE;q+~u* z`?>4Ep^G&Z|Mwi9l)Y{D{8QJa@NG%FHQQ=>Ovr>?Uv1vx{+{taenLjyGObVFN_bsX z2|b8i>~YcbqSd0lb$)v<hS$txU%8d#p}Gv*1x?Cb4jccmCBInVv;LC$I-vg<JYD@< J);T3K0RZ$pf<OQO literal 2023 zcmeAS@N?(olHy`uVBq!ia0vp^?F<ZzIvi|3)=TdNlYtaVv6E*A2N2Y7q;xPau+Q^! zaSW-5dpl=;S7^C}>-m`*&$-q#Ot31|(G80F$)UMe@KXC0yT*D0{p5$vH`uZjixO8E zJl?oL?nbmFyZtq<zrStD*YCa2JE`=eJ?9;#gsD9&dCCi9b`@$fJ`Lb|dZBS%!|990 zhhsF@m%XxEQS{}Ef%vJ$mAm*?$=Dj7X)Q`v^{!dV{X9?cLYWz>elIvRs&q62hEWJ8 zJ>BvB$(N$YYwEn~-ah;F{Qtk5RoCzM)UTFFY(6E}H0$4)rzfOJERFoSPb2g6+)rfw zF`llx`ohx_7CU7Wmw!AT)3?THy7J>EMJ;oV*%w=G;)?C-nS5HXNa{b(2rZBigILp@ zQcFL7fBUu9U-#eiw|sZ?>8?LJ*PLGbs{8h*+h@1!S)W%{x99H7d-LPx{J;C!c=xHo z?;l^@Ji6=O*6aPt|L>eX?d{Fu;m`Mff3!fRdZO)v^Pzpr3jTjvihOe4HQZk-!|pKe z7w6L%x9%|RkGAA%u=y%{%5dvW=DO`gG7Ock)Tbn86|?`zduqY(>59L`@hi{xe%xLB z)Z%a5udknyY6}>azY>1E$u?%%*Xge^ZpP)F{<U!T&F^2&E`R&>=hvTS<Kl0AeINGi z*Twt4p8pE}Cg})_k)QpwPJWN)@05vb)pI{~@+pU9Z~e2P6wzHWlIqiypP2lcd3s{# zi=vb{F?|y*|47$!4_kP8VquZxP}HO}{qZ|_dz+Z;-M=Ll>97B{e@|WI*FUdz|Ju)K zw*P<jJ*B5VqymmeKULT!mloD1Ao6i$kw7%Rv9>!$*AE}dj<xMGrz*3!)-01ba_#UL zV3Jp|3+79DotXBN!%=X)Ci}*(2Ahjo7Id7S(tM+8Mx>=vz>)M*jybkx*2pMoJTe~P c#{QAKy#2Vh=K;P`z?z%E)78&qol`;+00=GWDgXcg diff --git a/Images/drawable-ldpi/+.png b/Images/drawable-ldpi/+.png index 0e2acf0d2ee6782b510d67ffd4f6ab5a9458b513..b530aca76e81d942f4b1a866a223ab3f02e48eb3 100644 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^f<Uas!3HFigbLmRDVAa<&kznEsNqQI0P<&gx;Tb- zcqgYUU`klhB+0Y5EurmE#*CgePQ%J<lerUS__b{Q;Ug(A!_V-~@9F=`jxG1x!6cb~ zpik=10fi|?_lsG6koa%RWo%${<NyEj1+9%A|Ldmgy#N1yXzjdzKh->VR1*{#J6Zl2 zXBrw9>HIkVVgK}r5C40KaM#uB`j{qnIGxA&!r}sxvJOql4XY(}{XKO2J9u9uifv$E Xh>KKLdD)}{bR>hPtDnm{r-UW|p@CHB literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^E<ikugAGWgKh>KCq*#ibJVQ8upoSx*gMoo@t*47) zNJZS+n|FPg0vTE^9%ZUoD3*IfPp893!zKHm3%9`hordN=nY5*gE7&&i6u<khIr@&C z(2bLijTjqwdIdThp0&5MWpuPHQFLXKOqt-xsnG1B)ic!*$O&RPp)i>%Idy^~+sr8p zMkkgWiU6u`R8wu>F<NO5Ms?+Pa#O#p@Ap6b>BG0*SL^KO^Toe^IrYwqb4)i+NiI@6 zY^^BJc*ft7_o4u==X@5RqtIM<pkBq;o@0Gy`rPC5rhoqU_`}bjdA5IBG$w?6{$%&( zY^`a^iAV*enU|yYDsG?hesQ(cg1^P)M^ptGEu7~l?)$eq)D4@DihUE!KHvD_el=}f y)lqK269VfTSd6|eQ<Peym^m5K5%_}X4FADYzGY%|k+#5yWbkzLb6Mw<&;$U<#=FY^ diff --git a/Images/drawable-mdpi/+.png b/Images/drawable-mdpi/+.png index b71b718fafebcdeb6cd5454a444496710ad80cfd..7ea4f06f259e35965febc2ffb9e549ac81949d22 100644 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^;y`S~!3HF^dpoECDVAa<&kznEsNqQI0P_1hT^vIq z+>=ulC?+gfc#~&wTQcw6iwTmvVvjc8&B&7U)m^-@^@o6jukMlds~j59Et`H^H!?C{ zGc@>PTy6dKa%K`!`-=ogQ<>}nzIO?N=N=iSCL~z7`gk1(`20Tp-)+hHYKq;9mx#@h z>N|h5+4_uoEFX8{!N6@3CV%TJ`?=!bla>P+yIX$*Nc(n09Ohz>`yXa(&uSqJbQy!E LtDnm{r-UW|e|b(a literal 1008 zcmeAS@N?(olHy`uVBq!ia0vp^Q9yixgAGV#uzm9aQY^(zo*^7SP{WbZ!N9=0+|$J| zq$2L^ZNpW;fg-IBi<_q&b?%sY?m%4h@&_z$LS3q#CoF7@I+;DUYn#|Bi5lNa9EbKQ zm5DuEv-hF-q4`zo*E~6`6{nCdX(!Ognz=EBgSXcqW1%ABies+ayqpfEdQll3466z+ zIyo~1^mdC$2{mNJY`HLjA>{F*);5*}QsTNMDhyY5j9e{W<QxA^?%tjJ#%|u1i0jY8 z-}9|k+#GcFrhe3mOV4Mux12lc#ktTsr_$raoi$Sgb{&~U1EJ#*=JVtBZ(VymZ#ql5 z^X+%%B91*>`8hX7fBMGS8MUWQ-Tn0V!_(it3)iI7r$_C7eZziNg<09|@T;HxYj3}| zyQ=s{NbOlC|I?hdzE`b9c0D(rD^@jYRk=pV`FtzgFD9Yy176I#U-B#7$$sC*gy?PU zm)CDC*pYL(PUrEzllnThf7ncW8~yO*a%KDNUypu#`|)+jgY}26-M@JClFIY&4=$?< zwM&@wJGtg&nC7+SJx~o?D7^OA+6%mURJ2MKUELwNt8uzZtKSx>?M~(&Cat*88TL5r z1zVhusMW=+J6v}UcrS8NkLrzHC|%(h@`6~y_PqU@-CFmVDgFQC4L`RR-J9;@Jiq_K ffTdx@7x9O0EWN=xT|OL`g&90u{an^LB{Ts5JP)^w diff --git a/Images/drawable-xhdpi/+.png b/Images/drawable-xhdpi/+.png index 2a92602f9138445c7d0a945a6dad2e3874a4905f..b9fe192ca6a91fd95adfe8cf6b3ecdac1882fa24 100644 GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^x<H)5!3HFSe0SObDVAa<&kznEsNqQIU|?WO^mK6y zsfc@f!!V1<QR3*wnW|e^_ITgAqZp^O<V0*s!eh}R-8Y``gh_dHg*@tLjM%w(&+`ut z57ob}-7If^{~X^llSA751<#IL2;47q$s?R)1^d?pa)GiAQknh@wYQ2d2Yb9ui(|?> z@9VF)c6KG_5?gcI)-8F@R4079^F`#+u9?#vh*orV>GJiHzh5c+{6El3>-GAh-+koQ z+8?}-F1@5$%E@+xd+P3ma#xzGcxw9JKYIMhyrp2Op8fMF@p|d~lkAEu^;%Vf>MYij z$?w0t@63aDhPBl?r<iZwsjj)DUuVX1*KPB*Q)@3JzuB^?N_;oF^J=C!%e9kAW>p37 z*Lq9Z7_9XEr1VK?)!fXQ`p<sm^WMKI;*nigQ^$76!~Nf3k%hj?m8aaaT{LB)Ta`nD ouKp?|59PCsnyZ+nKA*!d@!*xzb7?G>fPv58>FVdQ&MBb@02xfaPXGV_ literal 2814 zcmeAS@N?(olHy`uVBq!ia0vp^TNoG^CvdO<S?ujz%YYP1v6E*A2N2Y7q;xPaaBcN; zaSW-5dwYBD+NJ5DZ4dXdr=)OluTgY<*T6Pm1*6mUgaxclSrRcUEEgDsR0EoX1%9|I zvE&;)^0(Vwdhc(6@1MD*?{{5aDtz`%{yz<akOy{Kx<f^FF!CM@VO+5MT&Cm#$r)M< zU#?i{GMg|5vo_4LTAtdFmavN9Lh$n~JQsL;L>a1H&6&nHt8pchga6#iMh?aXp$sop z7DusVur1?aur2jF&2aX>s9~dFHkvf3o}HMP<^TL@-u}M!?_B#mDOVo<`*HjE`+dKD zs2cxy^Omh-!GpKz@Bjb!_N;pTUZ8B*?>C>z<LkamlB^SZafIQ5=dqNI`xhMD7BqKU z<XF%=!GT?Hv7iIHVk4iDn{or66O*h<j~jz*3yW2UL@$FC2WN?Zp%i0@fY1wtBon3= z3Mv;Ik7Tf1aP$~8fXpy>6zW+2W3~LBZ)YF>+ng~yT>A44`+K|Zzq7CX$Sk+ret*R= zZT=s>{{1*D4vf{a*|v{E9ryoz%KyJ&_x-wmQKx@b?{8)5zdiro&)xd<A9a29nFzh` zo>^0}li@<0bNsPSJn~GuUyLpG{&8E-xUc7_q#cXYi}Zr3pS=#uwUVceYdB0UoPY4; zlXN57FQaMcKLj!s%s=?@sX0(ns?PZjiWeO0n=hZv2WmPUG4G-Cg2p<w<<sv2HBH}W zbGY4s`7e*3{{D~uCBL-KulcXuf4jWC#PZrg`F%TW@7=q9r~dz<=eBb7|Ia`E_pv)o z=ELFdxA*`5cy#&yU$3)mpN9Uo{gSO4`+x60?y%S|v(GdCn!Ww^egDxUH;A%btI4w- sCWrZj?CU$Y7-UCzqai_^RPaaKOXTW$e!cszfDKv(Pgg&ebxsLQ03}x(zyJUM diff --git a/Images/drawable-xxhdpi/+.png b/Images/drawable-xxhdpi/+.png index db4dadfebb9e83ea1817a7ff01525d29b2df329b..0e2acf0d2ee6782b510d67ffd4f6ab5a9458b513 100644 GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^E<ikugAGWgKh>KCq*#ibJVQ8upoSx*gMoo@t*47) zNJZS+n|FPg0vTE^9%ZUoD3*IfPp893!zKHm3%9`hordN=nY5*gE7&&i6u<khIr@&C z(2bLijTjqwdIdThp0&5MWpuPHQFLXKOqt-xsnG1B)ic!*$O&RPp)i>%Idy^~+sr8p zMkkgWiU6u`R8wu>F<NO5Ms?+Pa#O#p@Ap6b>BG0*SL^KO^Toe^IrYwqb4)i+NiI@6 zY^^BJc*ft7_o4u==X@5RqtIM<pkBq;o@0Gy`rPC5rhoqU_`}bjdA5IBG$w?6{$%&( zY^`a^iAV*enU|yYDsG?hesQ(cg1^P)M^ptGEu7~l?)$eq)D4@DihUE!KHvD_el=}f y)lqK269VfTSd6|eQ<Peym^m5K5%_}X4FADYzGY%|k+#5yWbkzLb6Mw<&;$U<#=FY^ literal 5452 zcmeAS@N?(olHy`uVBq!ia0y~yVB}+9V2a>i1By)U<G2K*Sc;uILpXq-h9jkefkBkn z)5S5QBJS;7!*$C}hqgYvoWOZn$zaBeJIqO3d}kCA*izKgTRjap&ojLiQc$|WvLwRl z^sT++<!hfGTfQpKcK4T8m*;<(&i`Lf!9hXfhtR*h_UaA|2iglNSXelYFdY({9O=-| zP*A}<${P)d(Nr*+A4bc9(Nb}=Mi}0;;gmg%`+uE1|Nq<he}A6;|Fm}fZ+m(9{~s>f z|Nrv-{x6x|_qjNZul;}P<^Er9<Ny77{5XC8|7+}Ze}DWcum5qk{@?BGcE|s1XF62) zdVkrjf;EBRGAc5n$^U)`^i6Wqj}5k%wqSj~VBc%bJ*E2!_L!cxuabVKA^GK!X=^g) zuU`@mcg#Bw{ha%F^ye=}1C7qV&gMG)m1Www??*SX#1{1wOyP;L@M7Cr;`=b7X`h{& z#X9v5*M1)Qc+KYTu~F5dVKO|^iG7L1zhB$;|2e+>*vGedpP#-ye!r&X=a1j{<%j;i z{qyzp_4>a*K0W<@|JNMxZ~qU!ultpF|9!u7-~F0DkHYPLKds;Uq2bQL;0N~q9xacr z`E&Vr{r`^b;(hXkS^wtG7ZB*{HvIKyM?m?r1q}r}Np)4)4}X|Uwf|$s+VVI_?@-~w zcV`?KA4(kg^Cj%i$4ssIAGN^je>A4$vD4j|%}j?3JAS@g+w%Bw$iEN2MSy1Q<T&2C z%b1<DC0XF}<!H|1%UAw+_+3*$M!Z<CkGnLT52#t;+4Ai|eg45e55Es~u+V#^BqRRn zoD5L2;~D>aRhjwAKDFOp-cS&8#??aa%3Mng1)1g<^Y3|C*!e!?-|x@(aL0`9f|wQ7 z#Q_c$Y=-uGrxw)AIwfB>A6ViTia(@<M=pomcROIu_%k;qy8Lh9f5&ClI{$Wl7wfYZ zJh$n8xPyh4TpO@ps(Lx=&_<Tp+Ma?K{|9S7w?1B5`S0Rw4)>D_rmxeK@xE~VI0vvO zyJr<|ac|ag{k}<+aq+>x@@qrMKK(w`7n71(7N=Y|6lnBfDX_>B`tsHAP@!$(_H*KW z+n>EOA5}dXCL=GMtn*9=a<EV{ee1fw1(?g&-p*oC0~Rbnm*ZHxSU}ljRKaLCjHZVX eoi85LGbX%UIrY_oW6i+fQ3g*}KbLh*2~7ZXzyNvx diff --git a/Images/drawable-xxxhdpi/+.png b/Images/drawable-xxxhdpi/+.png index 8784692088007245f133650b6472c166ae372f12..b71b718fafebcdeb6cd5454a444496710ad80cfd 100644 GIT binary patch literal 1008 zcmeAS@N?(olHy`uVBq!ia0vp^Q9yixgAGV#uzm9aQY^(zo*^7SP{WbZ!N9=0+|$J| zq$2L^ZNpW;fg-IBi<_q&b?%sY?m%4h@&_z$LS3q#CoF7@I+;DUYn#|Bi5lNa9EbKQ zm5DuEv-hF-q4`zo*E~6`6{nCdX(!Ognz=EBgSXcqW1%ABies+ayqpfEdQll3466z+ zIyo~1^mdC$2{mNJY`HLjA>{F*);5*}QsTNMDhyY5j9e{W<QxA^?%tjJ#%|u1i0jY8 z-}9|k+#GcFrhe3mOV4Mux12lc#ktTsr_$raoi$Sgb{&~U1EJ#*=JVtBZ(VymZ#ql5 z^X+%%B91*>`8hX7fBMGS8MUWQ-Tn0V!_(it3)iI7r$_C7eZziNg<09|@T;HxYj3}| zyQ=s{NbOlC|I?hdzE`b9c0D(rD^@jYRk=pV`FtzgFD9Yy176I#U-B#7$$sC*gy?PU zm)CDC*pYL(PUrEzllnThf7ncW8~yO*a%KDNUypu#`|)+jgY}26-M@JClFIY&4=$?< zwM&@wJGtg&nC7+SJx~o?D7^OA+6%mURJ2MKUELwNt8uzZtKSx>?M~(&Cat*88TL5r z1zVhusMW=+J6v}UcrS8NkLrzHC|%(h@`6~y_PqU@-CFmVDgFQC4L`RR-J9;@Jiq_K ffTdx@7x9O0EWN=xT|OL`g&90u{an^LB{Ts5JP)^w literal 8532 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 M1ce1&2;lDjFY#jts{jB1 -- GitLab