KKUH App updates & fixes

king_kahild_app_updated_3.32
haroon amjad 1 year ago
parent 65a3f3bfff
commit 8b7d0d4a7e

@ -0,0 +1,6 @@
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg5RaefOuG8Q/5I7wM
JA/2GKcBp/eV1Tfe6zeWBAk58zOgCgYIKoZIzj0DAQehRANCAAQ8JuxrvWtIvYfy
aIMpvgbvDmzpZVMZ1uRhBSgtkO49AAYX8JFkq7bMMgq90b8GbvWA8nMkLchIATvX
yuSNSQFx
-----END PRIVATE KEY-----

@ -0,0 +1,6 @@
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg5RaefOuG8Q/5I7wM
JA/2GKcBp/eV1Tfe6zeWBAk58zOgCgYIKoZIzj0DAQehRANCAAQ8JuxrvWtIvYfy
aIMpvgbvDmzpZVMZ1uRhBSgtkO49AAYX8JFkq7bMMgq90b8GbvWA8nMkLchIATvX
yuSNSQFx
-----END PRIVATE KEY-----

Binary file not shown.

@ -28,7 +28,7 @@ if (keystorePropertiesFile.exists()) {
}
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
//apply plugin: 'com.huawei.agconnect'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
//apply plugin: 'com.google.firebase.crashlytics'
@ -68,7 +68,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.ejada.hmg"
applicationId "sa.edu.kku.kkuMcApp"
minSdkVersion 24
targetSdkVersion 34
versionCode flutterVersionCode.toInteger()

@ -1,44 +1,26 @@
{
"project_info": {
"project_number": "815750722565",
"firebase_url": "https://api-project-815750722565.firebaseio.com",
"project_id": "api-project-815750722565",
"storage_bucket": "api-project-815750722565.appspot.com"
"project_number": "218653915217",
"project_id": "kkumc-e0903",
"storage_bucket": "kkumc-e0903.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063",
"mobilesdk_app_id": "1:218653915217:android:28ffffcec5fbf67c896070",
"android_client_info": {
"package_name": "com.ejada.hmg"
"package_name": "sa.edu.kku.kkuMcApp"
}
},
"oauth_client": [
{
"client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com",
"client_type": 3
}
],
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw"
"current_key": "AIzaSyCcN2iDIOH8X7yOikH95cZqyMqA9Kgc8P0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "815750722565-0cq9366orvsk5ipivq6lijcj56u03fr7.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.void.demo"
}
}
]
"other_platform_oauth_client": []
}
}
}

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ejada.hmg">
package="sa.edu.kku.kkuMcApp">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->

@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.ejada.hmg">
package="sa.edu.kku.kkuMcApp">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
@ -66,7 +66,7 @@
android:allowBackup="false"
android:extractNativeLibs="true"
tools:replace="android:extractNativeLibs"
android:label="King Khalid University">
android:label="KKUH">
<meta-data android:name="push_kit_auto_init_enabled" android:value="true" />
<activity

@ -1,5 +1,5 @@
//package com.cloud.diplomaticquarterapp
package com.ejada.hmg
package sa.edu.kku.kkuMcApp
import com.facebook.stetho.Stetho
import io.flutter.app.FlutterApplication

@ -1,4 +1,6 @@
package com.ejada.hmg
package sa.edu.kku.kkuMcApp
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.ContentResolver
@ -9,7 +11,7 @@ import android.util.Log
import android.os.Build
import android.view.WindowManager
import androidx.annotation.NonNull;
import com.ejada.hmg.utils.*
//import sa.edu.kku.kkuMcApp.utils.*
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
@ -18,11 +20,11 @@ import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterFragmentActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
// Create Flutter Platform Bridge
// Create Flutter Platform Bridge
this.window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)
PlatformBridge(flutterEngine, this).create()
OpenTokPlatformBridge(flutterEngine, this).create()
// PlatformBridge(flutterEngine, this).create()
// OpenTokPlatformBridge(flutterEngine, this).create()
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// val mChannel = NotificationChannel("video_call_noti", "video call", NotificationManager.IMPORTANCE_HIGH)

@ -1,58 +1,58 @@
package com.ejada.hmg.geofence
import com.google.android.gms.location.Geofence
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
class GeoZoneModel {
var GEOF_ID:Int = 0
var Radius:Int = 0
var Type:Int = 0
var ProjectID:Int = 0
var Description:String? = null
var DescriptionN:String? = null
var Latitude:String? = null
var Longitude:String? = null
var ImageURL:String? = null
var IsCity:String? = null
fun identifier():String{
return "$GEOF_ID" + "_hmg"
}
fun message():String{
return Description ?: "nil"
}
fun listFrom(jsonString: String) : List<GeoZoneModel>{
val type = object : TypeToken<List<GeoZoneModel?>?>() {}.getType()
return Gson().fromJson(jsonString, type)
}
fun toGeofence() : Geofence?{
if (!Latitude.isNullOrEmpty() && !Longitude.isNullOrEmpty() && Radius > 50) {
val lat = Latitude!!.trim().toDoubleOrNull()
val long = Longitude!!.trim().toDoubleOrNull()
val rad = Radius.toFloat()
if(lat != null && long != null){
val loiteringDelayMinutes:Int = 2 // in Minutes
return Geofence.Builder()
.setRequestId(identifier())
.setCircularRegion(
lat,
long,
rad
)
.setTransitionTypes(GeofenceTransition.ENTER_EXIT.value)
.setNotificationResponsiveness(0)
.setLoiteringDelay(loiteringDelayMinutes * 60 * 1000)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.build()
}
}
return null
}
}
//package com.ejada.hmg.geofence
//
//import com.google.android.gms.location.Geofence
//import com.google.gson.Gson
//import com.google.gson.reflect.TypeToken
//
//class GeoZoneModel {
// var GEOF_ID:Int = 0
// var Radius:Int = 0
// var Type:Int = 0
// var ProjectID:Int = 0
//
// var Description:String? = null
// var DescriptionN:String? = null
// var Latitude:String? = null
// var Longitude:String? = null
// var ImageURL:String? = null
// var IsCity:String? = null
//
// fun identifier():String{
// return "$GEOF_ID" + "_hmg"
// }
//
// fun message():String{
// return Description ?: "nil"
// }
//
// fun listFrom(jsonString: String) : List<GeoZoneModel>{
// val type = object : TypeToken<List<GeoZoneModel?>?>() {}.getType()
// return Gson().fromJson(jsonString, type)
// }
//
// fun toGeofence() : Geofence?{
// if (!Latitude.isNullOrEmpty() && !Longitude.isNullOrEmpty() && Radius > 50) {
// val lat = Latitude!!.trim().toDoubleOrNull()
// val long = Longitude!!.trim().toDoubleOrNull()
// val rad = Radius.toFloat()
// if(lat != null && long != null){
//
// val loiteringDelayMinutes:Int = 2 // in Minutes
// return Geofence.Builder()
// .setRequestId(identifier())
// .setCircularRegion(
// lat,
// long,
// rad
// )
// .setTransitionTypes(GeofenceTransition.ENTER_EXIT.value)
// .setNotificationResponsiveness(0)
// .setLoiteringDelay(loiteringDelayMinutes * 60 * 1000)
// .setExpirationDuration(Geofence.NEVER_EXPIRE)
// .build()
// }
// }
// return null
// }
//
//}

@ -1,291 +1,291 @@
package com.ejada.hmg.geofence
import android.Manifest
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.location.Location
import androidx.core.content.ContextCompat
import com.ejada.hmg.geofence.intent_receivers.GeofenceBroadcastReceiver
import com.ejada.hmg.geofence.intent_receivers.ReregisterGeofenceJobService
import com.ejada.hmg.utils.*
import com.google.android.gms.location.Geofence
import com.google.android.gms.location.GeofencingClient
import com.google.android.gms.location.GeofencingRequest
import com.google.android.gms.location.LocationServices
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
enum class GeofenceTransition(val value: Int) {
ENTER(1),
EXIT(2),
DWELL(4),
ENTER_EXIT((ENTER.value or EXIT.value)),
DWELL_EXIT((DWELL.value or EXIT.value));
companion object {
fun fromInt(value: Int) = GeofenceTransition.values().first { it.value == value }
}
fun named(): String {
if (value == 1) return "Enter"
if (value == 2) return "Exit"
if (value == 4) return "dWell"
if (value == (ENTER.value or EXIT.value)) return "Enter or Exit"
if (value == (DWELL.value or EXIT.value)) return "DWell or Exit"
return "unknown"
}
}
class HMG_Geofence {
// https://developer.android.com/training/location/geofencing#java
private lateinit var context: Context
private lateinit var preferences: SharedPreferences
private val gson = Gson()
private lateinit var geofencingClient: GeofencingClient
private val geofencePendingIntent: PendingIntent by lazy {
val intent = Intent(context, GeofenceBroadcastReceiver::class.java)
PendingIntent.getBroadcast(
context,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
)
}
companion object {
var instance: HMG_Geofence? = null
fun shared(context: Context): HMG_Geofence {
if (instance == null) {
instance = HMG_Geofence()
instance?.context = context
instance?.geofencingClient = LocationServices.getGeofencingClient(context)
instance?.preferences =
context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
}
return instance!!
}
}
private fun limitize(zones: List<GeoZoneModel>): List<GeoZoneModel> {
var geoZones_ = zones
if (zones.size > 100)
geoZones_ = zones.subList(0, 99)
return geoZones_
}
fun register(completion: ((Boolean, java.lang.Exception?) -> Unit)) {
unRegisterAll { status, exception ->
val geoZones = getGeoZonesFromPreference(context)
doRegister(geoZones) { status_, error ->
completion.let { it(status_, error) }
}
}
}
fun unRegisterAll(completion: (status: Boolean, exception: Exception?) -> Unit) {
getActiveGeofences({ success ->
removeActiveGeofences()
if (success.isNotEmpty())
geofencingClient
.removeGeofences(success)
.addOnSuccessListener {
completion(true, null)
}
.addOnFailureListener {
completion(false, it)
saveLog(context, "error:REMOVE_GEOFENCES", it.localizedMessage)
}
else
completion(true, null)
}, { failed ->
// Nothing to do with failed geofences.
})
}
private fun doRegister(
geoZones: List<GeoZoneModel>,
completion: ((Boolean, java.lang.Exception?) -> Unit)? = null
) {
if (geoZones.isEmpty())
return
val geoZones_ = limitize(geoZones)
fun buildGeofencingRequest(geofences: List<Geofence>): GeofencingRequest {
return GeofencingRequest.Builder()
.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_DWELL)
.addGeofences(geofences)
.build()
}
getActiveGeofences({ active ->
val geofences = mutableListOf<Geofence>()
geoZones_.forEach {
it.toGeofence()?.let { geof ->
if (!active.contains(geof.requestId)) { // if not already registered then register
geofences.add(geof)
}
}
}
if (checkPermission() && geofences.isNotEmpty()) {
geofencingClient
.addGeofences(buildGeofencingRequest(geofences), geofencePendingIntent)
.addOnSuccessListener {
Logs.RegisterGeofence.save(
context,
"SUCCESS",
"Successfuly registered the geofences",
Logs.STATUS.SUCCESS
)
saveActiveGeofence(geofences.map { it.requestId }, listOf())
completion?.let { it(true, null) }
}
.addOnFailureListener { exc ->
Logs.RegisterGeofence.save(
context,
"FAILED_TO_REGISTER",
"Failed to register geofence",
Logs.STATUS.ERROR
)
completion?.let { it(false, exc) }
}
// Schedule the job to register after specified duration (due to: events not calling after long period.. days or days [Needs to register fences again])
HMGUtils.scheduleJob(
context,
ReregisterGeofenceJobService::class.java,
ReregisterGeofenceJobService.JobID,
ReregisterGeofenceJobService.TriggerIntervalDuration
)
}
}, null)
}
fun getGeoZonesFromPreference(context: Context): List<GeoZoneModel> {
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
val json = pref.getString(PREF_KEY_HMG_ZONES, "[]")
val geoZones = GeoZoneModel().listFrom(json!!)
return geoZones
}
fun saveActiveGeofence(success: List<String>, failed: List<String>) {
val jsonSuccess = gson.toJson(success)
val jsonFailure = gson.toJson(failed)
preferences.edit().putString(PREF_KEY_SUCCESS, jsonSuccess).apply()
preferences.edit().putString(PREF_KEY_FAILED, jsonFailure).apply()
}
fun removeActiveGeofences() {
preferences.edit().putString(PREF_KEY_SUCCESS, "[]").apply()
preferences.edit().putString(PREF_KEY_FAILED, "[]").apply()
}
fun getActiveGeofences(
success: (success: List<String>) -> Unit,
failure: ((failed: List<String>) -> Unit)?
) {
val type = object : TypeToken<List<String?>?>() {}.type
val jsonSuccess = preferences.getString(PREF_KEY_SUCCESS, "[]")
val success = gson.fromJson<List<String>>(jsonSuccess, type)
success(success)
if (failure != null) {
val jsonFailure = preferences.getString(PREF_KEY_FAILED, "[]")
val failed = gson.fromJson<List<String>>(jsonFailure, type)
failure(failed)
}
}
private fun checkPermission(): Boolean {
return ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
}
fun getPatientID(): Int? {
var profileJson = preferences.getString("flutter.imei-user-data", null)
if (profileJson == null)
profileJson = preferences.getString("flutter.user-profile", null)
val type = object : TypeToken<Map<String?, Any?>?>() {}.type
return gson.fromJson<Map<String?, Any?>?>(profileJson, type)
?.get("PatientID")
.toString()
.toDoubleOrNull()
?.toInt()
}
fun handleEvent(
triggerGeofences: List<Geofence>,
location: Location,
transition: GeofenceTransition
) {
getPatientID()?.let { patientId ->
getActiveGeofences({ activeGeofences ->
triggerGeofences.forEach { geofence ->
// Extract PointID from 'geofence.requestId' and find from active geofences
val pointID =
activeGeofences.firstOrNull { it == geofence.requestId }?.split('_')
?.first()
if (!pointID.isNullOrEmpty() && pointID.toIntOrNull() != null) {
val body = mutableMapOf<String, Any?>(
"PointsID" to pointID.toIntOrNull(),
"GeoType" to transition.value,
"PatientID" to patientId
)
body.putAll(HMGUtils.defaultHTTPParams(context))
httpPost<Map<String, Any>>(API.LOG_GEOFENCE, body, { response ->
saveLog(
context,
"HMG_GEOFENCE_NOTIFY",
"Success: Notified to server\uD83D\uDE0E."
)
sendNotification(
context,
transition.named(),
geofence.requestId,
"Notified to server.😎"
)
}, { exception ->
val errorMessage = "${transition.named()}, ${geofence.requestId}"
saveLog(
context,
"HMG_GEOFENCE_NOTIFY",
"failed: $errorMessage | error: ${exception.localizedMessage}"
)
sendNotification(
context,
transition.named(),
geofence.requestId,
"Failed to notify server😔 -> ${exception.localizedMessage}"
)
})
}
}
}, null)
}
}
}
//package com.ejada.hmg.geofence
//
//import android.Manifest
//import android.app.PendingIntent
//import android.content.Context
//import android.content.Intent
//import android.content.SharedPreferences
//import android.content.pm.PackageManager
//import android.location.Location
//import androidx.core.content.ContextCompat
//import com.ejada.hmg.geofence.intent_receivers.GeofenceBroadcastReceiver
//import com.ejada.hmg.geofence.intent_receivers.ReregisterGeofenceJobService
//import com.ejada.hmg.utils.*
//import com.google.android.gms.location.Geofence
//import com.google.android.gms.location.GeofencingClient
//import com.google.android.gms.location.GeofencingRequest
//import com.google.android.gms.location.LocationServices
//import com.google.gson.Gson
//import com.google.gson.reflect.TypeToken
//
//enum class GeofenceTransition(val value: Int) {
// ENTER(1),
// EXIT(2),
// DWELL(4),
//
// ENTER_EXIT((ENTER.value or EXIT.value)),
// DWELL_EXIT((DWELL.value or EXIT.value));
//
// companion object {
// fun fromInt(value: Int) = GeofenceTransition.values().first { it.value == value }
// }
//
// fun named(): String {
// if (value == 1) return "Enter"
// if (value == 2) return "Exit"
// if (value == 4) return "dWell"
// if (value == (ENTER.value or EXIT.value)) return "Enter or Exit"
// if (value == (DWELL.value or EXIT.value)) return "DWell or Exit"
// return "unknown"
// }
//}
//
//class HMG_Geofence {
// // https://developer.android.com/training/location/geofencing#java
//
// private lateinit var context: Context
// private lateinit var preferences: SharedPreferences
// private val gson = Gson()
//
// private lateinit var geofencingClient: GeofencingClient
// private val geofencePendingIntent: PendingIntent by lazy {
// val intent = Intent(context, GeofenceBroadcastReceiver::class.java)
// PendingIntent.getBroadcast(
// context,
// 0,
// intent,
// PendingIntent.FLAG_IMMUTABLE
// )
// }
//
// companion object {
//
// var instance: HMG_Geofence? = null
// fun shared(context: Context): HMG_Geofence {
// if (instance == null) {
// instance = HMG_Geofence()
// instance?.context = context
// instance?.geofencingClient = LocationServices.getGeofencingClient(context)
// instance?.preferences =
// context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// }
// return instance!!
// }
// }
//
// private fun limitize(zones: List<GeoZoneModel>): List<GeoZoneModel> {
// var geoZones_ = zones
// if (zones.size > 100)
// geoZones_ = zones.subList(0, 99)
// return geoZones_
// }
//
//
// fun register(completion: ((Boolean, java.lang.Exception?) -> Unit)) {
// unRegisterAll { status, exception ->
// val geoZones = getGeoZonesFromPreference(context)
// doRegister(geoZones) { status_, error ->
// completion.let { it(status_, error) }
// }
// }
// }
//
// fun unRegisterAll(completion: (status: Boolean, exception: Exception?) -> Unit) {
// getActiveGeofences({ success ->
// removeActiveGeofences()
// if (success.isNotEmpty())
// geofencingClient
// .removeGeofences(success)
// .addOnSuccessListener {
// completion(true, null)
// }
// .addOnFailureListener {
// completion(false, it)
// saveLog(context, "error:REMOVE_GEOFENCES", it.localizedMessage)
// }
// else
// completion(true, null)
//
// }, { failed ->
// // Nothing to do with failed geofences.
// })
// }
//
// private fun doRegister(
// geoZones: List<GeoZoneModel>,
// completion: ((Boolean, java.lang.Exception?) -> Unit)? = null
// ) {
// if (geoZones.isEmpty())
// return
//
// val geoZones_ = limitize(geoZones)
//
// fun buildGeofencingRequest(geofences: List<Geofence>): GeofencingRequest {
// return GeofencingRequest.Builder()
// .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_DWELL)
// .addGeofences(geofences)
// .build()
// }
//
// getActiveGeofences({ active ->
//
// val geofences = mutableListOf<Geofence>()
// geoZones_.forEach {
// it.toGeofence()?.let { geof ->
// if (!active.contains(geof.requestId)) { // if not already registered then register
// geofences.add(geof)
// }
// }
// }
//
// if (checkPermission() && geofences.isNotEmpty()) {
// geofencingClient
// .addGeofences(buildGeofencingRequest(geofences), geofencePendingIntent)
// .addOnSuccessListener {
// Logs.RegisterGeofence.save(
// context,
// "SUCCESS",
// "Successfuly registered the geofences",
// Logs.STATUS.SUCCESS
// )
// saveActiveGeofence(geofences.map { it.requestId }, listOf())
// completion?.let { it(true, null) }
// }
// .addOnFailureListener { exc ->
// Logs.RegisterGeofence.save(
// context,
// "FAILED_TO_REGISTER",
// "Failed to register geofence",
// Logs.STATUS.ERROR
// )
// completion?.let { it(false, exc) }
// }
//
// // Schedule the job to register after specified duration (due to: events not calling after long period.. days or days [Needs to register fences again])
// HMGUtils.scheduleJob(
// context,
// ReregisterGeofenceJobService::class.java,
// ReregisterGeofenceJobService.JobID,
// ReregisterGeofenceJobService.TriggerIntervalDuration
// )
// }
//
// }, null)
//
// }
//
// fun getGeoZonesFromPreference(context: Context): List<GeoZoneModel> {
// val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// val json = pref.getString(PREF_KEY_HMG_ZONES, "[]")
//
// val geoZones = GeoZoneModel().listFrom(json!!)
// return geoZones
// }
//
// fun saveActiveGeofence(success: List<String>, failed: List<String>) {
// val jsonSuccess = gson.toJson(success)
// val jsonFailure = gson.toJson(failed)
// preferences.edit().putString(PREF_KEY_SUCCESS, jsonSuccess).apply()
// preferences.edit().putString(PREF_KEY_FAILED, jsonFailure).apply()
// }
//
// fun removeActiveGeofences() {
// preferences.edit().putString(PREF_KEY_SUCCESS, "[]").apply()
// preferences.edit().putString(PREF_KEY_FAILED, "[]").apply()
// }
//
// fun getActiveGeofences(
// success: (success: List<String>) -> Unit,
// failure: ((failed: List<String>) -> Unit)?
// ) {
// val type = object : TypeToken<List<String?>?>() {}.type
//
// val jsonSuccess = preferences.getString(PREF_KEY_SUCCESS, "[]")
// val success = gson.fromJson<List<String>>(jsonSuccess, type)
// success(success)
//
// if (failure != null) {
// val jsonFailure = preferences.getString(PREF_KEY_FAILED, "[]")
// val failed = gson.fromJson<List<String>>(jsonFailure, type)
// failure(failed)
// }
//
// }
//
// private fun checkPermission(): Boolean {
// return ContextCompat.checkSelfPermission(
// context,
// Manifest.permission.ACCESS_FINE_LOCATION
// ) == PackageManager.PERMISSION_GRANTED
// }
//
// fun getPatientID(): Int? {
// var profileJson = preferences.getString("flutter.imei-user-data", null)
// if (profileJson == null)
// profileJson = preferences.getString("flutter.user-profile", null)
//
// val type = object : TypeToken<Map<String?, Any?>?>() {}.type
// return gson.fromJson<Map<String?, Any?>?>(profileJson, type)
// ?.get("PatientID")
// .toString()
// .toDoubleOrNull()
// ?.toInt()
// }
//
//
// fun handleEvent(
// triggerGeofences: List<Geofence>,
// location: Location,
// transition: GeofenceTransition
// ) {
// getPatientID()?.let { patientId ->
// getActiveGeofences({ activeGeofences ->
//
// triggerGeofences.forEach { geofence ->
// // Extract PointID from 'geofence.requestId' and find from active geofences
// val pointID =
// activeGeofences.firstOrNull { it == geofence.requestId }?.split('_')
// ?.first()
// if (!pointID.isNullOrEmpty() && pointID.toIntOrNull() != null) {
//
// val body = mutableMapOf<String, Any?>(
// "PointsID" to pointID.toIntOrNull(),
// "GeoType" to transition.value,
// "PatientID" to patientId
// )
// body.putAll(HMGUtils.defaultHTTPParams(context))
//
// httpPost<Map<String, Any>>(API.LOG_GEOFENCE, body, { response ->
// saveLog(
// context,
// "HMG_GEOFENCE_NOTIFY",
// "Success: Notified to server\uD83D\uDE0E."
// )
// sendNotification(
// context,
// transition.named(),
// geofence.requestId,
// "Notified to server.😎"
// )
// }, { exception ->
// val errorMessage = "${transition.named()}, ${geofence.requestId}"
// saveLog(
// context,
// "HMG_GEOFENCE_NOTIFY",
// "failed: $errorMessage | error: ${exception.localizedMessage}"
// )
// sendNotification(
// context,
// transition.named(),
// geofence.requestId,
// "Failed to notify server😔 -> ${exception.localizedMessage}"
// )
// })
//
// }
// }
//
// }, null)
// }
// }
//}

