Dynamic Linking V2

Erstellt anstatt normalen invite links, dynamic links und speichert diese auch in die db
This commit is contained in:
Georg Reisinger 2019-03-25 19:32:27 +01:00
parent fef831ea54
commit e2ae90d143
6 changed files with 330 additions and 118 deletions

Binary file not shown.

View File

@ -42,5 +42,5 @@ dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'cz.msebera.android:httpclient:4.4.1.2'
implementation 'com.google.firebase:firebase-dynamic-links:16.1.7'
implementation 'com.google.firebase:firebase-dynamic-links:16.1.8'
}

View File

@ -39,12 +39,16 @@ 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.dynamiclinks.DynamicLink;
import com.google.firebase.dynamiclinks.FirebaseDynamicLinks;
import com.google.firebase.dynamiclinks.ShortDynamicLink;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;
import com.squareup.picasso.Picasso;
import org.json.JSONException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@ -138,7 +142,35 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte
setMsgId();
Intent getIntent = getIntent();
String sl_idToGo = getIntent.getStringExtra("sl_idToGo");
String inviteToAdd = getIntent.getStringExtra("inviteToAdd");
if (sl_idToGo != null && inviteToAdd != null) {
try {
db.addInviteLinkDynamicLink(inviteToAdd, FirebaseAuth.getInstance().getCurrentUser().getUid());
} catch (SQLException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
// Damit werden die Shared Shoppinglists angezeigt
// try {
// TabHost tabhost = (TabHost) findViewById(R.id.tabHost1);
// tabhost.setCurrentTab(1);
// sharedswiperefresh.setRefreshing(true);
// showSharedShoppingList(FirebaseAuth.getInstance().getCurrentUser().getUid());
// sharedswiperefresh.setRefreshing(false);
// } catch (JSONException e) {
// e.printStackTrace();
// } catch (SQLException e) {
// e.printStackTrace();
// }
//Damit wird die hinzugefügte shoppinglist angezeigt
onShoppinglistClickContainer(sl_idToGo);
}
/*
@ -793,7 +825,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte
}
}
private void onShoppinglistClickContainer(String sl_id, View v) {
private void onShoppinglistClickContainer(String sl_id) {
finish();
Intent intent = new Intent(this, ShoppinglistDetails.class);
intent.putExtra("sl_id", sl_id);
@ -827,109 +859,222 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte
* @param sl_id Die Shoppingliste von der der invitelink gewünscht ist
* @return
*/
private String getInviteLink(String sl_id) {
// private String getInviteLink(String sl_id, String invitelink, String dynamiclink) {
//
// return link;
// }
@Override
public void onShareClick(final String sl_id, final View v) {
String link = null;
try {
if (db.isShared(sl_id)) {
link = db.getInviteLink(sl_id);
} else {
final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
View popupContentView = inflater.inflate(R.layout.add_share, null);
link = db.createInviteLink(sl_id);
final TextView linkausgabe = (TextView) popupContentView.findViewById(R.id.shareLink);
linkausgabe.setText("invite.dergeorg.at/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();
} else {
final String invitelink = db.generateInviteLink();
String url = "https://smartshopper.cf/androidinvite/" + sl_id;
Task<ShortDynamicLink> 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<ShortDynamicLink>() {
@Override
public void onComplete(@NonNull Task<ShortDynamicLink> 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);
}
}

View File

@ -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<InstanceIdResult>() {
@ -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);
}
}

View File

@ -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 {
}
/**

View File

@ -99,7 +99,13 @@ public class ShoppinglistSharedAdapter extends RecyclerView.Adapter<Shoppinglist
public void onClick(View v) {
String sl_id = shoppinglist.getSlId();
Toast.makeText(v.getContext(), "LISTENER im ADAPTER geht: " + sl_id, Toast.LENGTH_LONG);
sharedOnShareClick.sharedOnShareClick(sl_id, v);
try {
sharedOnShareClick.sharedOnShareClick(sl_id, v);
} catch (SQLException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
@ -211,7 +217,7 @@ public class ShoppinglistSharedAdapter extends RecyclerView.Adapter<Shoppinglist
* Interface damit onoclick in der dash activity ausgeführt werden kann
*/
public interface SharedOnShareClick {
void sharedOnShareClick(String sl_id, View v);
void sharedOnShareClick(String sl_id, View v) throws SQLException, JSONException;
}
/**