Răsfoiți Sursa

first commit

yayan 6 luni în urmă
comite
439c4b9997
100 a modificat fișierele cu 1454 adăugiri și 0 ștergeri
  1. 15 0
      .gitignore
  2. 3 0
      .idea/.gitignore
  3. 8 0
      .idea/compiler.xml
  4. 10 0
      .idea/deploymentTargetSelector.xml
  5. 23 0
      .idea/gradle.xml
  6. 6 0
      .idea/kotlinc.xml
  7. 10 0
      .idea/migrations.xml
  8. 10 0
      .idea/misc.xml
  9. 17 0
      .idea/runConfigurations.xml
  10. 1 0
      app/.gitignore
  11. 49 0
      app/build.gradle
  12. 21 0
      app/proguard-rules.pro
  13. 24 0
      app/src/androidTest/java/io/nexilis/ExampleInstrumentedTest.kt
  14. 14 0
      app/src/custom/java/io/nexilis/app/NexilisActivity.java
  15. 13 0
      app/src/main/AndroidManifest.xml
  16. 20 0
      app/src/main/java/io/nexilis/MainActivity.kt
  17. 170 0
      app/src/main/res/drawable/ic_launcher_background.xml
  18. 30 0
      app/src/main/res/drawable/ic_launcher_foreground.xml
  19. BIN
      app/src/main/res/font/pb_poppins_black.ttf
  20. BIN
      app/src/main/res/font/pb_poppins_blackitalic.ttf
  21. BIN
      app/src/main/res/font/pb_poppins_bold.ttf
  22. BIN
      app/src/main/res/font/pb_poppins_bolditalic.ttf
  23. BIN
      app/src/main/res/font/pb_poppins_light.ttf
  24. BIN
      app/src/main/res/font/pb_poppins_lightitalic.ttf
  25. BIN
      app/src/main/res/font/pb_poppins_medium.ttf
  26. BIN
      app/src/main/res/font/pb_poppins_mediumitalic.ttf
  27. BIN
      app/src/main/res/font/pb_poppins_regular.ttf
  28. BIN
      app/src/main/res/font/pb_poppins_regularitalic.ttf
  29. BIN
      app/src/main/res/font/pb_poppins_thin.ttf
  30. BIN
      app/src/main/res/font/pb_poppins_thinitalic.ttf
  31. 19 0
      app/src/main/res/layout/activity_main.xml
  32. 6 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  33. 6 0
      app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  34. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher.webp
  35. BIN
      app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  36. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher.webp
  37. BIN
      app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  38. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher.webp
  39. BIN
      app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  40. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  41. BIN
      app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  42. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  43. BIN
      app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  44. 7 0
      app/src/main/res/values-night/themes.xml
  45. 5 0
      app/src/main/res/values/colors.xml
  46. 4 0
      app/src/main/res/values/strings.xml
  47. 22 0
      app/src/main/res/values/style.xml
  48. 9 0
      app/src/main/res/values/themes.xml
  49. 13 0
      app/src/main/res/xml/backup_rules.xml
  50. 19 0
      app/src/main/res/xml/data_extraction_rules.xml
  51. 17 0
      app/src/test/java/io/nexilis/ExampleUnitTest.kt
  52. 7 0
      build.gradle
  53. 1 0
      dm-plugin/.gitignore
  54. 47 0
      dm-plugin/build.gradle
  55. 61 0
      dm-plugin/src/main/java/io/nexilis/DynamicModulePlugin.kt
  56. 1 0
      dm-set-plugin/.gitignore
  57. 47 0
      dm-set-plugin/build.gradle
  58. 230 0
      dm-set-plugin/src/main/java/io/nexilis/SettingsPlugin.kt
  59. 1 0
      dynamic_core/.gitignore
  60. 46 0
      dynamic_core/build.gradle
  61. 21 0
      dynamic_core/proguard-rules.pro
  62. 24 0
      dynamic_core/src/androidTest/java/io/nexilis/ExampleInstrumentedTest.kt
  63. 14 0
      dynamic_core/src/custom/java/io/nexilis/app/NexilisActivity.java
  64. 13 0
      dynamic_core/src/main/AndroidManifest.xml
  65. 20 0
      dynamic_core/src/main/java/io/nexilis/MainActivity.kt
  66. 170 0
      dynamic_core/src/main/res/drawable/app_ic_launcher_background.xml
  67. 30 0
      dynamic_core/src/main/res/drawable/app_ic_launcher_foreground.xml
  68. BIN
      dynamic_core/src/main/res/font/pb_poppins_black.ttf
  69. BIN
      dynamic_core/src/main/res/font/pb_poppins_blackitalic.ttf
  70. BIN
      dynamic_core/src/main/res/font/pb_poppins_bold.ttf
  71. BIN
      dynamic_core/src/main/res/font/pb_poppins_bolditalic.ttf
  72. BIN
      dynamic_core/src/main/res/font/pb_poppins_light.ttf
  73. BIN
      dynamic_core/src/main/res/font/pb_poppins_lightitalic.ttf
  74. BIN
      dynamic_core/src/main/res/font/pb_poppins_medium.ttf
  75. BIN
      dynamic_core/src/main/res/font/pb_poppins_mediumitalic.ttf
  76. BIN
      dynamic_core/src/main/res/font/pb_poppins_regular.ttf
  77. BIN
      dynamic_core/src/main/res/font/pb_poppins_regularitalic.ttf
  78. BIN
      dynamic_core/src/main/res/font/pb_poppins_thin.ttf
  79. BIN
      dynamic_core/src/main/res/font/pb_poppins_thinitalic.ttf
  80. 19 0
      dynamic_core/src/main/res/layout/app_activity_main.xml
  81. 6 0
      dynamic_core/src/main/res/mipmap-anydpi-v26/app_ic_launcher.xml
  82. 6 0
      dynamic_core/src/main/res/mipmap-anydpi-v26/app_ic_launcher_round.xml
  83. BIN
      dynamic_core/src/main/res/mipmap-hdpi/app_ic_launcher.webp
  84. BIN
      dynamic_core/src/main/res/mipmap-hdpi/app_ic_launcher_round.webp
  85. BIN
      dynamic_core/src/main/res/mipmap-mdpi/app_ic_launcher.webp
  86. BIN
      dynamic_core/src/main/res/mipmap-mdpi/app_ic_launcher_round.webp
  87. BIN
      dynamic_core/src/main/res/mipmap-xhdpi/app_ic_launcher.webp
  88. BIN
      dynamic_core/src/main/res/mipmap-xhdpi/app_ic_launcher_round.webp
  89. BIN
      dynamic_core/src/main/res/mipmap-xxhdpi/app_ic_launcher.webp
  90. BIN
      dynamic_core/src/main/res/mipmap-xxhdpi/app_ic_launcher_round.webp
  91. BIN
      dynamic_core/src/main/res/mipmap-xxxhdpi/app_ic_launcher.webp
  92. BIN
      dynamic_core/src/main/res/mipmap-xxxhdpi/app_ic_launcher_round.webp
  93. 7 0
      dynamic_core/src/main/res/values-night/themes.xml
  94. 5 0
      dynamic_core/src/main/res/values/colors.xml
  95. 22 0
      dynamic_core/src/main/res/values/style.xml
  96. 9 0
      dynamic_core/src/main/res/values/themes.xml
  97. 13 0
      dynamic_core/src/main/res/xml/backup_rules.xml
  98. 19 0
      dynamic_core/src/main/res/xml/data_extraction_rules.xml
  99. 17 0
      dynamic_core/src/test/java/io/nexilis/ExampleUnitTest.kt
  100. 27 0
      gradle.properties