@ -1,71 +1,71 @@
package com.ejada.hmg.geofence.intent_receivers
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import com.ejada.hmg.geofence.GeofenceTransition
import com.ejada.hmg.geofence.HMG_Geofence
import com.ejada.hmg.utils.Logs
import com.google.android.gms.location.GeofenceStatusCodes
import com.google.android.gms.location.GeofencingEvent
class GeofenceBroadcastReceiver : BroadcastReceiver() {
private val LOG_TAG = "GeofenceBroadcastReceiver"
@SuppressLint("LongLogTag")
override fun onReceive(context: Context, intent: Intent) {
val geofencingEvent = GeofencingEvent.fromIntent(intent)
if (geofencingEvent != null) {
if (geofencingEvent.hasError()) {
val errorMessage =
GeofenceErrorMessages.getErrorString(context, geofencingEvent.errorCode)
Log.e(LOG_TAG, errorMessage)
Logs.GeofenceEvent.save(
context,
LOG_TAG,
"Error while triggering geofence event",
Logs.STATUS.ERROR
)
doReRegisterIfRequired(context, geofencingEvent.errorCode)
return
}
}
if (geofencingEvent != null) {
Logs.GeofenceEvent.save(
context,
LOG_TAG,
"Geofence event triggered: ${GeofenceTransition.fromInt(geofencingEvent.geofenceTransition).value} for ${geofencingEvent.triggeringGeofences?.map { it.requestId }}",
Logs.STATUS.SUCCESS
)
geofencingEvent.triggeringLocation?.let {
geofencingEvent.triggeringGeofences?.let { it1 ->
HMG_Geofence.shared(context).handleEvent(
it1,
it, GeofenceTransition.fromInt(geofencingEvent.geofenceTransition)
)
}
}
};
}
fun doReRegisterIfRequired(context: Context, errorCode: Int) {
val errorRequiredReregister = listOf(
GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE,
GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES,
GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS,
GeofenceStatusCodes.GEOFENCE_REQUEST_TOO_FREQUENT
)
if (errorRequiredReregister.contains(errorCode))
HMG_Geofence.shared(context).register() { status, error ->
}
}
}
//package com.ejada.hmg.geofence.intent_receivers
//
//import android.annotation.SuppressLint
//import android.content.BroadcastReceiver
//import android.content.Context
//import android.content.Intent
//import android.util.Log
//import com.ejada.hmg.geofence.GeofenceTransition
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.ejada.hmg.utils.Logs
//import com.google.android.gms.location.GeofenceStatusCodes
//import com.google.android.gms.location.GeofencingEvent
//
//class GeofenceBroadcastReceiver : BroadcastReceiver() {
// private val LOG_TAG = "GeofenceBroadcastReceiver"
//
// @SuppressLint("LongLogTag")
// override fun onReceive(context: Context, intent: Intent) {
//
// val geofencingEvent = GeofencingEvent.fromIntent(intent)
// if (geofencingEvent != null) {
// if (geofencingEvent.hasError()) {
// val errorMessage =
// GeofenceErrorMessages.getErrorString(context, geofencingEvent.errorCode)
// Log.e(LOG_TAG, errorMessage)
//
// Logs.GeofenceEvent.save(
// context,
// LOG_TAG,
// "Error while triggering geofence event",
// Logs.STATUS.ERROR
// )
// doReRegisterIfRequired(context, geofencingEvent.errorCode)
//
// return
// }
// }
// if (geofencingEvent != null) {
// Logs.GeofenceEvent.save(
// context,
// LOG_TAG,
// "Geofence event triggered: ${GeofenceTransition.fromInt(geofencingEvent.geofenceTransition).value} for ${geofencingEvent.triggeringGeofences?.map { it.requestId }}",
// Logs.STATUS.SUCCESS
// )
// geofencingEvent.triggeringLocation?.let {
// geofencingEvent.triggeringGeofences?.let { it1 ->
// HMG_Geofence.shared(context).handleEvent(
// it1,
// it, GeofenceTransition.fromInt(geofencingEvent.geofenceTransition)
// )
// }
// }
// };
//
// }
//
// fun doReRegisterIfRequired(context: Context, errorCode: Int) {
// val errorRequiredReregister = listOf(
// GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE,
// GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES,
// GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS,
// GeofenceStatusCodes.GEOFENCE_REQUEST_TOO_FREQUENT
// )
//
// if (errorRequiredReregister.contains(errorCode))
// HMG_Geofence.shared(context).register() { status, error ->
//
// }
//
// }
//}

@ -1,16 +1,16 @@
package com.ejada.hmg.geofence.intent_receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.ejada.hmg.geofence.HMG_Geofence
import com.google.android.gms.location.GeofenceStatusCodes
class GeofenceBroadcastReceiverWithJobService : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
GeofenceTransitionsJobIntentService.enqueueWork(context, intent)
}
}
//
//
//package com.ejada.hmg.geofence.intent_receivers
//
//import android.content.BroadcastReceiver
//import android.content.Context
//import android.content.Intent
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.google.android.gms.location.GeofenceStatusCodes
//
//class GeofenceBroadcastReceiverWithJobService : BroadcastReceiver() {
// override fun onReceive(context: Context, intent: Intent) {
// GeofenceTransitionsJobIntentService.enqueueWork(context, intent)
// }
//
//}

@ -1,43 +1,43 @@
package com.ejada.hmg.geofence.intent_receivers
import android.content.Context
import com.ejada.hmg.R
import com.ejada.hmg.geofence.HMG_Geofence
import com.google.android.gms.common.api.ApiException
import com.google.android.gms.location.GeofenceStatusCodes
object GeofenceErrorMessages {
fun getErrorString(context: Context, e: Exception): String {
return if (e is ApiException) {
getErrorString(context, e.statusCode)
} else {
context.resources.getString(R.string.geofence_unknown_error)
}
}
fun getErrorString(context: Context, errorCode: Int): String {
val resources = context.resources
val errorMessage = when (errorCode) {
GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE ->
resources.getString(R.string.geofence_not_available)
GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES ->
resources.getString(R.string.geofence_too_many_geofences)
GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS ->
resources.getString(R.string.geofence_too_many_pending_intents)
GeofenceStatusCodes.GEOFENCE_INSUFFICIENT_LOCATION_PERMISSION ->
resources.getString(R.string.GEOFENCE_INSUFFICIENT_LOCATION_PERMISSION)
GeofenceStatusCodes.GEOFENCE_REQUEST_TOO_FREQUENT ->
resources.getString(R.string.GEOFENCE_REQUEST_TOO_FREQUENT)
else -> resources.getString(R.string.geofence_unknown_error)
}
return errorMessage
}
}
//
//
//package com.ejada.hmg.geofence.intent_receivers
//
//import android.content.Context
//import sa.edu.kku.kkuMcApp.R
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.google.android.gms.common.api.ApiException
//import com.google.android.gms.location.GeofenceStatusCodes
//
//object GeofenceErrorMessages {
// fun getErrorString(context: Context, e: Exception): String {
// return if (e is ApiException) {
// getErrorString(context, e.statusCode)
// } else {
// context.resources.getString(R.string.geofence_unknown_error)
// }
// }
//
// fun getErrorString(context: Context, errorCode: Int): String {
// val resources = context.resources
// val errorMessage = when (errorCode) {
// GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE ->
// resources.getString(R.string.geofence_not_available)
//
// GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES ->
// resources.getString(R.string.geofence_too_many_geofences)
//
// GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS ->
// resources.getString(R.string.geofence_too_many_pending_intents)
//
// GeofenceStatusCodes.GEOFENCE_INSUFFICIENT_LOCATION_PERMISSION ->
// resources.getString(R.string.GEOFENCE_INSUFFICIENT_LOCATION_PERMISSION)
//
// GeofenceStatusCodes.GEOFENCE_REQUEST_TOO_FREQUENT ->
// resources.getString(R.string.GEOFENCE_REQUEST_TOO_FREQUENT)
//
// else -> resources.getString(R.string.geofence_unknown_error)
// }
//
// return errorMessage
// }
//}

