diff --git a/CHANGELOG.md b/CHANGELOG.md index 280afc5..118f3ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.7.0 (2018-05-08) + +- Add new method that just needs client_id & doesn't require the client_secret + ## 2.6.1 (2018-04-09) - Fix Layout for short followup question diff --git a/README.md b/README.md index 40ee38e..0c4b758 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,14 @@ If you use Maven, you can include this library as a dependency: com.wootric wootric-sdk-android - 2.6.1 + 2.7.0 ``` ### Using Gradle ```xml -compile 'com.wootric:wootric-sdk-android:2.6.1' +compile 'com.wootric:wootric-sdk-android:2.7.0' ``` ## Initializing Wootric @@ -74,12 +74,12 @@ WootricSDK task is to present a fully functional survey view with just a few lin import com.wootric.androidsdk.Wootric; ``` -4. Configure the SDK with your client ID, secret and account token: +4. Configure the SDK with your client ID and account token: All you need to do is to add this code to your Activity's `onCreate` method: ```java - Wootric wootric = Wootric.init(this, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric wootric = Wootric.init(this, CLIENT_ID, ACCOUNT_TOKEN); ``` 5. To display the survey (if user is eligible - this check is built in the method) use: @@ -99,7 +99,7 @@ import com.wootric.androidsdk.Wootric; // Inside your Activity's onCreate method -Wootric wootric = Wootric.init(this, YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_ACCOUNT_TOKEN); +Wootric wootric = Wootric.init(this, YOUR_CLIENT_ID, YOUR_ACCOUNT_TOKEN); wootric.setEndUserEmail("nps@example.com"); // Use only for testing wootric.setSurveyImmediately(true); diff --git a/androidsdk/gradle.properties b/androidsdk/gradle.properties index 7ed7770..1b6ab65 100644 --- a/androidsdk/gradle.properties +++ b/androidsdk/gradle.properties @@ -1,5 +1,5 @@ -VERSION_NAME=2.6.1 -VERSION_CODE=261 +VERSION_NAME=2.7.0 +VERSION_CODE=270 GROUP=com.wootric POM_DESCRIPTION=WootricSDK Android diff --git a/androidsdk/src/main/java/com/wootric/androidsdk/Wootric.java b/androidsdk/src/main/java/com/wootric/androidsdk/Wootric.java index 6eca5aa..cd78779 100644 --- a/androidsdk/src/main/java/com/wootric/androidsdk/Wootric.java +++ b/androidsdk/src/main/java/com/wootric/androidsdk/Wootric.java @@ -66,6 +66,7 @@ public class Wootric { * @param clientSecret Found in API section of the Wootric's admin panel. * @param accountToken Found in Install section of the Wootric's admin panel. */ + @Deprecated public static Wootric init(FragmentActivity activity, String clientId, String clientSecret, String accountToken) { Wootric local = singleton; if(local == null) { @@ -84,6 +85,30 @@ public static Wootric init(FragmentActivity activity, String clientId, String cl return local; } + /** + * It configures the SDK with required parameters. + * + * @param activity Activity where the survey will be presented. + * @param clientId Found in API section of the Wootric's admin panel. + * @param accountToken Found in Install section of the Wootric's admin panel. + */ + public static Wootric init(FragmentActivity activity, String clientId, String accountToken) { + Wootric local = singleton; + if(local == null) { + synchronized (Wootric.class) { + local = singleton; + if(local == null) { + checkNotNull(activity, "Activity"); + checkNotNull(clientId, "Client Id"); + checkNotNull(accountToken, "Account Token"); + singleton = local = new Wootric(activity, clientId, accountToken); + } + } + } + + return local; + } + public static void notifySurveyFinished(boolean surveyShown, boolean responseSent, Integer resurvey_days) { if(singleton == null) return; @@ -374,6 +399,18 @@ private Wootric(FragmentActivity activity, String clientId, String clientSecret, permissionsValidator = new PermissionsValidator(weakContext); } + private Wootric(FragmentActivity activity, String clientId, String accountToken) { + weakActivity = new WeakReference<>(activity); + weakContext = new WeakReference<>(activity.getApplicationContext()); + + endUser = new EndUser(); + user = new User(clientId, accountToken); + settings = new Settings(); + + preferencesUtils = new PreferencesUtils(weakContext); + permissionsValidator = new PermissionsValidator(weakContext); + } + SurveyValidator buildSurveyValidator(User user, EndUser endUser, Settings settings, WootricRemoteClient wootricRemoteClient, PreferencesUtils preferencesUtils) { return new SurveyValidator(user, endUser, settings, wootricRemoteClient, preferencesUtils); diff --git a/androidsdk/src/main/java/com/wootric/androidsdk/network/tasks/GetAccessTokenTask.java b/androidsdk/src/main/java/com/wootric/androidsdk/network/tasks/GetAccessTokenTask.java index 58a8a97..bde516d 100644 --- a/androidsdk/src/main/java/com/wootric/androidsdk/network/tasks/GetAccessTokenTask.java +++ b/androidsdk/src/main/java/com/wootric/androidsdk/network/tasks/GetAccessTokenTask.java @@ -50,7 +50,9 @@ protected String requestUrl() { protected void buildParams() { paramsMap.put("grant_type", "client_credentials"); paramsMap.put("client_id", clientId); - paramsMap.put("client_secret", clientSecret); + if (clientSecret != null) { + paramsMap.put("client_secret", clientSecret); + } } @Override diff --git a/androidsdk/src/main/java/com/wootric/androidsdk/objects/User.java b/androidsdk/src/main/java/com/wootric/androidsdk/objects/User.java index 4c9d920..2d897b8 100644 --- a/androidsdk/src/main/java/com/wootric/androidsdk/objects/User.java +++ b/androidsdk/src/main/java/com/wootric/androidsdk/objects/User.java @@ -30,9 +30,9 @@ */ public class User implements Parcelable { - private final String clientId; - private final String clientSecret; - private final String accountToken; + private String clientId; + private String clientSecret; + private String accountToken; public User(String clientId, String clientSecret, String accountToken) { this.clientId = clientId; @@ -40,6 +40,11 @@ public User(String clientId, String clientSecret, String accountToken) { this.accountToken = accountToken; } + public User(String clientId, String accountToken) { + this.clientId = clientId; + this.accountToken = accountToken; + } + public String getClientId() { return clientId; } diff --git a/androidsdk/src/test/java/com/wootric/androidsdk/WootricTest.java b/androidsdk/src/test/java/com/wootric/androidsdk/WootricTest.java index c022a2c..f62f79b 100644 --- a/androidsdk/src/test/java/com/wootric/androidsdk/WootricTest.java +++ b/androidsdk/src/test/java/com/wootric/androidsdk/WootricTest.java @@ -12,6 +12,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.internal.matchers.Null; import org.mockito.runners.MockitoJUnitRunner; import java.util.HashMap; @@ -43,12 +44,14 @@ public class WootricTest { public void setUp() { Wootric.singleton = null; Wootric.init(TEST_ACTIVITY, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric.init(TEST_ACTIVITY, CLIENT_ID, ACCOUNT_TOKEN); } @Test public void fails_whenContextIsNull() throws Exception { try { Wootric.singleton = null; Wootric.init(null, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric.init(null, CLIENT_ID, ACCOUNT_TOKEN); fail("Null activity should throw exception"); } catch (IllegalArgumentException expected) { } @@ -58,6 +61,7 @@ public void setUp() { try { Wootric.singleton = null; Wootric.init(new FragmentActivity(), null, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric.init(new FragmentActivity(), null, ACCOUNT_TOKEN); fail("Null client id should throw exception"); } catch (IllegalArgumentException expected) { } @@ -67,6 +71,7 @@ public void setUp() { try { Wootric.singleton = null; Wootric.init(new FragmentActivity(), CLIENT_ID, null, ACCOUNT_TOKEN); + Wootric.init(new FragmentActivity(), CLIENT_ID, ACCOUNT_TOKEN); fail("Null client secret should throw exception"); } catch (IllegalArgumentException expected) { } @@ -76,6 +81,7 @@ public void setUp() { try { Wootric.singleton = null; Wootric.init(new FragmentActivity(), CLIENT_ID, CLIENT_SECRET, null); + Wootric.init(new FragmentActivity(), CLIENT_ID, null); fail("Null account token should throw exception"); } catch (IllegalArgumentException expected) { } @@ -84,9 +90,12 @@ public void setUp() { @Test public void inits_singleton() throws Exception { Wootric.singleton = null; Wootric wootric = Wootric.init(TEST_ACTIVITY, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); - Wootric wootric_2 = Wootric.init(TEST_ACTIVITY, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric wootric_1 = Wootric.init(TEST_ACTIVITY, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric wootric_2 = Wootric.init(TEST_ACTIVITY, CLIENT_ID, ACCOUNT_TOKEN); + Wootric wootric_3 = Wootric.init(TEST_ACTIVITY, CLIENT_ID, ACCOUNT_TOKEN); - assertThat(wootric).isEqualTo(wootric_2); + assertThat(wootric).isEqualTo(wootric_1); + assertThat(wootric_2).isEqualTo(wootric_3); } @Test public void init_sets_endUser() throws Exception { @@ -138,9 +147,12 @@ public void setsEndUserProperties() { @Test public void setSurveyImmediately() throws Exception { Wootric wootric = Wootric.init(new FragmentActivity(), CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric wootric_1 = Wootric.init(new FragmentActivity(), CLIENT_ID, ACCOUNT_TOKEN); wootric.setSurveyImmediately(true); + wootric_1.setSurveyImmediately(true); assertThat(wootric.settings.isSurveyImmediately()).isTrue(); + assertThat(wootric_1.settings.isSurveyImmediately()).isTrue(); } @Test @@ -218,41 +230,69 @@ public void setsTweeterPage() { @Test public void survey_startsSurvey() throws Exception { Wootric.singleton = null; Wootric wootric = spy(Wootric.init(TEST_ACTIVITY, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN)); + Wootric wootric_1 = spy(Wootric.init(TEST_ACTIVITY, CLIENT_ID, ACCOUNT_TOKEN)); doReturn(mockSurveyValidator).when(wootric).buildSurveyValidator(eq(wootric.user), eq(wootric.endUser), eq(wootric.settings), any(WootricRemoteClient.class), any(PreferencesUtils.class)); + doReturn(mockSurveyValidator).when(wootric_1).buildSurveyValidator(eq(wootric_1.user), + eq(wootric_1.endUser), eq(wootric_1.settings), any(WootricRemoteClient.class), any(PreferencesUtils.class)); + + doReturn(mockSurveyManager).when(wootric).buildSurveyManager(eq(wootric.weakActivity.get()), any(WootricRemoteClient.class), eq(wootric.user), eq(wootric.endUser), eq(wootric.settings), any(PreferencesUtils.class), eq(mockSurveyValidator)); + doReturn(mockSurveyManager).when(wootric_1).buildSurveyManager(eq(wootric_1.weakActivity.get()), + any(WootricRemoteClient.class), eq(wootric_1.user), + eq(wootric_1.endUser), eq(wootric_1.settings), + any(PreferencesUtils.class), eq(mockSurveyValidator)); + wootric.permissionsValidator = mockPermissionsValidator; + wootric_1.permissionsValidator = mockPermissionsValidator; doReturn(true).when(wootric.permissionsValidator).check(); + doReturn(true).when(wootric_1.permissionsValidator).check(); wootric.survey(); - verify(mockSurveyManager, times(1)).start(); + wootric_1.survey(); + verify(mockSurveyManager, times(2)).start(); assertThat(wootric.surveyInProgress).isTrue(); + assertThat(wootric_1.surveyInProgress).isTrue(); } @Test public void doesNotStartSurvey_whenSurveyInProgress() { Wootric.singleton = null; Wootric wootric = spy(Wootric.init(TEST_ACTIVITY, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN)); + Wootric wootric_1 = spy(Wootric.init(TEST_ACTIVITY, CLIENT_ID, ACCOUNT_TOKEN)); doReturn(mockSurveyValidator).when(wootric).buildSurveyValidator(eq(wootric.user), eq(wootric.endUser), eq(wootric.settings), any(WootricRemoteClient.class), any(PreferencesUtils.class)); + doReturn(mockSurveyValidator).when(wootric_1).buildSurveyValidator(eq(wootric_1.user), + eq(wootric_1.endUser), eq(wootric_1.settings), any(WootricRemoteClient.class), any(PreferencesUtils.class)); + + doReturn(mockSurveyManager).when(wootric).buildSurveyManager(eq(wootric.weakActivity.get()), any(WootricRemoteClient.class), eq(wootric.user), eq(wootric.endUser), eq(wootric.settings), any(PreferencesUtils.class), eq(mockSurveyValidator)); + doReturn(mockSurveyManager).when(wootric_1).buildSurveyManager(eq(wootric_1.weakActivity.get()), + any(WootricRemoteClient.class), eq(wootric_1.user), + eq(wootric_1.endUser), eq(wootric_1.settings), + any(PreferencesUtils.class), eq(mockSurveyValidator)); + wootric.permissionsValidator = mockPermissionsValidator; + wootric_1.permissionsValidator = mockPermissionsValidator; doReturn(true).when(wootric.permissionsValidator).check(); + doReturn(true).when(wootric_1.permissionsValidator).check(); wootric.surveyInProgress = true; + wootric_1.surveyInProgress = true; wootric.survey(); + wootric_1.survey(); verify(mockSurveyManager, times(0)).start(); } @@ -261,20 +301,34 @@ public void doesNotStartSurvey_whenSurveyInProgress() { public void doesNotStartSurvey_whenPermissionsValidatorChecksReturnsFalse() { Wootric.singleton = null; Wootric wootric = spy(Wootric.init(TEST_ACTIVITY, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN)); + Wootric wootric_1 = spy(Wootric.init(TEST_ACTIVITY, CLIENT_ID, ACCOUNT_TOKEN)); doReturn(mockSurveyValidator).when(wootric).buildSurveyValidator(eq(wootric.user), eq(wootric.endUser), eq(wootric.settings), any(WootricRemoteClient.class), any(PreferencesUtils.class)); + doReturn(mockSurveyValidator).when(wootric_1).buildSurveyValidator(eq(wootric_1.user), + eq(wootric_1.endUser), eq(wootric_1.settings), any(WootricRemoteClient.class), any(PreferencesUtils.class)); + + doReturn(mockSurveyManager).when(wootric).buildSurveyManager(eq(wootric.weakActivity.get()), any(WootricRemoteClient.class), eq(wootric.user), eq(wootric.endUser), eq(wootric.settings), any(PreferencesUtils.class), eq(mockSurveyValidator)); + doReturn(mockSurveyManager).when(wootric_1).buildSurveyManager(eq(wootric_1.weakActivity.get()), + any(WootricRemoteClient.class), eq(wootric_1.user), + eq(wootric_1.endUser), eq(wootric_1.settings), + any(PreferencesUtils.class), eq(mockSurveyValidator)); + wootric.permissionsValidator = mockPermissionsValidator; + wootric_1.permissionsValidator = mockPermissionsValidator; doReturn(false).when(wootric.permissionsValidator).check(); + doReturn(false).when(wootric_1.permissionsValidator).check(); wootric.surveyInProgress = false; + wootric_1.surveyInProgress = false; wootric.survey(); + wootric_1.survey(); verify(mockSurveyManager, times(0)).start(); } diff --git a/app/src/main/java/com/wootric/androidsdk_demo/MainActivity.java b/app/src/main/java/com/wootric/androidsdk_demo/MainActivity.java index 9ef0622..d1960bf 100644 --- a/app/src/main/java/com/wootric/androidsdk_demo/MainActivity.java +++ b/app/src/main/java/com/wootric/androidsdk_demo/MainActivity.java @@ -9,7 +9,6 @@ public class MainActivity extends FragmentActivity { private static final String CLIENT_ID = "CLIENT ID"; - private static final String CLIENT_SECRET = "CLIENT SECRET"; private static final String ACCOUNT_TOKEN = "ACCOUNT TOKEN"; @Override @@ -25,7 +24,7 @@ public void showSurvey(View view) { private void startSurvey() { - Wootric wootric = Wootric.init(this, CLIENT_ID, CLIENT_SECRET, ACCOUNT_TOKEN); + Wootric wootric = Wootric.init(this, CLIENT_ID, ACCOUNT_TOKEN); wootric.setEndUserEmail("nps@example.com"); wootric.setSurveyImmediately(true); wootric.survey(); diff --git a/build.gradle b/build.gradle index 31dd20b..8b719cf 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.1.0' classpath 'com.github.dcendents:android-maven-plugin:1.2' // NOTE: Do not place your application dependencies here; they belong