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