@ -1,97 +1,97 @@
/*
* Copyright (c) 2018 Razeware LLC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
* distribute, sublicense, create a derivative work, and/or sell copies of the
* Software in any work that is designed, intended, or marketed for pedagogical or
* instructional purposes related to programming, coding, application development,
* or information technology. Permission for such use, copying, modification,
* merger, publication, distribution, sublicensing, creation of derivative works,
* or sale is expressly withheld.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.ejada.hmg.geofence.intent_receivers
import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.core.app.JobIntentService
import com.ejada.hmg.geofence.GeofenceTransition
import com.ejada.hmg.geofence.HMG_Geofence
import com.ejada.hmg.utils.saveLog
import com.google.android.gms.location.GeofenceStatusCodes
import com.google.android.gms.location.GeofencingEvent
class GeofenceTransitionsJobIntentService : JobIntentService() {
companion object {
private const val LOG_TAG = "GeoTrIntentService"
private const val JOB_ID = 95902
var context_: Context? = null
fun enqueueWork(context: Context, intent: Intent) {
context_ = context
enqueueWork(
context,
GeofenceTransitionsJobIntentService::class.java, JOB_ID,
intent)
}
}
override fun onHandleWork(intent: Intent) {
val geofencingEvent = GeofencingEvent.fromIntent(intent)
if (geofencingEvent != null) {
if (geofencingEvent.hasError()) {
val errorMessage = GeofenceErrorMessages.getErrorString(context_!!, geofencingEvent.errorCode)
Log.e(LOG_TAG, errorMessage)
saveLog(context_!!,LOG_TAG,errorMessage)
doReRegisterIfRequired(context_!!, geofencingEvent.errorCode)
return
}
}
if (geofencingEvent != null) {
geofencingEvent.triggeringGeofences?.let { geofencingEvent.triggeringLocation?.let { it1 ->
HMG_Geofence.shared(context_!!).handleEvent(it,
it1, GeofenceTransition.fromInt(geofencingEvent.geofenceTransition))
} }
};
}
fun doReRegisterIfRequired(context: Context, errorCode: Int){
val errorRequiredReregister = listOf(
GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE,
GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES,
GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS,
GeofenceStatusCodes.GEOFENCE_REQUEST_TOO_FREQUENT
)
if(errorRequiredReregister.contains(errorCode))
HMG_Geofence.shared(context).register(){ status, exc -> }
}
}
///*
// * Copyright (c) 2018 Razeware LLC
// *
// * Permission is hereby granted, free of charge, to any person obtaining a copy
// * of this software and associated documentation files (the "Software"), to deal
// * in the Software without restriction, including without limitation the rights
// * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// * copies of the Software, and to permit persons to whom the Software is
// * furnished to do so, subject to the following conditions:
// *
// * The above copyright notice and this permission notice shall be included in
// * all copies or substantial portions of the Software.
// *
// * Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
// * distribute, sublicense, create a derivative work, and/or sell copies of the
// * Software in any work that is designed, intended, or marketed for pedagogical or
// * instructional purposes related to programming, coding, application development,
// * or information technology. Permission for such use, copying, modification,
// * merger, publication, distribution, sublicensing, creation of derivative works,
// * or sale is expressly withheld.
// *
// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// * THE SOFTWARE.
// */
//
//
//package com.ejada.hmg.geofence.intent_receivers
//
//import android.content.Context
//import android.content.Intent
//import android.util.Log
//import androidx.core.app.JobIntentService
//import com.ejada.hmg.geofence.GeofenceTransition
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.ejada.hmg.utils.saveLog
//import com.google.android.gms.location.GeofenceStatusCodes
//import com.google.android.gms.location.GeofencingEvent
//
//class GeofenceTransitionsJobIntentService : JobIntentService() {
//
// companion object {
// private const val LOG_TAG = "GeoTrIntentService"
//
// private const val JOB_ID = 95902
// var context_: Context? = null
// fun enqueueWork(context: Context, intent: Intent) {
// context_ = context
// enqueueWork(
// context,
// GeofenceTransitionsJobIntentService::class.java, JOB_ID,
// intent)
// }
// }
//
// override fun onHandleWork(intent: Intent) {
// val geofencingEvent = GeofencingEvent.fromIntent(intent)
// if (geofencingEvent != null) {
// if (geofencingEvent.hasError()) {
// val errorMessage = GeofenceErrorMessages.getErrorString(context_!!, geofencingEvent.errorCode)
// Log.e(LOG_TAG, errorMessage)
//
//
// saveLog(context_!!,LOG_TAG,errorMessage)
// doReRegisterIfRequired(context_!!, geofencingEvent.errorCode)
//
// return
// }
// }
//
// if (geofencingEvent != null) {
// geofencingEvent.triggeringGeofences?.let { geofencingEvent.triggeringLocation?.let { it1 ->
// HMG_Geofence.shared(context_!!).handleEvent(it,
// it1, GeofenceTransition.fromInt(geofencingEvent.geofenceTransition))
// } }
// };
//
// }
//
//
// fun doReRegisterIfRequired(context: Context, errorCode: Int){
// val errorRequiredReregister = listOf(
// GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE,
// GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES,
// GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS,
// GeofenceStatusCodes.GEOFENCE_REQUEST_TOO_FREQUENT
// )
//
// if(errorRequiredReregister.contains(errorCode))
// HMG_Geofence.shared(context).register(){ status, exc -> }
//
// }
//}

@ -1,23 +1,23 @@
package com.ejada.hmg.geofence.intent_receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.ejada.hmg.geofence.HMG_Geofence
import com.ejada.hmg.utils.PREFS_STORAGE
class GeofencingRebootBroadcastReceiver : BroadcastReceiver(){
override fun onReceive(context: Context, intent: Intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.action)) {
// if (intent.action.equals("android.intent.action.BOOT_COMPLETE")) {
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
pref.edit().putString("REBOOT_DETECTED","YES").apply()
HMG_Geofence.shared(context).register(){ status, error -> }
}
}
}
//
//
//package com.ejada.hmg.geofence.intent_receivers
//
//import android.content.BroadcastReceiver
//import android.content.Context
//import android.content.Intent
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.ejada.hmg.utils.PREFS_STORAGE
//
//class GeofencingRebootBroadcastReceiver : BroadcastReceiver(){
// override fun onReceive(context: Context, intent: Intent) {
//
// if (Intent.ACTION_BOOT_COMPLETED.equals(intent.action)) {
//// if (intent.action.equals("android.intent.action.BOOT_COMPLETE")) {
// val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// pref.edit().putString("REBOOT_DETECTED","YES").apply()
//
// HMG_Geofence.shared(context).register(){ status, error -> }
// }
// }
//
//}

@ -1,25 +1,25 @@
package com.ejada.hmg.geofence.intent_receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.location.LocationManager
import com.ejada.hmg.geofence.HMG_Geofence
import com.ejada.hmg.utils.HMGUtils
import com.ejada.hmg.utils.PREFS_STORAGE
class LocationProviderChangeReceiver : BroadcastReceiver() {
private val LOG_TAG = "LocationProviderChangeReceiver"
override fun onReceive(context: Context, intent: Intent) {
if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(intent.action)) {
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
pref.edit().putString("LOCATION_PROVIDER_CHANGE","YES").apply()
HMG_Geofence.shared(context).register(){ s, e -> }
}
}
}
//
//
//package com.ejada.hmg.geofence.intent_receivers
//
//import android.content.BroadcastReceiver
//import android.content.Context
//import android.content.Intent
//import android.location.LocationManager
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.ejada.hmg.utils.HMGUtils
//import com.ejada.hmg.utils.PREFS_STORAGE
//
//class LocationProviderChangeReceiver : BroadcastReceiver() {
// private val LOG_TAG = "LocationProviderChangeReceiver"
// override fun onReceive(context: Context, intent: Intent) {
//
// if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(intent.action)) {
// val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// pref.edit().putString("LOCATION_PROVIDER_CHANGE","YES").apply()
//
// HMG_Geofence.shared(context).register(){ s, e -> }
// }
// }
//
//}

@ -1,24 +1,24 @@
package com.ejada.hmg.geofence.intent_receivers
import android.app.job.JobParameters
import android.app.job.JobService
import com.ejada.hmg.geofence.HMG_Geofence
import com.ejada.hmg.utils.Logs
class ReregisterGeofenceJobService : JobService(){
companion object{
val TriggerIntervalDuration:String = "06:00:00"
val JobID = 918273
}
override fun onStartJob(params: JobParameters?): Boolean {
Logs.save(applicationContext,"ReregisterGeofenceJobService.onStartJob", "triggered to re-register the geofences after $TriggerIntervalDuration >> [HH:mm:ss]")
HMG_Geofence.shared(applicationContext).register(){ status, error ->
jobFinished(params, true)
}
return true
}
override fun onStopJob(params: JobParameters?): Boolean {
return true
}
}
//package com.ejada.hmg.geofence.intent_receivers
//
//import android.app.job.JobParameters
//import android.app.job.JobService
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.ejada.hmg.utils.Logs
//
//class ReregisterGeofenceJobService : JobService(){
// companion object{
// val TriggerIntervalDuration:String = "06:00:00"
// val JobID = 918273
// }
// override fun onStartJob(params: JobParameters?): Boolean {
// Logs.save(applicationContext,"ReregisterGeofenceJobService.onStartJob", "triggered to re-register the geofences after $TriggerIntervalDuration >> [HH:mm:ss]")
// HMG_Geofence.shared(applicationContext).register(){ status, error ->
// jobFinished(params, true)
// }
// return true
// }
//
// override fun onStopJob(params: JobParameters?): Boolean {
// return true
// }
//}

