From e2ae90d143e87a282c8787f9eb89b08022f1d617 Mon Sep 17 00:00:00 2001 From: Georg Reisinger <43533139+GeorgReisinger@users.noreply.github.com> Date: Mon, 25 Mar 2019 19:32:27 +0100 Subject: [PATCH] Dynamic Linking V2 Erstellt anstatt normalen invite links, dynamic links und speichert diese auch in die db --- .idea/caches/gradle_models.ser | Bin 289188 -> 289188 bytes app/build.gradle | 2 +- .../smartshopperapp/activitys/Dash.java | 339 +++++++++++++----- .../activitys/LoginActivity.java | 24 +- .../smartshopperapp/db/Database.java | 73 +++- .../ShoppinglistSharedAdapter.java | 10 +- 6 files changed, 330 insertions(+), 118 deletions(-) diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index 01ca2e4bed86621f33ef0a0d7384d349ce744139..d7e9b339cefed6b8f7f59008cf88b0a2291bd9b4 100644 GIT binary patch delta 1814 zcmb7Fdq`7Z6!*LL%(Cn;HfQfP%1A5Sox8hN+O#H76tr1clSXy7t1*gND>D)elPoAR zyVjwM9wyNfqfwXW0b*||QVFaOlZwco7ZgFyyOr+W-G2_3`~4p0JLi1g*W9UX?$ln~ zodzG~pFI$+OIzcBThsFD!oPh_005mo!X2w`5eS%@JmJHE>QZ=BD=d>tJ=RhDEI|kb zHzZV2T^l3u*YDe%>6;P^lBw4qRrlyLeCW=a1=8#bxfraV$4%ig6};EV+I%Ifz;dFQ zw{nct#uu{!$MP0mjztu+S&7u>rL33!4BpG~B4f=l+bp6bo8$eq5{}7cMApxmd7qHu zv#@545sGbo)NZ546CP`QWUeZ!-g^_ImOVB#9IW?|d{qQSBr8-A+C}1t60Gr6%o{4+ zSVkpyw*<9)RbNrNnW!uHhTBFQT|!irp@g`jNv6e>q~t!5T3z!-u6aYsmO*Xv^=Uha zgOZ7Z?sCZAs%V`F%DO!wc5kIUaSjSDFQ@q-(IHf(Ph*r$^el;&+INu7Q`M8tNa?T= zX>~=K-9_n!xp+e#D5J387(5PQogo!m7F9w$Pvu11e% zC&DA(U6^*d5H;*4Ki+zo>65~VOQk3OwcM}SoOfqJs5C<9sW#g zYsE8em?`f~hb#2x>E9dbBX_K3OeE47kx#&a%3YkA@2 zEPU@$w5UvQ3@7_>mL2p4sUJ6JaEyFFD%h2R+37HD#KWUE0-nfthNhGJ*r=S;`DGZecAPH0UwH1z|L_Qm8*;t7``7qEi`-@0Hpp0NXi zQ`|7g7#hHzj^Y2^Y|5^a&ZEnzxa4!4^;qXrTwc53nFjJYR<_8kOW_WIr`H$>t5T?3 zyzha0I5_Y9;z%oQz>5VBKgsPyN8|I0j2jllQHO#k&D{i{oQLC~PnW36N}(&CZyWtT zwL1#C(hsP~sx5D_OmPpc@q-`!E4kEzU4HmT{dO9hp`rZ`9@eK{UGv2BN~fnk-(5B4 z--B6=xUOO5vqd>moQ&b1Cj9+pC#GU^P!r~6L!c0Mhrxo2{7^9Vhz`vkgU7=fw70Xn z7N3MQ=pTMqZYB*lCkVE&uOApKK>l^Cjc7RDyI>~%6wz=ug3wc7Kcx#cqj}u zY@G#8{3{HFcxM(ka7qLw&G;&V|1pbCW{M}W#T_iVs~Cl8@ZMV?v9C3|u@etY)zllb z9ra-Z9++V%?b)IBtbnTo+N;_daeFa053g512%h}&@>zN`-EjEv*MF;bDz*8*waGS9 b8eT_muo3{xRj@Q~-MN=ReZcFhz-##*mM~= 21) { + popupShare.setElevation(5.0f); + } + popupShare.setAnimationStyle(R.style.popup_window_animation_phone); + + + popupShare.showAtLocation(v, Gravity.CENTER, 0, 0); + popupShare.update(); + } else { + final String invitelink = db.generateInviteLink(); + String url = "https://smartshopper.cf/androidinvite/" + sl_id; + Task shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink() + .setLink(Uri.parse("https://smartshopper.cf/invite/" + invitelink + "?slid=" + sl_id)) + .setDomainUriPrefix("https://invite.dergeorg.at/invite") + .setAndroidParameters(new DynamicLink.AndroidParameters.Builder().build()) + .buildShortDynamicLink() + .addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + // Short link created + final Uri shortLink = task.getResult().getShortLink(); + try { + db.createInviteLink(sl_id, invitelink, db.getinviteFromLink(shortLink.toString())); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); + View popupContentView = inflater.inflate(R.layout.add_share, null); + + final TextView linkausgabe = (TextView) popupContentView.findViewById(R.id.shareLink); + try { + linkausgabe.setText("invite.dergeorg.at/invite/" + db.getInviteLink(sl_id)); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + ImageButton exitButton = (ImageButton) popupContentView.findViewById(R.id.shareExit); + Picasso.get().load(R.drawable.close).into(exitButton); + exitButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + popupShare.dismiss(); + } + }); + + final Button copyButton = (Button) popupContentView.findViewById(R.id.shareCopy); + copyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + copyText(linkausgabe.getText().toString()); + popupShare.dismiss(); + } + }); + + Button delShare = (Button) popupContentView.findViewById(R.id.delShare); + + delShare.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Shoppinglist spl = null; + try { + spl = db.getShoppinglist(sl_id); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + MyFirebaseSender myFirebaseSender = new MyFirebaseSender(db.getMembers(sl_id)); + myFirebaseSender.addMember(db.getAdmin(sl_id)); + myFirebaseSender.sendMessage("Das Sharing von " + spl.getname() + " wurde von " + db.getUser(FirebaseAuth.getInstance().getCurrentUser().getUid()).getName() + " aufgehoben!", spl.getname() + " sharing wurde geändert!"); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + try { + db.deleteInvite(db.getInviteLink(shortLink.toString())); + + + TabHost tabhost = (TabHost) findViewById(R.id.tabHost1); + tabhost.setCurrentTab(0); + sharedswiperefresh.setRefreshing(true); + + showSharedShoppingList(FirebaseAuth.getInstance().getCurrentUser().getUid()); + sharedswiperefresh.setRefreshing(false); + popupShare.dismiss(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + + } + }); + + popupShare = new PopupWindow(popupContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + popupShare.setOutsideTouchable(false); + popupShare.setFocusable(true); + // Set an elevation value for popup window + // Call requires API level 21 + if (Build.VERSION.SDK_INT >= 21) { + popupShare.setElevation(5.0f); + } + popupShare.setAnimationStyle(R.style.popup_window_animation_phone); + + + popupShare.showAtLocation(v, Gravity.CENTER, 0, 0); + popupShare.update(); + Uri flowchartLink = task.getResult().getPreviewLink(); + } else { + // Error + // ... + } + } + }); } } catch (SQLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } - return link; - } - - @Override - public void onShareClick(final String sl_id, View v) { - final String link = getInviteLink(sl_id); - - final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); - View popupContentView = inflater.inflate(R.layout.add_share, null); - - final TextView linkausgabe = (TextView) popupContentView.findViewById(R.id.shareLink); - linkausgabe.setText("www.smartshopper.cf/invite/" + link); - - ImageButton exitButton = (ImageButton) popupContentView.findViewById(R.id.shareExit); - Picasso.get().load(R.drawable.close).into(exitButton); - exitButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - popupShare.dismiss(); - } - }); - - final Button copyButton = (Button) popupContentView.findViewById(R.id.shareCopy); - copyButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - copyText(linkausgabe.getText().toString()); - popupShare.dismiss(); - } - }); - - Button delShare = (Button) popupContentView.findViewById(R.id.delShare); - - final String finalLink = link; - delShare.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Shoppinglist spl = null; - try { - spl = db.getShoppinglist(db.getSlIdFromInvite(finalLink)); - } catch (SQLException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - try { - MyFirebaseSender myFirebaseSender = new MyFirebaseSender(db.getMembers(sl_id)); - myFirebaseSender.addMember(db.getAdmin(sl_id)); - myFirebaseSender.sendMessage("Das Sharing von " + spl.getname() + " wurde von " + db.getUser(FirebaseAuth.getInstance().getCurrentUser().getUid()).getName() + " aufgehoben!", spl.getname() + " sharing wurde geändert!"); - } catch (SQLException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - - try { - db.deleteInvite(finalLink); - - - TabHost tabhost = (TabHost) findViewById(R.id.tabHost1); - tabhost.setCurrentTab(0); - sharedswiperefresh.setRefreshing(true); - - showSharedShoppingList(FirebaseAuth.getInstance().getCurrentUser().getUid()); - sharedswiperefresh.setRefreshing(false); - popupShare.dismiss(); - } catch (SQLException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - - - } - }); - - popupShare = new PopupWindow(popupContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - popupShare.setOutsideTouchable(false); - popupShare.setFocusable(true); - // Set an elevation value for popup window - // Call requires API level 21 - if (Build.VERSION.SDK_INT >= 21) { - popupShare.setElevation(5.0f); - } - popupShare.setAnimationStyle(R.style.popup_window_animation_phone); - - - popupShare.showAtLocation(v, Gravity.CENTER, 0, 0); - popupShare.update(); } /** @@ -945,7 +1090,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte @Override public void onShoppinglistClick(String sl_id, View v) { - onShoppinglistClickContainer(sl_id, v); + onShoppinglistClickContainer(sl_id); } @Override @@ -959,7 +1104,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte } @Override - public void sharedOnShareClick(String sl_id, View v) { + public void sharedOnShareClick(String sl_id, View v) throws SQLException, JSONException { final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); View popupContentView = inflater.inflate(R.layout.edit_share_member, null); @@ -970,7 +1115,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte Button stopShareBtn = popupContentView.findViewById(R.id.delShare); - linkAusgabe.setText("www.smartshopper.cf/invite/" + getInviteLink(sl_id)); + linkAusgabe.setText("invite.dergeorg.at/invite/" + db.getInviteLink(sl_id)); exitBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -1019,6 +1164,6 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte @Override public void sharedOnShoppinglistClick(String sl_id, View v) { - onShoppinglistClickContainer(sl_id, v); + onShoppinglistClickContainer(sl_id); } } diff --git a/app/src/main/java/at/smartshopper/smartshopperapp/activitys/LoginActivity.java b/app/src/main/java/at/smartshopper/smartshopperapp/activitys/LoginActivity.java index 70feb81..555c7fc 100644 --- a/app/src/main/java/at/smartshopper/smartshopperapp/activitys/LoginActivity.java +++ b/app/src/main/java/at/smartshopper/smartshopperapp/activitys/LoginActivity.java @@ -60,12 +60,21 @@ public class LoginActivity extends AppCompatActivity { public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) { // Get deep link from result (may be null if no link is found) Uri deepLink = null; + String sl_idToGo = ""; if (pendingDynamicLinkData != null) { deepLink = pendingDynamicLinkData.getLink(); + String invite = deepLink.toString(); + invite = invite.replaceAll("https://smartshopper.cf/invite/", ""); + invite = invite.replaceAll(".slid=.*", ""); + sl_idToGo = deepLink.getQueryParameter("slid"); Log.d("SmartShopper", deepLink.toString()); + if (null != mAuth.getCurrentUser()) { + goDash(sl_idToGo, invite); + } } + // Handle the deep link. For example, open the linked // content, or apply promotional credit to the user's // account. @@ -109,7 +118,7 @@ public class LoginActivity extends AppCompatActivity { /** * Wechselt zu der Dash Activity */ - private void goDash() { + private void goDash(String sl_idToGo, String inviteToAdd) { FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener() { @@ -156,6 +165,10 @@ public class LoginActivity extends AppCompatActivity { Intent intent = new Intent(this, Dash.class); + if(sl_idToGo != null){ + intent.putExtra("sl_idToGo", sl_idToGo); + intent.putExtra("inviteToAdd", inviteToAdd); + } finish(); startActivity(intent); } @@ -175,7 +188,7 @@ public class LoginActivity extends AppCompatActivity { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithEmail:success"); FirebaseUser user = mAuth.getCurrentUser(); - goDash(); + goDash(null, null); } else { // If sign in fails, display a message to the user. Log.w(TAG, "signInWithEmail:failure", task.getException()); @@ -225,7 +238,7 @@ public class LoginActivity extends AppCompatActivity { mAuth = FirebaseAuth.getInstance(); db = new Database(); - getDynamicLink(); + Button loginEmailBtn = (Button) findViewById(R.id.loginEmailBtn); final TextView email = (TextView) findViewById(R.id.email); @@ -277,7 +290,7 @@ public class LoginActivity extends AppCompatActivity { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithCredential:success"); FirebaseUser user = mAuth.getCurrentUser(); - goDash(); + goDash(null, null); } else { // If sign in fails, display a message to the user. Log.w(TAG, "signInWithCredential:failure", task.getException()); @@ -297,9 +310,10 @@ public class LoginActivity extends AppCompatActivity { public void onStart() { super.onStart(); + getDynamicLink(); if (null != mAuth.getCurrentUser()) { - goDash(); + goDash(null, null); } } diff --git a/app/src/main/java/at/smartshopper/smartshopperapp/db/Database.java b/app/src/main/java/at/smartshopper/smartshopperapp/db/Database.java index 242bf52..7df664d 100644 --- a/app/src/main/java/at/smartshopper/smartshopperapp/db/Database.java +++ b/app/src/main/java/at/smartshopper/smartshopperapp/db/Database.java @@ -1,12 +1,21 @@ package at.smartshopper.smartshopperapp.db; +import android.net.Uri; import android.os.StrictMode; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.dynamiclinks.DynamicLink; +import com.google.firebase.dynamiclinks.FirebaseDynamicLinks; +import com.google.firebase.dynamiclinks.ShortDynamicLink; import org.json.JSONException; import org.json.JSONObject; +import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @@ -21,7 +30,7 @@ import at.smartshopper.smartshopperapp.shoppinglist.details.Details; import at.smartshopper.smartshopperapp.shoppinglist.details.group.Group; import at.smartshopper.smartshopperapp.shoppinglist.details.item.Item; -public class Database { +public class Database extends AppCompatActivity { final private String HOST = "188.166.124.80"; final private String DB_NAME = "smartshopperdb"; @@ -163,7 +172,7 @@ public class Database { public void deleteInvite(String invitelink) throws SQLException, JSONException { String sl_id = getSlIdFromInvite(invitelink); sqlUpdate("DELETE FROM \"Shoppinglist_member\" WHERE sl_id = ?", sl_id); - sqlUpdate("Update \"Shoppinglist\" set invitelink=null where sl_id=?", sl_id); + sqlUpdate("Update \"Shoppinglist\" set invitelink=null, dynamiclink=null where sl_id=?", sl_id); } /** @@ -179,15 +188,17 @@ public class Database { } - private String getinviteFromLink(String eingabeLink) { + public String getinviteFromLink(String eingabeLink) { String delString = null; if (eingabeLink.contains("https://")) { - delString = "https://www.smartshopper.cf/invite/"; + delString = "https://invite.dergeorg.at/invite/"; } else if (eingabeLink.contains("http://")) { - delString = "http://www.smartshopper.cf/invite/"; - } else if (eingabeLink.contains("www.smartshopper.cf/invite/")) { - delString = "www.smartshopper.cf/invite/"; - } else if (!eingabeLink.contains("www.smartshopper.cf/invite/")) { + delString = "http://invite.dergeorg.at/invite/"; + } else if (eingabeLink.contains("invite.dergeorg.at/invite/")) { + delString = "invite.dergeorg.at/invite/"; + } else if (eingabeLink.contains("www.invite.dergeorg.atf/invite/")) { + delString = "www.invite.dergeorg.at/invite"; + } else { delString = ""; } String invite = eingabeLink.replace(delString, ""); @@ -204,7 +215,7 @@ public class Database { * @throws JSONException */ public String getInviteLink(String sl_id) throws SQLException, JSONException { - String SQL = "Select invitelink from \"Shoppinglist\" WHERE sl_id = ?"; + String SQL = "Select dynamiclink from \"Shoppinglist\" WHERE sl_id = ?"; String returnLink = executeQuery(SQL, sl_id); return returnLink; } @@ -218,6 +229,20 @@ public class Database { * @throws JSONException */ public String getSlIdFromInvite(String invitelink) throws SQLException, JSONException { + String SQL = "Select sl_id from \"Shoppinglist\" WHERE dynamiclink = ?"; + String returnSl_id = executeQuery(SQL, getinviteFromLink(invitelink)); + return returnSl_id; + } + + /** + * Sucht anhand des invitelinks eine Shoppingliste und gibt dessen sl_id zurück + * + * @param invitelink Der invitelink nach dem gesucht werden soll + * @return Die sl_id die dem invitelink zugeordnet ist + * @throws SQLException + * @throws JSONException + */ + public String getSlIdFromInviteDynamicLink(String invitelink) throws SQLException, JSONException { String SQL = "Select sl_id from \"Shoppinglist\" WHERE invitelink = ?"; String returnSl_id = executeQuery(SQL, getinviteFromLink(invitelink)); return returnSl_id; @@ -239,6 +264,21 @@ public class Database { } } + /** + * Fügt einen invite link zu den shoppinglisten hinzu + * + * @param invitelink Der invite link der hinzugefügt werden soll + * @param uid Der user zu dem der invitelink hinzugefügt werden soll + * @throws SQLException + * @throws JSONException + */ + public void addInviteLinkDynamicLink(String invitelink, String uid) throws SQLException, JSONException { + String sl_id = getSlIdFromInviteDynamicLink(invitelink); + if (!sl_id.equals("null")) { + sqlUpdate2Param("INSERT INTO \"Shoppinglist_member\" (username, sl_id) VALUES (?, ?)", uid, sl_id); + } + } + /** * Erstellt einen neuen InviteLink * @@ -246,10 +286,17 @@ public class Database { * @return Der neue InviteLink * @throws SQLException */ - public String createInviteLink(String sl_id) throws SQLException { - String invitelink = generateInviteLink(); - sqlUpdate2Param("UPDATE \"Shoppinglist\" SET invitelink = ? WHERE sl_id = ?", invitelink, sl_id); - return invitelink; + public void createInviteLink(String sl_id, String invitelink, String dynamiclink) throws SQLException, IOException, JSONException { + sqlUpdate3Param("UPDATE \"Shoppinglist\" SET invitelink = ?, dynamiclink = ? WHERE sl_id = ?", invitelink, dynamiclink, sl_id); + } + + /** + * Generiert einen neuen dynamic link bei google und gibt nur die id zurück + * + * @return DynamicId von dem neuen link + */ + private void generateDynamicLink(final String sl_id, final String invitelink) throws IOException, SQLException, JSONException { + } /** diff --git a/app/src/main/java/at/smartshopper/smartshopperapp/shoppinglist/ShoppinglistSharedAdapter.java b/app/src/main/java/at/smartshopper/smartshopperapp/shoppinglist/ShoppinglistSharedAdapter.java index fe7d975..3f9ae2d 100644 --- a/app/src/main/java/at/smartshopper/smartshopperapp/shoppinglist/ShoppinglistSharedAdapter.java +++ b/app/src/main/java/at/smartshopper/smartshopperapp/shoppinglist/ShoppinglistSharedAdapter.java @@ -99,7 +99,13 @@ public class ShoppinglistSharedAdapter extends RecyclerView.Adapter