Browse Source

[이벤트][New] 딥 링크 추가
- 정해진 activity 로 진입하지 않음.

hyodong.min 6 years ago
parent
commit
25e1d01ad7

+ 1 - 0
app/build.gradle

@@ -118,6 +118,7 @@ dependencies {
     implementation "android.arch.lifecycle:extensions:1.1.1"
     implementation "android.arch.lifecycle:viewmodel:1.1.1"
     implementation 'com.google.firebase:firebase-messaging:17.3.4'
+    implementation 'com.google.firebase:firebase-dynamic-links:16.1.7'
 
 
     /*********************************

+ 12 - 1
app/src/main/AndroidManifest.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
           package="kr.co.zumo.app">
 
   <uses-permission android:name="android.permission.INTERNET"/>
@@ -14,9 +15,9 @@
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 
   <application
-    android:hardwareAccelerated="true"
     android:name=".lifeplus.application.App"
     android:allowBackup="false"
+    android:hardwareAccelerated="true"
     android:icon="@mipmap/ic_launcher"
     android:label="${appLabel}"
     android:largeHeap="true"
@@ -46,9 +47,19 @@
         <category android:name="android.intent.category.DEFAULT"/>
         <category android:name="android.intent.category.BROWSABLE"/>
 
+        <!-- kakao link -->
         <data
           android:host="@string/kakaolink_host"
           android:scheme="@string/kakao_scheme"/>
+
+        <!-- firebase dynamic links -->
+        <data
+          android:host="lifeplus.co.kr/app"
+          android:scheme="http"/>
+        <data
+          android:host="lifeplus.co.kr/app"
+          android:scheme="https"/>
+
       </intent-filter>
     </activity>
     <activity

+ 72 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/tool/Share.java

@@ -3,13 +3,24 @@
  */
 package kr.co.zumo.app.lifeplus.tool;
 
+import android.net.Uri;
+import android.support.annotation.NonNull;
 import android.support.annotation.StringDef;
+import android.util.Log;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.OnFailureListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.dynamiclinks.DynamicLink;
+import com.google.firebase.dynamiclinks.FirebaseDynamicLinks;
+import com.google.firebase.dynamiclinks.ShortDynamicLink;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 import kr.co.zumo.app.lifeplus.bean.api.ContentsItemBean;
 import kr.co.zumo.app.lifeplus.bean.api.EventDetailBean;
+import kr.co.zumo.app.lifeplus.util.AppUtil;
 
 /**
  * Share
@@ -53,4 +64,65 @@ public abstract class Share<T> {
   }
 
   protected abstract void disposeInternal();
+
+  protected Uri getDeepLink(EventDetailBean eventDetailBean, String type) {
+    // Generate promotion code
+    Uri.Builder builder = new Uri.Builder();
+    builder.scheme("http")
+      .authority("lifeplus.co.kr")
+      .appendPath("app")
+      .appendQueryParameter(ShareKakaoTalk.LINK_TYPE, type)
+      .appendQueryParameter(ShareKakaoTalk.CONTENTS_ITEM_NO, eventDetailBean.getItemNo());
+    Log.i("APP# ShareFacebook | getDeepLink", "|" + "uri: " + builder.toString());
+    return builder.build();
+  }
+
+  protected void onDynamicLinkClick(EventDetailBean eventDetailBean, IShareListener listener) {
+    DynamicLink dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink()
+      .setLink(getDeepLink(eventDetailBean, ShareKakaoTalk.LINK_TYPE_EVENT_DETAIL))
+      .setDomainUriPrefix("https://k56gf.app.goo.gl")
+      .setAndroidParameters(
+        new DynamicLink.AndroidParameters.Builder(AppUtil.getPackageName())
+          .setMinimumVersion(149)
+          .build())
+//      .setGoogleAnalyticsParameters(
+//        new DynamicLink.GoogleAnalyticsParameters.Builder()
+//          .setSource("orkut")
+//          .setMedium("social")
+//          .setCampaign("example-promo")
+//          .build())
+      .buildDynamicLink();
+
+    Log.e("APP#  ShareFacebook | onDynamicLinkClick", "|" + " longLink: " + dynamicLink.getUri().toString());
+
+    Task<ShortDynamicLink> shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink()
+      .setLongLink(dynamicLink.getUri())
+      .buildShortDynamicLink()
+      .addOnCompleteListener(new OnCompleteListener<ShortDynamicLink>() {
+        @Override
+        public void onComplete(@NonNull Task<ShortDynamicLink> task) {
+          if (task.isSuccessful()) {
+            Uri shortLink = task.getResult().getShortLink();
+            Log.e("APP#  ShareFacebook | onComplete", "| shortLink: " + shortLink.toString());
+            listener.onSuccess(shortLink.toString());
+          }
+          else {
+            Log.e("APP#  ShareFacebook | onComplete", "|" + task.toString());
+
+            // short 실패, 롱으로 전달.
+            listener.onSuccess(dynamicLink.getUri().toString());
+          }
+        }
+      })
+      .addOnFailureListener(new OnFailureListener() {
+        @Override
+        public void onFailure(@NonNull Exception e) {
+          e.printStackTrace();
+
+          // short 실패, 롱으로 전달.
+          listener.onSuccess(dynamicLink.getUri().toString());
+        }
+      });
+  }
+
 }

+ 10 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/tool/ShareClipBoard.java

@@ -27,13 +27,22 @@ public class ShareClipBoard extends Share<Context> {
 
   @Override
   public void shareEvent(EventDetailBean eventDetailBean, IShareListener listener) {
+    onDynamicLinkClick(eventDetailBean, new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        copy("url", result, listener);
+      }
 
+      @Override
+      public void onFailure(int errorCode, String result) {
+        listener.onFailure(errorCode, result);
+      }
+    });
   }
 
   @Override
   public void shareContents(ContentsItemBean contentsBean, int pageIndex, IShareListener listener) {
     copy("url", contentsBean.getContentsUrlWithParamForShare(pageIndex), listener);
-
   }
 
   @Override

+ 36 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/tool/ShareFacebook.java

@@ -40,7 +40,43 @@ public class ShareFacebook extends Share<Activity> {
   public void shareEvent(EventDetailBean eventDetailBean, IShareListener listener) {
 
     // deep link
+    onDynamicLinkClick(eventDetailBean, new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+
+        Uri uri = Uri.parse(result);
+        Log.d("APP# ShareFacebook | onSuccess", "| ------------> uri: " + uri.toString());
+
+        ShareLinkContent content = new ShareLinkContent.Builder()
+          .setContentUrl(uri)
+          .build();
+
+        ShareDialog shareDialog = new ShareDialog(context);
+        shareDialog.registerCallback(ShareFacebook.this.callbackManager, new FacebookCallback<Sharer.Result>() {
+          @Override
+          public void onSuccess(Sharer.Result result) {
+            listener.onSuccess(result.toString());
+          }
+
+          @Override
+          public void onCancel() {
+            listener.onCancel();
+          }
+
+          @Override
+          public void onError(FacebookException error) {
+            error.printStackTrace();
+            listener.onFailure(0, error.getLocalizedMessage());
+          }
+        });
+        shareDialog.show(content);
+      }
 
+      @Override
+      public void onFailure(int errorCode, String result) {
+        listener.onFailure(errorCode, result);
+      }
+    });
   }
 
   @Override

+ 36 - 6
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/entry/EventDetailEntryPresenter.java

@@ -20,6 +20,7 @@ import kr.co.zumo.app.lifeplus.util.StringUtil;
 import kr.co.zumo.app.lifeplus.view.DoubleChecker;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.ToastProvider;
+import kr.co.zumo.app.lifeplus.view.command.EmailSendingCommand;
 import kr.co.zumo.app.lifeplus.view.dialog.DialogBuilder;
 import kr.co.zumo.app.lifeplus.view.dialog.DialogID;
 import kr.co.zumo.app.lifeplus.view.dialog.ICustomDialogListener;
@@ -305,32 +306,40 @@ public class EventDetailEntryPresenter extends Presenter<EventDetailEntryModel,
   }
 
   protected void sendFaceBook() {
+    // deep link 생성하는 시간동안 웨이터 표시
+    showWaiter();
     share = new ShareFacebook(view.getActivity(), getHelper(FacebookHelper.class).getCallbackManager());
     share.shareEvent(model.getEventDetailBean(), new IShareListener() {
       @Override
       public void onSuccess(String result) {
         loadShareCoin(Share.TYPE_FACEBOOK);
         showShareToast("", ResourceUtil.getString(R.string.share_completed_message), 1);
+        hideWaiter();
       }
 
       @Override
       public void onCancel() {
         loadShareCoin(Share.TYPE_FACEBOOK);
+        hideWaiter();
       }
 
       @Override
       public void onFailure(int errorCode, String result) {
         showErrorDialog(result);
+        hideWaiter();
       }
     });
 
   }
 
   protected void sendClipBoardCopy() {
+    // deep link 생성하는 시간동안 웨이터 표시
+    showWaiter();
     share = new ShareClipBoard(view.getActivity());
     share.shareEvent(model.getEventDetailBean(), new IShareListener() {
       @Override
       public void onSuccess(String result) {
+        hideWaiter();
         loadShareCoin(Share.TYPE_URL);
         // clipboard 는 resume 이 없으므로 바로 실행
         resumeInternal();
@@ -340,22 +349,43 @@ public class EventDetailEntryPresenter extends Presenter<EventDetailEntryModel,
 
       @Override
       public void onFailure(int errorCode, String result) {
+        hideWaiter();
         showErrorDialog(ResourceUtil.getString(R.string.share_error_message));
       }
     });
   }
 
   protected void sendEmail() {
-    loadShareCoin(Share.TYPE_EMAIL);
-    String subject;
-    subject = ResourceUtil.getString(R.string.share_title, model.getEventDetailBean().getTitle());
-//    String url = // todo deep link
-//    String contents = ResourceUtil.getString(R.string.share_event_contents, subject, url);
-//    onCommand(new EmailSendingCommand("", subject, contents));
+
+    // fixme 임시로 클립보드 이용
+    // deep link 생성하는 시간동안 웨이터 표시
+    showWaiter();
+    share = new ShareClipBoard(view.getActivity());
+    share.shareEvent(model.getEventDetailBean(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        hideWaiter();
+        loadShareCoin(Share.TYPE_EMAIL);
+        String subject;
+        subject = ResourceUtil.getString(R.string.share_title, model.getEventDetailBean().getTitle());
+        String url = result;
+        String contents = ResourceUtil.getString(R.string.share_event_contents, subject, url);
+        onCommand(new EmailSendingCommand("", subject, contents));
+
+        showShareToast("", ResourceUtil.getString(R.string.url_copy_message), 1);
+      }
+
+      @Override
+      public void onFailure(int errorCode, String result) {
+        hideWaiter();
+        showErrorDialog(ResourceUtil.getString(R.string.share_error_message));
+      }
+    });
   }
 
   protected Share share;
   protected DoubleChecker coinChecker = null;
+
   protected void loadShareCoin(@Share.Type String type) {
     // 더블 체커 세팅
     coinChecker = new DoubleChecker(() -> {