@ -1,257 +1,257 @@
package com.ejada.hmg.hmgwifi
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.net.*
import android.net.wifi.*
import android.os.Build
import android.os.PatternMatcher
import android.provider.Settings
import android.util.Log
import androidx.annotation.RequiresApi
import com.ejada.hmg.MainActivity
import com.ejada.hmg.utils.HMGUtils
class HMG_Guest(private var context: MainActivity, ssid: String) {
private val TAG = "HMG_Guest"
private val TEST = false
private var SSID = ssid
// private var SSID = "HMG-MOHEMM"
val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
private lateinit var completionListener: ((status: Boolean, message: String) -> Unit)
fun completionOnUiThread(status: Boolean, message: String){
completionListener(status, message)
}
fun enableWifi(){
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
wifiManager?.setWifiEnabled(true)
HMGUtils.popFlutterText(context,"enablingWifi");
HMGUtils.timer(2000,false){
connectApiLessThen29()
}
}else {
val panelIntent = Intent(Settings.Panel.ACTION_WIFI)
context.startActivityForResult(panelIntent, 1)
}
}
/*
* Helpful:
* http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically
*/
fun connectToHMGGuestNetwork(completion: (status: Boolean, message: String) -> Unit) {
completionListener = completion
wifiManager?.let { wm ->
if (!wm.isWifiEnabled){
enableWifi()
}else{
connectWifi()
}
}
}
private fun errorConnecting(){
completionOnUiThread(false, "errorConnectingHmgNetwork")
}
fun connectWifi(){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
connectApiGreaterThen28()
}else {
connectApiLessThen29()
}
}
// I }else{f CompileSDK is greater and equals to APILevel 29
@RequiresApi(Build.VERSION_CODES.Q)
private fun connectApiGreaterThen28(){
Log.e(TAG, "connection wifi with Android Q+")
val networkRequest: NetworkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) //removeCapability added for hotspots without internet
.setNetworkSpecifier(
WifiNetworkSpecifier.Builder()
.setSsid(SSID)
.build()
).build()
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
connectivityManager.bindProcessToNetwork(network)
HMGUtils.timer(2000,false){
completionListener(true, "Success")
}
Log.e(TAG, "onAvailable")
}
override fun onLosing(network: Network, maxMsToLive: Int) {
super.onLosing(network, maxMsToLive)
Log.e(TAG, "onLosing")
completionListener(false, "fail")
}
override fun onLost(network: Network) {
super.onLost(network)
Log.e(TAG, "onLosing")
Log.e(TAG, "losing active connection")
completionListener(false, "fail")
}
override fun onUnavailable() {
super.onUnavailable()
Log.e(TAG, "onUnavailable")
completionListener(false, "fail")
}
}
//timeout add because "No devices found" wasn't handled correct and doesn't throw Unavailable
connectivityManager.requestNetwork(networkRequest, networkCallback, 30000)
}
fun connectApiLessThen29(){
val wifi = WifiConfiguration()
wifi.SSID = """"$SSID""""
wifi.status = WifiConfiguration.Status.ENABLED
wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
wifi.networkId = ssidToNetworkId(wifi.SSID)
if (wifi.networkId == -1) {
wifiManager?.addNetwork(wifi)
} else {
Log.v(TAG, "WiFi found - updating it.\n")
wifiManager?.updateNetwork(wifi)
}
Log.v(TAG, "saving config.\n")
wifiManager?.saveConfiguration()
wifi.networkId = ssidToNetworkId(wifi.SSID)
Log.v(TAG, "wifi ID in device = " + wifi.networkId)
var supState: SupplicantState
val networkIdToConnect = wifi.networkId
if (networkIdToConnect >= 0) {
Log.v(TAG, "Start connecting...\n")
// We disable the network before connecting, because if this was the last connection before
// a disconnect(), this will not reconnect.
wifiManager?.disableNetwork(networkIdToConnect)
wifiManager?.enableNetwork(networkIdToConnect, true)
val wifiInfo: WifiInfo = wifiManager!!.connectionInfo
HMGUtils.timer(5000,false){
supState = wifiInfo.supplicantState
Log.i(TAG, "Done connect to network : status = $supState")
val successStates = listOf(SupplicantState.COMPLETED, SupplicantState.ASSOCIATED)
if (successStates.contains(supState))
completionListener(true,"Connected to internet Wifi")
else
completionListener(false,"errorConnectingHmgNetwork")
}
} else {
Log.v(TAG, "WifiWizard: cannot connect to network")
completionListener(false,"errorConnectingHmgNetwork")
}
// val wifi = WifiConfiguration()
// wifi.SSID = SSID
// wifi.status = WifiConfiguration.Status.ENABLED
// wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
//package sa.edu.kku.kkuMcApp.hmgwifi
//
//import android.annotation.SuppressLint
//import android.content.Context
//import android.content.Intent
//import android.net.*
//import android.net.wifi.*
//import android.os.Build
//import android.os.PatternMatcher
//import android.provider.Settings
//import android.util.Log
//import androidx.annotation.RequiresApi
//import sa.edu.kku.kkuMcApp.MainActivity
//import sa.edu.kku.kkuMcApp.utils.HMGUtils
//
//
//
//
//
//class HMG_Guest(private var context: MainActivity, ssid: String) {
// private val TAG = "HMG_Guest"
// private val TEST = false
// private var SSID = ssid
//// private var SSID = "HMG-MOHEMM"
//
// val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
//
// private lateinit var completionListener: ((status: Boolean, message: String) -> Unit)
//
// fun completionOnUiThread(status: Boolean, message: String){
// completionListener(status, message)
// }
//
// fun enableWifi(){
// if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
// wifiManager?.setWifiEnabled(true)
// HMGUtils.popFlutterText(context,"enablingWifi");
// HMGUtils.timer(2000,false){
// connectApiLessThen29()
// }
// }else {
// val panelIntent = Intent(Settings.Panel.ACTION_WIFI)
// context.startActivityForResult(panelIntent, 1)
// }
// }
// /*
// * Helpful:
// * http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically
// */
// fun connectToHMGGuestNetwork(completion: (status: Boolean, message: String) -> Unit) {
// completionListener = completion
// wifiManager?.let { wm ->
// if (!wm.isWifiEnabled){
// enableWifi()
// }else{
// connectWifi()
// }
// }
//
// }
//
// wifi.networkId = ssidToNetworkId(SSID)
// private fun errorConnecting(){
// completionOnUiThread(false, "errorConnectingHmgNetwork")
// }
//
// // Set network to highest priority (deprecated in API >= 26)
// if(Build.VERSION.SDK_INT < 26) {
// wifi.priority = getMaxWifiPriority(wifiManager!!) + 1;
// fun connectWifi(){
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
// connectApiGreaterThen28()
// }else {
// connectApiLessThen29()
// }
// }
//
// // I }else{f CompileSDK is greater and equals to APILevel 29
// @RequiresApi(Build.VERSION_CODES.Q)
// private fun connectApiGreaterThen28(){
// Log.e(TAG, "connection wifi with Android Q+")
//
// // After processing authentication types, add or update network
// if(wifi.networkId == -1) { // -1 means SSID configuration does not exist yet
// val networkRequest: NetworkRequest = NetworkRequest.Builder()
// .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
// .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
// .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) //removeCapability added for hotspots without internet
// .setNetworkSpecifier(
// WifiNetworkSpecifier.Builder()
// .setSsid(SSID)
// .build()
//
// val newNetId = wifiManager?.addNetwork(wifi)!!
// if( newNetId > -1 ){
// completionListener(true,"Success")
// } else {
// completionListener(false, "ERROR_ADDING_NETWORK" )
// ).build()
//
// val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
// val networkCallback = object : ConnectivityManager.NetworkCallback() {
// override fun onAvailable(network: Network) {
// super.onAvailable(network)
// connectivityManager.bindProcessToNetwork(network)
// HMGUtils.timer(2000,false){
// completionListener(true, "Success")
// }
// Log.e(TAG, "onAvailable")
// }
//
// override fun onLosing(network: Network, maxMsToLive: Int) {
// super.onLosing(network, maxMsToLive)
// Log.e(TAG, "onLosing")
// completionListener(false, "fail")
// }
//
// override fun onLost(network: Network) {
// super.onLost(network)
// Log.e(TAG, "onLosing")
// Log.e(TAG, "losing active connection")
// completionListener(false, "fail")
// }
//
// override fun onUnavailable() {
// super.onUnavailable()
// Log.e(TAG, "onUnavailable")
// completionListener(false, "fail")
// }
//
// }
//
// //timeout add because "No devices found" wasn't handled correct and doesn't throw Unavailable
// connectivityManager.requestNetwork(networkRequest, networkCallback, 30000)
// }
//
//
//
// fun connectApiLessThen29(){
// val wifi = WifiConfiguration()
// wifi.SSID = """"$SSID""""
// wifi.status = WifiConfiguration.Status.ENABLED
// wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
//
// wifi.networkId = ssidToNetworkId(wifi.SSID)
// if (wifi.networkId == -1) {
// wifiManager?.addNetwork(wifi)
// } else {
// Log.v(TAG, "WiFi found - updating it.\n")
// wifiManager?.updateNetwork(wifi)
// }
//
// Log.v(TAG, "saving config.\n")
// wifiManager?.saveConfiguration()
//
// wifi.networkId = ssidToNetworkId(wifi.SSID)
//
// var updatedNetID = wifiManager?.updateNetwork(wifi)
// Log.v(TAG, "wifi ID in device = " + wifi.networkId)
//
// if(updatedNetID == -1)
// updatedNetID = wifiManager?.addNetwork(wifi)
// var supState: SupplicantState
// val networkIdToConnect = wifi.networkId
// if (networkIdToConnect >= 0) {
// Log.v(TAG, "Start connecting...\n")
//
// if(updatedNetID > -1) {
// callbackContext.success( updatedNetID )
// } else {
// callbackContext.error("ERROR_UPDATING_NETWORK")
// // We disable the network before connecting, because if this was the last connection before
// // a disconnect(), this will not reconnect.
// wifiManager?.disableNetwork(networkIdToConnect)
// wifiManager?.enableNetwork(networkIdToConnect, true)
//
// val wifiInfo: WifiInfo = wifiManager!!.connectionInfo
//
// HMGUtils.timer(5000,false){
// supState = wifiInfo.supplicantState
// Log.i(TAG, "Done connect to network : status = $supState")
// val successStates = listOf(SupplicantState.COMPLETED, SupplicantState.ASSOCIATED)
// if (successStates.contains(supState))
// completionListener(true,"Connected to internet Wifi")
// else
// completionListener(false,"errorConnectingHmgNetwork")
// }
//
// } else {
// Log.v(TAG, "WifiWizard: cannot connect to network")
// completionListener(false,"errorConnectingHmgNetwork")
// }
//
// // WifiManager configurations are presistent for API 26+
// if(Build.VERSION.SDK_INT < 26) {
// wifiManager?.saveConfiguration(); // Call saveConfiguration for older < 26 API
//// val wifi = WifiConfiguration()
//// wifi.SSID = SSID
//// wifi.status = WifiConfiguration.Status.ENABLED
//// wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
////
//// wifi.networkId = ssidToNetworkId(SSID)
////
//// // Set network to highest priority (deprecated in API >= 26)
//// if(Build.VERSION.SDK_INT < 26) {
//// wifi.priority = getMaxWifiPriority(wifiManager!!) + 1;
//// }
////
//// // After processing authentication types, add or update network
//// if(wifi.networkId == -1) { // -1 means SSID configuration does not exist yet
////
//// val newNetId = wifiManager?.addNetwork(wifi)!!
//// if( newNetId > -1 ){
//// completionListener(true,"Success")
//// } else {
//// completionListener(false, "ERROR_ADDING_NETWORK" )
//// }
////
//// } else {
////
//// var updatedNetID = wifiManager?.updateNetwork(wifi)
////
//// if(updatedNetID == -1)
//// updatedNetID = wifiManager?.addNetwork(wifi)
////
//// if(updatedNetID > -1) {
//// callbackContext.success( updatedNetID )
//// } else {
//// callbackContext.error("ERROR_UPDATING_NETWORK")
//// }
////
//// }
////
//// // WifiManager configurations are presistent for API 26+
//// if(Build.VERSION.SDK_INT < 26) {
//// wifiManager?.saveConfiguration(); // Call saveConfiguration for older < 26 API
//// }
// }
//
//
// /**
// * This method takes a given String, searches the current list of configured WiFi
// * networks, and returns the networkId for the network if the SSID matches. If not,
// * it returns -1.
// */
// @SuppressLint("MissingPermission")
// private fun ssidToNetworkId(ssid: String): Int {
// val currentNetworks = wifiManager!!.configuredNetworks
// var networkId = -1
//
// // For each network in the list, compare the SSID with the given one
// for (test in currentNetworks) {
// if (test.SSID == ssid) {
// networkId = test.networkId
// break
// }
// }
// return networkId
// }
//
// companion object{
//
// /**
// * Figure out what the highest priority network in the network list is and return that priority
// */
// @RequiresApi(Build.VERSION_CODES.S)
// fun getMaxWifiPriority(wifiManager:WifiManager) : Int {
// val configurations = wifiManager.callerConfiguredNetworks
// var maxPriority = 0
// configurations.forEach {
// if (it.priority > maxPriority) {
// maxPriority = it.priority;
// }
// }
// return maxPriority;
// }
}
/**
* This method takes a given String, searches the current list of configured WiFi
* networks, and returns the networkId for the network if the SSID matches. If not,
* it returns -1.
*/
@SuppressLint("MissingPermission")
private fun ssidToNetworkId(ssid: String): Int {
val currentNetworks = wifiManager!!.configuredNetworks
var networkId = -1
// For each network in the list, compare the SSID with the given one
for (test in currentNetworks) {
if (test.SSID == ssid) {
networkId = test.networkId
break
}
}
return networkId
}
companion object{
/**
* Figure out what the highest priority network in the network list is and return that priority
*/
@RequiresApi(Build.VERSION_CODES.S)
fun getMaxWifiPriority(wifiManager:WifiManager) : Int {
val configurations = wifiManager.callerConfiguredNetworks
var maxPriority = 0
configurations.forEach {
if (it.priority > maxPriority) {
maxPriority = it.priority;
}
}
return maxPriority;
}
}
}
// }
//}

@ -1,120 +1,120 @@
package com.ejada.hmg.hmgwifi
import android.annotation.SuppressLint
import com.ejada.hmg.utils.API
import com.ejada.hmg.MainActivity
import com.github.kittinunf.fuel.core.extensions.jsonBody
import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.fuel.httpPost
import org.json.JSONObject
import java.util.*
@SuppressLint("MissingPermission")
class HMG_Internet(flutterMainActivity: MainActivity) {
private val TAG = "HMG_Wifi"
private val TEST = true
private var context = flutterMainActivity;
private lateinit var completionListener: ((status: Boolean, message: String) -> Unit)
private var SSID = "GUEST-POC"
fun completionOnUiThread(status: Boolean, message: String){
completionListener(status, message)
// context.runOnUiThread {
// .with(message){localized ->
// completionListener(status, localized)
// }
//package com.ejada.hmg.hmgwifi
//
//import android.annotation.SuppressLint
//import com.ejada.hmg.utils.API
//import com.ejada.hmg.MainActivity
//import com.github.kittinunf.fuel.core.extensions.jsonBody
//import com.github.kittinunf.fuel.httpGet
//import com.github.kittinunf.fuel.httpPost
//import org.json.JSONObject
//import java.util.*
//
//
//@SuppressLint("MissingPermission")
//class HMG_Internet(flutterMainActivity: MainActivity) {
// private val TAG = "HMG_Wifi"
// private val TEST = true
//
// private var context = flutterMainActivity;
//
// private lateinit var completionListener: ((status: Boolean, message: String) -> Unit)
//
// private var SSID = "GUEST-POC"
//
// fun completionOnUiThread(status: Boolean, message: String){
// completionListener(status, message)
//// context.runOnUiThread {
//// .with(message){localized ->
//// completionListener(status, localized)
//// }
//// }
// }
//
// /*
// * Helpful:
// * http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically
// */
// fun connectToHMGGuestNetwork(username: String, password: String, completion: (status: Boolean, message: String) -> Unit): HMG_Internet {
// completionListener = completion
// WpaEnterprise(context,SSID).connect(username,username) { status, message ->
// completionOnUiThread(status,message)
// }
}
/*
* Helpful:
* http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically
*/
fun connectToHMGGuestNetwork(username: String, password: String, completion: (status: Boolean, message: String) -> Unit): HMG_Internet {
completionListener = completion
WpaEnterprise(context,SSID).connect(username,username) { status, message ->
completionOnUiThread(status,message)
}
return this
}
private fun haveInternet(completion: ((status: Boolean) -> Unit)){
if (TEST)
completion(true)
"https://captive.apple.com".httpGet().response { request, response, result ->
result.fold(success = {
val html = String(it).toLowerCase(Locale.ENGLISH)
.replace(" ", "", true)
.replace("\n","",true)
val have = html.contains("<title>success</title>", true)
completion(have)
},failure = {
completion(false)
})
}
}
private fun getWifiCredentials(patientId:String, success: ((String?,String?) -> Unit)){
if (TEST){
SSID = "GUEST-POC"
success("2300", "0000")
return
}
val jsonBody = """{
"PatientID":$patientId
"VersionID": 8.8,
"Channel": 3,
"LanguageID": 2,
"IPAdress": "10.20.10.20",
"generalid": "Cs2020@2016$2958",
"PatientOutSA": 0,
"SessionID": "@admin",
"isDentalAllowedBackend": false,
"DeviceTypeID": 2,
"TokenID": "@admin",
"PatientTypeID": 1,
"PatientType": 1
}""".trimMargin()
API.WIFI_CREDENTIALS.
httpPost()
.jsonBody(jsonBody, Charsets.UTF_8)
.response { request, response, result ->
result.fold(success = { data ->
val jsonString = String(data)
val jsonObject = JSONObject(jsonString)
if(!jsonObject.getString("ErrorMessage").equals("null")){
val errorMsg = jsonObject.getString("ErrorMessage")
completionOnUiThread(false, errorMsg)
}else{
jsonObject.getJSONArray("Hmg_SMS_Get_By_ProjectID_And_PatientIDList").let { array ->
array.getJSONObject(0).let { object_ ->
if (object_.has("UserName") && object_.has("UserName")){
try {
val userName = object_.getString("UserName")
val password = object_.getString("Password")
success(userName, password)
}catch (e:Exception){
success(null, null)
}
}else{
completionOnUiThread(false, "somethingWentWrong")
}
}
}
}
},failure = { error ->
completionOnUiThread(false, "somethingWentWrong" )
})
}
}
}
// return this
// }
//
// private fun haveInternet(completion: ((status: Boolean) -> Unit)){
// if (TEST)
// completion(true)
//
// "https://captive.apple.com".httpGet().response { request, response, result ->
// result.fold(success = {
// val html = String(it).toLowerCase(Locale.ENGLISH)
// .replace(" ", "", true)
// .replace("\n","",true)
// val have = html.contains("<title>success</title>", true)
// completion(have)
//
// },failure = {
// completion(false)
// })
// }
// }
//
// private fun getWifiCredentials(patientId:String, success: ((String?,String?) -> Unit)){
// if (TEST){
// SSID = "GUEST-POC"
// success("2300", "0000")
// return
// }
//
// val jsonBody = """{
// "PatientID":$patientId
// "VersionID": 8.8,
// "Channel": 3,
// "LanguageID": 2,
// "IPAdress": "10.20.10.20",
// "generalid": "Cs2020@2016$2958",
// "PatientOutSA": 0,
// "SessionID": "@admin",
// "isDentalAllowedBackend": false,
// "DeviceTypeID": 2,
// "TokenID": "@admin",
// "PatientTypeID": 1,
// "PatientType": 1
// }""".trimMargin()
// API.WIFI_CREDENTIALS.
// httpPost()
// .jsonBody(jsonBody, Charsets.UTF_8)
// .response { request, response, result ->
//
// result.fold(success = { data ->
// val jsonString = String(data)
// val jsonObject = JSONObject(jsonString)
// if(!jsonObject.getString("ErrorMessage").equals("null")){
// val errorMsg = jsonObject.getString("ErrorMessage")
// completionOnUiThread(false, errorMsg)
//
// }else{
// jsonObject.getJSONArray("Hmg_SMS_Get_By_ProjectID_And_PatientIDList").let { array ->
// array.getJSONObject(0).let { object_ ->
// if (object_.has("UserName") && object_.has("UserName")){
// try {
// val userName = object_.getString("UserName")
// val password = object_.getString("Password")
// success(userName, password)
// }catch (e:Exception){
// success(null, null)
// }
// }else{
// completionOnUiThread(false, "somethingWentWrong")
// }
// }
// }
// }
//
// },failure = { error ->
// completionOnUiThread(false, "somethingWentWrong" )
// })
// }
// }
//}