+ 15 - 0
.gitignore

@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 8 - 0
.idea/compiler.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <bytecodeTargetLevel target="11">
+      <module name="dm-plugin.app" target="21" />
+    </bytecodeTargetLevel>
+  </component>
+</project>

+ 10 - 0
.idea/deploymentTargetSelector.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="deploymentTargetSelector">
+    <selectionStates>
+      <SelectionState runConfigName="app">
+        <option name="selectionMode" value="DROPDOWN" />
+      </SelectionState>
+    </selectionStates>
+  </component>
+</project>

+ 23 - 0
.idea/gradle.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="testRunner" value="CHOOSE_PER_TEST" />
+        <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
+        <option name="modules">
+          <set>
+            <option value="$PROJECT_DIR$" />
+            <option value="$PROJECT_DIR$/app" />
+            <option value="$PROJECT_DIR$/dm-plugin" />
+            <option value="$PROJECT_DIR$/dm-set-plugin" />
+            <option value="$PROJECT_DIR$/dynamic_core" />
+          </set>
+        </option>
+        <option name="resolveExternalAnnotations" value="false" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 6 - 0
.idea/kotlinc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="KotlinJpsPluginSettings">
+    <option name="version" value="1.9.24" />
+  </component>
+</project>

+ 10 - 0
.idea/migrations.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectMigrations">
+    <option name="MigrateToGradleLocalJavaHome">
+      <set>
+        <option value="$PROJECT_DIR$" />
+      </set>
+    </option>
+  </component>
+</project>

+ 10 - 0
.idea/misc.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/build/classes" />
+  </component>
+  <component name="ProjectType">
+    <option name="id" value="Android" />
+  </component>
+</project>

+ 17 - 0
.idea/runConfigurations.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
+        <option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
+        <option value="com.intellij.execution.junit.PatternConfigurationProducer" />
+        <option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
+        <option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
+        <option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
+        <option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
+        <option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 1 - 0
app/.gitignore

@@ -0,0 +1 @@
+/build

+ 49 - 0
app/build.gradle

