Reputation: 291
I am developing an app which can share and been reward so I use the concept of the dynamic link so to store the information of inviter in that link and later be rewarded. but the PendingDynamicLinkData return null on installing the app after referred.
MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
googleSignInClient = GoogleSignIn.getClient(this, gso);
checkInvitations();
}
void checkInvitations() {
FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())
.addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
@Override
public void onSuccess(PendingDynamicLinkData data) {
if (data == null) {
Diagnostics.e(this, "No data").append(activity);
return;
}
// Get the deep link
Uri deepLink = data.getLink();
// Extract invite
FirebaseAppInvite invite = FirebaseAppInvite.getInvitation(data);
if (invite != null) {
String invitationId = invite.getInvitationId();
Diagnostics.i(this, "Send invitationId to server. InvitationId = " + invitationId).append(activity);
}
Diagnostics.i(this, "deepLink:" + deepLink).append(activity);
if (deepLink != null) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setPackage(getPackageName());
intent.setData(deepLink);
startActivity(intent);
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "getDynamicLink:onFailure", e);
}
});
}
onClick event on Invite button in MainActivity
void onInviteClicked() {
JSONObject json = jsonObjectCreator.createJSONObjectForSendingUserId(getUserId());
String jsonString = json.toString();
getterReferenceId = new GetFromServer(this, GET_REFERENCE_URL, jsonString);
getterReferenceId.execute();
}
GetFromServer class
static class GetFromServer extends AsyncTask<Void, Void, JSONObject> {
private String mUrl;
private String mSpotsReportJson;
private WeakReference<MainActivity> activityReference;
GetFromServer(MainActivity context, String url, String spotsReportJson) {
activityReference = new WeakReference<>(context);
mUrl = url;
mSpotsReportJson = spotsReportJson;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
MainActivity activity = activityReference.get();
if (activity == null || activity.isFinishing()) return;
}
@Override
protected JSONObject doInBackground(Void... voids) {
StringBuilder data = new StringBuilder();
HttpURLConnection httpURLConnection = null;
MainActivity activity = activityReference.get();
// get JSON
try {
httpURLConnection = (HttpURLConnection) new URL(mUrl).openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "application/json");
httpURLConnection.setDoOutput(true);
if (isCancelled()) return null;
DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());
wr.writeBytes(mSpotsReportJson);
wr.flush();
wr.close();
int response = httpURLConnection.getResponseCode();
if (response == HttpURLConnection.HTTP_OK || response == HttpURLConnection.HTTP_CREATED) {
// Success
InputStream in = httpURLConnection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(in);
int inputStreamData = inputStreamReader.read();
while (inputStreamData != -1) {
char current = (char) inputStreamData;
inputStreamData = inputStreamReader.read();
data.append(current);
}
}
} catch (Exception e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionDetails = sw.toString();
Diagnostics.e(this, "Exception caught: " + exceptionDetails).append(activity);
} finally {
if (httpURLConnection != null) {
httpURLConnection.disconnect();
}
}
try {
JSONObject json = new JSONObject(data.toString());
return json;
} catch (JSONException e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionDetails = sw.toString();
Diagnostics.e(this, "Exception caught: " + exceptionDetails).append(activity);
}
return null;
}
@Override
protected void onPostExecute(JSONObject json) {
super.onPostExecute(json);
String referenceId = getReferenceIdFromJson(json);
if (referenceId != null) {
// create dynamic link
String link = "https://www.hu.info/_invites/" + referenceId;
// create Firebase link
FirebaseDynamicLinks.getInstance().createDynamicLink()
.setLink(Uri.parse(link))
.setDomainUriPrefix("https://hu.page.link")
.setAndroidParameters(new DynamicLink.AndroidParameters.Builder().build())
.buildShortDynamicLink()
.addOnCompleteListener(activity, new OnCompleteListener<ShortDynamicLink>() {
@Override
public void onComplete(@NonNull Task<ShortDynamicLink> task) {
if (task.isSuccessful()) {
// Short link created
ShortDynamicLink shortDynamicLink = task.getResult();
if (shortDynamicLink != null) {
Uri shortLink = shortDynamicLink.getShortLink();
// send reference
Intent intent = new AppInviteInvitation.IntentBuilder(activity.getString(R.string.invitation_title))
.setMessage(activity.getString(R.string.invitation_message))
.setDeepLink(shortLink)
.setCallToActionText(activity.getString(R.string.invitation_cta))
.build(); activity.startActivityForResult(intent, RC_INVITE);
} else
Diagnostics.e(this, "ShortDynamicLink is null");
} else
Diagnostics.e(this, "link was not created");
}
});
}
break;
}
}
Manifest
<activity
android:name=".MainActivity"
android:screenOrientation="portrait" />
<activity android:name=".InfoActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".InvitationActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="hu.page.link" android:scheme="http"/>
<data android:host="hu.page.link" android:scheme="https"/>
</intent-filter>
</activity>
Upvotes: 1
Views: 1709
Reputation: 19960
You likely want to check the intent on the launch intent - at the moment it looks like you are launching InfoActivity
, and dynamic links when the app has been installed are going to InvitationActivity
, but your link checking code is in MainActivity
.
Upvotes: 1