@ -1,105 +1,105 @@
package com.ejada.hmg.hmgwifi
import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import android.net.wifi.*
import android.net.wifi.SupplicantState.ASSOCIATED
import android.net.wifi.SupplicantState.COMPLETED
import android.util.Log
import com.ejada.hmg.MainActivity
import com.ejada.hmg.utils.HMGUtils
class WPA(mainActivity: MainActivity, SSID:String) {
private var TAG = "WPA"
private var SSID = "GUEST-POC"
private var wifiManager_: WifiManager? = null
private var connectivityManager_: ConnectivityManager? = null
init {
wifiManager_ = mainActivity.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
connectivityManager_ = mainActivity.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
}
fun connect(identity:String, password:String, completion: (status: Boolean, message: String) -> Unit) {
if(wifiManager_ == null || connectivityManager_ == null){
completion(false,"errorConnectingHmgNetwork")
return
}
val wifiManager = wifiManager_!!
val connectivityManager = connectivityManager_!!
// Initialize the WifiConfiguration object
val enterpriseConfig = WifiEnterpriseConfig()
val wifi = WifiConfiguration()
wifi.SSID = """"$SSID""""
wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP)
wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X)
enterpriseConfig.eapMethod = WifiEnterpriseConfig.Eap.PEAP
enterpriseConfig.identity = identity
enterpriseConfig.password = password
wifi.enterpriseConfig = enterpriseConfig
wifi.networkId = ssidToNetworkId(wifi.SSID)
if (wifi.networkId == -1) {
wifiManager.addNetwork(wifi)
} else {
Log.v(TAG, "WiFi found - updating it.\n")
wifiManager.updateNetwork(wifi)
}
Log.v(TAG, "saving config.\n")
wifiManager.saveConfiguration()
wifi.networkId = ssidToNetworkId(wifi.SSID)
Log.v(TAG, "wifi ID in device = " + wifi.networkId)
var supState: SupplicantState
val networkIdToConnect = wifi.networkId
if (networkIdToConnect >= 0) {
Log.v(TAG, "Start connecting...\n")
// We disable the network before connecting, because if this was the last connection before
// a disconnect(), this will not reconnect.
wifiManager.disableNetwork(networkIdToConnect)
wifiManager.enableNetwork(networkIdToConnect, true)
val wifiInfo: WifiInfo = wifiManager.connectionInfo
HMGUtils.timer(5000,false){
supState = wifiInfo.supplicantState
Log.i(TAG, "WifiWizard: Done connect to network : status = $supState")
val successStates = listOf(COMPLETED, ASSOCIATED)
if (successStates.contains(COMPLETED /*supState*/))
completion(true,"Connected to internet Wifi")
else
completion(false,"errorConnectingHmgNetwork")
}
} else {
Log.v(TAG, "WifiWizard: cannot connect to network")
completion(false,"errorConnectingHmgNetwork")
}
}
/**
* This method takes a given String, searches the current list of configured WiFi
* networks, and returns the networkId for the network if the SSID matches. If not,
* it returns -1.
*/
@SuppressLint("MissingPermission")
private fun ssidToNetworkId(ssid: String): Int {
val currentNetworks = wifiManager_!!.configuredNetworks
var networkId = -1
// For each network in the list, compare the SSID with the given one
for (test in currentNetworks) {
if (test.SSID == ssid) {
networkId = test.networkId
break
}
}
return networkId
}
}
//package com.ejada.hmg.hmgwifi
//
//import android.annotation.SuppressLint
//import android.content.Context
//import android.net.ConnectivityManager
//import android.net.wifi.*
//import android.net.wifi.SupplicantState.ASSOCIATED
//import android.net.wifi.SupplicantState.COMPLETED
//import android.util.Log
//import com.ejada.hmg.MainActivity
//import com.ejada.hmg.utils.HMGUtils
//
//class WPA(mainActivity: MainActivity, SSID:String) {
// private var TAG = "WPA"
// private var SSID = "GUEST-POC"
// private var wifiManager_: WifiManager? = null
// private var connectivityManager_: ConnectivityManager? = null
//
// init {
// wifiManager_ = mainActivity.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
// connectivityManager_ = mainActivity.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
// }
//
// fun connect(identity:String, password:String, completion: (status: Boolean, message: String) -> Unit) {
// if(wifiManager_ == null || connectivityManager_ == null){
// completion(false,"errorConnectingHmgNetwork")
// return
// }
//
// val wifiManager = wifiManager_!!
// val connectivityManager = connectivityManager_!!
//
// // Initialize the WifiConfiguration object
// val enterpriseConfig = WifiEnterpriseConfig()
// val wifi = WifiConfiguration()
// wifi.SSID = """"$SSID""""
// wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP)
// wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X)
// enterpriseConfig.eapMethod = WifiEnterpriseConfig.Eap.PEAP
// enterpriseConfig.identity = identity
// enterpriseConfig.password = password
// wifi.enterpriseConfig = enterpriseConfig
// wifi.networkId = ssidToNetworkId(wifi.SSID)
// if (wifi.networkId == -1) {
// wifiManager.addNetwork(wifi)
// } else {
// Log.v(TAG, "WiFi found - updating it.\n")
// wifiManager.updateNetwork(wifi)
// }
// Log.v(TAG, "saving config.\n")
// wifiManager.saveConfiguration()
// wifi.networkId = ssidToNetworkId(wifi.SSID)
//
// Log.v(TAG, "wifi ID in device = " + wifi.networkId)
//
// var supState: SupplicantState
// val networkIdToConnect = wifi.networkId
// if (networkIdToConnect >= 0) {
// Log.v(TAG, "Start connecting...\n")
//
// // We disable the network before connecting, because if this was the last connection before
// // a disconnect(), this will not reconnect.
// wifiManager.disableNetwork(networkIdToConnect)
// wifiManager.enableNetwork(networkIdToConnect, true)
//
// val wifiInfo: WifiInfo = wifiManager.connectionInfo
//
// HMGUtils.timer(5000,false){
// supState = wifiInfo.supplicantState
// Log.i(TAG, "WifiWizard: Done connect to network : status = $supState")
// val successStates = listOf(COMPLETED, ASSOCIATED)
// if (successStates.contains(COMPLETED /*supState*/))
//
// completion(true,"Connected to internet Wifi")
//
// else
// completion(false,"errorConnectingHmgNetwork")
// }
//
// } else {
// Log.v(TAG, "WifiWizard: cannot connect to network")
// completion(false,"errorConnectingHmgNetwork")
// }
// }
//
// /**
// * This method takes a given String, searches the current list of configured WiFi
// * networks, and returns the networkId for the network if the SSID matches. If not,
// * it returns -1.
// */
// @SuppressLint("MissingPermission")
// private fun ssidToNetworkId(ssid: String): Int {
// val currentNetworks = wifiManager_!!.configuredNetworks
// var networkId = -1
//
// // For each network in the list, compare the SSID with the given one
// for (test in currentNetworks) {
// if (test.SSID == ssid) {
// networkId = test.networkId
// break
// }
// }
// return networkId
// }
//}

@ -1,166 +1,166 @@
package com.ejada.hmg.hmgwifi
import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.net.wifi.*
import android.net.wifi.SupplicantState.ASSOCIATED
import android.net.wifi.SupplicantState.COMPLETED
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import com.ejada.hmg.MainActivity
import com.ejada.hmg.utils.HMGUtils
import java.security.cert.X509Certificate
class WpaEnterprise(private val mainActivity: MainActivity, private var SSID: String) {
private var TAG = "WpaEnterprise"
private lateinit var identity:String
private lateinit var password:String
private lateinit var completion:((status: Boolean, message: String) -> Unit)
fun connect(identity:String, password:String, completion: (status: Boolean, message: String) -> Unit) {
this.password = password
this.identity = identity
this.completion = completion
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
apiGreaterThen28()
}else if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
apiLessThen29()
}
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
fun apiLessThen29(){
val wifiManager = mainActivity.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val wifi = WifiConfiguration()
wifi.SSID = """"$SSID""""
wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP)
wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X)
wifi.enterpriseConfig = enterpriseConfig()
wifi.networkId = ssidToNetworkId(wifi.SSID, wifiManager)
if (wifi.networkId == -1) {
wifiManager.addNetwork(wifi)
} else {
Log.v(TAG, "WiFi found - updating it.\n")
wifiManager.updateNetwork(wifi)
}
Log.v(TAG, "saving config.\n")
wifiManager.saveConfiguration()
wifi.networkId = ssidToNetworkId(wifi.SSID, wifiManager)
Log.v(TAG, "wifi ID in device = " + wifi.networkId)
var supState: SupplicantState
val networkIdToConnect = wifi.networkId
if (networkIdToConnect >= 0) {
Log.v(TAG, "Start connecting...\n")
// We disable the network before connecting, because if this was the last connection before
// a disconnect(), this will not reconnect.
wifiManager.disableNetwork(networkIdToConnect)
wifiManager.enableNetwork(networkIdToConnect, true)
val wifiInfo: WifiInfo = wifiManager.connectionInfo
HMGUtils.timer(5000,false){
supState = wifiInfo.supplicantState
Log.i(TAG, "Done connect to network : status = $supState")
val successStates = listOf(COMPLETED, ASSOCIATED)
if (successStates.contains(supState))
completion(true,"Connected to internet Wifi")
else
completion(false,"errorConnectingHmgNetwork")
}
} else {
Log.v(TAG, "WifiWizard: cannot connect to network")
completion(false,"errorConnectingHmgNetwork")
}
}
/**
* This method takes a given String, searches the current list of configured WiFi
* networks, and returns the networkId for the network if the SSID matches. If not,
* it returns -1.
*/
@SuppressLint("MissingPermission")
private fun ssidToNetworkId(ssid: String, wifiManager: WifiManager): Int {
val currentNetworks = wifiManager.configuredNetworks
var networkId = -1
// For each network in the list, compare the SSID with the given one
for (test in currentNetworks) {
if (test.SSID == ssid) {
networkId = test.networkId
break
}
}
return networkId
}
@RequiresApi(Build.VERSION_CODES.Q)
fun apiGreaterThen28(){
val connectivityManager = mainActivity.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
Log.e(TAG, "connection wifi with Android Q+")
val wifiNetworkSpecifier: WifiNetworkSpecifier = WifiNetworkSpecifier.Builder()
.setSsid(SSID)
.setWpa2EnterpriseConfig(enterpriseConfig())
.build()
val networkRequest: NetworkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifier)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) //removeCapability added for hotspots without internet
.build()
val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
connectivityManager.bindProcessToNetwork(network)
completion(true, "200")
Log.e(TAG, "onAvailable")
}
override fun onLosing(network: Network, maxMsToLive: Int) {
super.onLosing(network, maxMsToLive)
Log.e(TAG, "onLosing")
}
override fun onLost(network: Network) {
super.onLost(network)
Log.e(TAG, "onLosing")
Log.e(TAG, "losing active connection")
}
override fun onUnavailable() {
super.onUnavailable()
completion(false, "401")
Log.e(TAG, "onUnavailable")
}
}
//timeout add because "No devices found" wasn't handled correct and doesn't throw Unavailable
connectivityManager.requestNetwork(networkRequest, networkCallback, 30000)
}
fun enterpriseConfig() : WifiEnterpriseConfig{
// Initialize the WifiConfiguration object
val enterpriseConfig = WifiEnterpriseConfig()
enterpriseConfig.eapMethod = WifiEnterpriseConfig.Eap.PEAP
enterpriseConfig.identity = identity
enterpriseConfig.password = password
enterpriseConfig.phase2Method = WifiEnterpriseConfig.Phase2.NONE
// enterpriseConfig.caCertificates = WifiEnterpriseConfig.Phase2.
return enterpriseConfig;
}
}
//package com.ejada.hmg.hmgwifi
//
//import android.annotation.SuppressLint
//import android.content.Context
//import android.net.ConnectivityManager
//import android.net.Network
//import android.net.NetworkCapabilities
//import android.net.NetworkRequest
//import android.net.wifi.*
//import android.net.wifi.SupplicantState.ASSOCIATED
//import android.net.wifi.SupplicantState.COMPLETED
//import android.os.Build
//import android.util.Log
//import androidx.annotation.RequiresApi
//import com.ejada.hmg.MainActivity
//import com.ejada.hmg.utils.HMGUtils
//import java.security.cert.X509Certificate
//
//class WpaEnterprise(private val mainActivity: MainActivity, private var SSID: String) {
// private var TAG = "WpaEnterprise"
//
// private lateinit var identity:String
// private lateinit var password:String
// private lateinit var completion:((status: Boolean, message: String) -> Unit)
//
// fun connect(identity:String, password:String, completion: (status: Boolean, message: String) -> Unit) {
// this.password = password
// this.identity = identity
// this.completion = completion
//
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
// apiGreaterThen28()
// }else if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
// apiLessThen29()
// }
// }
//
// @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
// fun apiLessThen29(){
// val wifiManager = mainActivity.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
//
// val wifi = WifiConfiguration()
// wifi.SSID = """"$SSID""""
// wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP)
// wifi.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X)
// wifi.enterpriseConfig = enterpriseConfig()
// wifi.networkId = ssidToNetworkId(wifi.SSID, wifiManager)
// if (wifi.networkId == -1) {
// wifiManager.addNetwork(wifi)
// } else {
// Log.v(TAG, "WiFi found - updating it.\n")
// wifiManager.updateNetwork(wifi)
// }
// Log.v(TAG, "saving config.\n")
// wifiManager.saveConfiguration()
// wifi.networkId = ssidToNetworkId(wifi.SSID, wifiManager)
//
// Log.v(TAG, "wifi ID in device = " + wifi.networkId)
//
// var supState: SupplicantState
// val networkIdToConnect = wifi.networkId
// if (networkIdToConnect >= 0) {
// Log.v(TAG, "Start connecting...\n")
//
// // We disable the network before connecting, because if this was the last connection before
// // a disconnect(), this will not reconnect.
// wifiManager.disableNetwork(networkIdToConnect)
// wifiManager.enableNetwork(networkIdToConnect, true)
//
// val wifiInfo: WifiInfo = wifiManager.connectionInfo
//
// HMGUtils.timer(5000,false){
// supState = wifiInfo.supplicantState
// Log.i(TAG, "Done connect to network : status = $supState")
// val successStates = listOf(COMPLETED, ASSOCIATED)
// if (successStates.contains(supState))
// completion(true,"Connected to internet Wifi")
// else
// completion(false,"errorConnectingHmgNetwork")
// }
//
// } else {
// Log.v(TAG, "WifiWizard: cannot connect to network")
// completion(false,"errorConnectingHmgNetwork")
// }
// }
//
// /**
// * This method takes a given String, searches the current list of configured WiFi
// * networks, and returns the networkId for the network if the SSID matches. If not,
// * it returns -1.
// */
// @SuppressLint("MissingPermission")
// private fun ssidToNetworkId(ssid: String, wifiManager: WifiManager): Int {
// val currentNetworks = wifiManager.configuredNetworks
// var networkId = -1
// // For each network in the list, compare the SSID with the given one
// for (test in currentNetworks) {
// if (test.SSID == ssid) {
// networkId = test.networkId
// break
// }
// }
// return networkId
// }
//
//
// @RequiresApi(Build.VERSION_CODES.Q)
// fun apiGreaterThen28(){
// val connectivityManager = mainActivity.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
//
// Log.e(TAG, "connection wifi with Android Q+")
// val wifiNetworkSpecifier: WifiNetworkSpecifier = WifiNetworkSpecifier.Builder()
// .setSsid(SSID)
// .setWpa2EnterpriseConfig(enterpriseConfig())
// .build()
//
// val networkRequest: NetworkRequest = NetworkRequest.Builder()
// .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
// .setNetworkSpecifier(wifiNetworkSpecifier)
// .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) //removeCapability added for hotspots without internet
// .build()
//
// val networkCallback = object : ConnectivityManager.NetworkCallback() {
// override fun onAvailable(network: Network) {
// super.onAvailable(network)
// connectivityManager.bindProcessToNetwork(network)
// completion(true, "200")
// Log.e(TAG, "onAvailable")
// }
//
// override fun onLosing(network: Network, maxMsToLive: Int) {
// super.onLosing(network, maxMsToLive)
// Log.e(TAG, "onLosing")
// }
//
// override fun onLost(network: Network) {
// super.onLost(network)
// Log.e(TAG, "onLosing")
// Log.e(TAG, "losing active connection")
// }
//
// override fun onUnavailable() {
// super.onUnavailable()
// completion(false, "401")
// Log.e(TAG, "onUnavailable")
// }
//
// }
//
// //timeout add because "No devices found" wasn't handled correct and doesn't throw Unavailable
// connectivityManager.requestNetwork(networkRequest, networkCallback, 30000)
// }
//
// fun enterpriseConfig() : WifiEnterpriseConfig{
// // Initialize the WifiConfiguration object
// val enterpriseConfig = WifiEnterpriseConfig()
// enterpriseConfig.eapMethod = WifiEnterpriseConfig.Eap.PEAP
// enterpriseConfig.identity = identity
// enterpriseConfig.password = password
// enterpriseConfig.phase2Method = WifiEnterpriseConfig.Phase2.NONE
//// enterpriseConfig.caCertificates = WifiEnterpriseConfig.Phase2.
// return enterpriseConfig;
// }
//
//}

@ -6,7 +6,8 @@ import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import com.ejada.hmg.R
//import com.ejada.hmg.R
import sa.edu.kku.kkuMcApp.R
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory

@ -6,7 +6,8 @@ import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import com.ejada.hmg.R
//import com.ejada.hmg.R
import sa.edu.kku.kkuMcApp.R
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory

