diff --git a/README.md b/README.md
index 7884781..0b5fb18 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,11 @@
OCS Inventory NG Android Agent
Web site : https://ocsinventory-ng.org/
+
+# Build
+`bash gradlew assembleLegacy`
+## Possible targets:
+- clean
+- assembleLegacy (for Android 9)
+- assembleModern (Android X)
+- assembleModernDebug
diff --git a/app/build.gradle b/app/build.gradle
index c4df909..db6a93d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,15 +1,30 @@
+/*
+# Build legacy version (Android 8 / API 26)
+bash gradlew clean assembleLegacyDebug
+
+# Build modern version (Android 14 / API 34 with AndroidX)
+bash gradlew clean assembleModernDebug
+ */
apply plugin: 'com.android.application'
android {
- compileSdkVersion 26
- buildToolsVersion '26.0.3'
+ namespace "org.ocs.android.agent"
+ // compileSdkVersion is set per flavor below
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "org.ocs.android.agent"
- minSdkVersion 26
+ minSdkVersion 19
targetSdkVersion 26
+ versionCode 27
+ versionName "2.7"
+ }
+
+ compileOptions {
+ // Use Java 17 if your Android Gradle Plugin (AGP) >= 7.3
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
@@ -17,12 +32,72 @@ android {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
+ debug {
+ applicationIdSuffix ".debug"
+ versionNameSuffix "-debug"
+ }
}
+
+ // Define two build flavors: legacy (Android 8) and modern (Android 14)
+ flavorDimensions "mode"
+
productFlavors {
+ // -------- Legacy flavor: Android O (API 26) --------
+ legacy {
+ dimension "mode"
+ compileSdkVersion 26
+ targetSdkVersion 26
+ minSdkVersion 26 // old devices supported
+ resValue "string", "build_mode", "Legacy (Android 8)"
+ applicationIdSuffix ".legacy"
+ }
+
+ // -------- Modern flavor: Android 14 (API 34, AndroidX) --------
+ modern {
+ dimension "mode"
+ compileSdkVersion 34
+ targetSdkVersion 34
+ //minSdkVersion 19 // must be at least 19 for Material 1.12.0
+ minSdkVersion 21
+ resValue "string", "build_mode", "Modern (Android 14)"
+ applicationIdSuffix ".modern"
+ }
+ }
+
+ lint {
+ abortOnError false // Don’t stop the build because of AndroidX warnings
}
}
dependencies {
- implementation 'com.android.support:support-v4:26.1.0'
- implementation 'com.android.support:appcompat-v7:26.1.0'
+ // ==========================================================
+ // 📦 Flavor-specific dependencies
+ // ==========================================================
+ // Common dependencies (AndroidX)
+ /*
+ implementation 'androidx.appcompat:appcompat:1.7.0'
+ implementation 'androidx.core:core-ktx:1.13.1'
+ implementation 'com.google.android.material:material:1.5.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ */
+ // Legacy build → pre-AndroidX libraries
+ legacyImplementation('com.android.support:support-v4:26.1.0') {
+ exclude group: 'androidx.appcompat'
+ exclude group: 'androidx.core'
+ exclude group: 'androidx.vectordrawable'
+ }
+
+ legacyImplementation ('com.android.support:appcompat-v7:26.1.0') {
+ exclude group: 'androidx.appcompat'
+ exclude group: 'androidx.core'
+ exclude group: 'androidx.vectordrawable'
+ }
+ legacyImplementation 'com.google.android.material:material:1.5.0'
+ modernImplementation 'com.google.android.material:material:1.12.0'
+
+ // Modern build → AndroidX libraries
+ //modernImplementation 'androidx.core:core-ktx:1.13.1'
+ modernImplementation 'androidx.appcompat:appcompat:1.7.0'
+ modernImplementation 'com.google.android.material:material:1.12.0'
}
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1fcfd45..f067a0a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -20,7 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-->
-
-
-
-
@@ -58,6 +56,7 @@
@@ -96,6 +95,7 @@
@@ -104,6 +104,7 @@
diff --git a/app/src/main/java/org/ocs/android/actions/Inventory.java b/app/src/main/java/org/ocs/android/actions/Inventory.java
index 0174017..edbba4b 100644
--- a/app/src/main/java/org/ocs/android/actions/Inventory.java
+++ b/app/src/main/java/org/ocs/android/actions/Inventory.java
@@ -98,7 +98,7 @@ private void buildInventory(Context ctx) {
SystemInfos.initSystemInfos();
ocslog.debug("OCSBios...");
- bios = new OCSBios(mCtx);
+ bios = new OCSBios();
ocslog.debug("hardware...");
hardware = new OCSHardware();
String sid = Secure.getString(mCtx.getContentResolver(), Secure.ANDROID_ID);
diff --git a/app/src/main/java/org/ocs/android/agent/activity/OCSAgentActivity.java b/app/src/main/java/org/ocs/android/agent/activity/OCSAgentActivity.java
index 7d55c69..bac4840 100644
--- a/app/src/main/java/org/ocs/android/agent/activity/OCSAgentActivity.java
+++ b/app/src/main/java/org/ocs/android/agent/activity/OCSAgentActivity.java
@@ -20,7 +20,6 @@
*/
package org.ocs.android.agent.activity;
-import android.Manifest;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -31,9 +30,9 @@
import android.os.Environment;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.content.ContextCompat;
-import android.support.v7.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
@@ -166,7 +165,7 @@ public boolean onCreateOptionsMenu(Menu menu) {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
+ /*switch (item.getItemId()) {
case R.id.menu_settings:
startActivity(new Intent(this, OCSPrefsActivity.class));
break;
@@ -182,6 +181,17 @@ public boolean onOptionsItemSelected(MenuItem item) {
break;
default:
break;
+ }*/
+ int id = item.getItemId();
+ if (id == R.id.menu_settings)
+ startActivity(new Intent(this, OCSPrefsActivity.class));
+ else if (id == R.id.menu_export)
+ exportConfig();
+ else if (id == R.id.menu_import)
+ importConfig();
+ else if (id == R.id.menu_about) {
+ AboutDialog about = new AboutDialog(this);
+ about.show();
}
return true;
}
@@ -259,28 +269,29 @@ private void setStatus(String msg) {
private boolean checkAndRequestPermissions() {
// Check permissions
- String[] ocsPermissions = new String[]{
- Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.CAMERA,
- Manifest.permission.READ_PHONE_STATE,
- Manifest.permission.ACCESS_FINE_LOCATION,
- Manifest.permission.ACCESS_COARSE_LOCATION};
-
- List permissionNeeded = new ArrayList<>();
- for (String permission:ocsPermissions) {
- if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
- permissionNeeded.add(permission);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ String[] ocsPermissions = new String[]{
+ android.Manifest.permission.READ_EXTERNAL_STORAGE,
+ android.Manifest.permission.CAMERA,
+ android.Manifest.permission.READ_PHONE_STATE};
+
+ List permissionNeeded = new ArrayList<>();
+ for (String permission:ocsPermissions) {
+ if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
+ permissionNeeded.add(permission);
+ }
}
- }
- if (!permissionNeeded.isEmpty()) {
- requestPermissions(permissionNeeded.toArray(new String[permissionNeeded.size()]), REQUEST_PERMISSION_CODE);
- }
+ if (!permissionNeeded.isEmpty()) {
+ requestPermissions(permissionNeeded.toArray(new String[permissionNeeded.size()]), REQUEST_PERMISSION_CODE);
+ }
- for (String permission:ocsPermissions) {
- if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
- return false;
+ for (String permission:ocsPermissions) {
+ if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){
+ return false;
+ }
}
+
}
return true;
diff --git a/app/src/main/java/org/ocs/android/agent/activity/OCSInstallPackageActivity.java b/app/src/main/java/org/ocs/android/agent/activity/OCSInstallPackageActivity.java
index 505d232..e2a270d 100644
--- a/app/src/main/java/org/ocs/android/agent/activity/OCSInstallPackageActivity.java
+++ b/app/src/main/java/org/ocs/android/agent/activity/OCSInstallPackageActivity.java
@@ -25,7 +25,7 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.widget.TextView;
import org.ocs.android.actions.OCSLog;
diff --git a/app/src/main/java/org/ocs/android/agent/activity/OCSShowInventory.java b/app/src/main/java/org/ocs/android/agent/activity/OCSShowInventory.java
index 3e10228..5b3c4b5 100644
--- a/app/src/main/java/org/ocs/android/agent/activity/OCSShowInventory.java
+++ b/app/src/main/java/org/ocs/android/agent/activity/OCSShowInventory.java
@@ -21,8 +21,8 @@
package org.ocs.android.agent.activity;
import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
diff --git a/app/src/main/java/org/ocs/android/agent/service/OCSAgentService.java b/app/src/main/java/org/ocs/android/agent/service/OCSAgentService.java
index e53d5e5..2b1b6e2 100644
--- a/app/src/main/java/org/ocs/android/agent/service/OCSAgentService.java
+++ b/app/src/main/java/org/ocs/android/agent/service/OCSAgentService.java
@@ -31,7 +31,7 @@
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
-import android.support.v4.app.NotificationCompat;
+import androidx.core.app.NotificationCompat;
import org.ocs.android.actions.Inventory;
import org.ocs.android.actions.OCSFiles;
diff --git a/app/src/main/java/org/ocs/android/agent/service/OCSDownloadService.java b/app/src/main/java/org/ocs/android/agent/service/OCSDownloadService.java
index 571477b..e37db72 100644
--- a/app/src/main/java/org/ocs/android/agent/service/OCSDownloadService.java
+++ b/app/src/main/java/org/ocs/android/agent/service/OCSDownloadService.java
@@ -28,7 +28,7 @@
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
-import android.support.v4.app.NotificationCompat;
+import androidx.core.app.NotificationCompat;
import org.ocs.android.actions.OCSFiles;
import org.ocs.android.actions.OCSLog;
diff --git a/app/src/main/java/org/ocs/android/sections/OCSBios.java b/app/src/main/java/org/ocs/android/sections/OCSBios.java
index 1606ae6..350aee2 100644
--- a/app/src/main/java/org/ocs/android/sections/OCSBios.java
+++ b/app/src/main/java/org/ocs/android/sections/OCSBios.java
@@ -20,11 +20,7 @@
*/
package org.ocs.android.sections;
-import android.Manifest;
-import android.content.Context;
-import android.content.pm.PackageManager;
import android.os.Build;
-import android.support.v4.app.ActivityCompat;
import android.text.format.DateFormat;
import org.ocs.android.actions.OCSLog;
@@ -60,7 +56,7 @@ public class OCSBios implements OCSSectionInterface {
private String type;
private String smodel;
- public OCSBios(Context mCtx) {
+ public OCSBios() {
type = "Mobile";
OCSLog ocslog = OCSLog.getInstance();
assettag = Build.ID + "-0123456789";
@@ -68,11 +64,9 @@ public OCSBios(Context mCtx) {
manufacturer = Build.MANUFACTURER;
version = Build.BOOTLOADER;
ocslog.debug("BIOS version: " + version);
- try {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- serial = Build.getSerial();
- }
- } catch (SecurityException e) {
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
+ serial = Build.SERIAL;
+ } else {
serial = SystemInfos.getInstance().getSerial();
}
ocslog.debug("OCSBIOS serial " + serial);
diff --git a/app/src/main/java/org/ocs/android/sections/OCSNetworks.java b/app/src/main/java/org/ocs/android/sections/OCSNetworks.java
index 6a14e2e..1a4da73 100644
--- a/app/src/main/java/org/ocs/android/sections/OCSNetworks.java
+++ b/app/src/main/java/org/ocs/android/sections/OCSNetworks.java
@@ -103,9 +103,11 @@ public OCSNetworks(Context ctx) {
OCSNetwork netw = new OCSNetwork(name);
netw.setIpAdress(ipAdr.getHostAddress());
- try {
- netw.setMacaddr(Utils.bytesToHex(ni.getHardwareAddress()));
- } catch (SocketException ignored) {
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
+ try {
+ netw.setMacaddr(Utils.bytesToHex(ni.getHardwareAddress()));
+ } catch (SocketException se) {
+ }
}
// this ip may be already presents as a wifi address
boolean isWifi = false;
diff --git a/app/src/main/java/org/ocs/android/sections/OCSSims.java b/app/src/main/java/org/ocs/android/sections/OCSSims.java
index 08bfd8b..4b18cd4 100644
--- a/app/src/main/java/org/ocs/android/sections/OCSSims.java
+++ b/app/src/main/java/org/ocs/android/sections/OCSSims.java
@@ -44,12 +44,24 @@ public OCSSims(Context ctx) {
if (mng == null) {
ocslog.error("TelephonyManager information not found");
} else {
- device_id = mng.getDeviceId();
- simcountry = mng.getSimCountryIso();
- simoperator = mng.getSimOperator();
- simopname = mng.getSimOperatorName();
- simserial = mng.getSimSerialNumber();
- phonenumber = mng.getLine1Number();
+ // device_id = mng.getDeviceId();
+ /*if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE)
+ == PackageManager.PERMISSION_GRANTED) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ device_id = mng.getImei(); // API 26+
+ } else {
+ device_id = mng.getDeviceId();
+ */ /* simcountry = mng.getSimCountryIso();
+ simoperator = mng.getSimOperator();
+ simopname = mng.getSimOperatorName();
+ simserial = mng.getSimSerialNumber();
+ phonenumber = mng.getLine1Number();
+ */
+ /* }
+ } else {
+ device_id = "unknown";
+ }*/
+
ocslog.debug("device_id : " + device_id);
}
}
diff --git a/build.gradle b/build.gradle
index efbb2b2..1c8fb79 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,18 +2,20 @@
buildscript {
repositories {
google()
- jcenter()
+ // jcenter()
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.6.3'
+ //classpath 'com.android.tools.build:gradle:3.6.3'
+ classpath 'com.android.tools.build:gradle:8.2.2'
}
}
allprojects {
repositories {
google()
- jcenter()
+ // jcenter()
+ mavenCentral()
}
}
@@ -21,3 +23,4 @@ allprojects {
task clean(type: Delete) {
delete rootProject.buildDir
}
+
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..646c51b
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,2 @@
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index dbe55a5..4ae3109 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
-#Wed Apr 01 09:40:31 CEST 2020
+#Sun Oct 19 10:58:51 CEST 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+#distributionUrl=https\://services.gradle.org/distributions/gradle-9.0-milestone-1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip