diff --git a/app/src/main/java/org/gdg/frisbee/android/api/FirebaseDynamicLinks.java b/app/src/main/java/org/gdg/frisbee/android/api/FirebaseDynamicLinks.java new file mode 100644 index 000000000..9e5486493 --- /dev/null +++ b/app/src/main/java/org/gdg/frisbee/android/api/FirebaseDynamicLinks.java @@ -0,0 +1,16 @@ +package org.gdg.frisbee.android.api; + +import org.gdg.frisbee.android.api.model.FirebaseDynamicLinksRequest; +import org.gdg.frisbee.android.api.model.FirebaseDynamicLinksResponse; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public interface FirebaseDynamicLinks { + + @POST("/v1/shortLinks") + Call shortenUrl(@Query("key") String apiKey, + @Body FirebaseDynamicLinksRequest firebaseDynamicLinksRequest); +} diff --git a/app/src/main/java/org/gdg/frisbee/android/api/FirebaseDynamicLinksFactory.java b/app/src/main/java/org/gdg/frisbee/android/api/FirebaseDynamicLinksFactory.java new file mode 100644 index 000000000..cd2eabd66 --- /dev/null +++ b/app/src/main/java/org/gdg/frisbee/android/api/FirebaseDynamicLinksFactory.java @@ -0,0 +1,30 @@ +package org.gdg.frisbee.android.api; + +import com.google.gson.FieldNamingPolicy; + +import org.gdg.frisbee.android.utils.Utils; + +import okhttp3.OkHttpClient; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public final class FirebaseDynamicLinksFactory { + private static final String BASE_URL = "https://firebasedynamiclinks.googleapis.com"; + + private FirebaseDynamicLinksFactory() { + } + + private static Retrofit provideRestAdapter(OkHttpClient okHttpClient) { + return new Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addConverterFactory( + GsonConverterFactory.create(Utils.getGson(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)) + ) + .build(); + } + + public static FirebaseDynamicLinks provideFirebaseDynamicLinksApi(OkHttpClient okHttpClient) { + return provideRestAdapter(okHttpClient).create(FirebaseDynamicLinks.class); + } +} diff --git a/app/src/main/java/org/gdg/frisbee/android/api/model/FirebaseDynamicLinksRequest.java b/app/src/main/java/org/gdg/frisbee/android/api/model/FirebaseDynamicLinksRequest.java new file mode 100644 index 000000000..92f1153ee --- /dev/null +++ b/app/src/main/java/org/gdg/frisbee/android/api/model/FirebaseDynamicLinksRequest.java @@ -0,0 +1,11 @@ +package org.gdg.frisbee.android.api.model; + +public class FirebaseDynamicLinksRequest { + private String longDynamicLink; + private Suffix suffix; + + public FirebaseDynamicLinksRequest(String longDynamicLink, Suffix suffix) { + this.longDynamicLink = longDynamicLink; + this.suffix = suffix; + } +} diff --git a/app/src/main/java/org/gdg/frisbee/android/api/model/FirebaseDynamicLinksResponse.java b/app/src/main/java/org/gdg/frisbee/android/api/model/FirebaseDynamicLinksResponse.java new file mode 100644 index 000000000..f6438fed8 --- /dev/null +++ b/app/src/main/java/org/gdg/frisbee/android/api/model/FirebaseDynamicLinksResponse.java @@ -0,0 +1,19 @@ +package org.gdg.frisbee.android.api.model; + +public class FirebaseDynamicLinksResponse { + private final String shortLink; + private final String previewLink; + + public FirebaseDynamicLinksResponse(String shortLink, String previewLink) { + this.shortLink = shortLink; + this.previewLink = previewLink; + } + + public String getShortLink() { + return shortLink; + } + + public String getPreviewLink() { + return previewLink; + } +} diff --git a/app/src/main/java/org/gdg/frisbee/android/api/model/Suffix.java b/app/src/main/java/org/gdg/frisbee/android/api/model/Suffix.java new file mode 100644 index 000000000..4fc23b46c --- /dev/null +++ b/app/src/main/java/org/gdg/frisbee/android/api/model/Suffix.java @@ -0,0 +1,5 @@ +package org.gdg.frisbee.android.api.model; + +public class Suffix { + private final String option = "SHORT"; +} diff --git a/app/src/main/java/org/gdg/frisbee/android/app/App.java b/app/src/main/java/org/gdg/frisbee/android/app/App.java index 5d868ba22..aa48a21de 100644 --- a/app/src/main/java/org/gdg/frisbee/android/app/App.java +++ b/app/src/main/java/org/gdg/frisbee/android/app/App.java @@ -34,6 +34,8 @@ import org.gdg.frisbee.android.BuildConfig; import org.gdg.frisbee.android.R; +import org.gdg.frisbee.android.api.FirebaseDynamicLinks; +import org.gdg.frisbee.android.api.FirebaseDynamicLinksFactory; import org.gdg.frisbee.android.api.GdeDirectory; import org.gdg.frisbee.android.api.GdeDirectoryFactory; import org.gdg.frisbee.android.api.GdgXHub; @@ -78,6 +80,7 @@ public class App extends BaseApp implements LocationListener { private OrganizerChecker mOrganizerChecker; private List mTaggedEventSeriesList; private RefWatcher refWatcher; + private FirebaseDynamicLinks firebaseDynamicLinks; public static App from(Context context) { return (App) context.getApplicationContext(); @@ -296,6 +299,13 @@ public PlusApi getPlusApi() { return plusApi; } + public FirebaseDynamicLinks getFirebaseDynamicLinks() { + if (firebaseDynamicLinks == null) { + firebaseDynamicLinks = FirebaseDynamicLinksFactory.provideFirebaseDynamicLinksApi(okHttpClient); + } + return firebaseDynamicLinks; + } + public RefWatcher getRefWatcher() { return refWatcher; } diff --git a/app/src/main/java/org/gdg/frisbee/android/onboarding/AppInviteLinkGenerator.java b/app/src/main/java/org/gdg/frisbee/android/onboarding/AppInviteLinkGenerator.java index 3680927ee..4466bd346 100644 --- a/app/src/main/java/org/gdg/frisbee/android/onboarding/AppInviteLinkGenerator.java +++ b/app/src/main/java/org/gdg/frisbee/android/onboarding/AppInviteLinkGenerator.java @@ -1,9 +1,16 @@ package org.gdg.frisbee.android.onboarding; +import android.app.ProgressDialog; import android.support.v4.app.ShareCompat; import org.gdg.frisbee.android.BuildConfig; import org.gdg.frisbee.android.R; +import org.gdg.frisbee.android.api.Callback; +import org.gdg.frisbee.android.api.FirebaseDynamicLinks; +import org.gdg.frisbee.android.api.model.FirebaseDynamicLinksRequest; +import org.gdg.frisbee.android.api.model.FirebaseDynamicLinksResponse; +import org.gdg.frisbee.android.api.model.Suffix; +import org.gdg.frisbee.android.app.App; import org.gdg.frisbee.android.common.GdgActivity; import org.gdg.frisbee.android.utils.PlusUtils; @@ -16,31 +23,36 @@ public class AppInviteLinkGenerator { private final String dynamicLinkDomain; private final String deepLinkBaseUrl; + private GdgActivity activity; + private ProgressDialog shareProgressDialog; + + private AppInviteLinkGenerator(String dynamicLinkDomain, String deepLinkBaseUrl, GdgActivity activity) { + this.dynamicLinkDomain = dynamicLinkDomain; + this.deepLinkBaseUrl = deepLinkBaseUrl; + this.activity = activity; + } static String extractSender(HttpUrl httpUrl) { return httpUrl.queryParameter(SENDER); } - public static AppInviteLinkGenerator create() { - return new AppInviteLinkGenerator("https://fmec6.app.goo.gl/", "https://gdg.events/"); - } - - private AppInviteLinkGenerator(String dynamicLinkDomain, String deepLinkBaseUrl) { - this.dynamicLinkDomain = dynamicLinkDomain; - this.deepLinkBaseUrl = deepLinkBaseUrl; + public static AppInviteLinkGenerator create(GdgActivity activity) { + return new AppInviteLinkGenerator("https://fmec6.app.goo.gl/", "https://gdg.events/", activity); } public static void shareAppInviteLink(GdgActivity activity) { - AppInviteLinkGenerator linkGenerator = create(); + AppInviteLinkGenerator linkGenerator = create(activity); String gplusId = PlusUtils.getCurrentPlusId(activity); - HttpUrl appInviteLink = gplusId != null - ? linkGenerator.createAppInviteLink(gplusId) - : NON_SIGNED_IN_INVITE_URL; - ShareCompat.IntentBuilder.from(activity) - .setChooserTitle(R.string.invite_friends) - .setText(activity.getString(R.string.invitation_message, appInviteLink)) - .setType("text/plain") - .startChooser(); + HttpUrl appInviteLink; + if (gplusId != null) { + appInviteLink = linkGenerator.createAppInviteLink(gplusId); + linkGenerator.shareShortAppInviteLink(appInviteLink.toString()); + linkGenerator.showProgressDialog(activity); + } else { + appInviteLink = NON_SIGNED_IN_INVITE_URL; + linkGenerator.createChooser(appInviteLink); + } + activity.sendAnalyticsEvent("AppInvite", "Shared", gplusId != null ? "Signed In" : "Non Signed In"); @@ -63,4 +75,39 @@ private String createDeepLink(String gplusId) { .toString(); } + private void shareShortAppInviteLink(String longUrl) { + FirebaseDynamicLinks firebaseDynamicLinks = App.from(activity).getFirebaseDynamicLinks(); + FirebaseDynamicLinksRequest firebaseDynamicLinksRequest = + new FirebaseDynamicLinksRequest(longUrl, new Suffix()); + firebaseDynamicLinks.shortenUrl(BuildConfig.IP_SIMPLE_API_ACCESS_KEY, firebaseDynamicLinksRequest) + .enqueue(new Callback() { + @Override + public void onSuccess(FirebaseDynamicLinksResponse response) { + createChooser(HttpUrl.parse(response.getShortLink())); + shareProgressDialog.dismiss(); + } + + @Override + public void onError() { + createChooser(NON_SIGNED_IN_INVITE_URL); + shareProgressDialog.dismiss(); + } + }); + } + + private void showProgressDialog(GdgActivity activity) { + shareProgressDialog = new ProgressDialog(activity); + shareProgressDialog.setIndeterminate(true); + shareProgressDialog.setCancelable(true); + shareProgressDialog.setMessage(activity.getString(R.string.generating_url)); + shareProgressDialog.show(); + } + + private void createChooser(HttpUrl appInviteLink) { + ShareCompat.IntentBuilder.from(activity) + .setChooserTitle(R.string.invite_friends) + .setText(activity.getString(R.string.invitation_message, appInviteLink)) + .setType("text/plain") + .startChooser(); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9a3b289d..5c839d014 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -174,4 +174,5 @@ Yey! You\'re invited by\n%s a friend Login/Register + Generating URL