@ -1,36 +1,36 @@
package com.ejada.hmg.utils
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.Result
class FlutterText{
companion object{
fun with(key:String, completion:(String)->Unit){
HMGUtils.getPlatformChannel().invokeMethod("localizedValue",key, object:MethodChannel.Result{
override fun success(result: Any?) {
val localized = result as String?
if (localized != null){
completion(localized)
}else{
completion(key)
}
}
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
completion(key)
require(false){
"'localizedValue' $errorMessage"
}
}
override fun notImplemented() {
require(false){
"'localizedValue' method not implemented at flutter"
}
}
})
}
}
}
//package com.ejada.hmg.utils
//
//import io.flutter.plugin.common.MethodChannel
//import io.flutter.plugin.common.MethodChannel.Result
//
//class FlutterText{
//
// companion object{
// fun with(key:String, completion:(String)->Unit){
// HMGUtils.getPlatformChannel().invokeMethod("localizedValue",key, object:MethodChannel.Result{
// override fun success(result: Any?) {
// val localized = result as String?
// if (localized != null){
// completion(localized)
// }else{
// completion(key)
// }
// }
//
// override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
// completion(key)
// require(false){
// "'localizedValue' $errorMessage"
// }
// }
//
// override fun notImplemented() {
// require(false){
// "'localizedValue' method not implemented at flutter"
// }
// }
//
// })
// }
// }
//}

@ -1,223 +1,224 @@
package com.ejada.hmg.utils
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.job.JobInfo
import android.app.job.JobScheduler
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.os.Build
import android.widget.Toast
import androidx.annotation.Nullable
import androidx.core.app.NotificationCompat
import androidx.core.app.TaskStackBuilder
import com.ejada.hmg.BuildConfig
import com.ejada.hmg.MainActivity
import com.ejada.hmg.R
import com.ejada.hmg.geofence.GeoZoneModel
import com.github.kittinunf.fuel.core.extensions.jsonBody
import com.github.kittinunf.fuel.httpPost
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import io.flutter.plugin.common.MethodChannel
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import java.text.SimpleDateFormat
import java.util.*
import kotlin.concurrent.timerTask
class HMGUtils {
companion object{
private lateinit var platformChannel: MethodChannel
fun getPlatformChannel():MethodChannel{
return platformChannel
}
fun setPlatformChannel(channel: MethodChannel){
platformChannel = channel
}
fun timer(delay: Long, repeat: Boolean, tick: (Timer) -> Unit) : Timer{
val timer = Timer()
if(repeat)
timer.schedule(timerTask {
tick(timer)
}, delay, delay)
else
timer.schedule(timerTask {
tick(timer)
}, delay)
return timer
}
fun popMessage(context: MainActivity, message: String){
context.runOnUiThread {
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
}
}
fun popFlutterText(context: MainActivity, key: String){
context.runOnUiThread {
FlutterText.with(key){
Toast.makeText(context, it, Toast.LENGTH_LONG).show()
}
}
}
fun getLanguageCode(context: Context) : Int {
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
val lang = pref.getString(PREF_KEY_LANGUAGE, "ar")
return if (lang == "ar") 2 else 1
}
fun defaultHTTPParams(context: Context) : Map<String, Any?>{
return mapOf(
"ZipCode" to "966",
"VersionID" to 5.8,
"Channel" to 3,
"LanguageID" to getLanguageCode(context),
"IPAdress" to "10.20.10.20",
"generalid" to "Cs2020@2016$2958",
"PatientOutSA" to 0,
"SessionID" to null,
"isDentalAllowedBackend" to false,
"DeviceTypeID" to 2)
}
fun <T>scheduleJob(context: Context, pendingIntentClassType:Class<T>, jobId:Int, intervalDuration:String, deadlineMillis:Long = (30 * 1000)) { // default deadline: 30 Seconds
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
val jobScheduler: JobScheduler = context.getSystemService(JobScheduler::class.java)
val serviceComponent = ComponentName(context, pendingIntentClassType)
val builder = JobInfo.Builder(jobId, serviceComponent)
builder.setPersisted(true)
builder.setBackoffCriteria(30000, JobInfo.BACKOFF_POLICY_LINEAR)
val intervalMillis = timeToMillis(intervalDuration,"HH:mm:ss")
builder.setMinimumLatency(intervalMillis) // wait at least
builder.setOverrideDeadline((intervalMillis + deadlineMillis)) // maximum delay
if (jobScheduler.schedule(builder.build()) == JobScheduler.RESULT_SUCCESS){
Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Job scheduled to trigger after duration $intervalDuration >> HH:mm:ss --('MinimumLatency:$intervalMillis Deadline:${(intervalMillis + deadlineMillis)}')--",Logs.STATUS.SUCCESS)
}else{
Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job",Logs.STATUS.ERROR)
}
} else {
Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job on VERSION.SDK_INT < ${android.os.Build.VERSION_CODES.M}",Logs.STATUS.ERROR)
}
}
}
}
private const val NOTIFICATION_CHANNEL_ID = BuildConfig.APPLICATION_ID + ".channel"
fun timeToMillis(time:String, format:String):Long{
val sdf = SimpleDateFormat(format, Locale.US)
val millis = sdf.parse(time).time + TimeZone.getDefault().rawOffset
return millis
}
fun sendNotification(context: Context, title: String, @Nullable subtitle: String?, message: String?) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
&& notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) == null) {
val name = context.getString(R.string.app_name)
val channel = NotificationChannel(NOTIFICATION_CHANNEL_ID,
name,
NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
}
val intent = Intent(context, MainActivity::class.java)
val stackBuilder = TaskStackBuilder.create(context)
.addParentStack(MainActivity::class.java)
.addNextIntent(intent)
val notificationPendingIntent = stackBuilder.getPendingIntent(getUniqueId(), PendingIntent.FLAG_UPDATE_CURRENT)
val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(notificationPendingIntent)
.setAutoCancel(true)
.setContentTitle(title)
subtitle.let { notification.setContentText(it) }
message.let { notification.setSubText(it) }
notificationManager.notify(getUniqueId(), notification.build())
}
//-------------------------
// Open Helper Methods
//-------------------------
fun getUniqueId() = ((System.currentTimeMillis() % 10000).toInt())
object DateUtils {
@JvmStatic
fun dateTimeNow() : String {
val format = SimpleDateFormat("dd-MMM-yyy hh:mm:ss")
return format.format(Date())
}
}
fun isJSONValid(jsonString: String?): Boolean {
try { JSONObject(jsonString) } catch (ex: JSONException) {
try { JSONArray(jsonString) } catch (ex1: JSONException) {
return false
}
}
return true
}
fun saveLog(context: Context, tag: String, message: String){
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
var logs = pref.getString("LOGS", "")
logs += "$tag -> $message \n"
pref.edit().putString("LOGS", logs).apply();
}
fun getLogs(context: Context) : String?{
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
return pref.getString("LOGS", "")
}
class HTTPResponse<T>(data: T){
final var data:T = data
}
fun <T>httpPost(url: String, body: Map<String, Any?>, onSuccess: (response: HTTPResponse<T>) -> Unit, onError: (error: Exception) -> Unit){
val gson = Gson()
val type = object : TypeToken<T>() {}.type
val jsonBody = gson.toJson(body)
url.httpPost()
.jsonBody(jsonBody, Charsets.UTF_8)
.timeout(10000)
.header("Content-Type", "application/json")
.header("Allow", "*/*")
.response { request, response, result ->
result.fold({ data ->
val dataString = String(data)
if (isJSONValid(dataString)) {
val responseData = gson.fromJson<T>(dataString, type)
onSuccess(HTTPResponse(responseData))
} else {
onError(Exception("Invalid response from server (Not a valid JSON)"))
}
}, {
onError(it)
})
}
}
//package com.ejada.hmg.utils
//
//import android.app.NotificationChannel
//import android.app.NotificationManager
//import android.app.PendingIntent
//import android.app.job.JobInfo
//import android.app.job.JobScheduler
//import android.content.ComponentName
//import android.content.Context
//import android.content.Intent
//import android.os.Build
//import android.widget.Toast
//import androidx.annotation.Nullable
//import androidx.core.app.NotificationCompat
//import androidx.core.app.TaskStackBuilder
////import com.ejada.hmg.BuildConfig
//import sa.edu.kku.kkuMcApp.BuildConfig
//import com.ejada.hmg.MainActivity
//import sa.edu.kku.kkuMcApp.R
//import com.ejada.hmg.geofence.GeoZoneModel
//import com.github.kittinunf.fuel.core.extensions.jsonBody
//import com.github.kittinunf.fuel.httpPost
//import com.google.gson.Gson
//import com.google.gson.reflect.TypeToken
//import io.flutter.plugin.common.MethodChannel
//import org.json.JSONArray
//import org.json.JSONException
//import org.json.JSONObject
//import java.text.SimpleDateFormat
//import java.util.*
//import kotlin.concurrent.timerTask
//
//
//class HMGUtils {
//
// companion object{
// private lateinit var platformChannel: MethodChannel
// fun getPlatformChannel():MethodChannel{
// return platformChannel
// }
// fun setPlatformChannel(channel: MethodChannel){
// platformChannel = channel
// }
//
// fun timer(delay: Long, repeat: Boolean, tick: (Timer) -> Unit) : Timer{
// val timer = Timer()
// if(repeat)
// timer.schedule(timerTask {
// tick(timer)
// }, delay, delay)
// else
// timer.schedule(timerTask {
// tick(timer)
// }, delay)
//
// return timer
// }
//
// fun popMessage(context: MainActivity, message: String){
// context.runOnUiThread {
// Toast.makeText(context, message, Toast.LENGTH_LONG).show()
// }
// }
//
// fun popFlutterText(context: MainActivity, key: String){
// context.runOnUiThread {
// FlutterText.with(key){
// Toast.makeText(context, it, Toast.LENGTH_LONG).show()
// }
// }
// }
//
// fun getLanguageCode(context: Context) : Int {
// val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// val lang = pref.getString(PREF_KEY_LANGUAGE, "ar")
// return if (lang == "ar") 2 else 1
// }
//
// fun defaultHTTPParams(context: Context) : Map<String, Any?>{
// return mapOf(
// "ZipCode" to "966",
// "VersionID" to 5.8,
// "Channel" to 3,
// "LanguageID" to getLanguageCode(context),
// "IPAdress" to "10.20.10.20",
// "generalid" to "Cs2020@2016$2958",
// "PatientOutSA" to 0,
// "SessionID" to null,
// "isDentalAllowedBackend" to false,
// "DeviceTypeID" to 2)
// }
//
//
// fun <T>scheduleJob(context: Context, pendingIntentClassType:Class<T>, jobId:Int, intervalDuration:String, deadlineMillis:Long = (30 * 1000)) { // default deadline: 30 Seconds
// if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
// val jobScheduler: JobScheduler = context.getSystemService(JobScheduler::class.java)
//
// val serviceComponent = ComponentName(context, pendingIntentClassType)
// val builder = JobInfo.Builder(jobId, serviceComponent)
// builder.setPersisted(true)
// builder.setBackoffCriteria(30000, JobInfo.BACKOFF_POLICY_LINEAR)
//
// val intervalMillis = timeToMillis(intervalDuration,"HH:mm:ss")
// builder.setMinimumLatency(intervalMillis) // wait at least
// builder.setOverrideDeadline((intervalMillis + deadlineMillis)) // maximum delay
// if (jobScheduler.schedule(builder.build()) == JobScheduler.RESULT_SUCCESS){
// Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Job scheduled to trigger after duration $intervalDuration >> HH:mm:ss --('MinimumLatency:$intervalMillis Deadline:${(intervalMillis + deadlineMillis)}')--",Logs.STATUS.SUCCESS)
// }else{
// Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job",Logs.STATUS.ERROR)
// }
//
// } else {
// Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job on VERSION.SDK_INT < ${android.os.Build.VERSION_CODES.M}",Logs.STATUS.ERROR)
// }
// }
//
// }
//
//}
//
//
//private const val NOTIFICATION_CHANNEL_ID = BuildConfig.APPLICATION_ID + ".channel"
//
//
//fun timeToMillis(time:String, format:String):Long{
// val sdf = SimpleDateFormat(format, Locale.US)
// val millis = sdf.parse(time).time + TimeZone.getDefault().rawOffset
// return millis
//}
//
//fun sendNotification(context: Context, title: String, @Nullable subtitle: String?, message: String?) {
// val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
// && notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) == null) {
// val name = context.getString(R.string.app_name)
// val channel = NotificationChannel(NOTIFICATION_CHANNEL_ID,
// name,
// NotificationManager.IMPORTANCE_DEFAULT)
//
// notificationManager.createNotificationChannel(channel)
// }
//
// val intent = Intent(context, MainActivity::class.java)
//
// val stackBuilder = TaskStackBuilder.create(context)
// .addParentStack(MainActivity::class.java)
// .addNextIntent(intent)
// val notificationPendingIntent = stackBuilder.getPendingIntent(getUniqueId(), PendingIntent.FLAG_UPDATE_CURRENT)
//
// val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
// .setSmallIcon(R.mipmap.ic_launcher)
// .setContentIntent(notificationPendingIntent)
// .setAutoCancel(true)
// .setContentTitle(title)
//
// subtitle.let { notification.setContentText(it) }
// message.let { notification.setSubText(it) }
//
// notificationManager.notify(getUniqueId(), notification.build())
//}
//
////-------------------------
//// Open Helper Methods
////-------------------------
//fun getUniqueId() = ((System.currentTimeMillis() % 10000).toInt())
//
//object DateUtils {
// @JvmStatic
// fun dateTimeNow() : String {
// val format = SimpleDateFormat("dd-MMM-yyy hh:mm:ss")
// return format.format(Date())
// }
//}
//
//fun isJSONValid(jsonString: String?): Boolean {
// try { JSONObject(jsonString) } catch (ex: JSONException) {
// try { JSONArray(jsonString) } catch (ex1: JSONException) {
// return false
// }
// }
// return true
//}
//
//fun saveLog(context: Context, tag: String, message: String){
// val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// var logs = pref.getString("LOGS", "")
// logs += "$tag -> $message \n"
// pref.edit().putString("LOGS", logs).apply();
//}
//
//fun getLogs(context: Context) : String?{
// val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// return pref.getString("LOGS", "")
//}
//
//class HTTPResponse<T>(data: T){
// final var data:T = data
//}
//
//fun <T>httpPost(url: String, body: Map<String, Any?>, onSuccess: (response: HTTPResponse<T>) -> Unit, onError: (error: Exception) -> Unit){
// val gson = Gson()
// val type = object : TypeToken<T>() {}.type
// val jsonBody = gson.toJson(body)
// url.httpPost()
// .jsonBody(jsonBody, Charsets.UTF_8)
// .timeout(10000)
// .header("Content-Type", "application/json")
// .header("Allow", "*/*")
// .response { request, response, result ->
// result.fold({ data ->
// val dataString = String(data)
// if (isJSONValid(dataString)) {
// val responseData = gson.fromJson<T>(dataString, type)
// onSuccess(HTTPResponse(responseData))
// } else {
// onError(Exception("Invalid response from server (Not a valid JSON)"))
// }
// }, {
// onError(it)
// })
//
// }
//}

