diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/plugin.xml b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/plugin.xml
new file mode 100644
index 00000000..63d1d203
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/plugin.xml
@@ -0,0 +1,29 @@
+
+
+ CordovaHMSGMSCheckPlugin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/after_prepare.js b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/after_prepare.js
new file mode 100644
index 00000000..b3da28cf
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/after_prepare.js
@@ -0,0 +1,37 @@
+#!/usr/bin/env node
+
+"use strict";
+
+/**
+ * This hook makes sure projects using [cordova-plugin-firebase](https://github.com/arnesson/cordova-plugin-firebase)
+ * will build properly and have the required key files copied to the proper destinations when the app is build on Ionic Cloud using the package command.
+ * Credits: https://github.com/arnesson.
+ */
+var fs = require("fs");
+var path = require("path");
+var utilities = require("./lib/utilities");
+
+var config = fs.readFileSync("config.xml").toString();
+var name = utilities.getValue(config, "name");
+
+var ANDROID_DIR = "platforms/android";
+
+var PLATFORM = {
+ ANDROID: {
+ dest: [ANDROID_DIR + "/app/agconnect-services.json"],
+ src: ["agconnect-services.json"],
+ },
+};
+
+module.exports = function (context) {
+ //get platform from the context supplied by cordova
+ var platforms = context.opts.platforms;
+ // Copy key files to their platform specific folders
+ if (
+ platforms.indexOf("android") !== -1 &&
+ utilities.directoryExists(ANDROID_DIR)
+ ) {
+ console.log("Preparing HMS GMS Check Kit on Android");
+ // utilities.copyKey(PLATFORM.ANDROID);
+ }
+};
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/after_plugin_install.js b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/after_plugin_install.js
new file mode 100644
index 00000000..09e73419
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/after_plugin_install.js
@@ -0,0 +1,9 @@
+var helper = require('./helper');
+
+module.exports = function(context) {
+
+ // Modify the Gradle build file to add a task that will upload the debug symbols
+ // at build time.
+ helper.restoreRootBuildGradle();
+ helper.modifyRootBuildGradle();
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/before_plugin_uninstall.js b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/before_plugin_uninstall.js
new file mode 100644
index 00000000..9c32e552
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/before_plugin_uninstall.js
@@ -0,0 +1,7 @@
+var helper = require('./helper');
+
+module.exports = function(context) {
+
+ // Remove the Gradle modifications that were added when the plugin was installed.
+ helper.restoreRootBuildGradle();
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/helper.js b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/helper.js
new file mode 100644
index 00000000..cd4b8111
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/android/helper.js
@@ -0,0 +1,131 @@
+var fs = require("fs");
+var path = require("path");
+
+function rootBuildGradleExists() {
+ var target = path.join("platforms", "android", "build.gradle");
+ return fs.existsSync(target);
+}
+
+/*
+ * Helper function to read the build.gradle that sits at the root of the project
+ */
+function readRootBuildGradle() {
+ var target = path.join("platforms", "android", "build.gradle");
+ return fs.readFileSync(target, "utf-8");
+}
+
+/*
+ * Added a dependency on 'com.google.gms' based on the position of the know 'com.android.tools.build' dependency in the build.gradle
+ */
+function addDependencies(buildGradle) {
+ // find the known line to match
+ var match = buildGradle.match(
+ /^(\s*)classpath 'com.android.tools.build(.*)/m
+ );
+ var whitespace = match[1];
+
+ // modify the line to add the necessary dependencies
+ var agcDependency =
+ whitespace + "classpath 'com.huawei.agconnect:agcp:1.2.0.300'";
+
+ var modifiedLine = match[0] + "\n" + agcDependency;
+
+ // modify the actual line
+ return buildGradle.replace(
+ /^(\s*)classpath 'com.android.tools.build(.*)/m,
+ modifiedLine
+ );
+}
+
+/*
+ * Add 'google()' and Crashlytics to the repository repo list
+ */
+function addRepos(buildGradle) {
+ // find the known line to match
+ var match = buildGradle.match(/^(\s*)jcenter\(\)/m);
+ var whitespace = match[1];
+
+ // modify the line to add the necessary repo
+ var huaweiMavenRepo =
+ whitespace + "maven { url 'http://developer.huawei.com/repo/' }";
+ var modifiedLine = match[0] + "\n" + huaweiMavenRepo;
+
+ // modify the actual line
+ buildGradle = buildGradle.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+
+ // update the all projects grouping
+ var allProjectsIndex = buildGradle.indexOf("allprojects");
+ if (allProjectsIndex > 0) {
+ // split the string on allprojects because jcenter is in both groups and we need to modify the 2nd instance
+ var firstHalfOfFile = buildGradle.substring(0, allProjectsIndex);
+ var secondHalfOfFile = buildGradle.substring(allProjectsIndex);
+
+ // Add google() to the allprojects section of the string
+ match = secondHalfOfFile.match(/^(\s*)jcenter\(\)/m);
+ var huaweiMavenRepo =
+ whitespace + "maven { url 'http://developer.huawei.com/repo/' }";
+ modifiedLine = match[0] + "\n" + huaweiMavenRepo;
+ // modify the part of the string that is after 'allprojects'
+ secondHalfOfFile = secondHalfOfFile.replace(
+ /^(\s*)jcenter\(\)/m,
+ modifiedLine
+ );
+
+ // recombine the modified line
+ buildGradle = firstHalfOfFile + secondHalfOfFile;
+ } else {
+ // this should not happen, but if it does, we should try to add the dependency to the buildscript
+ match = buildGradle.match(/^(\s*)jcenter\(\)/m);
+ var huaweiMavenRepo =
+ whitespace + "maven { url 'http://developer.huawei.com/repo/' }";
+ modifiedLine = match[0] + "\n" + huaweiMavenRepo;
+ // modify the part of the string that is after 'allprojects'
+ buildGradle = buildGradle.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+ }
+
+ return buildGradle;
+}
+
+/*
+ * Helper function to write to the build.gradle that sits at the root of the project
+ */
+function writeRootBuildGradle(contents) {
+ var target = path.join("platforms", "android", "build.gradle");
+ fs.writeFileSync(target, contents);
+}
+
+module.exports = {
+ modifyRootBuildGradle: function () {
+ // be defensive and don't crash if the file doesn't exist
+ if (!rootBuildGradleExists) {
+ return;
+ }
+
+ var buildGradle = readRootBuildGradle();
+
+ // Add Google Play Services Dependency
+ buildGradle = addDependencies(buildGradle);
+
+ // Add Google's Maven Repo
+ buildGradle = addRepos(buildGradle);
+
+ writeRootBuildGradle(buildGradle);
+ },
+
+ restoreRootBuildGradle: function () {
+ // be defensive and don't crash if the file doesn't exist
+ if (!rootBuildGradleExists) {
+ return;
+ }
+
+ var buildGradle = readRootBuildGradle();
+
+ // remove any lines we added
+ buildGradle = buildGradle.replace(
+ /(?:^|\r?\n)(.*)com.huawei.cordovahmsgmscheckplugin*?(?=$|\r?\n)/g,
+ ""
+ );
+
+ writeRootBuildGradle(buildGradle);
+ },
+};
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/lib/utilities.js b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/lib/utilities.js
new file mode 100644
index 00000000..89ecc01f
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/scripts/lib/utilities.js
@@ -0,0 +1,93 @@
+/**
+ * Utilities and shared functionality for the build hooks.
+ */
+var fs = require("fs");
+var path = require("path");
+
+fs.ensureDirSync = function (dir) {
+ if (!fs.existsSync(dir)) {
+ dir.split(path.sep).reduce(function (currentPath, folder) {
+ currentPath += folder + path.sep;
+ if (!fs.existsSync(currentPath)) {
+ fs.mkdirSync(currentPath);
+ }
+ return currentPath;
+ }, "");
+ }
+};
+
+module.exports = {
+ /**
+ * Used to get the name of the application as defined in the config.xml.
+ *
+ * @param {object} context - The Cordova context.
+ * @returns {string} The value of the name element in config.xml.
+ */
+ getAppName: function (context) {
+ var ConfigParser = context.requireCordovaModule("cordova-lib").configparser;
+ var config = new ConfigParser("config.xml");
+ return config.name();
+ },
+
+ /**
+ * The ID of the plugin; this should match the ID in plugin.xml.
+ */
+ getPluginId: function () {
+ return "com.huawei.cordovahmsgmscheckplugin";
+ },
+
+ copyKey: function (platform) {
+ for (var i = 0; i < platform.src.length; i++) {
+ var file = platform.src[i];
+ if (this.fileExists(file)) {
+ try {
+ var contents = fs.readFileSync(file).toString();
+
+ try {
+ platform.dest.forEach(function (destinationPath) {
+ var folder = destinationPath.substring(
+ 0,
+ destinationPath.lastIndexOf("/")
+ );
+ fs.ensureDirSync(folder);
+ fs.writeFileSync(destinationPath, contents);
+ });
+ } catch (e) {
+ // skip
+ }
+ } catch (err) {
+ console.log(err);
+ }
+
+ break;
+ }
+ }
+ },
+
+ getValue: function (config, name) {
+ var value = config.match(
+ new RegExp("<" + name + "(.*?)>(.*?)" + name + ">", "i")
+ );
+ if (value && value[2]) {
+ return value[2];
+ } else {
+ return null;
+ }
+ },
+
+ fileExists: function (path) {
+ try {
+ return fs.statSync(path).isFile();
+ } catch (e) {
+ return false;
+ }
+ },
+
+ directoryExists: function (path) {
+ try {
+ return fs.statSync(path).isDirectory();
+ } catch (e) {
+ return false;
+ }
+ },
+};
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/src/android/CordovaHMSGMSCheckPlugin.java b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/src/android/CordovaHMSGMSCheckPlugin.java
new file mode 100644
index 00000000..86307e6b
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/src/android/CordovaHMSGMSCheckPlugin.java
@@ -0,0 +1,88 @@
+package com.huawei.cordovahmsgmscheckplugin;
+
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import com.huawei.hms.api.HuaweiApiAvailability;
+// import com.google.android.gms.common.GoogleApiAvailability;
+
+import org.apache.cordova.CordovaInterface;
+import org.apache.cordova.CordovaInterfaceImpl;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.CallbackContext;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * This class echoes a string called from JavaScript.
+ */
+public class CordovaHMSGMSCheckPlugin extends CordovaPlugin {
+
+ private static final String TAG = CordovaHMSGMSCheckPlugin.class.getSimpleName();
+ private CallbackContext mCallbackContext;
+
+ @Override
+ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
+ switch (action) {
+ case "isHmsAvailable":
+ mCallbackContext = callbackContext;
+ cordova.getThreadPool().execute(this::isHmsAvailable);
+ return true;
+ case "isGmsAvailable":
+ // mCallbackContext = callbackContext;
+ // cordova.getThreadPool().execute(this::isGmsAvailable);
+ return false;
+ }
+ return false;
+ }
+
+ private void isHmsAvailable() {
+ boolean isAvailable = false;
+ Context context = cordova.getContext();
+ if (null != cordova.getContext()) {
+ int result = HuaweiApiAvailability.getInstance().isHuaweiMobileServicesAvailable(context);
+ isAvailable = (com.huawei.hms.api.ConnectionResult.SUCCESS == result);
+ }
+ Log.i("Cordova", "isHmsAvailable: " + isAvailable);
+ String msg = "false";
+ if(isAvailable){
+ msg = "true";
+ }
+ outputCallbackContext(0, msg);
+ }
+
+ // private void isGmsAvailable() {
+ // boolean isAvailable = false;
+ // Context context = cordova.getContext();
+ // if (null != context) {
+ // int result = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context);
+ // isAvailable = (com.google.android.gms.common.ConnectionResult.SUCCESS == result);
+ // }
+ // Log.i("Cordova", "isGmsAvailable: " + isAvailable);
+ // String msg = "false";
+ // if(isAvailable){
+ // msg = "true";
+ // }
+ // outputCallbackContext(0, msg);
+ // }
+
+ /**
+ * @param type 0-success,1-error
+ * @param msg message
+ */
+ private void outputCallbackContext(int type, String msg) {
+ if (mCallbackContext != null) {
+ switch (type) {
+ case 0:
+ mCallbackContext.success(msg);
+ break;
+ case 1:
+ mCallbackContext.error(msg);
+ break;
+ }
+ }
+ }
+}
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/src/android/build.gradle b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/src/android/build.gradle
new file mode 100644
index 00000000..30dda1bf
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSGMSCheckPlugin/src/android/build.gradle
@@ -0,0 +1,29 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ // huawei maven
+ maven { url 'http://developer.huawei.com/repo/' }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.2.0'
+ // classpath 'com.huawei.agconnect:agcp:1.2.0.300'
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ // huawei maven
+ maven { url 'http://developer.huawei.com/repo/' }
+ }
+}
+
+cdvPluginPostBuildExtras.add({
+ apply plugin: 'com.huawei.agconnect'
+})
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/plugin.xml b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/plugin.xml
new file mode 100644
index 00000000..126ffbc8
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/plugin.xml
@@ -0,0 +1,29 @@
+
+
+ CordovaHMSLocationPlugin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/after_prepare.js b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/after_prepare.js
new file mode 100644
index 00000000..adc5a480
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/after_prepare.js
@@ -0,0 +1,38 @@
+#!/usr/bin/env node
+
+'use strict';
+
+/**
+ * This hook makes sure projects using [cordova-plugin-firebase](https://github.com/arnesson/cordova-plugin-firebase)
+ * will build properly and have the required key files copied to the proper destinations when the app is build on Ionic Cloud using the package command.
+ * Credits: https://github.com/arnesson.
+ */
+var fs = require('fs');
+var path = require('path');
+var utilities = require("./lib/utilities");
+
+var config = fs.readFileSync('config.xml').toString();
+var name = utilities.getValue(config, 'name');
+
+var ANDROID_DIR = 'platforms/android';
+
+var PLATFORM = {
+ ANDROID: {
+ dest: [
+ ANDROID_DIR + '/app/agconnect-services.json'
+ ],
+ src: [
+ 'agconnect-services.json'
+ ],
+ }
+};
+
+module.exports = function (context) {
+ //get platform from the context supplied by cordova
+ var platforms = context.opts.platforms;
+ // Copy key files to their platform specific folders
+ if (platforms.indexOf('android') !== -1 && utilities.directoryExists(ANDROID_DIR)) {
+ console.log('Preparing HMS Location Kit on Android');
+ utilities.copyKey(PLATFORM.ANDROID);
+ }
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/after_plugin_install.js b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/after_plugin_install.js
new file mode 100644
index 00000000..09e73419
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/after_plugin_install.js
@@ -0,0 +1,9 @@
+var helper = require('./helper');
+
+module.exports = function(context) {
+
+ // Modify the Gradle build file to add a task that will upload the debug symbols
+ // at build time.
+ helper.restoreRootBuildGradle();
+ helper.modifyRootBuildGradle();
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/before_plugin_uninstall.js b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/before_plugin_uninstall.js
new file mode 100644
index 00000000..9c32e552
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/before_plugin_uninstall.js
@@ -0,0 +1,7 @@
+var helper = require('./helper');
+
+module.exports = function(context) {
+
+ // Remove the Gradle modifications that were added when the plugin was installed.
+ helper.restoreRootBuildGradle();
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/helper.js b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/helper.js
new file mode 100644
index 00000000..da715c24
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/android/helper.js
@@ -0,0 +1,117 @@
+var fs = require("fs");
+var path = require("path");
+
+function rootBuildGradleExists() {
+ var target = path.join("platforms", "android", "build.gradle");
+ return fs.existsSync(target);
+}
+
+/*
+ * Helper function to read the build.gradle that sits at the root of the project
+ */
+function readRootBuildGradle() {
+ var target = path.join("platforms", "android", "build.gradle");
+ return fs.readFileSync(target, "utf-8");
+}
+
+/*
+ * Added a dependency on 'com.google.gms' based on the position of the know 'com.android.tools.build' dependency in the build.gradle
+ */
+function addDependencies(buildGradle) {
+ // find the known line to match
+ var match = buildGradle.match(/^(\s*)classpath 'com.android.tools.build(.*)/m);
+ var whitespace = match[1];
+
+ // modify the line to add the necessary dependencies
+ var agcDependency = whitespace + 'classpath \'com.huawei.agconnect:agcp:1.2.0.300\''
+
+ var modifiedLine = match[0] + '\n' + agcDependency;
+
+ // modify the actual line
+ return buildGradle.replace(/^(\s*)classpath 'com.android.tools.build(.*)/m, modifiedLine);
+}
+
+/*
+ * Add 'google()' and Crashlytics to the repository repo list
+ */
+function addRepos(buildGradle) {
+ // find the known line to match
+ var match = buildGradle.match(/^(\s*)jcenter\(\)/m);
+ var whitespace = match[1];
+
+ // modify the line to add the necessary repo
+ var huaweiMavenRepo = whitespace + 'maven { url \'http://developer.huawei.com/repo/\' }'
+ var modifiedLine = match[0] + '\n' + huaweiMavenRepo;
+
+ // modify the actual line
+ buildGradle = buildGradle.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+
+ // update the all projects grouping
+ var allProjectsIndex = buildGradle.indexOf('allprojects');
+ if (allProjectsIndex > 0) {
+ // split the string on allprojects because jcenter is in both groups and we need to modify the 2nd instance
+ var firstHalfOfFile = buildGradle.substring(0, allProjectsIndex);
+ var secondHalfOfFile = buildGradle.substring(allProjectsIndex);
+
+ // Add google() to the allprojects section of the string
+ match = secondHalfOfFile.match(/^(\s*)jcenter\(\)/m);
+ var huaweiMavenRepo = whitespace + 'maven { url \'http://developer.huawei.com/repo/\' }'
+ modifiedLine = match[0] + '\n' + huaweiMavenRepo;
+ // modify the part of the string that is after 'allprojects'
+ secondHalfOfFile = secondHalfOfFile.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+
+ // recombine the modified line
+ buildGradle = firstHalfOfFile + secondHalfOfFile;
+ } else {
+ // this should not happen, but if it does, we should try to add the dependency to the buildscript
+ match = buildGradle.match(/^(\s*)jcenter\(\)/m);
+ var huaweiMavenRepo = whitespace + 'maven { url \'http://developer.huawei.com/repo/\' }'
+ modifiedLine = match[0] + '\n' + huaweiMavenRepo;
+ // modify the part of the string that is after 'allprojects'
+ buildGradle = buildGradle.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+ }
+
+ return buildGradle;
+}
+
+/*
+ * Helper function to write to the build.gradle that sits at the root of the project
+ */
+function writeRootBuildGradle(contents) {
+ var target = path.join("platforms", "android", "build.gradle");
+ fs.writeFileSync(target, contents);
+}
+
+module.exports = {
+
+ modifyRootBuildGradle: function() {
+ // be defensive and don't crash if the file doesn't exist
+ if (!rootBuildGradleExists) {
+ return;
+ }
+
+ var buildGradle = readRootBuildGradle();
+
+ // Add Google Play Services Dependency
+ buildGradle = addDependencies(buildGradle);
+
+ // Add Google's Maven Repo
+ buildGradle = addRepos(buildGradle);
+
+ writeRootBuildGradle(buildGradle);
+ },
+
+ restoreRootBuildGradle: function() {
+ // be defensive and don't crash if the file doesn't exist
+ if (!rootBuildGradleExists) {
+ return;
+ }
+
+ var buildGradle = readRootBuildGradle();
+
+ // remove any lines we added
+ buildGradle = buildGradle.replace(/(?:^|\r?\n)(.*)com.huawei.cordovahmspushplugin*?(?=$|\r?\n)/g, '');
+
+ writeRootBuildGradle(buildGradle);
+ }
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/lib/utilities.js b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/lib/utilities.js
new file mode 100644
index 00000000..015f6831
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/scripts/lib/utilities.js
@@ -0,0 +1,88 @@
+/**
+ * Utilities and shared functionality for the build hooks.
+ */
+var fs = require('fs');
+var path = require("path");
+
+fs.ensureDirSync = function (dir) {
+ if (!fs.existsSync(dir)) {
+ dir.split(path.sep).reduce(function (currentPath, folder) {
+ currentPath += folder + path.sep;
+ if (!fs.existsSync(currentPath)) {
+ fs.mkdirSync(currentPath);
+ }
+ return currentPath;
+ }, '');
+ }
+};
+
+module.exports = {
+ /**
+ * Used to get the name of the application as defined in the config.xml.
+ *
+ * @param {object} context - The Cordova context.
+ * @returns {string} The value of the name element in config.xml.
+ */
+ getAppName: function (context) {
+ var ConfigParser = context.requireCordovaModule("cordova-lib").configparser;
+ var config = new ConfigParser("config.xml");
+ return config.name();
+ },
+
+ /**
+ * The ID of the plugin; this should match the ID in plugin.xml.
+ */
+ getPluginId: function () {
+ return "com.huawei.cordovahmspushplugin";
+ },
+
+ copyKey: function (platform) {
+ for (var i = 0; i < platform.src.length; i++) {
+ var file = platform.src[i];
+ if (this.fileExists(file)) {
+ try {
+ var contents = fs.readFileSync(file).toString();
+
+ try {
+ platform.dest.forEach(function (destinationPath) {
+ var folder = destinationPath.substring(0, destinationPath.lastIndexOf('/'));
+ fs.ensureDirSync(folder);
+ fs.writeFileSync(destinationPath, contents);
+ });
+ } catch (e) {
+ // skip
+ }
+ } catch (err) {
+ console.log(err);
+ }
+
+ break;
+ }
+ }
+ },
+
+ getValue: function (config, name) {
+ var value = config.match(new RegExp('<' + name + '(.*?)>(.*?)' + name + '>', 'i'));
+ if (value && value[2]) {
+ return value[2]
+ } else {
+ return null
+ }
+ },
+
+ fileExists: function (path) {
+ try {
+ return fs.statSync(path).isFile();
+ } catch (e) {
+ return false;
+ }
+ },
+
+ directoryExists: function (path) {
+ try {
+ return fs.statSync(path).isDirectory();
+ } catch (e) {
+ return false;
+ }
+ }
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/src/android/CordovaHMSLocationPlugin.java b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/src/android/CordovaHMSLocationPlugin.java
new file mode 100644
index 00000000..caef5fd0
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/src/android/CordovaHMSLocationPlugin.java
@@ -0,0 +1,185 @@
+package com.huawei.cordovahmslocationplugin;
+
+import android.Manifest;
+import android.content.IntentSender;
+import android.location.Location;
+import android.os.Build;
+import android.os.Looper;
+import android.util.Log;
+
+import com.huawei.hms.common.ApiException;
+import com.huawei.hms.common.ResolvableApiException;
+import com.huawei.hms.location.FusedLocationProviderClient;
+import com.huawei.hms.location.LocationCallback;
+import com.huawei.hms.location.LocationRequest;
+import com.huawei.hms.location.LocationResult;
+import com.huawei.hms.location.LocationServices;
+import com.huawei.hms.location.LocationSettingsRequest;
+import com.huawei.hms.location.LocationSettingsStatusCodes;
+import com.huawei.hms.location.SettingsClient;
+
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.PluginResult;
+import org.json.JSONArray;
+import org.json.JSONException;
+
+/**
+ *
+ */
+public class CordovaHMSLocationPlugin extends CordovaPlugin {
+
+ private static final String TAG = CordovaHMSLocationPlugin.class.getSimpleName();
+
+ private FusedLocationProviderClient fusedLocationProviderClient;
+ private LocationRequest mLocationRequest;
+ private LocationCallback mLocationCallback;
+ private CallbackContext mCallbackContext;
+
+ @Override
+ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
+ requestPermission();
+ if (fusedLocationProviderClient == null) {
+ fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(cordova.getContext());
+ }
+ switch (action) {
+ case "requestLocation":
+ this.setLocationRequest();
+ this.setLocationCallback();
+ this.checkLocationSetting(callbackContext);
+ return true;
+ case "removeLocation":
+ this.stopLocation();
+ return true;
+ case "getLastlocation":
+ this.getLastlocation(callbackContext);
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private void returnLocation(Location location) {
+ if (mCallbackContext != null) {
+ Log.d(TAG, "returnLocation");
+ String message = location.getLatitude() + "," + location.getLongitude();
+ PluginResult result = new PluginResult(PluginResult.Status.OK, message);
+ result.setKeepCallback(true);
+ mCallbackContext.sendPluginResult(result);
+ }
+ }
+
+ private void getLastlocation(CallbackContext callbackContext) {
+ fusedLocationProviderClient.getLastLocation().addOnSuccessListener(location -> {
+ Log.d(TAG, "getLastlocation success");
+ if (location == null) {
+ return;
+ }
+ // Location对象的处理逻辑
+ String message = location.getLatitude() + "," + location.getLongitude();
+ callbackContext.success(message);
+ }).addOnFailureListener(e -> {
+ // 异常处理逻辑
+ callbackContext.error("getLastlocation fail");
+ });
+ }
+
+ private void stopLocation() {
+ if (fusedLocationProviderClient == null) {
+ Log.d(TAG, "fusedLocationProviderClient is null");
+ return;
+ }
+ // 注意:停止位置更新时,mLocationCallback必须与requestLocationUpdates方法中的LocationCallback参数为同一对象。
+ fusedLocationProviderClient.removeLocationUpdates(mLocationCallback)
+ .addOnSuccessListener(aVoid -> {
+ // 停止位置更新成功
+ Log.d(TAG, "stop success");
+ mCallbackContext = null;
+ })
+ .addOnFailureListener(e -> {
+ // 停止位置更新失败
+ Log.d(TAG, "stop fail");
+ });
+ }
+
+ private void setLocationCallback() {
+ mLocationCallback = new LocationCallback() {
+ @Override
+ public void onLocationResult(LocationResult locationResult) {
+ if (locationResult != null) {
+ //处理位置回调结果
+ if (mLocationCallback != null) {
+ Log.d(TAG, "onLocationResult");
+ Location location = locationResult.getLocations().get(0);
+ returnLocation(location);
+ }
+ }
+ }
+ };
+ }
+
+ private void setLocationRequest() {
+ mLocationRequest = new LocationRequest();
+ // 设置位置更新的间隔(毫秒为单位)
+ mLocationRequest.setInterval(10000);
+// mLocationRequest.setNumUpdates(1);
+ // 设置权重
+ mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
+ }
+
+ private void checkLocationSetting(CallbackContext callbackContext) {
+ SettingsClient settingsClient = LocationServices.getSettingsClient(cordova.getContext());
+ LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
+ builder.addLocationRequest(mLocationRequest);
+ LocationSettingsRequest locationSettingsRequest = builder.build();
+ // 检查设备定位设置
+ settingsClient.checkLocationSettings(locationSettingsRequest)
+ .addOnSuccessListener(locationSettingsResponse -> {
+
+ // 设置满足定位条件,再发起位置请求
+ fusedLocationProviderClient
+ .requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
+ .addOnSuccessListener(aVoid -> {
+ // 接口调用成功的处理
+ Log.d(TAG, "request success");
+ mCallbackContext = callbackContext;
+ });
+ })
+ .addOnFailureListener(e -> {
+ // 设置不满足定位条件
+ int statusCode = ((ApiException) e).getStatusCode();
+ switch (statusCode) {
+ case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
+ try {
+ ResolvableApiException rae = (ResolvableApiException) e;
+ // 调用startResolutionForResult可以弹窗提示用户打开相应权限
+ rae.startResolutionForResult(cordova.getActivity(), 0);
+ } catch (IntentSender.SendIntentException sie) {
+ Log.d(TAG, sie.getMessage());
+ }
+ break;
+ }
+ });
+ }
+
+ private void requestPermission() {
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
+ Log.i(TAG, "sdk < 29 Q");
+ if (!cordova.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)
+ || !cordova.hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION)) {
+ String[] strings =
+ {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
+ cordova.requestPermissions(this, 1, strings);
+ }
+ } else {
+ if (!cordova.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)
+ || !cordova.hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
+ || !cordova.hasPermission("android.permission.ACCESS_BACKGROUND_LOCATION")) {
+ String[] strings = {android.Manifest.permission.ACCESS_FINE_LOCATION,
+ android.Manifest.permission.ACCESS_COARSE_LOCATION,
+ "android.permission.ACCESS_BACKGROUND_LOCATION"};
+ cordova.requestPermissions(this, 2, strings);
+ }
+ }
+ }
+}
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/src/android/build.gradle b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/src/android/build.gradle
new file mode 100644
index 00000000..23296fb7
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSLocationPlugin/src/android/build.gradle
@@ -0,0 +1,29 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ // huawei maven
+ maven { url 'http://developer.huawei.com/repo/' }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.2.0'
+ classpath 'com.huawei.agconnect:agcp:1.2.0.300'
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ // huawei maven
+ maven { url 'http://developer.huawei.com/repo/' }
+ }
+}
+
+cdvPluginPostBuildExtras.add({
+ apply plugin: 'com.huawei.agconnect'
+})
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/plugin.xml b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/plugin.xml
new file mode 100644
index 00000000..d7ccbfa7
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/plugin.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ CordovaHMSPushPlugin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/after_prepare.js b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/after_prepare.js
new file mode 100644
index 00000000..ab6c7b7e
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/after_prepare.js
@@ -0,0 +1,38 @@
+#!/usr/bin/env node
+
+'use strict';
+
+/**
+ * This hook makes sure projects using [cordova-plugin-firebase](https://github.com/arnesson/cordova-plugin-firebase)
+ * will build properly and have the required key files copied to the proper destinations when the app is build on Ionic Cloud using the package command.
+ * Credits: https://github.com/arnesson.
+ */
+var fs = require('fs');
+var path = require('path');
+var utilities = require("./lib/utilities");
+
+var config = fs.readFileSync('config.xml').toString();
+var name = utilities.getValue(config, 'name');
+
+var ANDROID_DIR = 'platforms/android';
+
+var PLATFORM = {
+ ANDROID: {
+ dest: [
+ ANDROID_DIR + '/app/agconnect-services.json'
+ ],
+ src: [
+ 'agconnect-services.json'
+ ],
+ }
+};
+
+module.exports = function (context) {
+ //get platform from the context supplied by cordova
+ var platforms = context.opts.platforms;
+ // Copy key files to their platform specific folders
+ if (platforms.indexOf('android') !== -1 && utilities.directoryExists(ANDROID_DIR)) {
+ console.log('Preparing HMS Push Kit on Android');
+ utilities.copyKey(PLATFORM.ANDROID);
+ }
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/after_plugin_install.js b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/after_plugin_install.js
new file mode 100644
index 00000000..09e73419
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/after_plugin_install.js
@@ -0,0 +1,9 @@
+var helper = require('./helper');
+
+module.exports = function(context) {
+
+ // Modify the Gradle build file to add a task that will upload the debug symbols
+ // at build time.
+ helper.restoreRootBuildGradle();
+ helper.modifyRootBuildGradle();
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/before_plugin_uninstall.js b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/before_plugin_uninstall.js
new file mode 100644
index 00000000..9c32e552
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/before_plugin_uninstall.js
@@ -0,0 +1,7 @@
+var helper = require('./helper');
+
+module.exports = function(context) {
+
+ // Remove the Gradle modifications that were added when the plugin was installed.
+ helper.restoreRootBuildGradle();
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/helper.js b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/helper.js
new file mode 100644
index 00000000..da715c24
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/android/helper.js
@@ -0,0 +1,117 @@
+var fs = require("fs");
+var path = require("path");
+
+function rootBuildGradleExists() {
+ var target = path.join("platforms", "android", "build.gradle");
+ return fs.existsSync(target);
+}
+
+/*
+ * Helper function to read the build.gradle that sits at the root of the project
+ */
+function readRootBuildGradle() {
+ var target = path.join("platforms", "android", "build.gradle");
+ return fs.readFileSync(target, "utf-8");
+}
+
+/*
+ * Added a dependency on 'com.google.gms' based on the position of the know 'com.android.tools.build' dependency in the build.gradle
+ */
+function addDependencies(buildGradle) {
+ // find the known line to match
+ var match = buildGradle.match(/^(\s*)classpath 'com.android.tools.build(.*)/m);
+ var whitespace = match[1];
+
+ // modify the line to add the necessary dependencies
+ var agcDependency = whitespace + 'classpath \'com.huawei.agconnect:agcp:1.2.0.300\''
+
+ var modifiedLine = match[0] + '\n' + agcDependency;
+
+ // modify the actual line
+ return buildGradle.replace(/^(\s*)classpath 'com.android.tools.build(.*)/m, modifiedLine);
+}
+
+/*
+ * Add 'google()' and Crashlytics to the repository repo list
+ */
+function addRepos(buildGradle) {
+ // find the known line to match
+ var match = buildGradle.match(/^(\s*)jcenter\(\)/m);
+ var whitespace = match[1];
+
+ // modify the line to add the necessary repo
+ var huaweiMavenRepo = whitespace + 'maven { url \'http://developer.huawei.com/repo/\' }'
+ var modifiedLine = match[0] + '\n' + huaweiMavenRepo;
+
+ // modify the actual line
+ buildGradle = buildGradle.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+
+ // update the all projects grouping
+ var allProjectsIndex = buildGradle.indexOf('allprojects');
+ if (allProjectsIndex > 0) {
+ // split the string on allprojects because jcenter is in both groups and we need to modify the 2nd instance
+ var firstHalfOfFile = buildGradle.substring(0, allProjectsIndex);
+ var secondHalfOfFile = buildGradle.substring(allProjectsIndex);
+
+ // Add google() to the allprojects section of the string
+ match = secondHalfOfFile.match(/^(\s*)jcenter\(\)/m);
+ var huaweiMavenRepo = whitespace + 'maven { url \'http://developer.huawei.com/repo/\' }'
+ modifiedLine = match[0] + '\n' + huaweiMavenRepo;
+ // modify the part of the string that is after 'allprojects'
+ secondHalfOfFile = secondHalfOfFile.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+
+ // recombine the modified line
+ buildGradle = firstHalfOfFile + secondHalfOfFile;
+ } else {
+ // this should not happen, but if it does, we should try to add the dependency to the buildscript
+ match = buildGradle.match(/^(\s*)jcenter\(\)/m);
+ var huaweiMavenRepo = whitespace + 'maven { url \'http://developer.huawei.com/repo/\' }'
+ modifiedLine = match[0] + '\n' + huaweiMavenRepo;
+ // modify the part of the string that is after 'allprojects'
+ buildGradle = buildGradle.replace(/^(\s*)jcenter\(\)/m, modifiedLine);
+ }
+
+ return buildGradle;
+}
+
+/*
+ * Helper function to write to the build.gradle that sits at the root of the project
+ */
+function writeRootBuildGradle(contents) {
+ var target = path.join("platforms", "android", "build.gradle");
+ fs.writeFileSync(target, contents);
+}
+
+module.exports = {
+
+ modifyRootBuildGradle: function() {
+ // be defensive and don't crash if the file doesn't exist
+ if (!rootBuildGradleExists) {
+ return;
+ }
+
+ var buildGradle = readRootBuildGradle();
+
+ // Add Google Play Services Dependency
+ buildGradle = addDependencies(buildGradle);
+
+ // Add Google's Maven Repo
+ buildGradle = addRepos(buildGradle);
+
+ writeRootBuildGradle(buildGradle);
+ },
+
+ restoreRootBuildGradle: function() {
+ // be defensive and don't crash if the file doesn't exist
+ if (!rootBuildGradleExists) {
+ return;
+ }
+
+ var buildGradle = readRootBuildGradle();
+
+ // remove any lines we added
+ buildGradle = buildGradle.replace(/(?:^|\r?\n)(.*)com.huawei.cordovahmspushplugin*?(?=$|\r?\n)/g, '');
+
+ writeRootBuildGradle(buildGradle);
+ }
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/lib/utilities.js b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/lib/utilities.js
new file mode 100644
index 00000000..015f6831
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/scripts/lib/utilities.js
@@ -0,0 +1,88 @@
+/**
+ * Utilities and shared functionality for the build hooks.
+ */
+var fs = require('fs');
+var path = require("path");
+
+fs.ensureDirSync = function (dir) {
+ if (!fs.existsSync(dir)) {
+ dir.split(path.sep).reduce(function (currentPath, folder) {
+ currentPath += folder + path.sep;
+ if (!fs.existsSync(currentPath)) {
+ fs.mkdirSync(currentPath);
+ }
+ return currentPath;
+ }, '');
+ }
+};
+
+module.exports = {
+ /**
+ * Used to get the name of the application as defined in the config.xml.
+ *
+ * @param {object} context - The Cordova context.
+ * @returns {string} The value of the name element in config.xml.
+ */
+ getAppName: function (context) {
+ var ConfigParser = context.requireCordovaModule("cordova-lib").configparser;
+ var config = new ConfigParser("config.xml");
+ return config.name();
+ },
+
+ /**
+ * The ID of the plugin; this should match the ID in plugin.xml.
+ */
+ getPluginId: function () {
+ return "com.huawei.cordovahmspushplugin";
+ },
+
+ copyKey: function (platform) {
+ for (var i = 0; i < platform.src.length; i++) {
+ var file = platform.src[i];
+ if (this.fileExists(file)) {
+ try {
+ var contents = fs.readFileSync(file).toString();
+
+ try {
+ platform.dest.forEach(function (destinationPath) {
+ var folder = destinationPath.substring(0, destinationPath.lastIndexOf('/'));
+ fs.ensureDirSync(folder);
+ fs.writeFileSync(destinationPath, contents);
+ });
+ } catch (e) {
+ // skip
+ }
+ } catch (err) {
+ console.log(err);
+ }
+
+ break;
+ }
+ }
+ },
+
+ getValue: function (config, name) {
+ var value = config.match(new RegExp('<' + name + '(.*?)>(.*?)' + name + '>', 'i'));
+ if (value && value[2]) {
+ return value[2]
+ } else {
+ return null
+ }
+ },
+
+ fileExists: function (path) {
+ try {
+ return fs.statSync(path).isFile();
+ } catch (e) {
+ return false;
+ }
+ },
+
+ directoryExists: function (path) {
+ try {
+ return fs.statSync(path).isDirectory();
+ } catch (e) {
+ return false;
+ }
+ }
+};
\ No newline at end of file
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/CordovaHMSPushPlugin.java b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/CordovaHMSPushPlugin.java
new file mode 100644
index 00000000..d2ef10b4
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/CordovaHMSPushPlugin.java
@@ -0,0 +1,112 @@
+package com.huawei.cordovahmspushplugin;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.huawei.agconnect.config.AGConnectServicesConfig;
+import com.huawei.hms.aaid.HmsInstanceId;
+import com.huawei.hms.push.HmsMessaging;
+import com.huawei.hmf.tasks.OnCompleteListener;
+import com.huawei.hmf.tasks.Task;
+
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.PluginResult;
+import org.json.JSONArray;
+import org.json.JSONException;
+
+/**
+ * This class echoes a string called from JavaScript.
+ */
+public class CordovaHMSPushPlugin extends CordovaPlugin {
+
+ private static final String TAG = CordovaHMSPushPlugin.class.getSimpleName();
+
+ private static CallbackContext mCallbackContext;
+ private static CallbackContext mTokenCallback;
+
+ @Override
+ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
+ switch (action) {
+ case "getToken":
+ this.getToken(callbackContext);
+ return true;
+ case "getMessageCallback":
+ Log.d(TAG, "getMessageCallback");
+ mCallbackContext = callbackContext;
+ return true;
+ case "subscribeTopic":
+ Log.d(TAG, "subscribeTopic");
+ try {
+ String topic = args.getString(0);
+ this.subscribeTopic(topic, callbackContext);
+ } catch (JSONException e) {
+ return true;
+ }
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public static void returnMessage(String message) {
+ if (mCallbackContext != null) {
+ Log.d(TAG, "returnMessage");
+ PluginResult result = new PluginResult(PluginResult.Status.OK, message);
+ result.setKeepCallback(true);
+ mCallbackContext.sendPluginResult(result);
+ }
+ }
+
+ public static void returnToken(String token) {
+ if (mTokenCallback != null) {
+ mTokenCallback.success(token);
+ mTokenCallback = null;
+ }
+ }
+
+ /**
+ * get push token
+ */
+ private void getToken(CallbackContext callbackContext) {
+ Log.i(TAG, "get token: begin");
+
+ try {
+ String appId = AGConnectServicesConfig.fromContext(cordova.getContext()).getString("client/app_id");
+ String pushToken = HmsInstanceId.getInstance(cordova.getContext()).getToken(appId, "HCM");
+ if (!TextUtils.isEmpty(pushToken)) {
+ Log.i(TAG, "get token:" + pushToken);
+ callbackContext.success(pushToken);
+ }else {
+ mTokenCallback = callbackContext;
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "getToken Failed, " + e);
+ callbackContext.error("getToken Failed, error : " + e.getMessage());
+ }
+ }
+
+ public void subscribeTopic(String topic, final CallbackContext callBack) {
+ // callBack.success("user subscribe to topic named as: "+ topic);
+ if (topic == null || topic.toString().equals("")) {
+ callBack.error("topic is empty!");
+ return;
+ }
+ try {
+ HmsMessaging.getInstance(cordova.getContext()).subscribe(topic).
+ addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(Task task) {
+ if (task.isSuccessful()) {
+ callBack.success("user subscribe to topic: "+ topic);
+ } else {
+ callBack.error("getToken Failed, error : " + task.getException().getMessage());
+ }
+ }
+ });
+ } catch (Exception e) {
+ callBack.error("getToken Failed, error : " + e.getMessage());
+ }
+ }
+
+}
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/MessageService.java b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/MessageService.java
new file mode 100644
index 00000000..d32542ef
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/MessageService.java
@@ -0,0 +1,32 @@
+package com.huawei.cordovahmspushplugin;
+
+import com.huawei.cordovahmspushplugin.CordovaHMSPushPlugin;
+import com.huawei.hms.push.HmsMessageService;
+import com.huawei.hms.push.RemoteMessage;
+
+import android.util.Log;
+
+public class MessageService extends HmsMessageService {
+
+ private static final String TAG = MessageService.class.getSimpleName();
+
+ @Override
+ public void onMessageReceived(RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Log.d(TAG, "onMessageReceived");
+ if (remoteMessage != null) {
+ String message = remoteMessage.getData();
+ Log.d(TAG, message);
+ CordovaHMSPushPlugin.returnMessage(message);
+ }
+ }
+
+ @Override
+ public void onNewToken(String s) {
+ super.onNewToken(s);
+ if (s != null) {
+ Log.d(TAG, "token:" + s);
+ CordovaHMSPushPlugin.returnToken(s);
+ }
+ }
+}
diff --git a/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/build.gradle b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/build.gradle
new file mode 100644
index 00000000..23296fb7
--- /dev/null
+++ b/Mohem/CordovaHMSPlugin/CordovaHMSPushPlugin/src/android/build.gradle
@@ -0,0 +1,29 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ // huawei maven
+ maven { url 'http://developer.huawei.com/repo/' }
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.2.0'
+ classpath 'com.huawei.agconnect:agcp:1.2.0.300'
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ // huawei maven
+ maven { url 'http://developer.huawei.com/repo/' }
+ }
+}
+
+cdvPluginPostBuildExtras.add({
+ apply plugin: 'com.huawei.agconnect'
+})