├── app ├── .gitignore ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── alkathirikhalid │ │ └── connection │ │ ├── call │ │ ├── Method.java │ │ ├── Task.java │ │ ├── ContentType.java │ │ ├── BackgroundTask.java │ │ ├── GlobalProperty.java │ │ ├── Util.java │ │ └── Call.java │ │ └── network │ │ ├── ConnectionChangeListener.java │ │ ├── ConnectionActivity.java │ │ ├── ConnectionAppCompactActivity.java │ │ ├── ConnectionChange.java │ │ └── Connection.java └── build.gradle ├── jitpack.yml ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties ├── gradlew.bat ├── gradlew ├── LICENSE └── README.md /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /jitpack.yml: -------------------------------------------------------------------------------- 1 | jdk: 2 | - openjdk11 -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'connection' 2 | include ':app' 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alkathirikhalid/connection/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Nov 19 21:22:46 MYT 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | out/ 15 | 16 | # Gradle files 17 | build/ 18 | 19 | # Local configuration file (sdk path, etc) 20 | local.properties 21 | 22 | # Proguard folder generated by Eclipse 23 | proguard/ 24 | 25 | # Log Files 26 | *.log 27 | 28 | # Android Studio Navigation editor temp files 29 | .navigation/ 30 | 31 | # Android Studio captures folder 32 | captures/ 33 | 34 | # Intellij 35 | *.iml 36 | .idea/workspace.xml 37 | 38 | # Keystore files 39 | *.jks 40 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 31 5 | defaultConfig { 6 | minSdkVersion 16 7 | } 8 | buildTypes { 9 | release { 10 | debuggable false 11 | shrinkResources false 12 | minifyEnabled false 13 | } 14 | } 15 | compileOptions { 16 | sourceCompatibility JavaVersion.VERSION_11 17 | targetCompatibility JavaVersion.VERSION_11 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation 'androidx.appcompat:appcompat:1.4.0' 23 | } 24 | afterEvaluate { 25 | publishing { 26 | publications { 27 | release(MavenPublication) { 28 | from components.release 29 | groupId = 'com.github.alkathirikhalid' 30 | artifactId = 'connection' 31 | version = 'v2.1.0' 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/call/Method.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.call; 17 | 18 | /** 19 | * Supported Call HTTP Methods 20 | * 21 | * @author alkathirikhalid 22 | * @version 2.1.0 23 | */ 24 | public enum Method { 25 | GET, 26 | POST, 27 | PUT, 28 | DELETE 29 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/call/Task.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.call; 17 | 18 | import androidx.annotation.Nullable; 19 | 20 | /** 21 | * Call back mechanism for all tasks 22 | * 23 | * @author alkathirikhalid 24 | * @version 2.1.0 25 | */ 26 | public interface Task { 27 | /** 28 | * Notify observing class on task completed 29 | * 30 | * @param task the task unique identifier 31 | * @param httpCode the http response code 32 | * @param result the result object of String (Server) or Exception (Locally) 33 | */ 34 | void onTaskCompleted(int task, int httpCode, @Nullable Object result); 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/call/ContentType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.call; 17 | 18 | import androidx.annotation.NonNull; 19 | 20 | /** 21 | * Supported Call Content Types 22 | * 23 | * @author alkathirikhalid 24 | * @version 2.1.0 25 | */ 26 | public enum ContentType { 27 | // Request / Response expected types 28 | APPLICATION_JSON("application/json"), 29 | MULTIPART_FORM_DATA("multipart/form-data"), 30 | APPLICATION_FORM_URLENCODED("application/x-www-form-urlencoded"); 31 | 32 | // Keys for requests 33 | protected static final String CONTENT_TYPE = "Content-Type"; 34 | protected static final String ACCEPT = "Accept"; 35 | 36 | // Member value 37 | private final String value; 38 | 39 | // constructor to set the value 40 | ContentType(String value) { 41 | this.value = value; 42 | } 43 | 44 | @NonNull 45 | @Override 46 | public String toString() { 47 | return value; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/call/BackgroundTask.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.call; 17 | 18 | import androidx.annotation.NonNull; 19 | import androidx.annotation.Nullable; 20 | 21 | /** 22 | *

Background task, thread provider