@@ -0,0 +1,49 @@
+plugins {
+    alias(libs.plugins.android.application)
+    alias(libs.plugins.kotlin.android)
+    id "io.nexilis.in-dm-plugin" version "1.0.0-alpha-18"
+}
+
+android {
+    namespace 'io.nexilis'
+    compileSdk 35
+
+    defaultConfig {
+        applicationId "io.nexilis.app"
+        minSdk 26
+        targetSdk 35
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_11
+        targetCompatibility JavaVersion.VERSION_11
+    }
+    kotlinOptions {
+        jvmTarget = "11"
+    }
+}
+
+dependencies {
+
+    implementation libs.androidx.core.ktx
+    implementation libs.androidx.appcompat
+    implementation libs.material
+    implementation libs.androidx.activity
+    implementation libs.androidx.constraintlayout
+    testImplementation libs.junit
+    androidTestImplementation libs.androidx.junit
+    androidTestImplementation libs.androidx.espresso.core
+
+    implementation 'com.ahmadullahpk:documents-reader-lib:1.0.6-g'
+    implementation 'androidx.work:work-runtime-ktx:2.10.0'
+}

+ 21 - 0
app/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 24 - 0
app/src/androidTest/java/io/nexilis/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package io.nexilis
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+    @Test
+    fun useAppContext() {
+        // Context of the app under test.
+        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+        assertEquals("io.nexilis", appContext.packageName)
+    }
+}

+ 14 - 0
app/src/custom/java/io/nexilis/app/NexilisActivity.java

@@ -0,0 +1,14 @@
+package io.nexilis.app;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class NexilisActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+}

+ 13 - 0
app/src/main/AndroidManifest.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
+
+    <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Dmplugin" tools:replace="android:allowBackup, android:fullBackupContent, android:dataExtractionRules, android:supportsRtl" tools:targetApi="31">
+        <activity android:exported="true" android:name="io.nexilis.app.NexilisActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>

+ 20 - 0
app/src/main/java/io/nexilis/MainActivity.kt

@@ -0,0 +1,20 @@
+package io.nexilis
+
+import android.os.Bundle
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+
+class MainActivity : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        enableEdgeToEdge()
+        setContentView(R.layout.activity_main)
+        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
+            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+            insets
+        }
+    }
+}

+ 170 - 0
app/src/main/res/drawable/ic_launcher_background.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path
+        android:fillColor="#3DDC84"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+</vector>

+ 30 - 0
app/src/main/res/drawable/ic_launcher_foreground.xml

@@ -0,0 +1,30 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="85.84757"
+                android:endY="92.4963"
+                android:startX="42.9492"
+                android:startY="49.59793"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

BIN
app/src/main/res/font/pb_poppins_black.ttf


BIN
app/src/main/res/font/pb_poppins_blackitalic.ttf


BIN
app/src/main/res/font/pb_poppins_bold.ttf


BIN
app/src/main/res/font/pb_poppins_bolditalic.ttf


BIN
app/src/main/res/font/pb_poppins_light.ttf


BIN
app/src/main/res/font/pb_poppins_lightitalic.ttf


BIN
app/src/main/res/font/pb_poppins_medium.ttf


BIN
app/src/main/res/font/pb_poppins_mediumitalic.ttf


BIN
app/src/main/res/font/pb_poppins_regular.ttf


BIN
app/src/main/res/font/pb_poppins_regularitalic.ttf


BIN
app/src/main/res/font/pb_poppins_thin.ttf


BIN
app/src/main/res/font/pb_poppins_thinitalic.ttf


+ 19 - 0
app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Hello World!"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

+ 6 - 0
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>

BIN
app/src/main/res/mipmap-hdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-mdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


+ 7 - 0
app/src/main/res/values-night/themes.xml

@@ -0,0 +1,7 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Base.Theme.Dmplugin" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your dark theme here. -->
+        <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
+    </style>
+</resources>

+ 5 - 0
app/src/main/res/values/colors.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="black">#FF000000</color>
+    <color name="white">#FFFFFFFF</color>
+</resources>

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -0,0 +1,4 @@
+<resources>
+    <string name="app_name">dm-plugin</string>
+    <string name="title_dynamic_core">core</string>
+</resources>

+ 22 - 0
app/src/main/res/values/style.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <style name="pb_AppTheme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:fontFamily">@font/pb_poppins_regular</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:textViewStyle">@style/pb_OpenSansTextViewStyle</item>
+    </style>
+
+    <style name="pb_AppTheme.Transparents" parent="pb_AppTheme.Transparent">
+        <item name="android:windowIsTranslucent">true</item>
+    </style>
+
+    <style name="pb_OpenSansTextViewStyle" parent="android:Widget.TextView">
+        <item name="android:fontFamily">@font/pb_poppins_regular</item>
+    </style>
+</resources>

+ 9 - 0
app/src/main/res/values/themes.xml

@@ -0,0 +1,9 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Base.Theme.Dmplugin" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your light theme here. -->
+        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
+    </style>
+
+    <style name="Theme.Dmplugin" parent="Base.Theme.Dmplugin" />
+</resources>

+ 13 - 0
app/src/main/res/xml/backup_rules.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample backup rules file; uncomment and customize as necessary.
+   See https://developer.android.com/guide/topics/data/autobackup
+   for details.
+   Note: This file is ignored for devices older that API 31
+   See https://developer.android.com/about/versions/12/backup-restore
+-->
+<full-backup-content>
+    <!--
+   <include domain="sharedpref" path="."/>
+   <exclude domain="sharedpref" path="device.xml"/>
+-->
+</full-backup-content>

+ 19 - 0
app/src/main/res/xml/data_extraction_rules.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample data extraction rules file; uncomment and customize as necessary.
+   See https://developer.android.com/about/versions/12/backup-restore#xml-changes
+   for details.
+-->
+<data-extraction-rules>
+    <cloud-backup>
+        <!-- TODO: Use <include> and <exclude> to control what is backed up.
+        <include .../>
+        <exclude .../>
+        -->
+    </cloud-backup>
+    <!--
+    <device-transfer>
+        <include .../>
+        <exclude .../>
+    </device-transfer>
+    -->
+</data-extraction-rules>

+ 17 - 0
app/src/test/java/io/nexilis/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package io.nexilis
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+    @Test
+    fun addition_isCorrect() {
+        assertEquals(4, 2 + 2)
+    }
+}

+ 7 - 0
build.gradle

@@ -0,0 +1,7 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+    alias(libs.plugins.android.application) apply false
+    alias(libs.plugins.kotlin.android) apply false
+    alias(libs.plugins.jetbrains.kotlin.jvm) apply false
+    id "io.nexilis.dm-plugin" version "1.0"
+}

+ 1 - 0
dm-plugin/.gitignore

@@ -0,0 +1 @@
+/build

+ 47 - 0
dm-plugin/build.gradle

@@ -0,0 +1,47 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+    id 'java-gradle-plugin'
+    id 'maven-publish'
+    alias(libs.plugins.jetbrains.kotlin.jvm)
+}
+
+java {
+    sourceCompatibility JavaVersion.VERSION_11
+    targetCompatibility JavaVersion.VERSION_11
+}
+
+kotlin {
+    compilerOptions {
+        jvmTarget = JvmTarget.JVM_11
+    }
+}
+group = "io.nexilis" // Replace with your group ID
+version = "1.0"      // Replace with your plugin version
+
+gradlePlugin {
+    plugins {
+        dm {
+            id = "io.nexilis.dm-plugin"
+            implementationClass = "io.nexilis.DynamicModulePlugin"
+        }
+    }
+}
+
+dependencies {
+    implementation(gradleApi())
+    compileOnly(libs.gradle)
+}
+
+publishing {
+    repositories {
+        maven {
+            url = uri("${project.buildDir}/repo") // Local Maven repository
+        }
+    }
+    publications {
+        mavenJava(MavenPublication) {
+            from components.java
+        }
+    }
+}

+ 61 - 0
dm-plugin/src/main/java/io/nexilis/DynamicModulePlugin.kt

@@ -0,0 +1,61 @@
+package io.nexilis
+
+import com.android.build.gradle.internal.dsl.BaseAppModuleExtension
+import com.android.build.gradle.internal.dsl.DynamicFeatureExtension
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.ProjectEvaluationListener
+import org.gradle.api.ProjectState
+
+const val libNameSpace = "com.example.dm"
+
+class DynamicModulePlugin : Plugin<Project> {
+    var mainProjectName: String = ""
+    override fun apply(target: Project) {
+        target.gradle.addProjectEvaluationListener(object : ProjectEvaluationListener {
+            override fun beforeEvaluate(project: Project) {
+                println(">>>>>>>>>>> beforeEvaluate:${project.name}")
+            }
+
+            override fun afterEvaluate(project: Project, state: ProjectState) {
+                println(">>>>>>>>>>> afterEvaluate:${project.name}")
+                project.plugins.withId("com.android.application") {
+                    val android = project.extensions.getByType(BaseAppModuleExtension::class.java)
+                    android.sourceSets.maybeCreate("main")
+                    android.sourceSets.getByName("main") { sourceSet ->
+                        sourceSet.java.setSrcDirs(listOf("src/custom/java"))
+                        println(">>>>>>>>>>> java:setSrcDirs:${project.projectDir}")
+                    }
+                    android.dynamicFeatures.add(":dynamic_core")
+                    println(">>>>>>>>>>> dynamicFeature:add:dynamic_core")
+                }
+                project.plugins.withId("com.android.application") {
+                    mainProjectName = project.name
+                    project.dependencies.add("implementation", "io.nexilis:ui-api-dm:5.0.12")
+                    println(">>>>>>>>>>> implementation:io.nexilis:ui-api-dm")
+                    project.dependencies.add("implementation", "io.nexilis:ss:5.0.12")
+                    println(">>>>>>>>>>> implementation:io.nexilis:ss")
+                }
+                if (project.name.equals("dynamic_core")) {
+                    val android = project.extensions.getByType(DynamicFeatureExtension::class.java)
+                    android.namespace = libNameSpace
+                    android.defaultConfig.applicationId = null
+                    android.buildTypes.forEach {
+                        it.isMinifyEnabled = false
+                    }
+                    println(">>>>>>>>>>> set:minifyEnabled:false")
+                    project.dependencies.add(
+                        "implementation",
+                        project.project(":$mainProjectName")
+                    )
+                    println(">>>>>>>>>>> implementation:$mainProjectName")
+                    project.dependencies.add("implementation", "io.nexilis:ui-api:5.0.12")
+                    println(">>>>>>>>>>> implementation:io.nexilis:ui-api:5.0.12")
+                    project.dependencies.add("implementation", "io.nexilis:uc:5.0.12")
+                    println(">>>>>>>>>>> implementation:io.nexilis:uc:5.0.12")
+                }
+            }
+        })
+    }
+
+}