@ -1,145 +1,146 @@
package com.ejada.hmg.utils
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import com.ejada.hmg.BuildConfig
import com.google.gson.Gson
class Logs {
enum class STATUS{
SUCCESS,
ERROR;
}
class GeofenceEvent{
companion object{
fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
Logs.Common.save(context,"GeofenceEvent", tag, message, status)
}
fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
return Logs.Common.list(context,"GeofenceEvent", tag, status)
}
fun raw(context: Context):String{
return Logs.Common.raw(context,"GeofenceEvent")
}
}
}
class RegisterGeofence{
companion object{
fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
Logs.Common.save(context,"RegisterGeofence", tag, message, status)
}
fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
return Logs.Common.list(context,"RegisterGeofence", tag, status)
}
fun raw(context: Context):String{
return Logs.Common.raw(context,"RegisterGeofence");
}
}
}
companion object{
private var pref:SharedPreferences? = null
fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
Logs.Common.save(context,"Logs", tag, message, status)
}
fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
return Logs.Common.list(context,"Logs", tag, status)
}
fun raw(context: Context):String{
return Logs.Common.raw(context,"Logs");
}
private fun storage(context: Context):SharedPreferences{
if(pref == null) {
pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
}
return pref!!
}
}
private class Common{
companion object{
private val gson = Gson()
fun save(context: Context, key:String, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
if(!BuildConfig.DEBUG)
return
val pref = Logs.storage(context)
val string = pref.getString(key,"{}")
val json = gson.fromJson<LogsContainerModel>(string,LogsContainerModel::class.java)
json.add(
LogModel().apply {
this.TAG = tag
this.MESSAGE = message
this.STATUS = status.name
this.DATE = DateUtils.dateTimeNow()
}
)
pref.edit().putString(key,gson.toJson(json)).apply()
}
fun list(context: Context, key:String, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
val pref = Logs.storage(context)
val string = pref.getString(key,"{}")
val json = gson.fromJson<LogsContainerModel>(string,LogsContainerModel::class.java)
if(tag == null && status == null) {
return json.LOGS
}else if(tag != null && status != null){
return json.LOGS.filter { (it.TAG == tag && it.STATUS == status.name) }
}else if(tag != null){
return json.LOGS.filter { (it.TAG == tag) }
}else if(status != null){
return json.LOGS.filter { (it.STATUS == status.name) }
}
return listOf()
}
fun raw(context: Context, key:String):String{
val pref = Logs.storage(context)
val string = pref.getString(key,"{}")
return string!!
}
}
}
class LogModel{
lateinit var TAG:String
lateinit var MESSAGE:String
lateinit var STATUS:String
lateinit var DATE:String
companion object{
fun with(tag:String, message:String, status:String):LogModel{
return LogModel().apply {
this.TAG = tag
this.MESSAGE = message
this.STATUS = status
this.DATE = DateUtils.dateTimeNow()
}
}
}
}
class LogsContainerModel{
var LOGS = mutableListOf<LogModel>()
fun add(log:LogModel){
LOGS.add(log)
}
}
}
//package com.ejada.hmg.utils
//
//import android.content.Context
//import android.content.SharedPreferences
//import android.os.Build
////import com.ejada.hmg.BuildConfig
//import sa.edu.kku.kkuMcApp.BuildConfig
//import com.google.gson.Gson
//
//class Logs {
//
// enum class STATUS{
// SUCCESS,
// ERROR;
// }
// class GeofenceEvent{
// companion object{
// fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
// Logs.Common.save(context,"GeofenceEvent", tag, message, status)
// }
//
// fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
// return Logs.Common.list(context,"GeofenceEvent", tag, status)
// }
//
// fun raw(context: Context):String{
// return Logs.Common.raw(context,"GeofenceEvent")
// }
// }
// }
//
// class RegisterGeofence{
// companion object{
// fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
// Logs.Common.save(context,"RegisterGeofence", tag, message, status)
// }
//
// fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
// return Logs.Common.list(context,"RegisterGeofence", tag, status)
// }
//
// fun raw(context: Context):String{
// return Logs.Common.raw(context,"RegisterGeofence");
// }
// }
// }
//
//
// companion object{
// private var pref:SharedPreferences? = null
// fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
// Logs.Common.save(context,"Logs", tag, message, status)
// }
//
// fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
// return Logs.Common.list(context,"Logs", tag, status)
// }
//
// fun raw(context: Context):String{
// return Logs.Common.raw(context,"Logs");
// }
//
// private fun storage(context: Context):SharedPreferences{
// if(pref == null) {
// pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
// }
// return pref!!
// }
// }
//
// private class Common{
// companion object{
// private val gson = Gson()
//
// fun save(context: Context, key:String, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
// if(!BuildConfig.DEBUG)
// return
//
// val pref = Logs.storage(context)
//
// val string = pref.getString(key,"{}")
// val json = gson.fromJson<LogsContainerModel>(string,LogsContainerModel::class.java)
// json.add(
// LogModel().apply {
// this.TAG = tag
// this.MESSAGE = message
// this.STATUS = status.name
// this.DATE = DateUtils.dateTimeNow()
// }
// )
//
// pref.edit().putString(key,gson.toJson(json)).apply()
// }
//
// fun list(context: Context, key:String, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
// val pref = Logs.storage(context)
// val string = pref.getString(key,"{}")
// val json = gson.fromJson<LogsContainerModel>(string,LogsContainerModel::class.java)
// if(tag == null && status == null) {
// return json.LOGS
// }else if(tag != null && status != null){
// return json.LOGS.filter { (it.TAG == tag && it.STATUS == status.name) }
// }else if(tag != null){
// return json.LOGS.filter { (it.TAG == tag) }
// }else if(status != null){
// return json.LOGS.filter { (it.STATUS == status.name) }
// }
// return listOf()
// }
//
// fun raw(context: Context, key:String):String{
// val pref = Logs.storage(context)
// val string = pref.getString(key,"{}")
// return string!!
// }
//
// }
// }
//
// class LogModel{
// lateinit var TAG:String
// lateinit var MESSAGE:String
// lateinit var STATUS:String
// lateinit var DATE:String
//
// companion object{
// fun with(tag:String, message:String, status:String):LogModel{
// return LogModel().apply {
// this.TAG = tag
// this.MESSAGE = message
// this.STATUS = status
// this.DATE = DateUtils.dateTimeNow()
// }
// }
// }
// }
//
// class LogsContainerModel{
// var LOGS = mutableListOf<LogModel>()
// fun add(log:LogModel){
// LOGS.add(log)
// }
// }
//
//
//}

@ -1,45 +1,45 @@
package com.ejada.hmg.utils
import com.ejada.hmg.MainActivity
import com.ejada.hmg.opentok.OpenTok
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
class OpenTokPlatformBridge(private var flutterEngine: FlutterEngine, private var mainActivity: MainActivity) {
private lateinit var channel: MethodChannel
private lateinit var openTok: OpenTok
companion object {
private const val CHANNEL = "OpenTok-Platform-Bridge"
}
fun create(){
openTok = OpenTok(mainActivity, flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
when (call.method) {
"initSession" -> {
openTok.initSession(call, result)
}
"swapCamera" -> {
openTok.swapCamera(call, result)
}
"toggleAudio" -> {
openTok.toggleAudio(call, result)
}
"toggleVideo" -> {
openTok.toggleVideo(call, result)
}
"hangupCall" -> {
openTok.hangupCall(call, result)
}
else -> {
result.notImplemented()
}
}
}
}
}
//package com.ejada.hmg.utils
//
//import com.ejada.hmg.MainActivity
//import com.ejada.hmg.opentok.OpenTok
//import io.flutter.embedding.engine.FlutterEngine
//import io.flutter.plugin.common.MethodCall
//import io.flutter.plugin.common.MethodChannel
//
//class OpenTokPlatformBridge(private var flutterEngine: FlutterEngine, private var mainActivity: MainActivity) {
//
// private lateinit var channel: MethodChannel
// private lateinit var openTok: OpenTok
//
// companion object {
// private const val CHANNEL = "OpenTok-Platform-Bridge"
// }
//
// fun create(){
// openTok = OpenTok(mainActivity, flutterEngine)
// channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
// channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
// when (call.method) {
// "initSession" -> {
// openTok.initSession(call, result)
// }
// "swapCamera" -> {
// openTok.swapCamera(call, result)
// }
// "toggleAudio" -> {
// openTok.toggleAudio(call, result)
// }
// "toggleVideo" -> {
// openTok.toggleVideo(call, result)
// }
// "hangupCall" -> {
// openTok.hangupCall(call, result)
// }
// else -> {
// result.notImplemented()
// }
// }
// }
// }
//
//}

@ -1,199 +1,199 @@
package com.ejada.hmg.utils
import android.content.Context
import android.content.Intent
import android.content.Intent.getIntent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.widget.Toast
import androidx.core.app.ActivityCompat.startActivityForResult
import android.net.wifi.WifiManager
import android.util.Log
import com.ejada.hmg.MainActivity
import com.ejada.hmg.hmgwifi.HMG_Guest
import com.ejada.hmg.geofence.GeoZoneModel
import com.ejada.hmg.geofence.HMG_Geofence
import com.ejada.hmg.hmgwifi.WpaEnterprise
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
class PlatformBridge(private var flutterEngine: FlutterEngine, private var mainActivity: MainActivity) {
private lateinit var channel: MethodChannel
companion object {
private const val CHANNEL = "HMG-Platform-Bridge"
private const val HMG_INTERNET_WIFI_CONNECT_METHOD = "connectHMGInternetWifi"
private const val HMG_GUEST_WIFI_CONNECT_METHOD = "connectHMGGuestWifi"
private const val ENABLE_WIFI_IF_NOT = "enableWifiIfNot"
private const val REGISTER_HMG_GEOFENCES = "registerHmgGeofences"
private const val UN_REGISTER_HMG_GEOFENCES = "unRegisterHmgGeofences"
private const val IS_DRAW_OVER_APPS_PERMISSION_ALLOWED = "isDrawOverAppsPermissionAllowed"
private const val ASK_DRAW_OVER_APPS_PERMISSION = "askDrawOverAppsPermission"
private const val GET_INTENT = "getIntent"
}
fun create() {
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
HMGUtils.setPlatformChannel(channel)
channel.setMethodCallHandler { methodCall: MethodCall, result: MethodChannel.Result ->
if (methodCall.method == HMG_INTERNET_WIFI_CONNECT_METHOD) {
connectHMGInternetWifi(methodCall, result)
} else if (methodCall.method == HMG_GUEST_WIFI_CONNECT_METHOD) {
connectHMGGuestWifi(methodCall, result)
} else if (methodCall.method == ENABLE_WIFI_IF_NOT) {
enableWifiIfNot(methodCall, result)
} else if (methodCall.method == REGISTER_HMG_GEOFENCES) {
registerHmgGeofences(methodCall, result)
} else if (methodCall.method == UN_REGISTER_HMG_GEOFENCES) {
unRegisterHmgGeofences(methodCall, result)
} else if (methodCall.method == IS_DRAW_OVER_APPS_PERMISSION_ALLOWED) {
isDrawOverAppsPermissionAllowed(methodCall, result)
} else if (methodCall.method == ASK_DRAW_OVER_APPS_PERMISSION) {
askDrawOverAppsPermission(methodCall, result)
} else if (methodCall.method == GET_INTENT) {
getIntentData(methodCall, result)
} else {
result.notImplemented()
}
}
val res = channel.invokeMethod("localizedValue", "errorConnectingHmgNetwork")
}
private fun connectHMGInternetWifi(methodCall: MethodCall, result: MethodChannel.Result) {
(methodCall.arguments as ArrayList<*>).let {
require(it.size == 3 && (it[0] is String) && (it[1] is String), lazyMessage = {
"Missing or invalid arguments (Must have three argument of 'String'"
})
val ssid = it[0].toString()
val username = it[1].toString()
val password = it[2].toString()
WpaEnterprise(mainActivity,ssid).connect(username,password) { status, message ->
HMGUtils.timer(2000,false){
mainActivity.runOnUiThread {
if(status)
result.success(if (status) 1 else 0)
else
result.error(message, null, null)
}
}
}
// HMG_Internet(mainActivity)
// .connectToHMGGuestNetwork(username, password) { status, message ->
// mainActivity.runOnUiThread {
// result.success(if (status) 1 else 0)
//package com.ejada.hmg.utils
//
//import android.content.Context
//import android.content.Intent
//import android.content.Intent.getIntent
//import android.net.Uri
//import android.os.Build
//import android.os.Bundle
//import android.provider.Settings
//import android.widget.Toast
//import androidx.core.app.ActivityCompat.startActivityForResult
//import android.net.wifi.WifiManager
//import android.util.Log
//import com.ejada.hmg.MainActivity
//import com.ejada.hmg.hmgwifi.HMG_Guest
//import com.ejada.hmg.geofence.GeoZoneModel
//import com.ejada.hmg.geofence.HMG_Geofence
//import com.ejada.hmg.hmgwifi.WpaEnterprise
//import io.flutter.embedding.engine.FlutterEngine
//import io.flutter.plugin.common.MethodCall
//import io.flutter.plugin.common.MethodChannel
//
//class PlatformBridge(private var flutterEngine: FlutterEngine, private var mainActivity: MainActivity) {
//
// private lateinit var channel: MethodChannel
//
// companion object {
// private const val CHANNEL = "HMG-Platform-Bridge"
// private const val HMG_INTERNET_WIFI_CONNECT_METHOD = "connectHMGInternetWifi"
// private const val HMG_GUEST_WIFI_CONNECT_METHOD = "connectHMGGuestWifi"
// private const val ENABLE_WIFI_IF_NOT = "enableWifiIfNot"
// private const val REGISTER_HMG_GEOFENCES = "registerHmgGeofences"
// private const val UN_REGISTER_HMG_GEOFENCES = "unRegisterHmgGeofences"
// private const val IS_DRAW_OVER_APPS_PERMISSION_ALLOWED = "isDrawOverAppsPermissionAllowed"
// private const val ASK_DRAW_OVER_APPS_PERMISSION = "askDrawOverAppsPermission"
// private const val GET_INTENT = "getIntent"
// }
//
// fun create() {
// channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
// HMGUtils.setPlatformChannel(channel)
// channel.setMethodCallHandler { methodCall: MethodCall, result: MethodChannel.Result ->
//
// if (methodCall.method == HMG_INTERNET_WIFI_CONNECT_METHOD) {
// connectHMGInternetWifi(methodCall, result)
//
// } else if (methodCall.method == HMG_GUEST_WIFI_CONNECT_METHOD) {
// connectHMGGuestWifi(methodCall, result)
//
// HMGUtils.popFlutterText(mainActivity, message)
// Log.v(this.javaClass.simpleName, "$status | $message")
// }
// } else if (methodCall.method == ENABLE_WIFI_IF_NOT) {
// enableWifiIfNot(methodCall, result)
// } else if (methodCall.method == REGISTER_HMG_GEOFENCES) {
// registerHmgGeofences(methodCall, result)
// } else if (methodCall.method == UN_REGISTER_HMG_GEOFENCES) {
// unRegisterHmgGeofences(methodCall, result)
// } else if (methodCall.method == IS_DRAW_OVER_APPS_PERMISSION_ALLOWED) {
// isDrawOverAppsPermissionAllowed(methodCall, result)
// } else if (methodCall.method == ASK_DRAW_OVER_APPS_PERMISSION) {
// askDrawOverAppsPermission(methodCall, result)
// } else if (methodCall.method == GET_INTENT) {
// getIntentData(methodCall, result)
// } else {
// result.notImplemented()
// }
//
// }
//
// val res = channel.invokeMethod("localizedValue", "errorConnectingHmgNetwork")
//
// }
//
// private fun connectHMGInternetWifi(methodCall: MethodCall, result: MethodChannel.Result) {
// (methodCall.arguments as ArrayList<*>).let {
// require(it.size == 3 && (it[0] is String) && (it[1] is String), lazyMessage = {
// "Missing or invalid arguments (Must have three argument of 'String'"
// })
//
// val ssid = it[0].toString()
// val username = it[1].toString()
// val password = it[2].toString()
//
// WpaEnterprise(mainActivity,ssid).connect(username,password) { status, message ->
// HMGUtils.timer(2000,false){
// mainActivity.runOnUiThread {
// if(status)
// result.success(if (status) 1 else 0)
// else
// result.error(message, null, null)
// }
}
}
private fun connectHMGGuestWifi(methodCall: MethodCall, result: MethodChannel.Result) {
(methodCall.arguments as ArrayList<*>).let {
require(it.size == 1 && (it[0] is String), lazyMessage = {
"Missing or invalid arguments (Must have one argument 'String at 0'"
})
val ssid = it[0].toString()
HMG_Guest(mainActivity, ssid).connectToHMGGuestNetwork { status, message ->
mainActivity.runOnUiThread {
result.success(if (status) 1 else 0)
HMGUtils.popFlutterText(mainActivity, message)
Log.v(this.javaClass.simpleName, "$status | $message")
}
}
}
}
private fun enableWifiIfNot(methodCall: MethodCall, result: MethodChannel.Result) {
val wm = mainActivity.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
if (wm != null) {
if (!wm.isWifiEnabled)
wm.isWifiEnabled = true
result.success(true)
} else
result.error("101", "Error while opening wifi, Please try to open wifi yourself and try again", "'WifiManager' service failed");
}
private fun registerHmgGeofences(methodCall: MethodCall, result: MethodChannel.Result) {
channel.invokeMethod("getGeoZones", null, object : MethodChannel.Result {
override fun success(result: Any?) {
if (result is String) {
val geoZones = GeoZoneModel().listFrom(result)
HMG_Geofence.shared(mainActivity).register() { s, e -> }
}
}
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {}
override fun notImplemented() {}
})
}
private fun unRegisterHmgGeofences(methodCall: MethodCall, result: MethodChannel.Result) {
HMG_Geofence.shared(mainActivity).unRegisterAll { status, exception ->
if (status)
result.success(true)
else
result.error("101", exception?.localizedMessage, exception);
}
}
private fun isDrawOverAppsPermissionAllowed(methodCall: MethodCall, result: MethodChannel.Result) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (
Settings.canDrawOverlays(mainActivity)
) {
result.success(true)
} else {
result.success(false)
}
} else {
result.success(false)
}
}
private fun askDrawOverAppsPermission(methodCall: MethodCall, result: MethodChannel.Result) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
val uri = Uri.parse("package:" + mainActivity.getPackageName())
intent.setData(uri)
startActivityForResult(mainActivity, intent, 102, null)
result.success(true)
} else {
result.success(false)
}
}
private fun getIntentData(methodCall: MethodCall, result: MethodChannel.Result) {
val bundle: Bundle? = getIntent("").extras
if (bundle != null) {
val message = bundle.getString("notification") // 1
System.out.println("BundleExtra:" + message)
Toast.makeText(this.mainActivity, message + "", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this.mainActivity, "Bundle Null", Toast.LENGTH_SHORT).show();
}
result.success(true);
}
}
// }
// }
//
//// HMG_Internet(mainActivity)
//// .connectToHMGGuestNetwork(username, password) { status, message ->
//// mainActivity.runOnUiThread {
//// result.success(if (status) 1 else 0)
////
//// HMGUtils.popFlutterText(mainActivity, message)
//// Log.v(this.javaClass.simpleName, "$status | $message")
//// }
////
//// }
// }
// }
//
//
// private fun connectHMGGuestWifi(methodCall: MethodCall, result: MethodChannel.Result) {
// (methodCall.arguments as ArrayList<*>).let {
// require(it.size == 1 && (it[0] is String), lazyMessage = {
// "Missing or invalid arguments (Must have one argument 'String at 0'"
// })
//
// val ssid = it[0].toString()
// HMG_Guest(mainActivity, ssid).connectToHMGGuestNetwork { status, message ->
// mainActivity.runOnUiThread {
// result.success(if (status) 1 else 0)
//
// HMGUtils.popFlutterText(mainActivity, message)
// Log.v(this.javaClass.simpleName, "$status | $message")
// }
// }
// }
// }
//
// private fun enableWifiIfNot(methodCall: MethodCall, result: MethodChannel.Result) {
// val wm = mainActivity.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
// if (wm != null) {
// if (!wm.isWifiEnabled)
// wm.isWifiEnabled = true
// result.success(true)
// } else
// result.error("101", "Error while opening wifi, Please try to open wifi yourself and try again", "'WifiManager' service failed");
// }
//
//
// private fun registerHmgGeofences(methodCall: MethodCall, result: MethodChannel.Result) {
//
// channel.invokeMethod("getGeoZones", null, object : MethodChannel.Result {
// override fun success(result: Any?) {
// if (result is String) {
// val geoZones = GeoZoneModel().listFrom(result)
// HMG_Geofence.shared(mainActivity).register() { s, e -> }
// }
// }
//
// override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {}
// override fun notImplemented() {}
// })
//
// }
//
// private fun unRegisterHmgGeofences(methodCall: MethodCall, result: MethodChannel.Result) {
// HMG_Geofence.shared(mainActivity).unRegisterAll { status, exception ->
// if (status)
// result.success(true)
// else
// result.error("101", exception?.localizedMessage, exception);
// }
// }
//
// private fun isDrawOverAppsPermissionAllowed(methodCall: MethodCall, result: MethodChannel.Result) {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// if (
// Settings.canDrawOverlays(mainActivity)
// ) {
// result.success(true)
// } else {
// result.success(false)
// }
// } else {
// result.success(false)
// }
// }
//
// private fun askDrawOverAppsPermission(methodCall: MethodCall, result: MethodChannel.Result) {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
// val uri = Uri.parse("package:" + mainActivity.getPackageName())
// intent.setData(uri)
// startActivityForResult(mainActivity, intent, 102, null)
// result.success(true)
// } else {
// result.success(false)
// }
// }
//
// private fun getIntentData(methodCall: MethodCall, result: MethodChannel.Result) {
//
// val bundle: Bundle? = getIntent("").extras
// if (bundle != null) {
// val message = bundle.getString("notification") // 1
// System.out.println("BundleExtra:" + message)
// Toast.makeText(this.mainActivity, message + "", Toast.LENGTH_SHORT).show()
// } else {
// Toast.makeText(this.mainActivity, "Bundle Null", Toast.LENGTH_SHORT).show();
// }
// result.success(true);
// }
//}