23 | * 24 | * @author alkathirikhalid 25 | * @version 2.1.0 26 | */ 27 | abstract class BackgroundTask extends Thread { 28 | private final Task task; 29 | 30 | /** 31 | * @param task the task call back 32 | */ 33 | protected BackgroundTask(@NonNull Task task) { 34 | this.task = task; 35 | } 36 | 37 | /** 38 | * @return the unique task identifier 39 | */ 40 | protected abstract int getTaskId(); 41 | 42 | /** 43 | * @param httpCode the http response code 44 | * @param result the result from server an Object type of String (Server) or Exception (Local) 45 | */ 46 | protected void executed(int httpCode, @Nullable Object result) { 47 | this.task.onTaskCompleted(this.getTaskId(), httpCode, result); 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/call/GlobalProperty.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.call; 17 | 18 | /** 19 | *

Allow to add more properties to the call

20 | * Supported Call Key / Value Property, user can add properties 21 | * such as security / date / authentication e.t.c 22 | * 23 | * @author alkathirikhalid 24 | * @version 2.1.0 25 | */ 26 | public class GlobalProperty { 27 | private final String propertyName; 28 | private final String propertyValue; 29 | 30 | /** 31 | * Constructor 32 | * 33 | * @param propertyName the property name 34 | * @param propertyValue the property value 35 | */ 36 | public GlobalProperty(String propertyName, String propertyValue) { 37 | this.propertyName = propertyName; 38 | this.propertyValue = propertyValue; 39 | } 40 | 41 | /** 42 | * @return the property name 43 | */ 44 | protected String getPropertyName() { 45 | return propertyName; 46 | } 47 | 48 | /** 49 | * @return the property value 50 | */ 51 | protected String getGetPropertyValue() { 52 | return propertyValue; 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/network/ConnectionChangeListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.network; 17 | 18 | /** 19 | *

Connection Change Call Back.

20 | * An Interface that provides a Call Back to notify 21 | * when Connection has Changed. 22 | * 23 | * @author alkathirikhalid 24 | * @version 2.1.0 25 | */ 26 | 27 | interface ConnectionChangeListener { 28 | 29 | /** 30 | *

Notify there is connectivity or is in the process of being established.

31 | */ 32 | void connectedOrConnecting(); 33 | 34 | /** 35 | *

Notify there is connectivity and it is possible for an internet connection.

36 | */ 37 | void connected(); 38 | 39 | /** 40 | *

Notify there is connectivity to WIFI.

41 | */ 42 | void typeWifi(); 43 | 44 | /** 45 | *

Notify there is connectivity to MOBILE.

46 | */ 47 | void typeMobile(); 48 | 49 | /** 50 | *

Notify there is connectivity to MOBILE data speed of about 400kbps and above.

51 | */ 52 | void connectedConnectionFast(); 53 | 54 | /** 55 | *

Notify there is connectivity to MOBILE data speed of about 14kbps to 100kbps.

56 | */ 57 | void connectedConnectionSlow(); 58 | 59 | /** 60 | *

Notify there is no connectivity.

61 | */ 62 | void noNetwork(); 63 | } 64 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/call/Util.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.call; 17 | 18 | import static com.alkathirikhalid.connection.call.ContentType.ACCEPT; 19 | import static com.alkathirikhalid.connection.call.ContentType.CONTENT_TYPE; 20 | 21 | import java.net.HttpURLConnection; 22 | import java.net.ProtocolException; 23 | 24 | /** 25 | * A Call Util Class 26 | * 27 | * @author alkathirikhalid 28 | * @version 2.1.0 29 | */ 30 | public class Util { 31 | /** 32 | * Adds single or multiple properties to the call 33 | * 34 | * @param connection the connection instance 35 | * @param method the connection http method POST, GET, PUT, DELETE 36 | * @param contentTypeRequest the request content type 37 | * @param contentTypeResponse the response content type 38 | * @return the finalized connection with the added properties 39 | * @throws ProtocolException protocol exception such as TCP error 40 | */ 41 | protected static HttpURLConnection setDefaultMethodAndProperties(HttpURLConnection connection, Method method, ContentType contentTypeRequest, ContentType contentTypeResponse) throws ProtocolException { 42 | connection.setRequestMethod(method.name()); 43 | connection.setRequestProperty(CONTENT_TYPE, contentTypeRequest.toString()); 44 | connection.setRequestProperty(ACCEPT, contentTypeResponse.toString()); 45 | return connection; 46 | } 47 | 48 | /** 49 | * @param method the method to be checked 50 | * @return true for POST and PUT only 51 | */ 52 | protected static boolean isSetDoOutput(Method method) { 53 | return (method.equals(Method.POST) || method.equals(Method.PUT)); 54 | } 55 | 56 | /** 57 | * Check response from server as being success 58 | * 59 | * @param responseCode the receive http response from server 60 | * @return true for 200 range response exclusive 200, 201 and 204 61 | */ 62 | public static boolean isSuccessResponse(int responseCode) { 63 | return (responseCode == 200 || responseCode == 201 || responseCode == 204); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/network/ConnectionActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.network; 17 | 18 | import android.app.Activity; 19 | import android.content.IntentFilter; 20 | import android.net.ConnectivityManager; 21 | import android.os.Bundle; 22 | 23 | /** 24 | *

Enhanced Base class with Real Time Connection Changes.

25 | * For activities without the 26 | * support library 27 | * action bar features. 28 | * 29 | * @author alkathirikhalid 30 | * @version 2.1.0 31 | */ 32 | 33 | public abstract class ConnectionActivity extends Activity implements ConnectionChangeListener { 34 | 35 | /** 36 | *

Connection Change Broadcast Receiver.

37 | */ 38 | private ConnectionChange connectionChange; 39 | 40 | /** 41 | *

Structured description of Intent values to be matched.

42 | */ 43 | private IntentFilter intentFilter; 44 | 45 | @Override 46 | protected void onCreate(Bundle savedInstanceState) { 47 | super.onCreate(savedInstanceState); 48 | 49 | // Creates new IntentFilter that matches a change in network connectivity 50 | intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 51 | 52 | // Creates new Connection Change Broadcast Receiver 53 | connectionChange = new ConnectionChange(); 54 | } 55 | 56 | @Override 57 | protected void onResume() { 58 | super.onResume(); 59 | 60 | // Register for Connection Change that matches a change in network connectivity 61 | this.registerReceiver(connectionChange, intentFilter); 62 | 63 | // Registers the connection change call back 64 | connectionChange.setConnectionChangeListener(this); 65 | } 66 | 67 | @Override 68 | protected void onPause() { 69 | super.onPause(); 70 | 71 | // Unregister the Connection Change Broadcast Receiver 72 | unregisterReceiver(connectionChange); 73 | 74 | // Unregisters the connectivity change call back 75 | connectionChange.setConnectionChangeListener(null); 76 | } 77 | 78 | // Implemented methods 79 | 80 | @Override 81 | public void connectedOrConnecting() { 82 | // To be implemented if / when needed on host app 83 | } 84 | 85 | @Override 86 | public void connected() { 87 | // To be implemented if / when needed on host app 88 | } 89 | 90 | @Override 91 | public void typeWifi() { 92 | // To be implemented if / when needed on host app 93 | } 94 | 95 | @Override 96 | public void typeMobile() { 97 | // To be implemented if / when needed on host app 98 | } 99 | 100 | @Override 101 | public void connectedConnectionFast() { 102 | // To be implemented if / when needed on host app 103 | } 104 | 105 | @Override 106 | public void connectedConnectionSlow() { 107 | // To be implemented if / when needed on host app 108 | } 109 | 110 | @Override 111 | public void noNetwork() { 112 | // To be implemented if / when needed on host app 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/network/ConnectionAppCompactActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.network; 17 | 18 | import android.content.IntentFilter; 19 | import android.net.ConnectivityManager; 20 | import android.os.Bundle; 21 | 22 | import androidx.appcompat.app.AppCompatActivity; 23 | 24 | /** 25 | *

Enhanced Base class with Real Time Connection Changes.

26 | * For activities that use the 27 | * support library 28 | * action bar features. 29 | * 30 | * @author alkathirikhalid 31 | * @version 2.1.0 32 | */ 33 | 34 | public abstract class ConnectionAppCompactActivity extends AppCompatActivity implements ConnectionChangeListener { 35 | 36 | /** 37 | *

Connection Change Broadcast Receiver.

38 | */ 39 | private ConnectionChange connectionChange; 40 | 41 | /** 42 | *

Structured description of Intent values to be matched.

43 | */ 44 | private IntentFilter intentFilter; 45 | 46 | @Override 47 | protected void onCreate(Bundle savedInstanceState) { 48 | super.onCreate(savedInstanceState); 49 | 50 | // Creates new IntentFilter that matches a change in network connectivity 51 | intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 52 | 53 | // Creates new Connection Change Broadcast Receiver 54 | connectionChange = new ConnectionChange(); 55 | } 56 | 57 | @Override 58 | protected void onResume() { 59 | super.onResume(); 60 | 61 | // Register for Connection Change that matches a change in network connectivity 62 | this.registerReceiver(connectionChange, intentFilter); 63 | 64 | // Registers the connection change call back 65 | connectionChange.setConnectionChangeListener(this); 66 | } 67 | 68 | @Override 69 | protected void onPause() { 70 | super.onPause(); 71 | 72 | // Unregister the Connection Change Broadcast Receiver 73 | unregisterReceiver(connectionChange); 74 | 75 | // Unregisters the connectivity change call back 76 | connectionChange.setConnectionChangeListener(null); 77 | } 78 | 79 | // Implemented methods 80 | 81 | @Override 82 | public void connectedOrConnecting() { 83 | // To be implemented if / when needed on host app 84 | } 85 | 86 | @Override 87 | public void connected() { 88 | // To be implemented if / when needed on host app 89 | } 90 | 91 | @Override 92 | public void typeWifi() { 93 | // To be implemented if / when needed on host app 94 | } 95 | 96 | @Override 97 | public void typeMobile() { 98 | // To be implemented if / when needed on host app 99 | } 100 | 101 | @Override 102 | public void connectedConnectionFast() { 103 | // To be implemented if / when needed on host app 104 | } 105 | 106 | @Override 107 | public void connectedConnectionSlow() { 108 | // To be implemented if / when needed on host app 109 | } 110 | 111 | @Override 112 | public void noNetwork() { 113 | // To be implemented if / when needed on host app 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/network/ConnectionChange.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.network; 17 | 18 | import android.content.BroadcastReceiver; 19 | import android.content.Context; 20 | import android.content.Intent; 21 | 22 | /** 23 | *

Connection Change Broadcast Receiver.

24 | * A subclass of BroadcastReceiver that will receive intents sent by sendBroadcast(). 25 | * 26 | * @author alkathirikhalid 27 | * @version 2.1.0 28 | */ 29 | 30 | class ConnectionChange extends BroadcastReceiver { 31 | 32 | /** 33 | *

An Interface that provides a Call Back Mechanism to notify 34 | * when Connection has Changed.

35 | */ 36 | private ConnectionChangeListener connectionChangeListener; 37 | 38 | /** 39 | *

Constructor adhering to Observer Pattern.

40 | * To be used after ConnectionChange(). 41 | * 42 | * @param connectionChangeListener The Connection Change Call Back. 43 | * @return The Initialized linked Connection Change Call Back. 44 | */ 45 | ConnectionChange setConnectionChangeListener(ConnectionChangeListener connectionChangeListener) { 46 | this.connectionChangeListener = connectionChangeListener; 47 | return this; 48 | } 49 | 50 | /** 51 | * This method is called when the BroadcastReceiver is receiving an Intent 52 | * broadcast. During this time you can use the other methods on 53 | * BroadcastReceiver to view/modify the current result values. This method 54 | * is always called within the main thread of its process, unless you 55 | * explicitly asked for it to be scheduled on a different thread using 56 | * {link Context#registerReceiver(BroadcastReceiver, * IntentFilter, String, Handler)}. 57 | * When it runs on the main thread you should 58 | * never perform long-running operations in it (there is a timeout of 59 | * 10 seconds that the system allows before considering the receiver to 60 | * be blocked and a candidate to be killed). You cannot launch a popup dialog 61 | * in your implementation of onReceive(). 62 | *

63 | *

If this BroadcastReceiver was launched through a <receiver> tag, 64 | * then the object is no longer alive after returning from this 65 | * function. This means you should not perform any operations that 66 | * return a result to you asynchronously -- in particular, for interacting 67 | * with services, you should use 68 | * {@link Context#startService(Intent)} instead of 69 | * {link Context#bindService(Intent, ServiceConnection, int)}. If you wish 70 | * to interact with a service that is already running, you can use 71 | * {@link #peekService}. 72 | *

73 | *

The Intent filters used in {@link Context#registerReceiver} 74 | * and in application manifests are not guaranteed to be exclusive. They 75 | * are hints to the operating system about how to find suitable recipients. It is 76 | * possible for senders to force delivery to specific recipients, bypassing filter 77 | * resolution. For this reason, {@link #onReceive(Context, Intent) onReceive()} 78 | * implementations should respond only to known actions, ignoring any unexpected 79 | * Intents that they may receive. 80 | * 81 | * @param context The Context in which the receiver is running. 82 | * @param intent The Intent being received. 83 | */ 84 | @Override 85 | public void onReceive(Context context, Intent intent) { 86 | 87 | // Checks if there are linked listeners before invoking change 88 | if (connectionChangeListener != null) { 89 | // Fall through all states, to allow multiple call back of the received Network Info 90 | 91 | // Checks if there is connectivity or is in the process of being established 92 | if (Connection.isConnectedOrConnecting(context)) { 93 | // Notifies there is connectivity or is in the process of being established 94 | connectionChangeListener.connectedOrConnecting(); 95 | } 96 | // Checks if there is connectivity and it is possible to pass data 97 | if (Connection.isConnected(context)) { 98 | // Notifies there is connectivity and it is possible to pass data 99 | connectionChangeListener.connected(); 100 | } 101 | // Checks if there is connectivity to WIFI 102 | if (Connection.isTypeWifi(context)) { 103 | // Notifies there is connectivity to WIFI 104 | connectionChangeListener.typeWifi(); 105 | } 106 | // Checks if there is connectivity to MOBILE 107 | if (Connection.isTypeMobile(context)) { 108 | // Notifies there is connectivity to MOBILE 109 | connectionChangeListener.typeMobile(); 110 | } 111 | // Checks if there is connectivity to MOBILE data speed of about 400kbps to 23Mbps 112 | if (Connection.isConnectedConnectionFast(context)) { 113 | // Notifies there is connectivity to MOBILE data speed of about 400kbps to 23Mbps 114 | connectionChangeListener.connectedConnectionFast(); 115 | } 116 | // Checks if there is connectivity to MOBILE data speed of about 14kbps to 100kbps 117 | if (Connection.isConnectedConnectionSlow(context)) { 118 | // Notifies there is connectivity to MOBILE data speed of about 14kbps to 100kbps 119 | connectionChangeListener.connectedConnectionSlow(); 120 | } 121 | // Checks there is no connectivity 122 | if (!Connection.isConnectedOrConnecting(context)) { 123 | // Notifies there is no connectivity 124 | connectionChangeListener.noNetwork(); 125 | } 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/call/Call.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.call; 17 | 18 | import static com.alkathirikhalid.connection.call.Util.isSetDoOutput; 19 | import static com.alkathirikhalid.connection.call.Util.isSuccessResponse; 20 | import static com.alkathirikhalid.connection.call.Util.setDefaultMethodAndProperties; 21 | 22 | import java.io.BufferedReader; 23 | import java.io.InputStream; 24 | import java.io.InputStreamReader; 25 | import java.net.HttpURLConnection; 26 | import java.net.URL; 27 | import java.util.ArrayList; 28 | import java.util.List; 29 | 30 | /** 31 | *

Call

32 | * Make synchronous (none blocking) http call / connection with a single line 33 | * 34 | * @author alkathirikhalid 35 | * @version 2.1.0 36 | */ 37 | public abstract class Call { 38 | 39 | // Global extra request properties such as security / date / authentication e.t.c for all calls 40 | private static final List globalProperties = new ArrayList<>(); // Empty 41 | // Global connection and read time out fot all calls 42 | private static int timeOut = 3000; // default half a minute 43 | 44 | /** 45 | * Add global properties to be used in all / next calls 46 | * 47 | * @param globalProperty the key / vale pair as expected by server 48 | * @return true on successful adding, false on fail 49 | */ 50 | public static boolean addGlobalProperty(GlobalProperty globalProperty) { 51 | return Call.globalProperties.add(globalProperty); 52 | } 53 | 54 | /** 55 | * Remove global property not to be used in all / next calls 56 | * 57 | * @param globalProperty the key / vale pair as expected by server 58 | * @return true on successful removal, false on fail 59 | */ 60 | public static boolean removeGlobalProperty(GlobalProperty globalProperty) { 61 | return Call.globalProperties.remove(globalProperty); 62 | } 63 | 64 | /** 65 | * Optional setup for connection and read time out / default 3000 (30 seconds) 66 | * 67 | * @param timeOut in milliseconds, 0 for indefinite (not advisable) 68 | */ 69 | public static void setTimeOut(int timeOut) { 70 | Call.timeOut = timeOut; 71 | } 72 | 73 | /** 74 | * Executes synchronous (none blocking) http call 75 | * 76 | * @param taskId the unique identifier of the task 77 | * @param task the task call back after completion or failure 78 | * @param method the http method POST, GET, PUT and DELETE 79 | * @param url the full url including parameters for GET 80 | * @param contentTypeRequest the request type expected by server 81 | * @param contentTypeResponse the response type expected back 82 | * @param requestBody the payload to be submit to the server 83 | */ 84 | public static void execute(int taskId, Task task, Method method, String url, ContentType contentTypeRequest, ContentType contentTypeResponse, String requestBody) { 85 | BackgroundTask backgroundTask = new BackgroundTask(task) { 86 | @Override 87 | public int getTaskId() { 88 | return taskId; 89 | } 90 | 91 | @Override 92 | public void run() { 93 | try { 94 | // Local declaration inside a thread life cycle / method 95 | HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 96 | // Set User preferred method, content request and content response type 97 | connection = setDefaultMethodAndProperties(connection, method, contentTypeRequest, contentTypeResponse); 98 | 99 | // Global connection and read time out fot all calls 100 | connection.setConnectTimeout(timeOut); 101 | connection.setReadTimeout(timeOut); 102 | 103 | // Global extra request properties such as security / date / authentication / authorization e.t.c for all calls 104 | for (GlobalProperty globalProperty : globalProperties) { 105 | connection.setRequestProperty(globalProperty.getPropertyName(), globalProperty.getGetPropertyValue()); 106 | } 107 | 108 | // check and set if required for this call 109 | connection.setDoOutput(isSetDoOutput(method)); 110 | if (requestBody != null) // Enforce request body protocol support 111 | connection.getOutputStream().write(requestBody.getBytes()); 112 | 113 | // connect to validate server response 114 | connection.connect(); 115 | // receive response from server success / fail from server 116 | InputStream inputStream = isSuccessResponse(connection.getResponseCode()) ? connection.getInputStream() : connection.getErrorStream(); 117 | // Prepare to read response from server 118 | BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 119 | String data; 120 | StringBuilder response = new StringBuilder(); 121 | while ((data = bufferedReader.readLine()) != null) { 122 | response.append(data); 123 | } 124 | // http response code and received data can be success / fail from server 125 | executed(connection.getResponseCode(), response.toString()); 126 | } catch (Exception exception) { 127 | // Error occurred locally no response from server, http code 0 with the local exception 128 | executed(0, exception); 129 | } 130 | } 131 | }; 132 | // Set a name to the backgroundTask for unique identification 133 | // required for canceling task premature when required 134 | backgroundTask.setName(String.valueOf(taskId)); 135 | // Start backgroundTask 136 | backgroundTask.start(); 137 | } 138 | 139 | /** 140 | * To Cancel backgroundTask premature when needed 141 | * 142 | * @param taskId the task unique identifier 143 | * @return true if found and canceled else false if not 144 | */ 145 | public static boolean cancelTask(int taskId) { 146 | for (Thread backgroundTask : Thread.getAllStackTraces().keySet()) { 147 | if (backgroundTask.getName().equals(String.valueOf(taskId))) { 148 | backgroundTask.interrupt(); 149 | return true; 150 | } 151 | } 152 | return false; 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /app/src/main/java/com/alkathirikhalid/connection/network/Connection.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Al-Kathiri Khalid www.alkathirikhalid.com 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.alkathirikhalid.connection.network; 17 | 18 | import android.content.Context; 19 | import android.net.ConnectivityManager; 20 | import android.net.NetworkInfo; 21 | import android.telephony.TelephonyManager; 22 | 23 | /** 24 | *

Connection.

25 | *

26 | * Monitor network connections like Wi-Fi, GPRS, UMTS, etc for API 16 and above, 27 | * this class attempt to fail over to another network when connectivity to a network is lost 28 | * by checking isConnectedOrConnecting, it provides a way that allows applications to 29 | * query the coarse-grained or fine-grained state of the available networks by checking 30 | * isTypeMobile or isTypeWifi. It also provides a way that allows 31 | * applications to request and check networks for their fast data traffic by checking 32 | * isConnectedConnectionFast or isConnectedConnectionSlow.

33 | *

34 | * It is safer to check isConnectedConnectionSlow first or only rather than 35 | * isConnectedConnectionFast first or combined, to allow forward compatibility in the 36 | * event faster mobile connection are introduce in the future that are above 20 plus Mbps.

37 | * 38 | * @author alkathirikhalid 39 | * @version 2.1.0 40 | */ 41 | public abstract class Connection { 42 | 43 | /** 44 | *

Serves the Connection public methods with a way to get an instance of the 45 | * current network Connection.

46 | * 47 | * @param context of an Application, Activity, Service or IntentService. 48 | * @return an instance that represents the current network connection. 49 | */ 50 | private static NetworkInfo getActiveNetworkInfo(Context context) { 51 | ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService 52 | (Context.CONNECTIVITY_SERVICE); 53 | return connectivityManager.getActiveNetworkInfo(); 54 | } 55 | 56 | /** 57 | *

Checks if there is connectivity or is in the process of being established. 58 | * This is applicable for applications that need to do any less intensive or slow 59 | * network related activities.

60 | * 61 | * @param context of an Application, Activity, Service or IntentService. 62 | * @return true if there is connectivity or is in the process of being established, 63 | * false otherwise. 64 | */ 65 | public static boolean isConnectedOrConnecting(Context context) { 66 | NetworkInfo networkInfo = Connection.getActiveNetworkInfo(context); 67 | return (networkInfo != null && networkInfo.isConnectedOrConnecting()); 68 | } 69 | 70 | /** 71 | *

Checks if there is connectivity and it is possible to pass data. 72 | * This is applicable for applications that need to do any intensive network related activities 73 | * like data transactions such as read or write data, isConnected guarantees that 74 | * the network is fully usable unlike isConnectedOrConnecting which dose not.

75 | * 76 | * @param context of an Application, Activity, Service or IntentService. 77 | * @return true if connectivity exists, false otherwise. 78 | */ 79 | public static boolean isConnected(Context context) { 80 | NetworkInfo networkInfo = Connection.getActiveNetworkInfo(context); 81 | return (networkInfo != null && networkInfo.isConnected()); 82 | } 83 | 84 | /** 85 | *

Checks if there is connectivity to WIFI, when active, all data traffic will use this network. 86 | * isTypeWifi automatically calls isConnected() to guarantees that 87 | * connectivity exists.

88 | * 89 | * @param context of an Application, Activity, Service or IntentService. 90 | * @return true if WIFI, false otherwise. 91 | */ 92 | public static boolean isTypeWifi(Context context) { 93 | NetworkInfo networkInfo = Connection.getActiveNetworkInfo(context); 94 | return (networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == 95 | ConnectivityManager.TYPE_WIFI); 96 | } 97 | 98 | /** 99 | *

Checks if there is connectivity to MOBILE data, when active, all data traffic will use 100 | * this network. isTypeMobile automatically calls isConnected() 101 | * to guarantees that connectivity exists.

102 | * 103 | * @param context of an Application, Activity, Service or IntentService. 104 | * @return true if MOBILE data, false otherwise. 105 | */ 106 | public static boolean isTypeMobile(Context context) { 107 | NetworkInfo networkInfo = Connection.getActiveNetworkInfo(context); 108 | return (networkInfo != null && networkInfo.isConnected() && networkInfo.getType() == 109 | ConnectivityManager.TYPE_MOBILE); 110 | } 111 | 112 | /** 113 | *

Checks if there is connectivity to MOBILE data speed of about 400kbps to 23Mbps. 114 | * isConnectedConnectionFast automatically calls isConnected() 115 | * to guarantees that connectivity exists.

116 | * 117 | * @param context of an Application, Activity, Service or IntentService. 118 | * @return true if MOBILE data, sub type EVDO0, EVDOA, EVDOB, UMTS, EHRPD, HSDPA, 119 | * HSPA, HSUPA, HSPAP or LTE false otherwise. 120 | */ 121 | public static boolean isConnectedConnectionFast(Context context) { 122 | NetworkInfo networkInfo = Connection.getActiveNetworkInfo(context); 123 | return (networkInfo != null && networkInfo.isConnected() && Connection.isConnectionFast 124 | (networkInfo.getType(), networkInfo.getSubtype())); 125 | } 126 | 127 | /** 128 | *

Checks if there is connectivity to MOBILE data speed of about 14kbps to 100kbps. 129 | * isConnectedConnectionSlow automatically calls isConnected() 130 | * to guarantees that connectivity exists.

131 | * 132 | * @param context of an Application, Activity, Service or IntentService. 133 | * @return true if MOBILE data, sub type CDMA, 1xRTT, EDGE, GPRS or IDEN 134 | * false otherwise. 135 | */ 136 | public static boolean isConnectedConnectionSlow(Context context) { 137 | NetworkInfo networkInfo = Connection.getActiveNetworkInfo(context); 138 | return (networkInfo != null && networkInfo.isConnected() && Connection.isConnectionSlow 139 | (networkInfo.getType(), networkInfo.getSubtype())); 140 | } 141 | 142 | /** 143 | *

Serves isConnectedConnectionFast public methods with a way to detect the 144 | * current sub type connection of MOBILE type.

145 | * 146 | * @param type of connection either WIFI or MOBILE. 147 | * @param subType of a MOBILE connection type. 148 | * @return true if WIFI or if MOBILE data speed of about 400kbps to 23Mbps 149 | * false otherwise. 150 | */ 151 | private static boolean isConnectionFast(int type, int subType) { 152 | if (type == ConnectivityManager.TYPE_WIFI) { 153 | return true; 154 | } else if (type == ConnectivityManager.TYPE_MOBILE) { 155 | switch (subType) { 156 | // Speeds of about ~ 400 to 1000 kbps 157 | case TelephonyManager.NETWORK_TYPE_EVDO_0: // 3G 158 | // Speeds of about ~ 600 to 1400 kbps. 159 | case TelephonyManager.NETWORK_TYPE_EVDO_A: // 3G 160 | // Speeds of about ~ 2 to 14 Mbps. 161 | case TelephonyManager.NETWORK_TYPE_HSDPA: // 3G 162 | // Speeds of about ~ 700 to 1700 kbps 163 | case TelephonyManager.NETWORK_TYPE_HSPA: // 3G 164 | // Speeds of about ~ 1 to 23 Mbps 165 | case TelephonyManager.NETWORK_TYPE_HSUPA: // 3G 166 | // Speeds of about ~ 400 to 7000 kbps 167 | case TelephonyManager.NETWORK_TYPE_UMTS: // 3G 168 | // Speeds of about ~ 1 to 2 Mbps 169 | case TelephonyManager.NETWORK_TYPE_EHRPD: // 3G 170 | // Speeds of about ~ 5 Mbps 171 | case TelephonyManager.NETWORK_TYPE_EVDO_B: // 3G 172 | // Speeds of about ~ 10 to 20 Mbps 173 | case TelephonyManager.NETWORK_TYPE_HSPAP: // 3G 174 | // Speeds of about ~ 10+ Mbps 175 | case TelephonyManager.NETWORK_TYPE_LTE: // 4G 176 | case TelephonyManager.NETWORK_TYPE_IWLAN: // 4G 177 | case TelephonyManager.NETWORK_TYPE_NR: // 5G 178 | return true; 179 | // Otherwise 180 | case TelephonyManager.NETWORK_TYPE_UNKNOWN: 181 | default: 182 | return false; 183 | } 184 | } else { 185 | return false; 186 | } 187 | } 188 | 189 | /** 190 | *

Serves isConnectedConnectionSlow public methods with a way to detect the 191 | * current sub type connection of MOBILE type.

192 | * 193 | * @param type of connection either WIFI or MOBILE. 194 | * @param subType of a MOBILE connection type. 195 | * @return true if MOBILE data speed of about 14kbps to 100kbps 196 | * false otherwise. 197 | */ 198 | private static boolean isConnectionSlow(int type, int subType) { 199 | if (type == ConnectivityManager.TYPE_WIFI) { 200 | return false; 201 | } else if (type == ConnectivityManager.TYPE_MOBILE) { 202 | switch (subType) { 203 | // Speeds of about ~ 50 to 100 kbps 204 | case TelephonyManager.NETWORK_TYPE_1xRTT: // 2G 205 | // Speeds of about ~ 14 to 64 kbps 206 | case TelephonyManager.NETWORK_TYPE_CDMA: // 2G 207 | // Speeds of about ~ 50 to 100 kbps 208 | case TelephonyManager.NETWORK_TYPE_EDGE: // 2G 209 | // Speeds of about ~ 100 kbps 210 | case TelephonyManager.NETWORK_TYPE_GPRS: // 2G 211 | // Speeds of about ~ 25 kbps 212 | case TelephonyManager.NETWORK_TYPE_IDEN: // 2G 213 | return true; 214 | // Otherwise 215 | case TelephonyManager.NETWORK_TYPE_UNKNOWN: 216 | default: 217 | return false; 218 | } 219 | } else { 220 | return false; 221 | } 222 | } 223 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![](https://jitpack.io/v/alkathirikhalid/connection.svg)](https://jitpack.io/#alkathirikhalid/connection) 2 | 3 | # Eloquent Connection 4 |

Android light weight library made up of two features Call and Network. Connection can be used in any Android project either using build script or adding aar file, no need to declare any thing else as all the permissions will be merged, it is simply a plug and play library!

5 | 6 |

- Network : Monitors connections like Wi-Fi, GPRS, UMTS, e.t.c. Device network usually attempts to fail over to another network connection when connectivity to a given network is lost, Network feature simply allows checking such as isConnectedOrConnecting to get the device network state. It also provides a way that allows apps to query the coarse-grained or fine-grained state of the available networks by checking isTypeMobile or isTypeWifi. It also allows apps to request and check networks for their fast data traffic by checking isConnectedConnectionFast or isConnectedConnectionSlow.

7 | 8 |

- Call : Makes asynchronous / non blocking http request with easy in a single line. To make a call simply do 2 things out of the box Call.execute(taskId,task,method,url,contentTypeRequest,contentTypeResponse,requestBody), and make your Class / Activity / Fragment / Model / Repositry whatever architecture you have implements Task where onTaskCompleted(int task, int httpCode, Object result) returns the response, thats it, 2 steps. It is also possible to make synchronous / blocking http request by simply cascaded the calls on Task completed for the consecutive calls.

9 | 10 | # Call Usage 11 |

implements Task in a class that is expected to receive http responses on task completed such as an Activity / Fragment / Model / Repositry whatever architecture you have, pass a unique task ID in the range of 1000 or as you so choose and pass the instance of the class that implemented the Task interface example call/s in one class for simple demo

12 | 13 | ``` 14 | public class MainActivity extends AppCompatActivity implements Task { 15 | ... 16 | 17 | // Global settings affecting all calls just to be set once or changed before a specific / special call 18 | Call.setTimeOut(5000); // not required only when needed, default half a minute / 30 seconds / 3000 milliseconds 19 | 20 | // Global property add if needed, list support removed to make the library simple with 5 methods for any dev level 21 | // Global property such as security / date / authentication e.t.c for all calls, just set once if needed 22 | GlobalProperty globalProperty1 = new GlobalProperty("Authorization", "Bearer 3672e8ae491a13072c1-YOUR-KEY-48afb6c6d3"); 23 | // Adding global property 24 | Call.addGlobalProperty(globalProperty1); // can be repeated for globalProperty2 e.t.c 25 | // Removing global property 26 | // Call.removeGlobalProperty(globalProperty1); // can be added / removed vice verser for specific flow 27 | 28 | 29 | // POST Sample 30 | String postData = "{\"name\":\"Khalid\",\"email\":\"khalid@alkathirikhalid.com\",\"gender\":\"male\",\"status\":\"active\"}"; 31 | String postURL = "https://gorest.co.in/public/v1/users"; 32 | 33 | // GET Sample 34 | String getData = null; 35 | String getURL = "https://gorest.co.in/public/v1/users/2676"; 36 | 37 | // PUT Sample 38 | String putData = "{\"name\":\"Al Kathiri Khalid\",\"email\":\"k@alkathirikhalid.com\",\"gender\":\"male\",\"status\":\"active\"}"; 39 | String putURL = "https://gorest.co.in/public/v1/users/2676"; 40 | 41 | // DELETE Sample 42 | String deleteData = null; 43 | String deleteURL = "https://gorest.co.in/public/v1/users/2676"; 44 | 45 | // Execute CRUD Call 46 | Call.execute(1000, this, POST, postURL, APPLICATION_JSON, APPLICATION_JSON, postData); 47 | //Call.execute(2000, this, GET, getURL, APPLICATION_JSON, APPLICATION_JSON, null); 48 | //Call.execute(3000, this, PUT, putURL, APPLICATION_JSON, APPLICATION_JSON, putData); 49 | //Call.execute(4000, this, DELETE, deleteURL, APPLICATION_JSON, APPLICATION_JSON, null); 50 | 51 | // Cancel executed Call if not needed for any reason example as leaving screen such as onPause e.t.c 52 | // Call.cancelTask(4000); 53 | ... 54 | 55 | @Override 56 | public void onTaskCompleted(int task, int httpCode, @Nullable Object result) { 57 | Log.d("***** Task ID: ", String.valueOf(task)); // the task unique identiifier provided in the execution of the call 58 | Log.d("***** HTTP CODE: ", String.valueOf(httpCode)); // server response range 2xx success, range 4xx - 5xx error (normal http response) or 0 local error 59 | Log.d("***** Data Received: ", String.valueOf(result)); // Object instance of String success / failure from Server or instance of Exception local error 60 | Log.d("***** is Success: ", String.valueOf(isSuccessResponse(httpCode))); // Call util to check success range / not needed 61 | if (result instanceof Exception) { 62 | // all local errors including Call cancled, the error string is provided, this will allow to stop loading screen / animation 63 | // all local errors will have http code 0 64 | } 65 | ... 66 | } 67 | ``` 68 | 69 | ### Call Accesible and usable Methods 70 |

Call has a total of 5 methods where only 1 is need to make the call

71 |

- Call.setTimeOut(5000) Not required, time in milliseconds, default 3000 / 30 seconds.

72 |

- Call.addGlobalProperty(globalProperty) Not required, extra properties such as security / date / authentication / authorization.

73 |

- Call.removeGlobalProperty(globalProperty) Not required, only to remove extra propert if needed.

74 |

- Call.execute(taskId,task,method,url,contentTypeRequest,contentTypeResponse,requestBody) Required to make the call.

75 |

- Call.cancelTask(taskId) not required, only if needed for any reason such as leaving screen.

76 | 77 |

Supported metheds are POST, GET, PUT and DELETE.

78 |

Supported content types are application/json, multipart/form-data and application/x-www-form-urlencoded

79 | 80 | # Network Usage 81 |

It is safer to check isConnectedConnectionSlow first or only rather than isConnectedConnectionFast first or combined, to allow forward compatibility in the event faster mobile connection are introduce in the future that are above 20 plus Mbps.

82 | 83 |

All accessible and usable methods automatically calls isConnected() to guarantees that connectivity exists except for isConnectedOrConnecting depending on your application needs.

84 | Connection.isConnectedConnectionSlow(context); 85 | 86 | ### Network Accesible and usable Methods 87 |

Network has a total of 6 methods.

88 |

- isConnectedOrConnecting() Checks if there is connectivity or is in the process of being established. This is applicable for applications that need to do any less intensive or slow network related activities.

89 |

- isConnected() Checks if there is connectivity and it is possible to pass data. This is applicable for applications that need to do any intensive network related activities like data transactions such as read or write data, guarantees that the network is fully usable.

90 |

- isTypeWifi() Checks if there is connectivity to WIFI, when active, all data traffic will use this network.

91 |

- isTypeMobile() Checks if there is connectivity to MOBILE data, when active, all data traffic will use this network.

92 |

- isConnectedConnectionFast() Checks if there is connectivity to MOBILE data speed of about 400kbps to 23Mbps. Supports subtype EVDO0, EVDOA, EVDOB, UMTS, EHRPD, HSDPA, HSPA, HSUPA, HSPAP and LTE.

93 |

- isConnectedConnectionSlow()Checks if there is connectivity to MOBILE data speed of about 14kbps to 100kbps. Supports subtype CDMA, 1xRTT, EDGE, GPRS and IDEN.

94 | 95 | ### Network Real time updates 96 |

To have connectivity updates in real time simply either replace:-

97 |

- ConnectionActivity in place of Activity.

98 |

- ConnectionAppCompactActivity in place of AppCompactActivity.

99 |

And Override any of the provided 7 methods, which gives real time updates of all 6 mothods explained in Network Accesible and usable Methods including the 7th being noNetwork(), or simply use them without real time update as seen fit such as calling Connection.isConnectedConnectionSlow(context).

100 | 101 | ``` 102 | public class MainActivity extends ConnectionAppCompactActivity { 103 | 104 | // Optional realtime update, simply Override any or all / if needed 105 | 106 | } 107 | @Override 108 | public void connectedOrConnecting() { 109 | // TODO 110 | } 111 | 112 | @Override 113 | public void connected() { 114 | // TODO 115 | } 116 | 117 | @Override 118 | public void typeWifi() { 119 | // TODO 120 | } 121 | 122 | @Override 123 | public void typeMobile() { 124 | // TODO 125 | } 126 | 127 | @Override 128 | public void connectedConnectionFast() { 129 | // TODO 130 | } 131 | 132 | @Override 133 | public void connectedConnectionSlow() { 134 | // TODO 135 | } 136 | 137 | @Override 138 | public void noNetwork() { 139 | // TODO 140 | } 141 | } 142 | ``` 143 | 144 | ### Eloquent Connection Permission and Requirements 145 |

The minimun Android API 16. Thats it!

146 |

The library will handle the system broadcast and permissions automatically, simply add the library via aar file or as a dependency declaration and use it out of the box without further settings, Eloquent Connection has already declared for internet and network state.

147 | 148 | # Installation 149 | ### Gradle 150 | ``` 151 | allprojects { 152 | repositories { 153 | ... 154 | maven { url 'https://jitpack.io' } 155 | } 156 | } 157 | ``` 158 | ``` 159 | dependencies { 160 | implementation 'com.github.alkathirikhalid:connection:v2.0.0' 161 | } 162 | ``` 163 | ### Gradle 7 issues 164 | A problem occurred will occur where the declared jitpack repo in project will fail to resolve / get the connection library 165 | 166 | Simple Fix, in settings.gradle add jitpack repo, it must be present in settings.gradle on faliure will trigger dependencyResolutionManagement 167 | ``` 168 | dependencyResolutionManagement { 169 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 170 | repositories { 171 | google() 172 | mavenCentral() 173 | maven { url 'https://jitpack.io' } // Jitpack Repo 174 | jcenter() // Warning: this repository is going to shut down soon 175 | } 176 | } 177 | rootProject.name = "Your App" 178 | include ':app' 179 | 180 | ``` 181 | ### Maven 182 | ``` 183 | 184 | 185 | jitpack.io 186 | https://jitpack.io 187 | 188 | 189 | ``` 190 | ``` 191 | 192 | com.github.alkathirikhalid 193 | connection 194 | v2.1.0 195 | 196 | ``` 197 | 198 | # Further Resources 199 |
    200 |
  • Document download: https://github.com/alkathirikhalid/connection/releases/download/v2.1.0/call-doc.zip
  • 201 |
  • Document download: https://github.com/alkathirikhalid/connection/releases/download/v2.1.0/network-doc.zip
  • 202 |
  • AAR download: https://github.com/alkathirikhalid/connection/releases/download/v2.1.0/connection.aar (Network & Call)
  • 203 |
  • JAR download: https://github.com/alkathirikhalid/connection/releases/download/v2.1.0/call.jar (Call Only)
  • 204 |
205 | 206 | # License 207 | 208 | Copyright 2015 - 2021 Al-Kathiri Khalid www.alkathirikhalid.com 209 | 210 | Licensed under the Apache License, Version 2.0 (the "License"); 211 | you may not use this file except in compliance with the License. 212 | You may obtain a copy of the License at 213 | 214 | http://www.apache.org/licenses/LICENSE-2.0 215 | 216 | Unless required by applicable law or agreed to in writing, software 217 | distributed under the License is distributed on an "AS IS" BASIS, 218 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 219 | See the License for the specific language governing permissions and 220 | limitations under the License. 221 | --------------------------------------------------------------------------------