+ 1 - 0
dm-set-plugin/.gitignore

@@ -0,0 +1 @@
+/build

+ 47 - 0
dm-set-plugin/build.gradle

@@ -0,0 +1,47 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
+plugins {
+    id 'java-gradle-plugin'
+    id 'maven-publish'
+    alias(libs.plugins.jetbrains.kotlin.jvm)
+}
+
+java {
+    sourceCompatibility JavaVersion.VERSION_11
+    targetCompatibility JavaVersion.VERSION_11
+}
+
+kotlin {
+    compilerOptions {
+        jvmTarget = JvmTarget.JVM_11
+    }
+}
+
+group = "io.nexilis"
+version = "1.0"
+
+gradlePlugin {
+    plugins {
+        st {
+            id = "io.nexilis.dm-st-plugin"
+            implementationClass = "io.nexilis.SettingsPlugin"
+        }
+    }
+}
+
+dependencies {
+    implementation(gradleApi())
+}
+
+publishing {
+    repositories {
+        maven {
+            url = uri("${project.buildDir}/repo") // Local Maven repository
+        }
+    }
+    publications {
+        mavenJava(MavenPublication) {
+            from components.java
+        }
+    }
+}

+ 230 - 0
dm-set-plugin/src/main/java/io/nexilis/SettingsPlugin.kt

