diff --git a/android/app/build.gradle b/android/app/build.gradle index c656f247..92b87fbc 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -85,6 +85,7 @@ dependencies { implementation 'com.github.kittinunf.fuel:fuel:2.3.0' //for JVM implementation 'com.github.kittinunf.fuel:fuel-android:2.3.0' //for Android + implementation 'com.wang.avi:library:2.1.3' // Dependency on a remote binary // implementation 'com.example.android:app-magic:12.3' diff --git a/android/app/src/main/java/com/cloud/diplomaticquarterapp/BaseActivity.kt b/android/app/src/main/java/com/cloud/diplomaticquarterapp/BaseActivity.kt new file mode 100644 index 00000000..5790abf6 --- /dev/null +++ b/android/app/src/main/java/com/cloud/diplomaticquarterapp/BaseActivity.kt @@ -0,0 +1,51 @@ +package com.cloud.diplomaticquarterapp + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.widget.RelativeLayout +import android.widget.TextView +import com.cloud.diplomaticquarterapp.utils.PlatformBridge +import com.wang.avi.AVLoadingIndicatorView +import io.flutter.embedding.android.FlutterView +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.plugin.common.MethodChannel +import io.flutter.view.FlutterMain +import org.jetbrains.anko.find +import java.util.ArrayList + +open class BaseActivity : AppCompatActivity() { + + lateinit var loadingView:RelativeLayout + lateinit var lblLoadingView:TextView + lateinit var avLoadingView:AVLoadingIndicatorView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + + override fun setContentView(layoutResID: Int) { + super.setContentView(layoutResID) + + loadingView = find(R.id.loadingView) + lblLoadingView = find(R.id.lblLoadingView) + avLoadingView = find(R.id.avLoadingView) + } + + override fun onResume() { + super.onResume() + } + + override fun onPause() { + super.onPause() + } + + override fun onStop() { + super.onStop() + } + + override fun onDestroy() { + super.onDestroy() + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/cloud/diplomaticquarterapp/FlutterMainActivity.kt b/android/app/src/main/java/com/cloud/diplomaticquarterapp/FlutterMainActivity.kt index b984835f..387c35a4 100644 --- a/android/app/src/main/java/com/cloud/diplomaticquarterapp/FlutterMainActivity.kt +++ b/android/app/src/main/java/com/cloud/diplomaticquarterapp/FlutterMainActivity.kt @@ -11,16 +11,17 @@ import io.flutter.plugin.common.MethodChannel import io.flutter.view.FlutterMain import java.util.ArrayList -class FlutterMainActivity : AppCompatActivity() { +class FlutterMainActivity : BaseActivity() { - private lateinit var channel: MethodChannel private var flutterView: FlutterView? = null companion object { private var flutterEngine: FlutterEngine? = null - private const val CHANNEL = "HMG-Platform-Bridge" - private const val METHOD_CONNECT_WIFI = "connectHMGGuestWifi" - private const val METHOD_SHOW_LOADING = "loading" + + private lateinit var instance:FlutterMainActivity + fun getInstance() : FlutterMainActivity{ + return instance + } } @@ -72,6 +73,7 @@ class FlutterMainActivity : AppCompatActivity() { override fun onResume() { super.onResume() flutterEngine!!.lifecycleChannel.appIsResumed() + instance = this } override fun onPause() { diff --git a/android/app/src/main/java/com/cloud/diplomaticquarterapp/hmgwifi/HMG_Wifi.kt b/android/app/src/main/java/com/cloud/diplomaticquarterapp/hmgwifi/HMG_Wifi.kt new file mode 100644 index 00000000..e594cc83 --- /dev/null +++ b/android/app/src/main/java/com/cloud/diplomaticquarterapp/hmgwifi/HMG_Wifi.kt @@ -0,0 +1,99 @@ +package com.cloud.diplomaticquarterapp.hmgwifi + +import android.annotation.SuppressLint +import android.util.Log +import com.cloud.diplomaticquarterapp.API +import com.cloud.diplomaticquarterapp.FlutterMainActivity +import com.github.kittinunf.fuel.Fuel +import com.github.kittinunf.fuel.core.extensions.jsonBody +import com.github.kittinunf.fuel.httpGet +import com.github.kittinunf.fuel.httpPost +import org.jetbrains.anko.doAsync +import org.json.JSONObject + + +@SuppressLint("MissingPermission") +class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { + 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" + private var USER_NAME = "" + private var PASSWORD = "" + + fun completionOnUiThread(status: Boolean, message: String){ + context.runOnUiThread { + completionListener(status, message) + } + } + + /* + * Helpful: + * http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically + */ + fun connectToHMGGuestNetwork(patientId: String, completion: (status: Boolean, message: String) -> Unit): HMG_Wifi { + completionListener = completion + getWifiCredentials(patientId) { + WPA(context,SSID).connect(USER_NAME,PASSWORD) { 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 -> + val have = response.statusCode == 200 && String(response.data).contains("Success", true) + completion(have) + } + } + + private fun getWifiCredentials(patientId:String, completion: (() -> Unit)){ +// if (TEST){ +// SSID = "GUEST-POC" +// USER_NAME = "0696" +// PASSWORD = "0000" +// completion() +// return +// } + + val jsonBody = """{"PatientID":$patientId}""" + 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")){ + USER_NAME = object_.getString("UserName") + PASSWORD = object_.getString("Password") + completion() + }else{ + completionOnUiThread(false, "Failed to get your internet credentials") + } + } + } + } + + },failure = { error -> + completionOnUiThread(false, error.localizedMessage ) + }) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/cloud/diplomaticquarterapp/hmgwifi/WPA.kt b/android/app/src/main/java/com/cloud/diplomaticquarterapp/hmgwifi/WPA.kt new file mode 100644 index 00000000..18bfc1a7 --- /dev/null +++ b/android/app/src/main/java/com/cloud/diplomaticquarterapp/hmgwifi/WPA.kt @@ -0,0 +1,98 @@ +package com.cloud.diplomaticquarterapp.hmgwifi + +import android.content.Context +import android.net.ConnectivityManager +import android.net.wifi.* +import android.util.Log +import com.cloud.diplomaticquarterapp.FlutterMainActivity +import com.cloud.diplomaticquarterapp.utils.HMGUtils + +class WPA(mainActivity: FlutterMainActivity, 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, "Failed to access system connectivity services") + 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") + if (supState == SupplicantState.COMPLETED) + completion(true,"Connected to Wifi") + else + completion(false,"Failed to connect with HMG network") + } + + } else { + Log.v(TAG, "WifiWizard: cannot connect to network") + completion(false,"Failed to connect to Wifi") + } + } + + /** + * 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. + */ + 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 + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMGUtils.kt b/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMGUtils.kt new file mode 100644 index 00000000..71488c1d --- /dev/null +++ b/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMGUtils.kt @@ -0,0 +1,51 @@ +package com.cloud.diplomaticquarterapp.utils + +import android.opengl.Visibility +import android.view.View +import android.widget.Toast +import com.cloud.diplomaticquarterapp.BaseActivity +import java.util.* +import kotlin.concurrent.timerTask + +class HMGUtils { + + companion object{ + 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 showLoading(context: BaseActivity, show:Boolean = true, message:String = "Please wait"){ + if(show){ + context.loadingView.visibility = View.VISIBLE + context.avLoadingView.smoothToShow() + context.lblLoadingView.text = message + }else{ + context.loadingView.visibility = View.GONE + context.avLoadingView.smoothToHide() + context.lblLoadingView.text = "" + } + + } + + fun showMessage(context:BaseActivity, title:String = "", message:String){ + Toast.makeText(context,message,Toast.LENGTH_LONG).show() + } + + } + +} + +private fun Timer.schedule(timerTask: TimerTask) { + +} diff --git a/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMG_Wifi.kt b/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMG_Wifi_.kt similarity index 76% rename from android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMG_Wifi.kt rename to android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMG_Wifi_.kt index 5e43fafd..9bb6196e 100644 --- a/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMG_Wifi.kt +++ b/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/HMG_Wifi_.kt @@ -3,6 +3,9 @@ package com.cloud.diplomaticquarterapp.utils 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.ScanResult import android.net.wifi.WifiConfiguration import android.net.wifi.WifiManager @@ -17,16 +20,18 @@ import java.util.* @SuppressLint("MissingPermission") -class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { +class HMG_Wifi_(flutterMainActivity: FlutterMainActivity) { val TAG = "WIFI" + val TEST = true var context = flutterMainActivity; - var completionListener: ((status:Boolean, message:String) -> Unit)? = null + var completionListener: ((status: Boolean, message: String) -> Unit)? = null private var SSID = "HMG-GUEST" private var USER_NAME = "" private var PASSWORD = "" + var NETWORK_ID = -1 // HMG-GUEST Assigned Network ID by Android private lateinit var PATIENT_ID:String /* * Helpful: @@ -41,7 +46,10 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { * Helpful: * http://stackoverflow.com/questions/8818290/how-to-connect-to-a-specific-wifi-network-in-android-programmatically */ - fun connectToWifiNetworkWith(patientId:String): HMG_Wifi { + fun connectToWifiNetworkWith(patientId: String): HMG_Wifi_ { + + val connectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + PATIENT_ID = patientId val security = "OPEN" @@ -66,16 +74,16 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { // Then, you need to add it to Android wifi manager settings: val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager - val networkId = wifiManager.addNetwork(conf) - Log.d(TAG, "Network ID: $networkId") + NETWORK_ID = wifiManager.addNetwork(conf) + Log.d(TAG, "Network ID: $NETWORK_ID") //wifiManager.disconnect(); - val result = wifiManager.enableNetwork(networkId, true) + val result = wifiManager.enableNetwork(NETWORK_ID, true) //wifiManager.reconnect(); wifiManager.saveConfiguration() if(result == true){ - authNetworkConnection(networkId); + authNetworkConnection(NETWORK_ID); }else{ completionListener?.let { it(false, "Error connecting to HMG network") } } @@ -83,38 +91,36 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { } private var authTimer:Timer? = null - fun authNetworkConnection(networkId:Int){ + fun authNetworkConnection(networkId: Int){ authTimer = Timer() - authTimer?.scheduleAtFixedRate( object : TimerTask(){ + authTimer?.scheduleAtFixedRate(object : TimerTask() { override fun run() { - if (connectedNetworkId() == networkId && connectedNetworkIPAddress() > 0){ + if (connectedNetworkId() == networkId && connectedNetworkIPAddress() > 0) { authServerCall() authTimer?.cancel() } } - },2000,1000) + }, 2000, 1000) // If wifi not connected in 5 sec terminate with fail status - Timer().schedule(object : TimerTask(){ + Timer().schedule(object : TimerTask() { override fun run() { if (null != authTimer) { authTimer?.cancel() completionListener?.let { it(false, "Error connecting to HMG network") } } } - },5000) + }, 5000) } fun authServerCall(){ - fun forceCallOverWifi(){ - val connectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - connectivityManager.networkPreference = ConnectivityManager.TYPE_WIFI - } - + fun call(){ - forceCallOverWifi() + + forceNetworkCallOverWifi() + val params = listOf("cmd" to "authenticate", "password" to PASSWORD, "user" to USER_NAME) val serverUrl = "https://captiveportal-login.hmg.com/cgi-bin/login" // val serverUrl = "http://192.168.102.223/cgi-bin/login" @@ -122,14 +128,14 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { .httpPost(params) .timeout(10000) .response { request, response, result -> - Log.v(TAG,response.statusCode.toString()) + Log.v(TAG, response.statusCode.toString()) haveInternet { have -> if(have){ - Log.v(TAG,"Connected to internet via $SSID network at HMG") + Log.v(TAG, "Connected to internet via $SSID network at HMG") completionListener?.let { it(true, "Successfully connected to the internet") } }else{ - Log.e(TAG,"failed to connect to internet via $SSID network at HMG") + Log.e(TAG, "failed to connect to internet via $SSID network at HMG") completionListener?.let { it(false, "Authentication failed or you are already using your credentials on another device") } } } @@ -142,21 +148,23 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { call() } }else{ - completionListener?.let { it(false,"You must have active internet connection to connect with HMG Network") } + completionListener?.let { it(false, "You must have active internet connection to connect with HMG Network") } } } } - fun haveInternet(completion:((status:Boolean)->Unit)){ - "https://captive.apple.com".httpGet().response {request, response, result -> - val have = response.statusCode == 200 && String(response.data).contains("Success",true) + fun haveInternet(completion: ((status: Boolean) -> Unit)){ + if (TEST) + completion(true) + + "https://captive.apple.com".httpGet().response { request, response, result -> + val have = response.statusCode == 200 && String(response.data).contains("Success", true) completion(have) } } - fun getAuthCredentials(completion:(() -> Unit)){ - val test = true - if (test){ + fun getAuthCredentials(completion: (() -> Unit)){ + if (TEST){ USER_NAME = "2300" PASSWORD = "1820" completion() @@ -166,7 +174,7 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { val jsonBody = """{"PatientID":$PATIENT_ID}""" API.WIFI_CREDENTIALS .httpPost() - .jsonBody(jsonBody,Charsets.UTF_8) + .jsonBody(jsonBody, Charsets.UTF_8) .response { request, response, result -> val jsonString = String(response.data) Log.d(TAG, "JSON $jsonString") @@ -176,7 +184,7 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { val jsonObject = JSONObject(jsonString) if(!jsonObject.getString("ErrorMessage").equals("null")){ val errorMsg = jsonObject.getString("ErrorMessage") - completionListener?.let { it(false,errorMsg) } + completionListener?.let { it(false, errorMsg) } }else{ jsonObject.getJSONArray("Hmg_SMS_Get_By_ProjectID_And_PatientIDList").let { array -> @@ -186,18 +194,45 @@ class HMG_Wifi(flutterMainActivity: FlutterMainActivity) { PASSWORD = object_.getString("Password") completion() }else{ - completionListener?.let { it(false,"Failed to get your internet credentials") } + completionListener?.let { it(false, "Failed to get your internet credentials") } } } } } }else{ - completionListener?.let { it(false,"Failed to get your internet credentials") } + completionListener?.let { it(false, "Failed to get your internet credentials") } } } } + fun forceNetworkCallOverWifi(){ + val connectivityManager = context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager +// val network = Network +// connectivityManager.activeNetwork + // Exit app if Network disappears. + // Exit app if Network disappears. +// val networkCapabilities: NetworkCapabilities = ConnectivityManager.from(context).getNetworkCapabilities(network) +// val networkCapabilities: NetworkCapabilities = connectivityManager.getNetworkCapabilities(network) + +// if (networkCapabilities == null) { +// return +// } + + val mNetworkCallback = object : ConnectivityManager.NetworkCallback() { + override fun onLost(lostNetwork: Network?) { +// if (network.equals(lostNetwork)){ +// //GlyphLayout.done(false) +// } + } + } + val builder: NetworkRequest.Builder = NetworkRequest.Builder() +// for (transportType in networkCapabilities.getTransportTypes()) { +// builder.addTransportType(transportType) +// } + connectivityManager.registerNetworkCallback(builder.build(), mNetworkCallback) + } + /* * Helpful: * http://stackoverflow.com/questions/6517314/android-wifi-connection-programmatically diff --git a/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/PlatformBridge.kt b/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/PlatformBridge.kt index ff7fdd1d..ea5ec5ec 100644 --- a/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/PlatformBridge.kt +++ b/android/app/src/main/java/com/cloud/diplomaticquarterapp/utils/PlatformBridge.kt @@ -1,7 +1,9 @@ package com.cloud.diplomaticquarterapp.utils import android.util.Log +import android.widget.Toast import com.cloud.diplomaticquarterapp.FlutterMainActivity +import com.cloud.diplomaticquarterapp.hmgwifi.HMG_Wifi import io.flutter.plugin.common.BinaryMessenger import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel @@ -22,26 +24,47 @@ class PlatformBridge(binaryMessenger: BinaryMessenger, flutterMainActivity: Flut channel = MethodChannel(binaryMessenger, CHANNEL) channel.setMethodCallHandler { methodCall: MethodCall, result: MethodChannel.Result -> if (methodCall.method == METHOD_CONNECT_WIFI) { - (methodCall.arguments as ArrayList<*>).let { - require(it.size > 0 && (it.get(0) is String),lazyMessage = { - "Missing or invalid arguments (Must have one argument 'String at 0'" - }) + connectHMGGuestWifi(methodCall,result) - val patientId = it.get(0).toString() - HMG_Wifi(mainActivity) - .connectToWifiNetworkWith(patientId) - .completionListener = { status, message -> + }else if (methodCall.method == METHOD_SHOW_LOADING) { + }else { + result.notImplemented() + } + } + } + + private fun connectHMGGuestWifi(methodCall: MethodCall, result: MethodChannel.Result){ + (methodCall.arguments as ArrayList<*>).let { + require(it.size > 0 && (it[0] is String),lazyMessage = { + "Missing or invalid arguments (Must have one argument 'String at 0'" + }) + + val patientId = it[0].toString() + HMGUtils.showLoading(mainActivity,true,"Connecting...") + HMG_Wifi(mainActivity) + .connectToHMGGuestNetwork(patientId){ status, message -> + HMGUtils.showLoading(mainActivity,false) + if(status){ + HMGUtils.showMessage(mainActivity,"Error", message) + }else{ + HMGUtils.showMessage(mainActivity,"Success",message) + } Log.v(this.javaClass.simpleName, "$status | $message") - + } - } + } + } - }else if (methodCall.method == METHOD_CONNECT_WIFI) { + private fun showLoading(methodCall: MethodCall, result: MethodChannel.Result){ + (methodCall.arguments as ArrayList<*>).let { + require(it.size > 1 && (it[0] is Boolean) && (it[1] is String),lazyMessage = { + "Missing or invalid arguments (Must have two argument 'Boolean at 0' and 'String at 1'" + }) - }else { - result.notImplemented() - } + val show = it[0] as Boolean + val message = it[0] as String + HMGUtils.showLoading(mainActivity,show,message) } } } \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_flutter_main.xml b/android/app/src/main/res/layout/activity_flutter_main.xml index 61249b30..bbaac9bb 100644 --- a/android/app/src/main/res/layout/activity_flutter_main.xml +++ b/android/app/src/main/res/layout/activity_flutter_main.xml @@ -12,11 +12,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> - + \ No newline at end of file diff --git a/android/app/src/main/res/layout/loading_view.xml b/android/app/src/main/res/layout/loading_view.xml new file mode 100644 index 00000000..da629a27 --- /dev/null +++ b/android/app/src/main/res/layout/loading_view.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + \ No newline at end of file