Skip to content

Commit aad7faf

Browse files
authored
[PR-12076] Ability to natively share via email features header (#6)
1 parent 723b761 commit aad7faf

File tree

5 files changed

+117
-38
lines changed

5 files changed

+117
-38
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ allprojects {
2424

2525
```gradle
2626
dependencies {
27-
implementation 'com.github.talkable:android-sdk:0.5.9'
27+
implementation 'com.github.talkable:android-sdk:0.5.10'
2828
}
2929
```
3030

sdk/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ android {
1010
defaultConfig {
1111
minSdkVersion 16
1212
targetSdkVersion 27
13-
versionCode 38
14-
versionName "0.5.9"
13+
versionCode 39
14+
versionName "0.5.10"
1515
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1616
}
1717
buildTypes {

sdk/src/main/java/com/talkable/sdk/Talkable.java

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,15 @@
44
import android.app.Activity;
55
import android.content.Context;
66
import android.content.Intent;
7-
import android.content.pm.PackageManager;
87
import android.net.Uri;
98
import android.os.Build;
109
import android.support.v4.app.FragmentActivity;
11-
import android.telephony.TelephonyManager;
1210
import android.util.Base64;
1311
import android.util.Log;
1412
import android.webkit.WebSettings;
1513
import android.webkit.WebView;
1614

1715
import com.facebook.FacebookSdk;
18-
import com.facebook.messenger.MessengerUtils;
19-
import com.google.gson.JsonObject;
2016
import com.talkable.sdk.api.ApiError;
2117
import com.talkable.sdk.interfaces.Callback2;
2218
import com.talkable.sdk.interfaces.TalkableCallback;
@@ -31,6 +27,7 @@
3127
import com.talkable.sdk.utils.FacebookUtils;
3228
import com.talkable.sdk.utils.IncorrectInstallationException;
3329
import com.talkable.sdk.utils.ManifestInfo;
30+
import com.talkable.sdk.utils.NativeFeatures;
3431
import com.talkable.sdk.utils.TalkableOfferLoadException;
3532
import com.talkable.sdk.utils.UriUtils;
3633

@@ -67,7 +64,10 @@ public class Talkable {
6764
public static final String ERROR_REASON_SITE_NOT_FOUND = "SITE_NOT_FOUND";
6865

6966
private static OkHttpClient httpClient;
70-
private static String server, siteSlug, nativeFeatures, defaultUserAgent, debugDeviceId;
67+
private static String server;
68+
private static String siteSlug;
69+
private static String defaultUserAgent;
70+
private static String debugDeviceId;
7171
private static Map<String, String> credentialsMap;
7272
private static Boolean initialized = false, debug = false;
7373

@@ -122,7 +122,7 @@ public static void initialize(Context context, String initialSiteSlug) throws In
122122
if (FacebookSdk.isInitialized()) {
123123
FacebookUtils.initialize();
124124
}
125-
setNativeFeatures(context);
125+
NativeFeatures.initialize(context);
126126
}
127127

128128
private static void loadConfig(Context context) {
@@ -169,32 +169,9 @@ static String getDefaultUserAgent(Context context) {
169169
}
170170
}
171171

172-
private static void setNativeFeatures(Context context) {
173-
Boolean isSmsAvailable = false;
174-
Boolean isMessengerInstalled = false;
175-
176-
if (context != null) {
177-
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY) &&
178-
((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getSimState() == TelephonyManager.SIM_STATE_READY) {
179-
isSmsAvailable = true;
180-
}
181-
isMessengerInstalled = MessengerUtils.hasMessengerInstalled(context);
182-
}
183-
184-
JsonObject json = new JsonObject();
185-
json.addProperty("send_sms", isSmsAvailable);
186-
json.addProperty("copy_to_clipboard", true);
187-
json.addProperty("share_via_facebook", FacebookSdk.isInitialized());
188-
json.addProperty("share_via_facebook_messenger", FacebookSdk.isInitialized() && isMessengerInstalled);
189-
json.addProperty("share_via_twitter", false);
190-
json.addProperty("sdk_version", BuildConfig.VERSION_NAME);
191-
json.addProperty("sdk_build", BuildConfig.VERSION_CODE);
192-
193-
nativeFeatures = json.toString();
194-
}
195-
172+
@Deprecated
196173
public static String getNativeFeatures() {
197-
return nativeFeatures;
174+
return NativeFeatures.getFeatures();
198175
}
199176

200177
public static OkHttpClient getHttpClient() {
@@ -262,7 +239,7 @@ public static void loadOffer(final Origin origin, final TalkableCallback<String,
262239
final Request request = new Request.Builder()
263240
.url(originUrl)
264241
.header("User-Agent", getUserAgent())
265-
.header(TALKABLE_FEATURES_HEADER, getNativeFeatures())
242+
.header(TALKABLE_FEATURES_HEADER, NativeFeatures.getFeatures())
266243
.get()
267244
.build();
268245

sdk/src/main/java/com/talkable/sdk/TalkableOfferFragment.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.Manifest;
44
import android.annotation.SuppressLint;
55
import android.annotation.TargetApi;
6+
import android.app.Activity;
67
import android.content.ClipData;
78
import android.content.ClipboardManager;
89
import android.content.Context;
@@ -34,13 +35,13 @@
3435
import com.talkable.sdk.utils.ContactsImporter;
3536
import com.talkable.sdk.utils.FacebookUtils;
3637
import com.talkable.sdk.utils.JsonUtils;
38+
import com.talkable.sdk.utils.NativeFeatures;
39+
import com.talkable.sdk.utils.NativeFeatures.Feature;
3740

3841
import java.util.ArrayList;
3942
import java.util.HashMap;
4043
import java.util.Map;
4144

42-
import android.app.Activity;
43-
4445
public class TalkableOfferFragment extends Fragment {
4546
public static final String OFFER_CODE_PARAM = "offer_code_param";
4647
public static final int REQUEST_CODE_SEND_SMS = 1;
@@ -226,6 +227,10 @@ public void shareSucceeded(String channel) {
226227
//-----------+
227228

228229
public void shareOfferViaNativeMail(String subject, String message, String claimUrl) {
230+
if (!NativeFeatures.isAvailable(Feature.SHARE_VIA_NATIVE_EMAIL)) {
231+
Log.d(Talkable.TAG, "Native feature called when not available: share_via_native_mail");
232+
return;
233+
}
229234
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
230235
if (subject != null) {
231236
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
@@ -237,6 +242,10 @@ public void shareOfferViaNativeMail(String subject, String message, String claim
237242
}
238243

239244
public void shareOfferViaSms(String recipients, String message, String claimUrl) {
245+
if (!NativeFeatures.isAvailable(Feature.SEND_SMS)) {
246+
Log.d(Talkable.TAG, "Native feature called when not available: send_sms");
247+
return;
248+
}
240249
String uriString = "sms:";
241250
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uriString));
242251
if (message != null && claimUrl != null && !message.contains(claimUrl)) {
@@ -331,7 +340,7 @@ public void customWebEvent(String eventName, JsonObject data) {
331340

332341
private Map<String, String> getTalkableHeaders() {
333342
HashMap<String, String> headers = new HashMap<>();
334-
headers.put(Talkable.TALKABLE_FEATURES_HEADER, Talkable.getNativeFeatures());
343+
headers.put(Talkable.TALKABLE_FEATURES_HEADER, NativeFeatures.getFeatures());
335344
return headers;
336345
}
337346

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.talkable.sdk.utils;
2+
3+
import android.content.Context;
4+
import android.content.Intent;
5+
import android.content.pm.PackageManager;
6+
import android.content.pm.ResolveInfo;
7+
import android.net.Uri;
8+
import android.telephony.TelephonyManager;
9+
10+
import com.facebook.FacebookSdk;
11+
import com.facebook.messenger.MessengerUtils;
12+
import com.google.gson.JsonObject;
13+
import com.talkable.sdk.BuildConfig;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class NativeFeatures {
19+
private static JsonObject features;
20+
21+
public enum Feature {
22+
SEND_SMS("send_sms"),
23+
COPY_TO_CLIPBOARD("copy_to_clipboard"),
24+
SHARE_VIA_NATIVE_EMAIL("share_via_native_mail"),
25+
SHARE_VIA_TWITTER("share_via_twitter"),
26+
SHARE_VIA_FACEBOOK("share_via_facebook"),
27+
SHARE_VIA_FACEBOOK_MESSENGER("share_via_facebook_messenger");
28+
29+
private final String identifier;
30+
31+
Feature(String s) {
32+
identifier = s;
33+
}
34+
35+
public boolean equalsIdentifier(String otherIdentifier) {
36+
return identifier.equals(otherIdentifier);
37+
}
38+
39+
public String toString() {
40+
return this.identifier;
41+
}
42+
}
43+
44+
public static void initialize(Context context) {
45+
Boolean isSmsAvailable = false;
46+
Boolean isMessengerInstalled = false;
47+
Boolean isMailAvailable = false;
48+
49+
if (context != null) {
50+
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY) &&
51+
((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getSimState() == TelephonyManager.SIM_STATE_READY) {
52+
isSmsAvailable = true;
53+
}
54+
55+
isMessengerInstalled = MessengerUtils.hasMessengerInstalled(context);
56+
57+
Intent sendNativeMailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
58+
List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(sendNativeMailIntent, 0);// .isEmpty();
59+
if (!resolveInfos.isEmpty()) {
60+
// for some android emulators there is always "com.android.fallback/.Fallback" intent
61+
// https://stackoverflow.com/a/31052350
62+
List<ResolveInfo> filtered = new ArrayList<ResolveInfo>();
63+
for (ResolveInfo info : resolveInfos) {
64+
String packageName = info.activityInfo.packageName;
65+
if (!packageName.toLowerCase().contains("fallback")) {
66+
filtered.add(info);
67+
}
68+
}
69+
isMailAvailable = !filtered.isEmpty();
70+
}
71+
}
72+
73+
JsonObject json = new JsonObject();
74+
json.addProperty(Feature.SEND_SMS.toString(), isSmsAvailable);
75+
json.addProperty(Feature.COPY_TO_CLIPBOARD.toString(), true);
76+
json.addProperty(Feature.SHARE_VIA_FACEBOOK.toString(), FacebookSdk.isInitialized());
77+
json.addProperty(Feature.SHARE_VIA_FACEBOOK_MESSENGER.toString(), FacebookSdk.isInitialized() && isMessengerInstalled);
78+
json.addProperty(Feature.SHARE_VIA_TWITTER.toString(), false);
79+
json.addProperty(Feature.SHARE_VIA_NATIVE_EMAIL.toString(), isMailAvailable);
80+
json.addProperty("sdk_version", BuildConfig.VERSION_NAME);
81+
json.addProperty("sdk_build", BuildConfig.VERSION_CODE);
82+
83+
features = json;
84+
}
85+
86+
public static String getFeatures() {
87+
return features.toString();
88+
}
89+
90+
public static boolean isAvailable(Feature feature) {
91+
return JsonUtils.getJsonBoolean(features, feature.toString());
92+
}
93+
}

0 commit comments

Comments
 (0)