@@ -0,0 +1,230 @@
+package io.nexilis
+
+import org.gradle.api.Plugin
+import org.gradle.api.initialization.Settings
+import org.w3c.dom.Document
+import org.w3c.dom.Element
+import org.xml.sax.SAXException
+import java.io.File
+import java.io.IOException
+import java.io.StringWriter
+import java.nio.file.FileVisitResult
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.Paths
+import java.nio.file.SimpleFileVisitor
+import java.nio.file.StandardCopyOption
+import java.nio.file.attribute.BasicFileAttributes
+import javax.xml.parsers.DocumentBuilderFactory
+import javax.xml.parsers.ParserConfigurationException
+import javax.xml.transform.TransformerFactory
+import javax.xml.transform.dom.DOMSource
+import javax.xml.transform.stream.StreamResult
+import kotlin.io.path.ExperimentalPathApi
+import kotlin.io.path.extension
+import kotlin.io.path.inputStream
+import kotlin.io.path.name
+import kotlin.io.path.nameWithoutExtension
+
+const val libNameSpace = "com.example.dm"
+
+class SettingsPlugin: Plugin<Settings> {
+    override fun apply(settings: Settings) {
+        println(">>>>>>>>>>> Settings")
+        settings.gradle.settingsEvaluated {
+            println(">>>>>>>>>>> settingsEvaluated")
+            try {
+                val moduleDir = File(settings.rootDir, "dynamic_core")
+                if (moduleDir.exists()) {
+                    moduleDir.deleteRecursively()
+                    println(">>>>>>>>>>> delete:dir:${moduleDir.toPath()}")
+                }
+                if (!moduleDir.exists()) {
+                    println(">>>>>>>>>>> create:dir:${moduleDir.toPath()}")
+                    moduleDir.mkdirs()
+                }
+                val projectApp = settings.project(File(settings.rootDir, "app"))
+                println(">>>>>>>>>>> copy:from:${projectApp.projectDir.toPath()}")
+                projectApp.projectDir.toPath().copy(moduleDir.toPath())
+                println(">>>>>>>>>>> copy:done")
+                moduleDir.toPath().refactor()
+                println(">>>>>>>>>>> refactor:done")
+                settings.include(":dynamic_core")
+                println(">>>>>>>>>>> include module:dynamic_core")
+                val tmpBaseDir = File(projectApp.projectDir, "src/custom/java/io/nexilis/app")
+                println(">>>>>>>>>>> create:base:dir:${tmpBaseDir.toPath()}")
+                if (!tmpBaseDir.exists()) {
+                    tmpBaseDir.mkdirs()
+                }
+                val activity = Paths.get(tmpBaseDir.toPath().toString(), "NexilisActivity.java")
+                Files.writeString(activity, mainActivity)
+                println(">>>>>>>>>>> create:activity:$activity")
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
+        }
+    }
+}
+
+const val mainActivity = "package io.nexilis.app;\n" +
+        "\n" +
+        "import android.os.Bundle;\n" +
+        "\n" +
+        "import androidx.appcompat.app.AppCompatActivity;\n" +
+        "\n" +
+        "public class NexilisActivity extends AppCompatActivity {\n" +
+        "\n" +
+        "    @Override\n" +
+        "    protected void onCreate(Bundle savedInstanceState) {\n" +
+        "        super.onCreate(savedInstanceState);\n" +
+        "    }\n" +
+        "\n" +
+        "}\n"
+const val androidManifest = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
+        "<manifest xmlns:dist=\"http://schemas.android.com/apk/distribution\">\n" +
+        "\n" +
+        "    <dist:module\n" +
+        "        dist:instant=\"false\"\n" +
+        "        dist:title=\"@string/title_dynamic_core\">\n" +
+        "        <dist:delivery>\n" +
+        "            <dist:on-demand />\n" +
+        "        </dist:delivery>\n" +
+        "        <dist:fusing dist:include=\"true\" />\n" +
+        "    </dist:module>\n" +
+        "    \n" +
+        "</manifest>"
+
+@OptIn(ExperimentalPathApi::class)
+fun Path.copy(target: Path) {
+    Files.walkFileTree(this, object : SimpleFileVisitor<Path>() {
+        @Throws(IOException::class)
+        override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult {
+            if (dir.fileName.name == "build") {
+                return FileVisitResult.SKIP_SUBTREE
+            }
+            val targetPath = target.resolve(this@copy.relativize(dir))
+            if (!Files.exists(targetPath)) {
+                Files.createDirectory(targetPath)
+            }
+            return FileVisitResult.CONTINUE
+        }
+
+        @Throws(IOException::class)
+        override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult {
+            if (file.fileName.name == "strings.xml") return FileVisitResult.CONTINUE
+            val targetPath = target.resolve(this@copy.relativize(file))
+            Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING)
+            if (file.isResource()) {
+                val oldName = targetPath.fileName.nameWithoutExtension
+                val oldExtension = targetPath.extension
+                val newName = "app_$oldName.$oldExtension"
+                val oldFile = targetPath.toFile()
+                val newFile = File(oldFile.parentFile, newName)
+                oldFile.renameTo(newFile)
+                renamedFiles[oldName] = newName
+            }
+            if (file.fileName.name == "build.gradle") {
+                var updatedContent = """plugins\s*\{[^}]*}""".toRegex()
+                    .replace(
+                        Files.readString(file).trimIndent(),
+                        "plugins {\n    id 'com.android.dynamic-feature'\n}\n"
+                    )
+//                updatedContent = """namespace\s+(['"])[^'"]+"\s*""".toRegex()
+//                    .replace(updatedContent, "'$libNameSpace'")
+//                updatedContent = """applicationId\s+(['"])[^'"]+"\s*""".toRegex()
+//                    .replace(updatedContent, "")
+                updatedContent = """kotlinOptions\s*\{\s*jvmTarget\s*=\s*"11"\s*\}""".toRegex()
+                    .replace(updatedContent, "")
+                Files.writeString(targetPath, updatedContent)
+            }
+            if (file.fileName.name == "AndroidManifest.xml") {
+                try {
+                    val activity = file.replaceMainActivity("io.nexilis.app.NexilisActivity")
+                    Files.writeString(file, activity)
+                } catch (_: Exception) {
+                }
+                Files.writeString(targetPath, androidManifest)
+            }
+            return FileVisitResult.CONTINUE
+        }
+    })
+}
+
+fun Path.refactor() {
+    Files.walkFileTree(this, object : SimpleFileVisitor<Path>() {
+        override fun visitFile(p0: Path, p1: BasicFileAttributes?): FileVisitResult {
+            if (p0.isSource()) {
+                var isReplace: Boolean = false
+                var content = Files.readString(p0)
+                renamedFiles.forEach { (oldName, newName) ->
+                    val newReference = newName.substringBefore(".")
+                    val tmpContent = content.replace("""$oldName\b""".toRegex(), newReference)
+                    if (content != tmpContent) {
+                        content = tmpContent
+                        isReplace = true
+                    }
+                }
+                val tmpContent = content.replace("""\bR\.""".toRegex(), "$libNameSpace.R.")
+                if (content != tmpContent) {
+                    content = tmpContent
+                    isReplace = true
+                }
+                if (isReplace) {
+                    Files.writeString(p0, content)
+                }
+            }
+            return FileVisitResult.CONTINUE
+        }
+    })
+}
+
+@Throws(ParserConfigurationException::class, IOException::class, SAXException::class)
+fun Path.replaceMainActivity(string: String): String {
+    val doc = DocumentBuilderFactory.newInstance()
+        .newDocumentBuilder()
+        .parse(this.inputStream())
+    doc.documentElement.normalize()
+    return doc.replace(string).asString()
+}
+
+fun Document.replace(string: String): Document {
+    val activity = this.getElementsByTagName("activity")
+    p@ for (i in 0..<activity.length) {
+        val element = activity.item(i) as Element
+        val intent = element.getElementsByTagName("intent-filter")
+        for (j in 0..<intent.length) {
+            val element1 = intent.item(j) as Element
+            val action = element1.getElementsByTagName("action")
+            for (k in 0..<action.length) {
+                val element2 = action.item(k) as Element
+                if (element2.getAttribute("android:name") == "android.intent.action.MAIN") {
+                    element.setAttribute("android:name", string)
+                    break@p
+                }
+            }
+        }
+    }
+    return this
+}
+
+fun Document.asString(): String {
+    val writer = StringWriter()
+    TransformerFactory.newInstance()
+        .newTransformer()
+        .transform(DOMSource(this), StreamResult(writer))
+    return writer.toString()
+}
+
+val renamedFiles = mutableMapOf<String, String>()
+
+fun Path.isResource(): Boolean {
+    if (this.fileName.name == "AndroidManifest.xml") return false
+    if (this.parent.name.contains("drawable|layout|mipmap".toRegex())) {
+        return this.fileName.extension.matches("xml|png|webp|jpeg|jpg|bitmap".toRegex())
+    }
+    return false
+}
+
+fun Path.isSource(): Boolean {
+    return this.fileName.extension.matches("java|kt|xml".toRegex())
+}

