diff --git a/cordova-plugin-moodleapp/plugin.xml b/cordova-plugin-moodleapp/plugin.xml
index ddc3cf863..f25baf041 100644
--- a/cordova-plugin-moodleapp/plugin.xml
+++ b/cordova-plugin-moodleapp/plugin.xml
@@ -6,12 +6,17 @@
+
+
+
+
+
diff --git a/cordova-plugin-moodleapp/src/android/InstallReferrer.java b/cordova-plugin-moodleapp/src/android/InstallReferrer.java
new file mode 100644
index 000000000..f1b0dbba0
--- /dev/null
+++ b/cordova-plugin-moodleapp/src/android/InstallReferrer.java
@@ -0,0 +1,148 @@
+// (C) Copyright 2015 Moodle Pty Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.moodle.moodlemobile;
+
+import android.util.Log;
+import android.os.RemoteException;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.PluginResult;
+
+import com.android.installreferrer.api.InstallReferrerClient;
+import com.android.installreferrer.api.InstallReferrerStateListener;
+import com.android.installreferrer.api.ReferrerDetails;
+
+public class InstallReferrer extends CordovaPlugin implements InstallReferrerStateListener {
+
+ private static final String TAG = "InstallReferrer";
+ private static final int UNKNOWN_ERROR = 1;
+ private static final int FEATURE_NOT_SUPPORTED = 2;
+ private static final int SERVICE_UNAVAILABLE = 3;
+
+ private InstallReferrerClient referrerClient;
+ private CallbackContext callbackContext;
+ private JSONObject referrerResult;
+
+ @Override
+ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
+ try {
+ switch (action) {
+ case "getReferrer":
+ this.getReferrer(callbackContext);
+
+ return true;
+ }
+ } catch (Throwable e) {
+ Log.e(TAG, "Failed executing action: " + action, e);
+ callbackContext.error(e.getMessage());
+ callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR));
+ }
+
+ return false;
+ }
+
+ /**
+ * Connect to the referrer client and obtain the referrer data when connected.
+ *
+ * @param callbackContext The callback context used when calling back into JavaScript.
+ */
+ private void getReferrer(CallbackContext callbackContext) {
+ if (this.referrerResult != null) {
+ callbackContext.success(this.referrerResult);
+
+ return;
+ }
+
+ this.callbackContext = callbackContext;
+
+ try {
+ if (this.referrerClient == null) {
+ this.referrerClient = InstallReferrerClient.newBuilder(this.cordova.getActivity().getApplicationContext()).build();
+ }
+
+ this.referrerClient.startConnection(this);
+ } catch (Exception exception) {
+ Log.e(TAG, "startConnection error: " + exception.getMessage());
+ callbackContext.error(exception.getMessage());
+ callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR));
+ }
+ }
+
+ /**
+ * Get referral data from an already established connection and pass it to current callback context.
+ */
+ private void getReferralData() {
+ try {
+ ReferrerDetails response = referrerClient.getInstallReferrer();
+ JSONObject referrerResult = new JSONObject();
+
+ referrerResult.put("referrer", response.getInstallReferrer());
+ referrerResult.put("clickTime", response.getReferrerClickTimestampSeconds());
+ referrerResult.put("appInstallTime", response.getInstallBeginTimestampSeconds());
+ referrerResult.put("instantExperienceLaunched", response.getGooglePlayInstantParam());
+ this.referrerResult = referrerResult;
+
+ if (this.callbackContext != null) {
+ this.callbackContext.success(this.referrerResult);
+ }
+ } catch (Exception exception) {
+ Log.e(TAG, "getReferralData error: " + exception.getMessage());
+ if (this.callbackContext != null) {
+ this.callbackContext.error(exception.getMessage());
+ this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, UNKNOWN_ERROR));
+ }
+
+ this.referrerClient.endConnection();
+ }
+
+ try {
+ this.referrerClient.endConnection();
+ } catch (Exception exception) {
+ // Ignore errors.
+ }
+ }
+
+ @Override
+ public void onInstallReferrerSetupFinished(int responseCode) {
+ switch (responseCode) {
+ case InstallReferrerClient.InstallReferrerResponse.OK:
+ // Connection established.
+ this.getReferralData();
+ break;
+ case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED:
+ // API not available on the current Play Store app.
+ if (this.callbackContext != null) {
+ this.callbackContext.error("Referrer feature not supported.");
+ this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, FEATURE_NOT_SUPPORTED));
+ }
+ break;
+ case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE:
+ // Connection couldn't be established.
+ if (this.callbackContext != null) {
+ this.callbackContext.error("Referrer service unavailable.");
+ this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, SERVICE_UNAVAILABLE));
+ }
+ break;
+ }
+ }
+
+ @Override
+ public void onInstallReferrerServiceDisconnected() {
+ // Nothing to do.
+ }
+
+}
diff --git a/cordova-plugin-moodleapp/src/ts/index.ts b/cordova-plugin-moodleapp/src/ts/index.ts
index a11c3eba9..79542caa0 100644
--- a/cordova-plugin-moodleapp/src/ts/index.ts
+++ b/cordova-plugin-moodleapp/src/ts/index.ts
@@ -12,10 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+import { InstallReferrer } from './plugins/InstallReferrer';
import { SecureStorage } from './plugins/SecureStorage';
const api: MoodleAppPlugins = {
secureStorage: new SecureStorage(),
+ installReferrer: new InstallReferrer(),
};
// This is necessary to work around the default transpilation behavior,
diff --git a/cordova-plugin-moodleapp/src/ts/plugins/InstallReferrer.ts b/cordova-plugin-moodleapp/src/ts/plugins/InstallReferrer.ts
new file mode 100644
index 000000000..83c9ecc5e
--- /dev/null
+++ b/cordova-plugin-moodleapp/src/ts/plugins/InstallReferrer.ts
@@ -0,0 +1,39 @@
+// (C) Copyright 2015 Moodle Pty Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * Allows retrieving install referrer data.
+ * https://developer.android.com/google/play/installreferrer
+ */
+export class InstallReferrer {
+
+ /**
+ * Get referrer data.
+ *
+ * @returns Referrer data.
+ */
+ async getReferrer(): Promise {
+ return new Promise((resolve, reject) => {
+ cordova.exec(resolve, reject, 'InstallReferrer', 'getReferrer', []);
+ });
+ }
+
+}
+
+export type InstallReferrerResult = {
+ referrer: string;
+ clickTime: number;
+ appInstallTime: number;
+ instantExperienceLaunched: boolean;
+};
diff --git a/cordova-plugin-moodleapp/types/index.d.ts b/cordova-plugin-moodleapp/types/index.d.ts
index 59ed28d30..9e7c3c6f2 100644
--- a/cordova-plugin-moodleapp/types/index.d.ts
+++ b/cordova-plugin-moodleapp/types/index.d.ts
@@ -12,12 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+import { InstallReferrer } from '../src/ts/plugins/InstallReferrer';
import { SecureStorage as SecureStorageImpl } from '../src/ts/plugins/SecureStorage';
declare global {
interface MoodleAppPlugins {
secureStorage: SecureStorageImpl;
+ installReferrer: InstallReferrer;
}
interface Cordova {
diff --git a/src/core/features/login/pages/site/site.html b/src/core/features/login/pages/site/site.html
index 2f2e443d4..ae1a62c8b 100644
--- a/src/core/features/login/pages/site/site.html
+++ b/src/core/features/login/pages/site/site.html
@@ -20,7 +20,7 @@
-