L+?Ao#`D-}ur*z0%GOPA@pj@&sDp(bNx#fI9;R-G0w>u;2C z#Teo})j}h9ci89`yY_w94P<12l}lk;)vv)5P}86^n&%8X?MOhFVo~RyJ=~-hp68zi zrem7-Q26W~*~vmy&Yo&Tr_cyNt9@73>CY@re^irE1j+oEL0-(+Bwoy{HmPE<+V2TJ zJ4A}#B!%j;@R5bD*kPR^Kp+|f9=tpi;^GO9$vZ6tIA0=$g##gU$S*Bn#c5XYzhj`f zt2~#YhQKG_Q!WS$RD?IHUCs=_FHLtX_G$`EZpogOuJVA@SwghkVaSE`$oBgsvsfL;egWrWMHYt&Y4mTuLAp3F&|vHQErz-^ zG5svhZNY)A6+DqY6W1@5C 006 zfTi*I9u4yLOyrPzI#dKTo*0Vk@9|_p&l8nDP~?nh=!b=pR{ZU+8O_+nK++|a@h2`s zFT9c0;Yql(Sl&>Swykh+@NgJYGITx(1M)dFSX)vwkN^B-W$hUW=&YbT`6`$E+!8_6 zO0~V6R!p-C>47C{36 dP~LNv0ZFll7|9U3~e zXcC+6sSH>Zv~sIlR{vO!dzVSy7(!RV@{YyBS~B5p!eNW$;0C*fd+S;C8Gas2gzyO? zghwMB%E+5s3Pl#TOO%(-ze5&nK*fV!#^M5k2!43H0?ql(8XieY0MKc2_Jmor;&~g) z(tgw(!|M01G1JVqn<32uf;}>tq8s59@w-cpzz%>J+`D#Gkft%7pwp{(Vs=KjAs}$Y z7VApQl%uyg( uzgSh?uwWh0!N9&P&YxtRU{8?J2F->7< z$rzk^#hG{Zrlbmbue}T3T-VppWH(xUowVD@YxW)$)q|lz55(`K2-L-!R*3AGuW7PL zf#NhjDL=pS%ZFQml94l1KcvxYW9+y2U8%iUxTocAx%%^XH|iJ*y=Z>PuB-rr{$xI( z%sl-miZ3sT?bzXNr EA`g^j868@}J2slwf>khPAL0SeRIiQ2nGR)*}I zIF$N8dPQV5FDnzc6k6Da=Giy*8%Ng?qR%W`qEqgp(`ct(amL^TV)_N=CMt67hDzIG zmo#Cb@^FAD$}k}slNJe?4+gRQ3#$_q@92evG k}mE!G7jLGBB&Llc*FhGoSw~K(DnA z6S&>!6br{m7)T%aiX)5)Q#Wd`!ISheE4v6e)k(NP!Z&HjN- ^nM@jX4%H0m!pG OwVqIhW=&%K%Ef$G26ns0 zaQ5qfwR(CC+q5l;#p7t6aheDKm*STyeMoQv^r|cediEXCw~mzA{*r99s!UWunWkcT zXED7(pIy%PVP;I3?rCoSs>n6mh%#dHIG=YRO$>k}!?pf0$M*wc!qB1!d4cSCKe#6| zZLOHnX}G@O*-C@F$&O-uf;qb&ZQoeoTJ7`B;jXn|y5T97JEQD+MjS2EFyJIaS#9fE z;0VT>{UXKQ8N?T^7dHk>5)S5)-CF7xCb%mjS!|$EDQ$8BQT8gHWx+vG5uv$v{P`0m zfLc6ButLUNm|Kht{?JA+BN`WPv|3RG=tlCe30Kse!}eKE*@oj;iW+S#Z5Bi9Gk<&N zU4mu}Mg3JXD|BYXJ%XC~5;SP7iG+P_IgkN!$-YwTCrI2*??q#*giiP(JXGPDJ30>= zv$dSh(?10@{UI0RHj`9F8s(rBy?cSR8X_DtC$~CNL(|qco)bQa_32-LN$ri0k6K z(P-wlsq5DVdPy??h#sR+y?V^@jfFRI79Y~&7SqV;%fFS+o~$m5K$R)PC_~+XNKFGd zK;H3oFP=Uv^XWxSnw+We`qX){Ao?`iS>W!`gE2zTz#Wd%Grh$QEcZB pXqBCb} zlQU=W6a%ykCj&Mzl6HuNa!B{D?0QuKuP6wRZtxX{dlN~0^KN~ifjMo3Q!u#RuKhHE z!<%K{wWQsqRcJvzLlyV1c1wc6U6Py7WdD5J|B6Y(V;GpKPnvx<5#W|_4_EXecdqeH zB&uqgz!NA)O_`3{Zrl#FyQGgu;=8BzfPv;4le!ge0*X&Weup{-eQ>zgvHtNyawD|b r3*z0)3evwu{=fOpi4#*Jbf!+r4&YcQa1mPmfs+PC$37gjzxTfYOtG2f literal 0 HcmV?d00001 diff --git a/app/src/main/java/at/smartshopper/smartshopper/Database.java b/app/src/main/java/at/smartshopper/smartshopper/Database.java deleted file mode 100644 index fda8775..0000000 --- a/app/src/main/java/at/smartshopper/smartshopper/Database.java +++ /dev/null @@ -1,67 +0,0 @@ -package at.smartshopper.smartshopper; - -import android.os.StrictMode; -import android.util.Log; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; - -public class Database { - - private Connection conect; - final String HOST = "188.166.124.80"; - final String DB_NAME = "smartshopperdb"; - final String USERNAME = "smartshopper-user"; - final String PASSWORD = "jW^v#&LjNY_b3-k*jYj!U4Xz?T??m_D6249XAeWZ#7C^FRbKm!c_Dt+qj@4&a-Hs"; - final int PORT = 5432; - - - public Database(){}; - public void connectDatabase() throws SQLException { - StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); - StrictMode.setThreadPolicy(policy); - DriverManager.registerDriver(new org.postgresql.Driver()); - conect = DriverManager.getConnection("jdbc:postgresql://" + HOST + ":" + PORT + "/" + DB_NAME, USERNAME, PASSWORD); - - System.out.println("Database connected!"); - } - - public List getMyShoppinglists(String uid) throws JSONException { - try { - connectDatabase(); - } catch (SQLException e) { - e.printStackTrace(); - } - String SQL = "SELECT row_to_json(\"Shoppinglist\") AS obj FROM \"Shoppinglist\" JOIN \"Shoppinglist_admin\" USING (sl_id) WHERE username = ?"; - ArrayList shoppinglistsList = null; - try ( - Statement stmt = conect.createStatement(); - PreparedStatement pstmt = conect.prepareStatement(SQL)) { - pstmt.setString(1, uid); - ResultSet rs = pstmt.executeQuery(); - System.out.println(uid); - shoppinglistsList = new ArrayList (); - while (rs.next()) { - String shoppinglist = rs.getString(1); - JSONObject jsonObject = new JSONObject(shoppinglist); - - shoppinglistsList.add(new Shoppinglist(jsonObject.getString("sl_id"), jsonObject.getString("name"), jsonObject.getString("description"), jsonObject.getString("invitelink"), jsonObject.getString("color"))); - } - Log.d("DATABASE SHOPPINGLISTS", shoppinglistsList.toString()); - - } catch (SQLException ex) { - System.out.println(ex.getMessage()); - } - return (List ) shoppinglistsList; - - } -} diff --git a/app/src/main/java/at/smartshopper/smartshopper/Shoppinglists.java b/app/src/main/java/at/smartshopper/smartshopper/Shoppinglists.java deleted file mode 100644 index 842f78f..0000000 --- a/app/src/main/java/at/smartshopper/smartshopper/Shoppinglists.java +++ /dev/null @@ -1,13 +0,0 @@ -package at.smartshopper.smartshopper; - -import at.smartshopper.smartshopper.Shoppinglist; - -public class Shoppinglists { - - - - - public Shoppinglists(){ - - } -} diff --git a/app/src/main/java/at/smartshopper/smartshopper/Dash.java b/app/src/main/java/at/smartshopper/smartshopper/activitys/Dash.java similarity index 71% rename from app/src/main/java/at/smartshopper/smartshopper/Dash.java rename to app/src/main/java/at/smartshopper/smartshopper/activitys/Dash.java index 02a5354..b3ddaff 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/Dash.java +++ b/app/src/main/java/at/smartshopper/smartshopper/activitys/Dash.java @@ -1,34 +1,30 @@ -package at.smartshopper.smartshopper; +package at.smartshopper.smartshopper.activitys; -import android.app.ActionBar; import android.content.Intent; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; -import android.support.annotation.ColorInt; -import android.support.annotation.NonNull; +import android.os.Handler; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; -import android.view.View; -import android.widget.Button; import android.widget.TabHost; +import android.widget.Toast; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; -import com.google.firebase.auth.GetTokenResult; import org.json.JSONException; +import java.sql.SQLException; import java.util.List; -import java.util.jar.JarInputStream; + +import at.smartshopper.smartshopper.R; +import at.smartshopper.smartshopper.db.Database; +import at.smartshopper.smartshopper.shoppinglist.Shoppinglist; +import at.smartshopper.smartshopper.shoppinglist.ShoppinglistAdapter; public class Dash extends AppCompatActivity { @@ -70,7 +66,11 @@ public class Dash extends AppCompatActivity { try { - showOwnShoppingList(uid); + try { + showOwnShoppingList(uid); + } catch (SQLException e) { + e.printStackTrace(); + } } catch (JSONException e) { e.printStackTrace(); } @@ -79,7 +79,11 @@ public class Dash extends AppCompatActivity { ownswiperefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { - refreshOwnShoppinglist(uid); + try { + refreshOwnShoppinglist(uid); + } catch (SQLException e) { + e.printStackTrace(); + } } }); @@ -92,6 +96,7 @@ public class Dash extends AppCompatActivity { * Logt den User aus und geht zur Login Activity */ private void logout(){ + finish(); FirebaseAuth.getInstance().signOut(); Intent intent = new Intent(this, LoginActivity.class); startActivity(intent); @@ -102,7 +107,7 @@ public class Dash extends AppCompatActivity { * * @param uid Von dem benutzer von welchem die Shoppinglists angezeigt werden sollen */ - private void refreshOwnShoppinglist(String uid) { + private void refreshOwnShoppinglist(String uid) throws SQLException { try { showOwnShoppingList(uid); } catch (JSONException e) { @@ -128,7 +133,7 @@ public class Dash extends AppCompatActivity { * * @param uid Die UserId damit von diesem user die shoppinglisten angezeigt werden */ - private void showOwnShoppingList(String uid) throws JSONException { + private void showOwnShoppingList(String uid) throws JSONException, SQLException { RecyclerView ownRecycleView = (RecyclerView) findViewById(R.id.ownrecycler); ownRecycleView.setHasFixedSize(true); ownRecycleView.setLayoutManager(new LinearLayoutManager(this)); @@ -158,6 +163,16 @@ public class Dash extends AppCompatActivity { host.addTab(spec); } + /** + * Schickt an die Login Activity einen intend mit dem extra EXIT. Um die app zu schließen + */ + private void exit(){ + Intent intent = new Intent(Dash.this, LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.putExtra("EXIT", true); + startActivity(intent); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -167,6 +182,11 @@ public class Dash extends AppCompatActivity { } + /** + * Menu item Action listener + * @param item Action Item + * @return True wenn erfolgreich + */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -174,7 +194,6 @@ public class Dash extends AppCompatActivity { logout(); return true; - default: // If we got here, the user's action was not recognized. // Invoke the superclass to handle it. @@ -184,4 +203,31 @@ public class Dash extends AppCompatActivity { } + //Für Double Back press to exit + private boolean doubleBackToExitPressedOnce = false; + + /** + * 2 Mal Zurück Drücken um die App zu schließen + */ + @Override + public void onBackPressed() { + if (doubleBackToExitPressedOnce) { + super.onBackPressed(); + exit(); + + return; + } + + this.doubleBackToExitPressedOnce = true; + Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show(); + + new Handler().postDelayed(new Runnable() { + + @Override + public void run() { + doubleBackToExitPressedOnce=false; + } + }, 2000); + } + } diff --git a/app/src/main/java/at/smartshopper/smartshopper/LoginActivity.java b/app/src/main/java/at/smartshopper/smartshopper/activitys/LoginActivity.java similarity index 82% rename from app/src/main/java/at/smartshopper/smartshopper/LoginActivity.java rename to app/src/main/java/at/smartshopper/smartshopper/activitys/LoginActivity.java index 5593cfe..0529d0f 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/LoginActivity.java +++ b/app/src/main/java/at/smartshopper/smartshopper/activitys/LoginActivity.java @@ -1,6 +1,7 @@ -package at.smartshopper.smartshopper; +package at.smartshopper.smartshopper.activitys; import android.content.Intent; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; @@ -25,6 +26,8 @@ import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; +import at.smartshopper.smartshopper.R; + public class LoginActivity extends AppCompatActivity { private static final String TAG = "SMASH"; @@ -58,11 +61,20 @@ public class LoginActivity extends AppCompatActivity { startActivityForResult(signInIntent, RC_SIGN_IN); } + /** + * Wechselt zu der Dash Activity + */ private void goDash() { Intent intent = new Intent(this, Dash.class); + finish(); startActivity(intent); } + /** + * Loggt den User per Email ein + * @param email Email des Users + * @param password Passwort des Users + */ private void signInEmail(String email, String password) { mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(this, new OnCompleteListener () { @@ -85,6 +97,12 @@ public class LoginActivity extends AppCompatActivity { }); } + + /** + * Erstellt einen Account mit Email und Passwort + * @param email Email des neuen Users + * @param password Passwort des neuen Users + */ private void createAccount(String email, String password) { mAuth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(this, new OnCompleteListener () { @@ -106,10 +124,15 @@ public class LoginActivity extends AppCompatActivity { }); } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + if (getIntent().getBooleanExtra("EXIT", false)) + { + finish(); + } mAuth = FirebaseAuth.getInstance(); Button loginEmailBtn = (Button) findViewById(R.id.loginEmailBtn); @@ -146,6 +169,10 @@ public class LoginActivity extends AppCompatActivity { } + /** + * Loggt den User ein. Bei erfolg wird der Aufruf zur Dash Activity getätigt + * @param acct Der Google Account, welcher eingelogt werden soll + */ private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId()); @@ -171,6 +198,10 @@ public class LoginActivity extends AppCompatActivity { }); } + + /** + * Prüft ob der User bereits eingelogt ist. Wenn ja, wird er auf die Dash Activity weitergeleitet + */ @Override public void onStart() { super.onStart(); @@ -181,4 +212,31 @@ public class LoginActivity extends AppCompatActivity { } } + + //Für Double Back press to exit + private boolean doubleBackToExitPressedOnce = false; + + /** + * 2 Mal Zurück Drücken um die App zu schließen + */ + @Override + public void onBackPressed() { + if (doubleBackToExitPressedOnce) { + super.onBackPressed(); + finish(); + + return; + } + + this.doubleBackToExitPressedOnce = true; + Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show(); + + new Handler().postDelayed(new Runnable() { + + @Override + public void run() { + doubleBackToExitPressedOnce=false; + } + }, 2000); + } } diff --git a/app/src/main/java/at/smartshopper/smartshopper/activitys/ShoppinglistDetails.java b/app/src/main/java/at/smartshopper/smartshopper/activitys/ShoppinglistDetails.java new file mode 100644 index 0000000..0bfd429 --- /dev/null +++ b/app/src/main/java/at/smartshopper/smartshopper/activitys/ShoppinglistDetails.java @@ -0,0 +1,77 @@ +package at.smartshopper.smartshopper.activitys; + +import android.os.Bundle; +import android.app.Activity; +import android.support.design.widget.Snackbar; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.widget.Toast; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; + +import org.json.JSONException; + +import java.sql.SQLException; +import java.util.List; + +import at.smartshopper.smartshopper.R; +import at.smartshopper.smartshopper.db.Database; +import at.smartshopper.smartshopper.shoppinglist.Shoppinglist; +import at.smartshopper.smartshopper.shoppinglist.ShoppinglistAdapter; +import at.smartshopper.smartshopper.shoppinglist.details.Details; +import at.smartshopper.smartshopper.shoppinglist.details.DetailsAdapter; + +public class ShoppinglistDetails extends Activity { + + private Database db = new Database(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_shoppinglist_details); + + Bundle bundle = getIntent().getExtras(); + int position = -1; // or other values + if (bundle != null) + position = bundle.getInt("pos"); + + Toast.makeText(this, "Click detected on item " + position, Toast.LENGTH_LONG).show(); + + List shoppinglists = null; + try { + shoppinglists = db.getMyShoppinglists(FirebaseAuth.getInstance().getCurrentUser().getUid()); + } catch (JSONException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + + Shoppinglist aktuelleShopinglist = shoppinglists.get(position); + + try { + showDetails(aktuelleShopinglist.getSlId()); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + } + + /** + * Zeigt das Card View der Shoppinglist Details an + * @param sl_id Shoppinglist welche angezeigt werden soll + * @throws SQLException + * @throws JSONException + */ + private void showDetails(String sl_id) throws SQLException, JSONException { + RecyclerView detailsRecycleView = (RecyclerView) findViewById(R.id.groupRecycle); + detailsRecycleView.setHasFixedSize(true); + detailsRecycleView.setLayoutManager(new LinearLayoutManager(this)); + List detailsList = db.getListDetails(sl_id); + DetailsAdapter detailsAdapter = new DetailsAdapter(detailsList); + detailsRecycleView.setAdapter(detailsAdapter); + } + +} diff --git a/app/src/main/java/at/smartshopper/smartshopper/RoundCornersTransformation.java b/app/src/main/java/at/smartshopper/smartshopper/customViews/RoundCornersTransformation.java similarity index 99% rename from app/src/main/java/at/smartshopper/smartshopper/RoundCornersTransformation.java rename to app/src/main/java/at/smartshopper/smartshopper/customViews/RoundCornersTransformation.java index 5ef900f..71632ec 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/RoundCornersTransformation.java +++ b/app/src/main/java/at/smartshopper/smartshopper/customViews/RoundCornersTransformation.java @@ -1,4 +1,4 @@ -package at.smartshopper.smartshopper; +package at.smartshopper.smartshopper.customViews; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; diff --git a/app/src/main/java/at/smartshopper/smartshopper/db/Database.java b/app/src/main/java/at/smartshopper/smartshopper/db/Database.java new file mode 100644 index 0000000..d23d2aa --- /dev/null +++ b/app/src/main/java/at/smartshopper/smartshopper/db/Database.java @@ -0,0 +1,224 @@ +package at.smartshopper.smartshopper.db; + +import android.os.StrictMode; +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import at.smartshopper.smartshopper.shoppinglist.Shoppinglist; +import at.smartshopper.smartshopper.shoppinglist.details.Details; +import at.smartshopper.smartshopper.shoppinglist.details.group.Group; +import at.smartshopper.smartshopper.shoppinglist.details.item.Item; + +public class Database { + + private Connection conect; + final String HOST = "188.166.124.80"; + final String DB_NAME = "smartshopperdb"; + final String USERNAME = "smartshopper-user"; + final String PASSWORD = "jW^v#&LjNY_b3-k*jYj!U4Xz?T??m_D6249XAeWZ#7C^FRbKm!c_Dt+qj@4&a-Hs"; + final int PORT = 5432; + + + /** + * Macht nix + */ + public Database() { + } + + + /** + * Verbindet Sich mit der Datenbank. Auf der Konsole wird "Database connected!" angezeigt, bei erfolgreicher verbindung + * + * @throws SQLException Bei einem error bei der Verbindung, können details über diese Exception abgerufen werden + */ + private void connectDatabase() throws SQLException { + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy); + DriverManager.registerDriver(new org.postgresql.Driver()); + conect = DriverManager.getConnection("jdbc:postgresql://" + HOST + ":" + PORT + "/" + DB_NAME, USERNAME, PASSWORD); + + System.out.println("Database connected!"); + } + + /** + * Verbindet sich mit dem Server + * Holt die eigenen Shoppinglisten vom Server. Und speichert diese in eine List mit Shoppinglist Objekten + * + * @param uid Die UID auf welche die Abfrage ausgeführt werden soll + * @return Das Ergebnis der eigenen Shoppinglisten in einer List gefüllt mit Shoppinglist Objekten + * @throws JSONException Ein JSON Umwandlungsfehler + * @throws SQLException Ein PostgreSQL Fehler + */ + public ListgetMyShoppinglists(String uid) throws JSONException, SQLException { + String SQL = "SELECT row_to_json(\"Shoppinglist\") AS obj FROM \"Shoppinglist\" JOIN \"Shoppinglist_admin\" USING (sl_id) WHERE username = ?"; + + connectDatabase(); + + ArrayList shoppinglistsList = new ArrayList (); + + ResultSet rs = null; + try (PreparedStatement pstmt = conect.prepareStatement(SQL)) { + pstmt.setString(1, uid); + rs = pstmt.executeQuery(); + System.out.println(uid); + + + while (rs.next()) { + String shoppinglist = rs.getString(1); + JSONObject jsonObject = new JSONObject(shoppinglist); + + shoppinglistsList.add(new Shoppinglist(jsonObject.getString("sl_id"), jsonObject.getString("name"), jsonObject.getString("description"), jsonObject.getString("invitelink"), jsonObject.getString("color"))); + } + + } catch (SQLException ex) { + System.out.println(ex.getMessage()); + } + + + Log.d("DATABASE SHOPPINGLISTS", shoppinglistsList.toString()); + + return (List ) shoppinglistsList; + + } + + + /** + * Hoolt alle groups und items der list und erstelt ein Detail objekt von jeder group. Die detail objekte kommen in eine List + * @param sl_id Shoppinglist Id mit der gearbeitet wird + * @return Eine List mit Details über jede Shoppinglist + * @throws SQLException + * @throws JSONException + */ + public List getListDetails(String sl_id) throws SQLException, JSONException { + + Listgroups = getGroups(sl_id); + + List - items = getItems(sl_id); + + ArrayList
detailsArrayList = new ArrayList(); + for (Group group : groups) { + Details detailsTmp = new Details(group); + for (Item item : items) { + if (group.getGroup_id().equals(item.getGroup_id())) { + detailsTmp.addItem(item); + } + } + detailsArrayList.add(detailsTmp); + } + + return (List) detailsArrayList; + + + } + + /** + * Holt alle Items einer bestimmten shoppingliste, angegeben durch die shoppinglist id + * + * @param sl_id + * @return + * @throws SQLException + * @throws JSONException + */ + private List- getItems(String sl_id) throws SQLException, JSONException { + String SQL = "SELECT row_to_json(\"Item\") AS obj FROM \"Item\" JOIN \"Group\" USING (group_id) WHERE \"Group\".sl_id = ?"; + connectDatabase(); + + ArrayList
- listItems = new ArrayList
- (); + ResultSet rsitems = null; + try (PreparedStatement pstmt = conect.prepareStatement(SQL)) { + pstmt.setString(1, sl_id); + rsitems = pstmt.executeQuery(); + System.out.println(sl_id); + while (rsitems.next()) { + String itemsString = rsitems.getString(1); + JSONObject jsonObject = new JSONObject(itemsString); + + listItems.add(new Item(jsonObject.getString("item_id"), jsonObject.getString("group_id"), jsonObject.getString("sl_id"), jsonObject.getString("name"), jsonObject.getString("count"))); + } + + } catch (SQLException ex) { + System.out.println(ex.getMessage()); + } + + return (List
- ) listItems; + + } + + /** + * Holt alle gruppen einer bestimmten Shoppinglist id + * + * @param sl_id Holt alle goups dieser Shoppinglist id + * @return Gibt alle groups der Abgefragten Shoppinglist id zurück + * @throws SQLException + * @throws JSONException + */ + private List
getGroups(String sl_id) throws SQLException, JSONException { + String SQLGroups = "SELECT row_to_json(\"Group\") AS obj FROM \"Group\" JOIN \"Shoppinglist\" USING (sl_id) WHERE sl_id = ?"; + connectDatabase(); + + ResultSet rsgroups = null; + ArrayList listGroup = new ArrayList (); + try (PreparedStatement pstmt = conect.prepareStatement(SQLGroups)) { + pstmt.setString(1, sl_id); + rsgroups = pstmt.executeQuery(); + System.out.println(sl_id); + while (rsgroups.next()) { + String groupString = rsgroups.getString(1); + JSONObject jsonObject = new JSONObject(groupString); + + + listGroup.add(new Group(jsonObject.getString("group_id"), jsonObject.getString("sl_id"), jsonObject.getString("name"), jsonObject.getString("color"), jsonObject.getString("hidden"))); + + } + + } catch (SQLException ex) { + System.out.println(ex.getMessage()); + } + + return (List ) listGroup; + + + } + + + /** + * NICHT VERWENDEN FUNKTIONIERT NICHT!! + * + *
+ * NUR EIN KOPIE SAMPLE + *
+ * Beim Start wird die Verbindung zum Server hergesetellt. Dann wird das resultSet von dem SQL reqest zurückgegeben + * + * @param SQL Der zumachende SQL Request + * @param uid Die UID des Benutzers, für den die Abfrage gemacht wird + * @return Das entstandene Result set, mit der Antwort des Servers + */ + private ResultSet databaseRequest(String SQL, String uid) throws SQLException { + connectDatabase(); + + ResultSet rs = null; + try (PreparedStatement pstmt = conect.prepareStatement(SQL)) { + pstmt.setString(1, uid); + rs = pstmt.executeQuery(); + System.out.println(uid); + + //HIER + //WEITER + //PROGRAMMIEREN + + } catch (SQLException ex) { + System.out.println(ex.getMessage()); + } + return rs; + } +} diff --git a/app/src/main/java/at/smartshopper/smartshopper/messaging/MyFirebaseMessagingService.java b/app/src/main/java/at/smartshopper/smartshopper/messaging/MyFirebaseMessagingService.java new file mode 100644 index 0000000..e4f00b5 --- /dev/null +++ b/app/src/main/java/at/smartshopper/smartshopper/messaging/MyFirebaseMessagingService.java @@ -0,0 +1,136 @@ +package at.smartshopper.smartshopper.messaging; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.RingtoneManager; +import android.net.Uri; +import android.support.v4.app.NotificationCompat; +import android.util.Log; +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; + + +import at.smartshopper.smartshopper.activitys.Dash; +import at.smartshopper.smartshopper.R; + +public class MyFirebaseMessagingService extends FirebaseMessagingService { + + private static final String TAG = "MyFirebaseMsgService"; + + /** + * Called when message is received. + * + * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. + */ + // [START receive_message] + @Override + public void onMessageReceived(RemoteMessage remoteMessage) { + // [START_EXCLUDE] + // There are two types of messages data messages and notification messages. Data messages + // are handled + // here in onMessageReceived whether the app is in the foreground or background. Data + // messages are the type + // traditionally used with GCM. Notification messages are only received here in + // onMessageReceived when the app + // is in the foreground. When the app is in the background an automatically generated + // notification is displayed. + // When the user taps on the notification they are returned to the app. Messages + // containing both notification + // and data payloads are treated as notification messages. The Firebase console always + // sends notification + // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options + // [END_EXCLUDE] + + // TODO(developer): Handle FCM messages here. + // Not getting messages here? See why this may be: https://goo.gl/39bRNJ + Log.d(TAG, "From: " + remoteMessage.getFrom()); + + // Check if message contains a data payload. + if (remoteMessage.getData().size() > 0) { + Log.d(TAG, "Message data payload: " + remoteMessage.getData()); + sendNotification(remoteMessage.getData() + ""); + + } + + // Check if message contains a notification payload. + if (remoteMessage.getNotification() != null) { + Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); + sendNotification(remoteMessage.getNotification().getBody()); + } + + // Also if you intend on generating your own notifications as a result of a received FCM + // message, here is where that should be initiated. See sendNotification method below. + } + // [END receive_message] + + + // [START on_new_token] + + /** + * Called if InstanceID token is updated. This may occur if the security of + * the previous token had been compromised. Note that this is called when the InstanceID token + * is initially generated so this is where you would retrieve the token. + */ + @Override + public void onNewToken(String token) { + Log.d(TAG, "Refreshed token: " + token); + + // If you want to send messages to this application instance or + // manage this apps subscriptions on the server side, send the + // Instance ID token to your app server. + sendRegistrationToServer(token); + } + // [END on_new_token] + + + /** + * Persist token to third-party servers. + * + * Modify this method to associate the user's FCM InstanceID token with any server-side account + * maintained by your application. + * + * @param token The new token. + */ + private void sendRegistrationToServer(String token) { + // TODO: Implement this method to send token to your app server. + } + + /** + * Create and show a simple notification containing the received FCM message. + * + * @param messageBody FCM message body received. + */ + private void sendNotification(String messageBody) { + Intent intent = new Intent(this, Dash.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, + PendingIntent.FLAG_ONE_SHOT); + + // String channelId = getString(R.string.default_notification_channel_id); + Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + NotificationCompat.Builder notificationBuilder = + //new NotificationCompat.Builder(this, channelId) + new NotificationCompat.Builder(this) + .setSmallIcon(R.drawable.ic_launcher_foreground) + .setContentTitle("SmartShopper") + .setContentText(messageBody) + .setAutoCancel(true) + .setSound(defaultSoundUri) + .setContentIntent(pendingIntent); + + NotificationManager notificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + + // Since android Oreo notification channel is needed. + //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // NotificationChannel channel = new NotificationChannel(channelId, + // "Channel human readable title", + // NotificationManager.IMPORTANCE_DEFAULT); + // notificationManager.createNotificationChannel(channel); + //} + + notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); + } +} \ No newline at end of file diff --git a/app/src/main/java/at/smartshopper/smartshopper/Shoppinglist.java b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/Shoppinglist.java similarity index 79% rename from app/src/main/java/at/smartshopper/smartshopper/Shoppinglist.java rename to app/src/main/java/at/smartshopper/smartshopper/shoppinglist/Shoppinglist.java index b3ea0be..b8f680e 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/Shoppinglist.java +++ b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/Shoppinglist.java @@ -1,4 +1,4 @@ -package at.smartshopper.smartshopper; +package at.smartshopper.smartshopper.shoppinglist; public class Shoppinglist { @@ -36,4 +36,9 @@ public class Shoppinglist { public String getcolor(){ return this.color;} + @Override + public String toString(){ + return "SL_ID: " + sl_id + " name: " + name + " description: " + description + " invitelink: " + invitelink + " color: "+ color; + } + } diff --git a/app/src/main/java/at/smartshopper/smartshopper/ShoppinglistAdapter.java b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/ShoppinglistAdapter.java similarity index 69% rename from app/src/main/java/at/smartshopper/smartshopper/ShoppinglistAdapter.java rename to app/src/main/java/at/smartshopper/smartshopper/shoppinglist/ShoppinglistAdapter.java index a26915b..d93f45b 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/ShoppinglistAdapter.java +++ b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/ShoppinglistAdapter.java @@ -1,8 +1,9 @@ -package at.smartshopper.smartshopper; +package at.smartshopper.smartshopper.shoppinglist; import android.content.Context; -import android.graphics.drawable.Drawable; +import android.content.Intent; import android.net.Uri; +import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -16,6 +17,10 @@ import com.squareup.picasso.Picasso; import java.util.List; +import at.smartshopper.smartshopper.R; +import at.smartshopper.smartshopper.activitys.ShoppinglistDetails; +import at.smartshopper.smartshopper.customViews.RoundCornersTransformation; + public class ShoppinglistAdapter extends RecyclerView.Adapter
{ @@ -31,14 +36,25 @@ public class ShoppinglistAdapter extends RecyclerView.Adapter items; + + public Details(Group group) { + this.group = group; + this.items = new ArrayList - (); + } + + public Group getGroup() { + return group; + } + + public ArrayList
- getItems() { + return items; + } + + public void addItem(Item item){ + this.items.add(item); + } + + @Override + public String toString() { + return "Details{" + + "group=" + group.toString() + + ", items=" + items.toString() + + '}'; + } +} diff --git a/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/DetailsAdapter.java b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/DetailsAdapter.java new file mode 100644 index 0000000..11fe511 --- /dev/null +++ b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/DetailsAdapter.java @@ -0,0 +1,104 @@ +package at.smartshopper.smartshopper.shoppinglist.details; + +import android.app.Activity; +import android.graphics.Color; +import android.support.annotation.NonNull; +import android.support.v7.widget.CardView; +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 android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; +import com.squareup.picasso.Picasso; +import java.util.List; +import at.smartshopper.smartshopper.R; +import at.smartshopper.smartshopper.customViews.RoundCornersTransformation; +import at.smartshopper.smartshopper.db.Database; +import at.smartshopper.smartshopper.shoppinglist.details.item.ItemAdapter; + +public class DetailsAdapter extends RecyclerView.Adapter
{ + + private List details; + + public DetailsAdapter(Listdetails) { + this.details = details; + } + + /** + * Erstellt einen Neuen view holder mit aktueller view + * @param viewGroup + * @param i + * @return + */ + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardviewgroup, viewGroup, false); + + MyViewHolder myViewHolder = new MyViewHolder(view); + return myViewHolder; + } + + + /** + * Setzt alle Daten in die View elemente + * @param viewHolder Das View Holder Objekt mit allen elementen + * @param i Der Index welcher aus der data list genommen werden soll + */ + @Override + public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int i) { + TextView groupName = viewHolder.groupName; + ImageButton deleteGroup = viewHolder.deleteGroup; + RecyclerView itemsrecycle = viewHolder.itemsrecycle; + TextView ownerName = viewHolder.ownerName; + ImageView ownerImage = viewHolder.ownerImage; + CardView cardViewGroup = viewHolder.cardViewGroups; + + Database db = new Database(); + + groupName.setText(details.get(i).getGroup().getName()); + ownerName.setText("Kein SQL"); + cardViewGroup.setCardBackgroundColor(Color.parseColor("#" + details.get(i).getGroup().getColor())); + Picasso.get().load(R.drawable.delete).into(deleteGroup); + Picasso.get().load(R.drawable.user).resize(250,250).transform(new RoundCornersTransformation(30, 30, true, true)).into(ownerImage); + + itemsrecycle.setHasFixedSize(true); + itemsrecycle.setLayoutManager(new LinearLayoutManager(new Activity())); + ListitemsList = details.get(i).getItems(); + ItemAdapter itemAdapter = new ItemAdapter(itemsList); + + itemsrecycle.setAdapter(itemAdapter); + } + + @Override + public int getItemCount() { + return details.size(); + } + + /** + * Haltet alle elemente. Durch ein Objekt von dem kann jedes Element welches hier drinnen angeführt ist verwendet werden + */ + public static class MyViewHolder extends RecyclerView.ViewHolder { + + TextView groupName, ownerName; + ImageButton deleteGroup; + RecyclerView itemsrecycle; + ImageView ownerImage; + CardView cardViewGroups; + + public MyViewHolder(@NonNull View itemView) { + super(itemView); + this.groupName = (TextView) itemView.findViewById(R.id.groupName); + this.deleteGroup = (ImageButton) itemView.findViewById(R.id.deleteGroup); + this.itemsrecycle = (RecyclerView) itemView.findViewById(R.id.itemsRecycle); + this.ownerName = (TextView)itemView.findViewById(R.id.ownerName); + this.ownerImage = (ImageView)itemView.findViewById(R.id.ownerImage); + this.cardViewGroups = (CardView)itemView.findViewById(R.id.cardViewGroup); + + } + + } +} diff --git a/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/group/Group.java b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/group/Group.java new file mode 100644 index 0000000..276d07f --- /dev/null +++ b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/group/Group.java @@ -0,0 +1,50 @@ +package at.smartshopper.smartshopper.shoppinglist.details.group; + +public class Group { + + private String group_id; + private String sl_id; + private String name; + private String color; + private String hidden; + + + public Group(String group_id, String sl_id, String name, String color, String hidden) { + this.group_id = group_id; + this.sl_id = sl_id; + this.name = name; + this.color = color; + this.hidden = hidden; + } + + public String getGroup_id() { + return this.group_id; + } + + public String getSl_idd() { + return this.sl_id; + } + + public String getName() { + return this.name; + } + + public String getColor() { + return this.color; + } + + public String getHidden() { + return this.hidden; + } + + @Override + public String toString() { + return "Group{" + + "group_id='" + group_id + '\'' + + ", sl_id='" + sl_id + '\'' + + ", name='" + name + '\'' + + ", color='" + color + '\'' + + ", hidden='" + hidden + '\'' + + '}'; + } +} diff --git a/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/item/Item.java b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/item/Item.java new file mode 100644 index 0000000..c8413b1 --- /dev/null +++ b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/item/Item.java @@ -0,0 +1,49 @@ +package at.smartshopper.smartshopper.shoppinglist.details.item; + +public class Item { + + private String item_id; + private String group_id; + private String sl_id; + private String name; + private String count; + + public Item(String item_id, String group_id, String sl_id, String name, String count){ + this.item_id = item_id; + this.group_id = group_id; + this.sl_id = sl_id; + this.name = name; + this.count = count; + } + + public String getItem_id() { + return item_id; + } + + public String getGroup_id() { + return group_id; + } + + public String getSl_id() { + return sl_id; + } + + public String getName() { + return name; + } + + public String getCount() { + return count; + } + + @Override + public String toString() { + return "Item{" + + "item_id='" + item_id + '\'' + + ", group_id='" + group_id + '\'' + + ", sl_id='" + sl_id + '\'' + + ", name='" + name + '\'' + + ", count='" + count + '\'' + + '}'; + } +} diff --git a/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/item/ItemAdapter.java b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/item/ItemAdapter.java new file mode 100644 index 0000000..905980c --- /dev/null +++ b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/details/item/ItemAdapter.java @@ -0,0 +1,81 @@ +package at.smartshopper.smartshopper.shoppinglist.details.item; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import com.squareup.picasso.Picasso; +import java.util.List; + + + +import at.smartshopper.smartshopper.R; + +public class ItemAdapter extends RecyclerView.Adapter { + + private List data; + + public ItemAdapter(List data){ + this.data = data; + } + + + /** + * Erstellt einen Neuen view holder mit aktueller view + * @param viewGroup + * @param i + * @return + */ + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardviewitem, viewGroup, false); + + MyViewHolder myViewHolder = new MyViewHolder(view); + return myViewHolder; + } + + /** + * Setzt alle Daten in die View elemente + * @param myViewHolder Das View Holder Objekt mit allen elementen + * @param i Der Index welcher aus der data list genommen werden soll + */ + @Override + public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) { + TextView itemName = myViewHolder.itemName; + TextView itemAnzahl = myViewHolder.itemAnzahl; + ImageView itemBearbeiten = myViewHolder.itemBearbeiten; + ImageView itemDel = myViewHolder.itemDel; + + itemName.setText(data.get(i).getName()); + itemAnzahl.setText(data.get(i).getCount()); + Picasso.get().load(R.drawable.bearbeiten).into(itemBearbeiten); + Picasso.get().load(R.drawable.delete).into(itemDel); + } + + @Override + public int getItemCount() { + return data.size(); + } + + /** + * Haltet alle elemente. Durch ein Objekt von dem kann jedes Element welches hier drinnen angeführt ist verwendet werden + */ + public static class MyViewHolder extends RecyclerView.ViewHolder{ + + TextView itemName, itemAnzahl; + ImageView itemBearbeiten, itemDel; + + public MyViewHolder(View itemView){ + super(itemView); + + this.itemName = (TextView)itemView.findViewById(R.id.nameItem); + this.itemAnzahl = (TextView)itemView.findViewById(R.id.anzahlItem); + this.itemBearbeiten = (ImageView)itemView.findViewById(R.id.itemBearbeiten); + this.itemDel = (ImageView)itemView.findViewById(R.id.itemDel); + } + } +} diff --git a/app/src/main/res/drawable-hdpi/add.png b/app/src/main/res/drawable-hdpi/add.png new file mode 100644 index 0000000000000000000000000000000000000000..d377914e8152587125517f10898f4bd9f9b3532c GIT binary patch literal 358 zcmV-s0h#`ZP) Qc{mylexXd5-1o%-YLj4dI^t1 +4LAV8)eV3n~1$~0Ik*>q)ia7@;QN3Ln-T>za%$mLk5tO?-K2%RMgoxjN} zI8(XH7O}vDLIpx0CbU-|w8w-J%4}+5w&t53#$ef(U_zCkZ6Et`H*8|5K&TwmFN+l{ z>UdOXZzvE#OWhfeNfgS+JJE0?3OO_>s*}=SFy%)bwuA!BX5GwufiiyA9X1jmv;C$93pw2jbgj_uiN63K_nH`O4A%R++`m&OfiUf0X+Ecknr~8xBvhE07*qoM6N<$ Eg6qPPF8}}l literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/addoutline.png b/app/src/main/res/drawable-hdpi/addoutline.png new file mode 100644 index 0000000000000000000000000000000000000000..69b1eb9d4068445593d7b12883b299e9a8b370b2 GIT binary patch literal 528 zcmV+r0`L8aP) >!o(+TrqY+8;04Bg1mL7lvHOfa>AiDBUR+~1d zRG_DNrkiM_l9x=FSC2Q-UES3aiLB$FL 8gl*L`*5F38RN{dP_L8`cf#TuQD`8#3W-2;ex)oB)a#eGBiU( z$D$zz-JAWXA;aQXi<5evJOr!k>lO{wxn-Xr3!^PVcwtnwx?%$yB67}xp&a55eKzjz zD3Q%IVR& zgh78*2 SE0000 s#) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/bearbeiten.png b/app/src/main/res/drawable-hdpi/bearbeiten.png new file mode 100644 index 0000000000000000000000000000000000000000..152b5b93885b5f11ed8f25fa214d942ea8e721b3 GIT binary patch literal 269 zcmV+o0rLKdP) P*er+1>u`^ZQ&lPT>-DAXr@L7Y^t`5(hEN?cP7p9NO0DQI3(4%KV2 znye YP) 8kemJyq_lMLrq1cBn}cM zzyRAD4AwLaQ{V=Kf>6Mk(ik7dM$GRE8Db <%@%wrBTaWOsGQZO>Y0ArM+>gf76^P-ew3t6~K1J8$_t0**1tL+ 7F4&`g|V=*W#;=`f8 3H*TWo%clM~^ek-Gn@sW7E>BJlS z^K^iZv7%0{Y8+70II8%zq#IWyMeUBROdBs`KW2-yO4B#|=c$UsTBTVr$mFbagw~8g mYb#WTP>6{fg!b~YsXI?tj|vrpH>A@50000 $CRP~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/add.png b/app/src/main/res/drawable-mdpi/add.png new file mode 100644 index 0000000000000000000000000000000000000000..9f570999d969eb947568316abb7acae8b0a80f99 GIT binary patch literal 306 zcmV-20nPr2P) NP-hxEf*VI^Z0(+to5+h;*B4J;JTD>?8csy31My+1N3eO`D z5;h1s>s(J_P9Rfw-hOpccnR#zI@gno6G$}*q@2KAqeXX4Akf(4Ky^$@4FaX=nCkq| ztXZy#HV({@9YcoP`LFA*51jXr>0mr^Bh&e0Wd26H0E?*HL$UFCIsgCw07*qoM6N<$ Ef_AEZA^-pY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/addoutline.png b/app/src/main/res/drawable-mdpi/addoutline.png new file mode 100644 index 0000000000000000000000000000000000000000..8db68ac32a60c249188f6634156f949e9a477381 GIT binary patch literal 401 zcmV;C0dD?@P) OGRp#ybG>ywk>p{_|= zc;S<86x|p IN=D-a_FR?oAyUbAfzp0n}%ngn>nT7eCsU!s7I$3`o#s-Q*Z zc&xMnbHs6pMIPfZcWqO%j~|7`4+=EM-MO}D{zr>S{%Gy0kBZ)Rj*2X9*=9u#yO`Wk v$8}J}asBHTj(uegxgNDEb6Doe{2TEJz}$9SqWT?J00000NkvXXu0mjfK25nX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/bearbeiten.png b/app/src/main/res/drawable-mdpi/bearbeiten.png new file mode 100644 index 0000000000000000000000000000000000000000..d49726c50a6c2db60c33cd5df601f068b791f3a2 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjF`h1tAr-fh6C_v#CNLdoZ@AGb z*0!ASqojtNC%5+m-36;uk5%YcI_QQkf4D)Vb(UjOo~M*4@9{LwtGw-r$x%}C%(8y0 wc=*L|PUE#U;|sS6*rKG*Ib 3$jTfrz=7-$cJr>mdKI;Vst0LuL^=l}o! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/delete.png b/app/src/main/res/drawable-mdpi/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..0b509d12dcd48db4a33efd7661f6c2e9de598763 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjIi4<#Ar-fh6C^YhcstH7cxY0@ zYwfHkSHa!JzM%30k3M%8(?(5!_ijSBc}1f=dAWTSCY=gsE_c4k6JXh;>tGfj*}Hdk zRAEC7r`}=q^{giRO0(RJ&Q5-L;mk?vlLj^FnqoI5W}Ng}F)xvWVdd==KV_z|%>vrX N;OXk;vd$@?2>=`gHQ4|F literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/user.png b/app/src/main/res/drawable-mdpi/user.png new file mode 100644 index 0000000000000000000000000000000000000000..07a2e1982005b3c8051a49b1497c12a03b3f4a81 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gji#=T&Ln>}1CrGe{Fm*ZHVL#Ho zP~yn6<;xzjH~ip{y63Lz{cD2+-(lM;8y* %0 1>?5 d<^6~H0?x=eR--$Pyp8fByi2XCcQGB1Z&_b0P_}C>@(>_0;}LA zK=T$i>|0wSAkzcmb~5y$JkE=E@L03c2aff-q{23xSV#1tG*1kIWllaioeIP2AWhcU zrW314FGDH`%z%=M$G%JBmeOp~jaQ;4X>EgNgA#bACn+VsKKL{!flqo$$Rsce&RmWh zUMKKFPqQ)!h*|K~zyxmTt*cHz&A )*<1R|&6>%$>SL_SC$^>ijViOZ+$^@(ODTMYF zGW8>F&|6oX8a#}i{)>q$ZSYcJPWF^dESx?JO5j6fG1teXYu%s(>h#nnJ1$RyqCp81 z=_%A(%E7R1>W_6c_13XU)_`M`tj@7YyYf9e*vfl#v{>L;Jd{U^p+DUH6UXcJ0>^>G zidBUMWBOX)XfH91`%q#U530n}smNF6Sg%s#E8B{E{k^POCRjS{RAzm5D6=MFks?KM ZtzQ8haUiN-NT~n-002ovPDHLkV1f)8BgX&$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/addoutline.png b/app/src/main/res/drawable-xhdpi/addoutline.png new file mode 100644 index 0000000000000000000000000000000000000000..e8caa219468c2c579e666759e7764de96c25de28 GIT binary patch literal 995 zcmV<9104K`P) 9~)ET3V8rlp+>Od>F z48s7J z;2XdQSW%p0m{FdC4saesUD%9Lr=62nrcG&og+3enn7|{jrv1#qVLv$KgMDG+0kfFu zV~xH&%LUM5vqm3-#sI#t%ixKPzaGZoI?szWIIk_6G#ynq=!?AG1iDBQ$BvT<+SZrT z8^+?QPQ*YjvrCpA*#|HHA_n>*;65-z`Z(q!!uCVHs3RrA^)izg%Plaiy?v4XP8;fX zF>t9r!!Z*nV`fu-g=xlQEFv@PC HKyqAFeW3Z2Xo*zmAAn?P#xj~ zgs%i!jVxoCV{DGn36>P+OYBo3Ax w@>yjmFPJEbGQO)Q+U0#c&+8=F^Gh2kj^%pZu1?6hpnk|7O(w7j zekqEzOl`;Id7TvPNE@3R%k{inohYMkX+!MnHcTdPz+IG7JOfG{mPo$XEwNJime2fQ z3+^cUd{`=$+m!JzCQw4(>IC*pCa}R@K`O=yxP)R}me5K1h#M6fyNu0I7PU0m;j#+* znMT{SG`i@ekR=OP$dX Dg!Tfb7*k$b$~3ooL2oGs zxP8^PlrcXx^~)h_>eJfWpZBt Q@@$KU? zPd@32pWryS xs#Nk0?mm&aMl138=gNf?k7#Cpzgk-|-K3`Udw<^DXf3;}BZ78m zM{YLkm)f|bf5&cz?1CegUrup%Tay>QWZ#Fk=iit6{?VO%Jd*kSQMUZTQ=2Px3o2L4 z7Bv20`|?~fJHMPw#fJw6o7wB 0(d)Rj?D`TY!=FR(`V-z2N>$%eb*~);I+elG L)z4*}Q$iB}KO9}8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/delete.png b/app/src/main/res/drawable-xhdpi/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3f52c5a18e4f777984f778805b88e2dadc25c5 GIT binary patch literal 266 zcmV+l0rmcgP) -(3;_s000QL#F_lf_3cwuo#$E(Akdb;m7ZQ$o3_TNj5U{(xoWw8u zH?{|XBe1 DELZS+W@243_W$VvPI4}n)MA=N{ydK*=Lkg2~) zsK3mqzfR+i3<7Tv2o2!_hk$P=;5h__RC5FPnZ9MXBs|k{3iNI^cm#Q3R!%3Q>#1U( QM*si-07*qoM6N<$g2<7XSbN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/user.png b/app/src/main/res/drawable-xhdpi/user.png new file mode 100644 index 0000000000000000000000000000000000000000..508a52f10bec0be947525d13eb7026381010377d GIT binary patch literal 384 zcmV-`0e}99P) bLS5 z_rM3D+~0HLs#hIHrBbQhO-(QaKG+eT` Cm^}I@@Qpr&PR4nQ$tj$Da@C&9O0RQ0o zj`}uh0 teYo$^@1LK$UZOwmOnJiz0@zAmfFcV-tVrCOyEhxa+Ccse`8bAYR e0F_Fm5~maNE!hN<3xR+D0000 @P) J6h%V=tAU1HP(TL-)M-Gpe0BmQ3qS%I2+;7WyeOJ`3nHNzO`aXwI#)W)D6;*I zl*snjnav0xgb*^E9dRk{#FO|DU&7D*xeMWT5Y(%nO>rn5MGD649tro0pjHL#iC2*d z<9 dN9TnMUF(6vaF<8dOW7C~nsHHOEHpmhn_7pZYv2ZBlo@)Z7EL=X5@ z%$M-<=>FcsmOxN$K_{a0gf904)O8^!x1bl%n;_SPpj?8s#kv-ir53@i6G72}&PDHn zTqlB}1>K0=1-VWHMGLwYQA>ya*cHq1^RewrU7EN~1Vsz-E8tc(%cp)NKLvuK1$~I# z1-VWHMGN9b8bPZG%C+TL+eFcIA}CrAi&X@zCdh{+dlxkMP$+^1vLT*DZ-QKx>qJnr zAm>>0CdhTI90U!-FZun_pTi3XnwA66`T;7}5gr7M%&BNijK`fl2pSn*jH_MDl_(wr zW!^03whw~-#uwQZqO=hATm6kg1P#Oo&wbhUK|~92yUpHuM$p79+@U`f_!j*00)hx3 cgpi#11?cL&YU4Q-g#Z8m07*qoM6N<$f+SYaQvd(} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/addoutline.png b/app/src/main/res/drawable-xxhdpi/addoutline.png new file mode 100644 index 0000000000000000000000000000000000000000..fd19e5b00847ca0ae5688c9525720901a52ccf6b GIT binary patch literal 708 zcmV;#0z3VQP) +M zJyp+iRlD2VE1hIC^Xk>HXQsQWdS)}naU92S%2|O2@EYF3U-%7rT+h1?s$)TiRnQ5z z1@B 49>XPAhSPy_a2fPE)hUgqzAR|0 zf*wKE;0L$~$DnVH!wvWdSs&`tg2p1~E@TZogQ325HO^DW`cmH(bWnn>LDs+y9CUUe z>r?ZvprHimU-&!30bjrom^T+-BcR9Ujrw>FvEMy72^Q2^&>e^a>Fad~Y9DC!J &Ib-%!ZY76=av7nY^rY1;z$Jc3|7F1i1Kcp?F zpP;O99dJ$UKyekaKZFI<7L=W=Zo$+9sqf}z^A<$3Su(p|HZ?)n1+#@Wg<4P{T7dfu zv2d-eZmk8W&sbmcT6DqFg1TlMvV}t}(2Y%y`uYU1zUI|C7F389`L*aD2ht{iv29+^ zri$j97c8h_uEW?jP-V+ILi4B|3+k9n7~3XJjhpqQzMIE_Iz~6f4ZV?ELR7c3k^CVH z9t-MupqJgu@&t5~%JR&2`~2U6;z{9G7<$=9 qOSq*U7Wf1H &sa*C7W1SLa_c zPPuPwy2?LTG;Ni03ceAcbA!`zigKP}(wV$DD`r;8+r5 X&?f$$hnonl>uBS{z z%cH+Cs+jLus`t|DuG))l`?9rzH+A^u-t`Mxwzv;Sf4lbW^s3}ZMJ3!H-=)3c6%|rg z`a(=7vA^gg8|z&+ZuRv3FBf%L*UfB>UzfLRYnDh!@xrM)=Ndh!J#{78^LN*UaP#n} znOD~a&71T5+Q)ZoVe|MK-<4gs5Vg~WWszvqLflC5w@Y)FJwwVXW5cLg!3it#pWkXY z^RKosjG5VJ +Kxxyk-Lt*I1)< zQv@gLC~zmTif%5Omuk>IOLv0p1_qbqijg7lOTsx9s@!PE$~ianT~GQ<;rRa(l6agr z6kFbW)wAo!@3YHztM$M{nZY!>!9>hY{?ejS?mG-j0u2l-3rv|o>K+MrTLXCt42&EO zAPF_*tfQ?K;^E41n=ajQy4}Tf!L>#t|EP4K+B(@+*=uiRNW146b2+TtcVS)d^bUI+ z#jC$^F0H(uIXjo9f$Q(p-(DplA elF{r5}E+_I=1To literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/user.png b/app/src/main/res/drawable-xxhdpi/user.png new file mode 100644 index 0000000000000000000000000000000000000000..974449e2c9ab1456d6bd42e367e31d88552a85aa GIT binary patch literal 679 zcmV;Y0$BZtP)
wQBt@Yzv@Khna)KfjRL}^bwh -jOEHOwvuXC-=Lf&bx|yAQoY~2|8|Q=&LI@#*=rcy(G+cyxFoIPY z@z?^K;<>q@04L!FgJ{6Gi4C6P&z<0BO>+&-!S8K?xhSX#EWrWG;Vf|q#a(&=Us?>Q zz>#y6aFQXFtWCE`POCVO-{3t 5z1w!g+__?*}7%Mym~*kf)mTfGPS13$X6pRRPW zGcRzYd}14|-jnUJFJrC`N+UPnGq}(HYA3awC-7FAp#0xPIh88z@^x+BmoM-s``B}Q z$7kRHhj};E!6W#U&yxoXYmkoe*c#6{>hc=L?Bk5 udHsRqk@= z)-x1N@>gm8E$^MQ!WoC#84TuMw|Or?xdFFaI _8H*TM8;Dv{0xds|ASy33jN_NCJr=V1&d1wEz+=O!#QDKr1zokS$ WypfxU{@VqRiB#%!|MD^EH@1ZTy=(e&|*k{>!8mt3SJxDfi&1O>;PNv zBOpc`sNbb^bneU5TSb#a9 )r)DD!zIeKm)3# zt6;z|3ziLEzyZhxXh2q7SK?S!@eQcBL$7`?rGBG>EOsfTNPJT&ZW=%XN>{JpF*pu6 zl1DEMpaJKq(a;IT3~xZ#4Ujy>RDO-MXn+muCD@2S;d9wg`E}9&8t`AY!32Wb!2j1# zGvGkwH=*)&t|wq2f<-@z1(i1qh@$~rhCy%~bEFPkG$7&z=<$4e!Dqn5P=OuiPvwwy zG}Iw=81#ESK@TU-8GeGG619c>0H)OwsxYmN?*tgv4`6F@0o2og2pZ68xB+aEhajj# z)85JaZqm@6LsA`22mI5RMNMvkOMV#8W_Soz9Ng?u>f7F)C%$%dJmnz16;+=$8W2GP z?4S5|kfi~6e~P3&Ng5C#1Db%Hp4$UQG~g6Rsy_XyZWZe?7;*f>S?dO9MpWHsK-dkq z2WDtM(afm2Rjj9Akp>jaqN*DW2)hCAL5c>H6sy#Y287*!k6_K`@%%z8c_(jFC-TIZ zP{)_bIDa+g6V_DSD%Kj<@_9J95Vo+_Ky#iro7M55GR|Mk;p{C{HyRLj17zYQ D=Myq&qNZZWBDk#2H&NHB=1p8L0HFb4Hy{IOKxqa@-Dp7A z4Un73K5xQBvtP}dF#iqZb3nWe_ypED6j3zms%{laz7-sdD=k*38x07%0Wz_$L<8K; zh|vH?2HXd;G@xi^t2rqzyG)JJfRbKIk-E` ;r*hX&*>(#rbsO%0xNp`Wb?6TA4FVeA*Z{2wFdw6$ zSzhiv~E>Eimq#?Af1*V9_%wzj2j!&8WjW>3WflpaC|g7ofwdLD2xmYD8d`sBT>> z`PJms#ai6Fn+C+&04-^RFzNm4-Lmb~ZUYC2Z_ g0SSr3MA}$@$N&HU07*qoM6N<$f_#(vAOHXW literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/addoutline.png b/app/src/main/res/drawable-xxxhdpi/addoutline.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd9d9283d4aa3aaaca4c1bcb95f4fd591874185 GIT binary patch literal 1703 zcmV;Y23YxtP) @9{gEQL0pxPSPHEV8c=E^mV^*$g!pUK#8RV)Mrci1 zA1Y6@C?S0)TO_o!SfsT-9{NXlZ}=YfxX#_%?ac1%%$$>aUYK<5Ip;g<{e7=eVq#)q zVq#)qVq#)q;aQ{R8E{hbC71x$HGhD=G%Mh5u)v;QXMdLgC)xWOCEX%G*{w=b4VpDA z;1zIKa|(Q~`2}RbEzLYI310&w#1eaci~Zdw_>R5*Fe{h*XlDLZ#ZdqgSPeL!IR Rm}BK02M3sc)gpih5SYCHj%Y4`G0pE_39OV+fE89Q`7y@)JHq^qymf)|>^Hic z$u33|^6xzJTLcgRinl|W(_o_sSVdFPFrxVeP;15f9JGOy=CM4sXm)}Q&8vXkGs51# zT7+K|#~~3w1Sn_?n%&@x=0{-r?@k@4-+-wE2SK0aZSWLm*K7xMti@6b%)e~|?aUW? zk9p^}V2qW!3~ZuM9B0@&8!Ax% 0zCDi?_Pi#*4{Qc3SYo9-^pv;}@t@)3 zK{VTJO}DF>pFtJFkEKv|bYK|!bRNgp^HcyI8!-$f3N)$jA}7=-tQG-cD1hnWzXmR& z>%M9k%Q4e_FM^<~Mdc=OOhP8}7-r8~0xWkg=(CI^(UjAjRSvWpPvaYb-xqEN{N; zY0zhBhSBnlOo=-pVGF=Jq8S#qS5Ep^-b8??3-B%&P=%-LdIRckRjL5IgVw7GPq_}T zy!p0|!H{Dtq`SmpQI#M7S+`>>Y>4Ge1c `Z8Fz_(FLT0irIz z6) ^acpc#ms5-$h#GHd|yp{K&HB=}o-9nE3<~>$AWsCsQnMzHJK3S_*3g%|3^d zU1TugXqfl#W1c ^R%km}yL|p)ycv-X*wguGt9M5-=RfShq^VQAS zO}xLD`Gk5Fw^vR~u4tmhx6v9-+miA+Q0uc24Vz*r@mdzQYXgV~5Oo0-flUBf9$u3m z0cu#>HUTJaB0$sypvvUFr7&tc*CnVDu48d~<>Y>lm9R8Jr5})N0mi`%OJUR{Pts7t zPRCHh4VE|GMqib!;-o>TBn`$rp?L||Ds;-52oQAvXkua5QrIWpXo3Vd%Hl5DjF<=z zk^t|43zouu04EY8zzG(&S58c>0-KblQ>IQS_p+3v2=Ik+FH51ki2zX-pb41ec3$h_ zY1Gf0#qd06ilG2aEWQ!-|D}n1e?%9{n{T7VNNJVZ_hnn0OGmuKb#X4mXIq?0`AMq) z7paK=Aqzle#yxt$MmA{B#)ha1z&B{nj!D}F4a!f+cF2eTAqtScNpB_Zr-)ZVrWHV& z+k&zvY|^9rY%7HTW?43E!yHt(2?wuc*o4Y$?~M93RoZTQRaL+~VG$ri0g64UfPOEd zcvOKAu^Uj!CiJ5U@_!fK0&zU7!?paJLwVR+P6tJRkOkn@4=$=`AK28v{F`yaa*@Ry zx`_ZG+neC5%AMK2sG@mjANl81;V!cH&a${G#&)UPtruBUna5Vr*S?>XyU}ASO-x^b zU6ojIi2xy60~|91ada^yh>i>9M;F(#PER?HE~fY@^5|l2eh=?9XE6)_I)vL)l5N0j zjF7{-MSy4+O=6r=5AJT6Q 6_uOVd&ES5GMnov!%no-4d&Xxjb3F)=a+8eDnojIr%K>ehA!LeWuDZL xx~B?X=J|n=+f+pWF)=YQF)=YQF)=Z*e*lqVWq^tNZ;Ai_002ovPDHLkV1hsR8Gir( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bearbeiten.png b/app/src/main/res/drawable-xxxhdpi/bearbeiten.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa7a82299376913e5f57011cf4ce9712b184e42 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V6^dcaSW-r_4bCL-(d$4*T8U* zHQZ%Q%RWqV(7b$M6Qfm^j@D%t#jeZ`55BjapZt&Q+|-=Yms8Tf;QseJ?{B F}+$?v0dMZu||;VL3aQ{d<)YLB@s@ACJv>J0G+1$ zVh=ft&*ij~PYJ&u*72e9pIFgr4)!14HKN@rn)cU3yJUPg&Sd(das`|H{}n*?ejRt0 zhW($exir|ns1s)V_u#f^h7`oi1L6xA_HnR&aMfsdZ!K?E^W($A!|nXUG5-9w`eDt> zU@yT?XTb0$f#JtNh7Zk*57?Ox@Uu0@^I(%OH->=CvF~`!CcnP7?CpL>U~n>cy85}S Ib4q9e04gG*4*&oF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/delete.png b/app/src/main/res/drawable-xxxhdpi/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..00fd1c8ac349b2550d3fdafeb14787095127301f GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U_9XI;uunK>+NmByh8>e?H_sG z-tac~#vs$VH{h$ UZS&`@V+I=2u<6E^ z(s>cmhI-<5oUASWPK*!RrxoPw;ZSH`V1g10Tp58X84@15GBC0TIG_;+E?9lr`YwCE z;g(vd&mITfeu%$pp+8gQ&E<$#sox;}ZXcn4?e|kB2?QNj`eC`(4v{)O&W9{9-2dY^ zuOFJPr8uYI>w&^{FA1T4^4UzsSj)Vf&TX7Ei@Au!-2KPGaK~V#Iof|d{BEdjnq&M& zt?W=T^IYRUX;qHNDrY3?g3s=V5h`lCA7fs!s^!i@^P7G9!Vf7Q%Kv7Qu%^Ym)t`Ye z&QUFK@`ltEy)$}egtes2Nt;tvBEiU)A|~>{qbQM)@2R-hgD5Y?;)d=>)-_ErzB&o= z4~p^_trM?b=FWEi?a&Ml24H}kdM;w|CzzLM9}~C56@>)phy&5QOkuTuS$O_i+eVA- zVHer(TI D literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/user.png b/app/src/main/res/drawable-xxxhdpi/user.png new file mode 100644 index 0000000000000000000000000000000000000000..77436f91786679797e57dbc2e83aef6a47b66678 GIT binary patch literal 795 zcmV+$1LXXPP) 2(>t>SHC1@TrY7Ie{q<}cWkuEh(ki>P4iHZ|r4=nrrqXmr S1W=>L9I+C>{FbuVFY+p202|mZ@-bilAFyBKSHJ+av0tPSFn~YU zPXNK$<`Kk8c%muL44vGL*fRDBmAPXslz_OGW%vvus$sR9vejo3IXR68o#y9MR%QBP! ze+~JVowcg9^DkjvvOVUkjo-MI%ul<+8}_+m$Cl~g0ssI2000000Km}V#_Kbx>mJH- zW!x6#2;`<}P4!mV|A@nF(!P*lnHQzK5xj0?uUTEjo+;I$>V@j7be~N5Vn(H5ey?)f zv7FU$YMhKet9qm=OS}p6#RThcOZ6j0`DLr~nNc==UZN$3{jU3TtJfZ@jt@`=ckWZ^ ze-pT?yPMja8ztl29PWlBxAXm*>Vd?YW^{l1(9TVw4(?j=GUO{OrtOZcNO~KqU#sq_ zmQ?4gB{O56m+aUZNpH1v#jbIB*vxmU4@weloxg9DQfeslg PK6K?+A5LSJge@&u2woUZES3U1DfcKc*p?AK_&tP^}Wqbrs#OSVi z=_7zLMt9X`9|6=bx@T`abuhZO2!H?xfB*=900@8p2!H?xfB*wj literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_dash.xml b/app/src/main/res/layout/activity_dash.xml index 68a497f..b957ffa 100644 --- a/app/src/main/res/layout/activity_dash.xml +++ b/app/src/main/res/layout/activity_dash.xml @@ -1,15 +1,19 @@ - + android:layout_height="match_parent"> \ No newline at end of file ++ android:layout_height="wrap_content" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> -+ + android:layout_height="match_parent"> + + @@ -82,4 +89,15 @@ + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index e880fc3..94b2c5c 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".LoginActivity"> + tools:context=".activitys.LoginActivity"> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/cardviewgroup.xml b/app/src/main/res/layout/cardviewgroup.xml new file mode 100644 index 0000000..867b76e --- /dev/null +++ b/app/src/main/res/layout/cardviewgroup.xml @@ -0,0 +1,77 @@ + + + ++ + + ++ + + diff --git a/app/src/main/res/layout/cardviewitem.xml b/app/src/main/res/layout/cardviewitem.xml new file mode 100644 index 0000000..8892c33 --- /dev/null +++ b/app/src/main/res/layout/cardviewitem.xml @@ -0,0 +1,59 @@ + ++ + + ++ + + ++ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/cardview.xml b/app/src/main/res/layout/cardviewshoppinglist.xml similarity index 99% rename from app/src/main/res/layout/cardview.xml rename to app/src/main/res/layout/cardviewshoppinglist.xml index af934fd..d306b27 100644 --- a/app/src/main/res/layout/cardview.xml +++ b/app/src/main/res/layout/cardviewshoppinglist.xml @@ -61,6 +61,7 @@ card_view:layout_constraintBottom_toBottomOf="parent" card_view:layout_constraintStart_toStartOf="parent" card_view:layout_constraintTop_toBottomOf="@+id/shoppinglistOwner" /> + \ No newline at end of file diff --git a/app/src/main/res/menu/dash_menu.xml b/app/src/main/res/menu/dash_menu.xml index 0a3c72e..ed9219b 100644 --- a/app/src/main/res/menu/dash_menu.xml +++ b/app/src/main/res/menu/dash_menu.xml @@ -1,5 +1,6 @@ -+ + ++ + + ++ + + + + ++ + +