+ 1 - 0
dynamic_core/.gitignore

@@ -0,0 +1 @@
+/build

+ 46 - 0
dynamic_core/build.gradle

@@ -0,0 +1,46 @@
+plugins {
+    id 'com.android.dynamic-feature'
+}
+
+
+android {
+    namespace 'io.nexilis'
+    compileSdk 35
+
+    defaultConfig {
+        applicationId "io.nexilis.app"
+        minSdk 26
+        targetSdk 35
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_11
+        targetCompatibility JavaVersion.VERSION_11
+    }
+    
+}
+
+dependencies {
+
+    implementation libs.androidx.core.ktx
+    implementation libs.androidx.appcompat
+    implementation libs.material
+    implementation libs.androidx.activity
+    implementation libs.androidx.constraintlayout
+    testImplementation libs.junit
+    androidTestImplementation libs.androidx.junit
+    androidTestImplementation libs.androidx.espresso.core
+
+    implementation 'com.ahmadullahpk:documents-reader-lib:1.0.6-g'
+    implementation 'androidx.work:work-runtime-ktx:2.10.0'
+}

+ 21 - 0
dynamic_core/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 24 - 0
dynamic_core/src/androidTest/java/io/nexilis/ExampleInstrumentedTest.kt

@@ -0,0 +1,24 @@
+package io.nexilis
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+    @Test
+    fun useAppContext() {
+        // Context of the app under test.
+        val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+        assertEquals("io.nexilis", appContext.packageName)
+    }
+}

+ 14 - 0
dynamic_core/src/custom/java/io/nexilis/app/NexilisActivity.java

@@ -0,0 +1,14 @@
+package io.nexilis.app;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class NexilisActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+}

+ 13 - 0
dynamic_core/src/main/AndroidManifest.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:dist="http://schemas.android.com/apk/distribution">
+
+    <dist:module
+        dist:instant="false"
+        dist:title="@string/title_dynamic_core">
+        <dist:delivery>
+            <dist:on-demand />
+        </dist:delivery>
+        <dist:fusing dist:include="true" />
+    </dist:module>
+    
+</manifest>

+ 20 - 0
dynamic_core/src/main/java/io/nexilis/MainActivity.kt

@@ -0,0 +1,20 @@
+package io.nexilis
+
+import android.os.Bundle
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+
+class MainActivity : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        enableEdgeToEdge()
+        setContentView(com.example.dm.R.layout.app_activity_main)
+        ViewCompat.setOnApplyWindowInsetsListener(findViewById(com.example.dm.R.id.main)) { v, insets ->
+            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
+            insets
+        }
+    }
+}

+ 170 - 0
dynamic_core/src/main/res/drawable/app_ic_launcher_background.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path
+        android:fillColor="#3DDC84"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeWidth="0.8"
+        android:strokeColor="#33FFFFFF" />
+</vector>

+ 30 - 0
dynamic_core/src/main/res/drawable/app_ic_launcher_foreground.xml

@@ -0,0 +1,30 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="85.84757"
+                android:endY="92.4963"
+                android:startX="42.9492"
+                android:startY="49.59793"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
+        android:strokeWidth="1"
+        android:strokeColor="#00000000" />
+</vector>

BIN
dynamic_core/src/main/res/font/pb_poppins_black.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_blackitalic.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_bold.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_bolditalic.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_light.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_lightitalic.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_medium.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_mediumitalic.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_regular.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_regularitalic.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_thin.ttf


BIN
dynamic_core/src/main/res/font/pb_poppins_thinitalic.ttf