@ -13,7 +13,7 @@ buildscript {
google()
// jcenter()
mavenCentral()
maven { url 'https://developer.huawei.com/repo/' }
// maven { url 'https://developer.huawei.com/repo/' }
// maven {
// url "https://dl.bintray.com/kotlin/kotlin-eap/"
@ -25,7 +25,7 @@ buildscript {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.8'
// classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'
classpath 'com.huawei.agconnect:agcp:1.5.2.300'
// classpath 'com.huawei.agconnect:agcp:1.5.2.300'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12'
}
}

@ -1,39 +1,26 @@
{
"project_info": {
"project_number": "815750722565",
"firebase_url": "https://api-project-815750722565.firebaseio.com",
"project_id": "api-project-815750722565",
"storage_bucket": "api-project-815750722565.appspot.com"
"project_number": "218653915217",
"project_id": "kkumc-e0903",
"storage_bucket": "kkumc-e0903.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063",
"mobilesdk_app_id": "1:218653915217:android:28ffffcec5fbf67c896070",
"android_client_info": {
"package_name": "com.ejada.hmg"
"package_name": "sa.edu.kku.kkuMcApp"
}
},
"oauth_client": [
{
"client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com",
"client_type": 3
}
],
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw"
"current_key": "AIzaSyCcN2iDIOH8X7yOikH95cZqyMqA9Kgc8P0"
}
],
"services": {
"analytics_service": {
"status": 1
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
}

@ -2,24 +2,18 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt</string>
<key>ANDROID_CLIENT_ID</key>
<string>815750722565-m14h8mkosm7cnq6uh6rhqr54dn02d705.apps.googleusercontent.com</string>
<key>API_KEY</key>
<string>AIzaSyDiXnCO00li4V7Ioa2YZ_M4ECxRsu_P9tA</string>
<string>AIzaSyCRDdv-9_QSpBM2SokbO5zxQsLDsy-z10s</string>
<key>GCM_SENDER_ID</key>
<string>815750722565</string>
<string>218653915217</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.HMG.HMG-Smartphone</string>
<string>sa.edu.kku.kkuMcApp</string>
<key>PROJECT_ID</key>
<string>api-project-815750722565</string>
<string>kkumc-e0903</string>
<key>STORAGE_BUCKET</key>
<string>api-project-815750722565.appspot.com</string>
<string>kkumc-e0903.firebasestorage.app</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
@ -31,8 +25,6 @@
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:815750722565:ios:328ec247a81a2ca23c186c</string>
<key>DATABASE_URL</key>
<string>https://api-project-815750722565.firebaseio.com</string>
<string>1:218653915217:ios:de051163e0381558896070</string>
</dict>
</plist>

@ -44,9 +44,9 @@ post_install do |installer|
build_configuration.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
'PERMISSION_LOCATION=1',
'PERMISSION_CAMERA=1',
'PERMISSION_MICROPHONE=1',
# 'PERMISSION_LOCATION=1',
# 'PERMISSION_CAMERA=1',
# 'PERMISSION_MICROPHONE=1',
## dart: PermissionGroup.calendar
'PERMISSION_EVENTS_FULL_ACCESS=1',
## dart: PermissionGroup.reminders
@ -60,7 +60,7 @@ post_install do |installer|
File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
if build_configuration.build_settings['WRAPPER_EXTENSION'] == 'bundle'
build_configuration.build_settings['DEVELOPMENT_TEAM'] = '3A359E86ZF'
build_configuration.build_settings['DEVELOPMENT_TEAM'] = '686M4Y8589'
end
end
end

@ -533,13 +533,14 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 3A359E86ZF;
DEVELOPMENT_TEAM = 686M4Y8589;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = KKUMC;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@ -549,8 +550,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 4.5.93;
PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone";
MARKETING_VERSION = 0.1;
PRODUCT_BUNDLE_IDENTIFIER = sa.edu.kku.kkuMcApp;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
@ -680,13 +681,14 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 3A359E86ZF;
DEVELOPMENT_TEAM = 686M4Y8589;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = KKUMC;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@ -696,8 +698,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 4.5.93;
PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone";
MARKETING_VERSION = 0.1;
PRODUCT_BUNDLE_IDENTIFIER = sa.edu.kku.kkuMcApp;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_COMPILATION_MODE = singlefile;
@ -718,13 +720,14 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 3A359E86ZF;
DEVELOPMENT_TEAM = 686M4Y8589;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = KKUMC;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@ -734,8 +737,8 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 4.5.93;
PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone";
MARKETING_VERSION = 0.1;
PRODUCT_BUNDLE_IDENTIFIER = sa.edu.kku.kkuMcApp;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";

@ -2,37 +2,29 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt</string>
<key>ANDROID_CLIENT_ID</key>
<string>815750722565-m14h8mkosm7cnq6uh6rhqr54dn02d705.apps.googleusercontent.com</string>
<key>API_KEY</key>
<string>AIzaSyDiXnCO00li4V7Ioa2YZ_M4ECxRsu_P9tA</string>
<string>AIzaSyCRDdv-9_QSpBM2SokbO5zxQsLDsy-z10s</string>
<key>GCM_SENDER_ID</key>
<string>815750722565</string>
<string>218653915217</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.HMG.HMG-Smartphone</string>
<string>sa.edu.kku.kkuMcApp</string>
<key>PROJECT_ID</key>
<string>api-project-815750722565</string>
<string>kkumc-e0903</string>
<key>STORAGE_BUCKET</key>
<string>api-project-815750722565.appspot.com</string>
<string>kkumc-e0903.firebasestorage.app</string>
<key>IS_ADS_ENABLED</key>
<false/>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false/>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true/>
<true></true>
<key>IS_GCM_ENABLED</key>
<true/>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true/>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:815750722565:ios:328ec247a81a2ca23c186c</string>
<key>DATABASE_URL</key>
<string>https://api-project-815750722565.firebaseio.com</string>
<string>1:218653915217:ios:de051163e0381558896070</string>
</dict>
</plist>
</plist>

@ -13,7 +13,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>King Khalid University</string>
<string>KKUH</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
@ -57,12 +57,12 @@
<string>This App requires access to Bluetooth to connect blood pressure &amp; blood sugar devices with the app to analyze the data.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>This App requires access to Bluetooth to connect blood pressure &amp; blood sugar devices with the app to analyze the data.</string>
<key>NSCalendarsFullAccessUsageDescription</key>
<string>This app requires calendar access to set reminders for Virtual &amp; Normal Appointments.</string>
<key>NSCalendarsUsageDescription</key>
<string>This app requires calendar access to set reminders for Virtual &amp; Normal Appointments.</string>
<key>NSCalendarsWriteOnlyAccessUsageDescription</key>
<string>This app requires calendar access to set reminders for Virtual &amp; Normal Appointments.</string>
<key>NSCalendarsFullAccessUsageDescription</key>
<string>This app requires calendar access to set reminders for Virtual &amp; Normal Appointments.</string>
<key>NSCameraUsageDescription</key>
<string>This app requires camera access to enable virtual consultation between patient &amp; doctor</string>
<key>NSContactsUsageDescription</key>
@ -91,13 +91,13 @@
<string>This app requires speech recognition access to access voice command features.</string>
<key>NSUserActivityTypes</key>
<array/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>fetch</string>
<string>location</string>
<string>remote-notification</string>
<string>voip</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
@ -118,7 +118,5 @@
<false/>
<key>io.flutter.embedded_views_preview</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

@ -4,16 +4,6 @@
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.healthkit</key>
<true/>
<key>com.apple.developer.healthkit.access</key>
<array/>
<key>com.apple.developer.in-app-payments</key>
<array>
<string>merchant.com.hmgwebsersives</string>
<string>merchant.com.hmgwebservices.uat</string>
<string>merchant.com.hmgwebservices</string>
</array>
<key>com.apple.developer.networking.HotspotConfiguration</key>
<true/>
<key>com.apple.developer.networking.wifi-info</key>
@ -22,9 +12,5 @@
<array>
<string>TAG</string>
</array>
<key>com.apple.developer.pass-type-identifiers</key>
<array>
<string>$(TeamIdentifierPrefix)*</string>
</array>
</dict>
</plist>

@ -1,4 +1,4 @@
storePassword=HmGsa123
keyPassword=HmGsa123
storePassword=KKUH54321
keyPassword=KKUH54321
keyAlias=key
storeFile=DQKey.jks
storeFile=Patient_App_KKUH_KeyStore

@ -443,14 +443,14 @@ class BaseAppClient {
if (parsed['Response_Message'] != null) {
onSuccess!(parsed, statusCode);
} else {
if (parsed['ErrorType'] == 4) {
navigateToAppUpdate(
AppGlobal.context, parsed['ErrorEndUserMessage']);
logApiEndpointError(
endPoint,
parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
statusCode);
}
// if (parsed['ErrorType'] == 4) {
// navigateToAppUpdate(
// AppGlobal.context, parsed['ErrorEndUserMessage']);
// logApiEndpointError(
// endPoint,
// parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
// statusCode);
// }
if (isAllowAny) {
onSuccess!(parsed, statusCode);
} else if (parsed['IsAuthenticated'] == null) {

@ -60,7 +60,7 @@ class RadiologyDetailsPage extends StatelessWidget {
finalRadiology!.doctorRate,
finalRadiology!.actualDoctorRate,
finalRadiology!.noOfPatientsRate,
projectViewModel.user.emailAddress!,
projectViewModel.user.emailAddress ?? "unknown@unknown.com",
),
onTap: () {
showConfirmMessage(finalRadiology: finalRadiology!, model: model, userObj: projectViewModel.user!);

@ -125,8 +125,10 @@ class DoctorsListService extends BaseService {
"gender": authUser.gender != null ? authUser.gender : 0,
"age": authUser.age != null ? authUser.age : 0,
"IsGetNearAppointment": false,
"Latitude": lat == null ? 0.0 : lat,
"Longitude": long == null ? 0.0 : long,
// "Latitude": lat == null ? 0.0 : lat,
// "Longitude": long == null ? 0.0 : long,
"Latitude": 0.0,
"Longitude": 0.0,
"LanguageID": languageID,
"License": true
};

@ -64,7 +64,7 @@ class _LaboratoryResultWidgetState extends State<LaboratoryResultWidget> {
widget.patientLabOrder!.doctorRate!,
widget.patientLabOrder!.actualDoctorRate!,
widget.patientLabOrder!.noOfPatientsRate!,
projectViewModel.user.emailAddress!),
projectViewModel.user.emailAddress ?? "unknown@unknown.com"),
onTap: widget.onTap!,
),
SizedBox(height: 10),

Loading…
Cancel
Save