+ 19 - 0
dynamic_core/src/main/res/layout/app_activity_main.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Hello World!"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
dynamic_core/src/main/res/mipmap-anydpi-v26/app_ic_launcher.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/app_ic_launcher_background" />
+    <foreground android:drawable="@drawable/app_ic_launcher_foreground" />
+    <monochrome android:drawable="@drawable/app_ic_launcher_foreground" />
+</adaptive-icon>

+ 6 - 0
dynamic_core/src/main/res/mipmap-anydpi-v26/app_ic_launcher_round.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/app_ic_launcher_background" />
+    <foreground android:drawable="@drawable/app_ic_launcher_foreground" />
+    <monochrome android:drawable="@drawable/app_ic_launcher_foreground" />
+</adaptive-icon>

BIN
dynamic_core/src/main/res/mipmap-hdpi/app_ic_launcher.webp


BIN
dynamic_core/src/main/res/mipmap-hdpi/app_ic_launcher_round.webp


BIN
dynamic_core/src/main/res/mipmap-mdpi/app_ic_launcher.webp


BIN
dynamic_core/src/main/res/mipmap-mdpi/app_ic_launcher_round.webp


BIN
dynamic_core/src/main/res/mipmap-xhdpi/app_ic_launcher.webp


BIN
dynamic_core/src/main/res/mipmap-xhdpi/app_ic_launcher_round.webp


BIN
dynamic_core/src/main/res/mipmap-xxhdpi/app_ic_launcher.webp


BIN
dynamic_core/src/main/res/mipmap-xxhdpi/app_ic_launcher_round.webp


BIN
dynamic_core/src/main/res/mipmap-xxxhdpi/app_ic_launcher.webp


BIN
dynamic_core/src/main/res/mipmap-xxxhdpi/app_ic_launcher_round.webp


+ 7 - 0
dynamic_core/src/main/res/values-night/themes.xml

@@ -0,0 +1,7 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Base.Theme.Dmplugin" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your dark theme here. -->
+        <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
+    </style>
+</resources>

+ 5 - 0
dynamic_core/src/main/res/values/colors.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="black">#FF000000</color>
+    <color name="white">#FFFFFFFF</color>
+</resources>

+ 22 - 0
dynamic_core/src/main/res/values/style.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <style name="pb_AppTheme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:fontFamily">@font/pb_poppins_regular</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+        <item name="android:windowAnimationStyle">@null</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:textViewStyle">@style/pb_OpenSansTextViewStyle</item>
+    </style>
+
+    <style name="pb_AppTheme.Transparents" parent="pb_AppTheme.Transparent">
+        <item name="android:windowIsTranslucent">true</item>
+    </style>
+
+    <style name="pb_OpenSansTextViewStyle" parent="android:Widget.TextView">
+        <item name="android:fontFamily">@font/pb_poppins_regular</item>
+    </style>
+</resources>

+ 9 - 0
dynamic_core/src/main/res/values/themes.xml

@@ -0,0 +1,9 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Base application theme. -->
+    <style name="Base.Theme.Dmplugin" parent="Theme.Material3.DayNight.NoActionBar">
+        <!-- Customize your light theme here. -->
+        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
+    </style>
+
+    <style name="Theme.Dmplugin" parent="Base.Theme.Dmplugin" />
+</resources>

+ 13 - 0
dynamic_core/src/main/res/xml/backup_rules.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample backup rules file; uncomment and customize as necessary.
+   See https://developer.android.com/guide/topics/data/autobackup
+   for details.
+   Note: This file is ignored for devices older that API 31
+   See https://developer.android.com/about/versions/12/backup-restore
+-->
+<full-backup-content>
+    <!--
+   <include domain="sharedpref" path="."/>
+   <exclude domain="sharedpref" path="device.xml"/>
+-->
+</full-backup-content>

+ 19 - 0
dynamic_core/src/main/res/xml/data_extraction_rules.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+   Sample data extraction rules file; uncomment and customize as necessary.
+   See https://developer.android.com/about/versions/12/backup-restore#xml-changes
+   for details.
+-->
+<data-extraction-rules>
+    <cloud-backup>
+        <!-- TODO: Use <include> and <exclude> to control what is backed up.
+        <include .../>
+        <exclude .../>
+        -->
+    </cloud-backup>
+    <!--
+    <device-transfer>
+        <include .../>
+        <exclude .../>
+    </device-transfer>
+    -->
+</data-extraction-rules>

+ 17 - 0
dynamic_core/src/test/java/io/nexilis/ExampleUnitTest.kt

@@ -0,0 +1,17 @@
+package io.nexilis
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+    @Test
+    fun addition_isCorrect() {
+        assertEquals(4, 2 + 2)
+    }
+}

+ 27 - 0
gradle.properties

@@ -0,0 +1,27 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. For more details, visit
+# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
+nexilis.appId=OneApp
+nexilis.account=38747683290F62E9667A018F490396EAE47BC16ADECD85B7E865C733E6DBD6A2
+repo_username=development
+repo_password=AP6wH1jwMWCRwDBftXh4cLmtYq7

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff