@pi-r/android 0.10.1 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,147 @@ const types_1 = require("@e-mc/types");
8
8
  const util_1 = require("@e-mc/document/util");
9
9
  const Parser = htmlparser2.Parser;
10
10
  const DomHandler = domhandler.DomHandler;
11
- const MANIFEST_ATTR = ['package', 'android:sharedUserId', 'android:sharedUserLabel', 'android:sharedUserMaxSdkVersion', 'android:versionCode', 'android:versionName', 'android:installLocation'];
11
+ const MANIFEST_ATTR = [
12
+ 'package',
13
+ 'android:sharedUserId',
14
+ 'android:sharedUserLabel',
15
+ 'android:sharedUserMaxSdkVersion',
16
+ 'android:versionCode',
17
+ 'android:versionName',
18
+ 'android:installLocation'
19
+ ];
20
+ const APPLICATION_ATTR = [
21
+ 'android:allowTaskReparenting',
22
+ 'android:allowBackup',
23
+ 'android:allowClearUserData',
24
+ 'android:allowNativeHeapPointerTagging',
25
+ 'android:appCategory',
26
+ 'android:backupAgent',
27
+ 'android:backupInForeground',
28
+ 'android:banner',
29
+ 'android:dataExtractionRules',
30
+ 'android:debuggable',
31
+ 'android:description',
32
+ 'android:enabled',
33
+ 'android:enableOnBackInvokedCallback',
34
+ 'android:extractNativeLibs',
35
+ 'android:fullBackupContent',
36
+ 'android:fullBackupOnly',
37
+ 'android:gwpAsanMode',
38
+ 'android:hasCode',
39
+ 'android:hasFragileUserData',
40
+ 'android:hardwareAccelerated',
41
+ 'android:icon',
42
+ 'android:isGame',
43
+ 'android:isMonitoringTool',
44
+ 'android:killAfterRestore',
45
+ 'android:largeHeap',
46
+ 'android:logo',
47
+ 'android:manageSpaceActivity',
48
+ 'android:name',
49
+ 'android:networkSecurityConfig',
50
+ 'android:permission',
51
+ 'android:persistent',
52
+ 'android:process',
53
+ 'android:restoreAnyVersion',
54
+ 'android:requestLegacyExternalStorage',
55
+ 'android:requiredAccountType',
56
+ 'android:resizeableActivity',
57
+ 'android:restrictedAccountType',
58
+ 'android:taskAffinity',
59
+ 'android:testOnly',
60
+ 'android:uiOptions',
61
+ 'android:usesCleartextTraffic',
62
+ 'android:vmSafeMode'
63
+ ];
64
+ const ACTIVITY_ATTR = [
65
+ 'android:allowEmbedded',
66
+ 'android:allowTaskReparenting',
67
+ 'android:alwaysRetainTaskState',
68
+ 'android:autoRemoveFromRecents',
69
+ 'android:banner',
70
+ 'android:canDisplayOnRemoteDevices',
71
+ 'android:clearTaskOnLaunch',
72
+ 'android:colorMode',
73
+ 'android:configChanges',
74
+ 'android:directBootAware',
75
+ 'android:documentLaunchMode',
76
+ 'android:enabled',
77
+ 'android:enableOnBackInvokedCallback',
78
+ 'android:excludeFromRecents',
79
+ 'android:exported',
80
+ 'android:finishOnTaskLaunch',
81
+ 'android:hardwareAccelerated',
82
+ 'android:icon',
83
+ 'android:immersive',
84
+ 'android:label',
85
+ 'android:launchMode',
86
+ 'android:lockTaskMode',
87
+ 'android:maxRecents',
88
+ 'android:maxAspectRatio',
89
+ 'android:minAspectRatio',
90
+ 'android:multiprocess',
91
+ 'android:name',
92
+ 'android:noHistory',
93
+ 'android:parentActivityName',
94
+ 'android:persistableMode',
95
+ 'android:permission',
96
+ 'android:process',
97
+ 'android:relinquishTaskIdentity',
98
+ 'android:requireContentUriPermissionFromCaller',
99
+ 'android:resizeableActivity',
100
+ 'android:screenOrientation',
101
+ 'android:showForAllUsers',
102
+ 'android:stateNotNeeded',
103
+ 'android:supportsPictureInPicture',
104
+ 'android:taskAffinity',
105
+ 'android:theme',
106
+ 'android:uiOptions',
107
+ 'android:windowSoftInputMode'
108
+ ];
109
+ const INVALID_ATTR = [
110
+ [36, ['android:resizableActivity', 'android:minAspectRatio', 'android:maxAspectRatio']]
111
+ ];
112
+ function getValidKeys(instance, data, attrList) {
113
+ const result = [];
114
+ const targetApi = typeof instance.targetAPI === 'number' ? instance.targetAPI : 0;
115
+ for (let attr in data) {
116
+ let value = data[attr];
117
+ const messageString = (type) => `${type} attribute: ${attr}="${value || 'null'}"`;
118
+ invalid: {
119
+ if (attrList.includes(attr) || !attr.includes(':') && attrList.includes(attr = 'android:' + attr)) {
120
+ value = Array.isArray(value) ? value.join('|') : value?.toString() || '';
121
+ if (targetApi >= 36) {
122
+ for (const [api, attrs] of INVALID_ATTR) {
123
+ if (targetApi >= api && attrs.includes(attr)) {
124
+ instance.addLog(instance.statusType.WARN, messageString("Invalid config"));
125
+ break invalid;
126
+ }
127
+ }
128
+ }
129
+ result.push([attr, value]);
130
+ }
131
+ else if (value !== undefined) {
132
+ instance.addLog(instance.statusType.INFO, messageString("Unknown"));
133
+ }
134
+ }
135
+ }
136
+ return result;
137
+ }
138
+ function applyAttributes(target, keys) {
139
+ if (keys.length === 0) {
140
+ return false;
141
+ }
142
+ for (const [attr, value] of keys) {
143
+ if (value) {
144
+ target.attribs[attr] = value;
145
+ }
146
+ else {
147
+ delete target.attribs[attr];
148
+ }
149
+ }
150
+ return true;
151
+ }
12
152
  function finalize(instance) {
13
153
  const config = instance.config;
14
154
  const manifest = config.manifest;
@@ -17,8 +157,11 @@ function finalize(instance) {
17
157
  }
18
158
  let { localUri, source, existing } = instance.findTemplate(path.join(this.baseDirectory, config.mainParentDir, config.mainSrcDir), "AndroidManifest.xml", { detect: instance.detect(this) });
19
159
  if (localUri && source && instance.canWrite(localUri, { ownPermissionOnly: true })) {
20
- const { supportsRtl, label, theme, activity, metaData = [], activityName, fontProvider } = manifest.application || {};
160
+ const application = manifest.application || {};
161
+ const { supportsRtl, label, theme, activity, metaData = [], activityName, fontProvider } = application;
21
162
  const profileable = config.profileable;
163
+ const applicationKeys = getValidKeys(instance, application, APPLICATION_ATTR);
164
+ const manifestKeys = getValidKeys(instance, manifest, MANIFEST_ATTR);
22
165
  let modified = false;
23
166
  if (!existing) {
24
167
  source = (0, util_1.replaceAll)(source, (name) => {
@@ -28,7 +171,7 @@ function finalize(instance) {
28
171
  case 'label':
29
172
  return '@string/' + (label || 'app_name');
30
173
  case 'theme':
31
- return '@style/' + (theme || 'Theme.Android4');
174
+ return '@style/' + (theme || 'Theme.AppCompat.Light.NoActionBar');
32
175
  case 'activityName':
33
176
  return activityName || '';
34
177
  case 'profileable':
@@ -38,7 +181,7 @@ function finalize(instance) {
38
181
  }
39
182
  });
40
183
  }
41
- else if (theme || activityName || activity || supportsRtl !== undefined) {
184
+ if (existing && (theme || activityName || activity || supportsRtl !== undefined) || applicationKeys.length > 0) {
42
185
  new Parser(new DomHandler((err, dom) => {
43
186
  if (err) {
44
187
  instance.writeFail(['Unable to parse XML document', "AndroidManifest.xml"], err, 0);
@@ -48,38 +191,44 @@ function finalize(instance) {
48
191
  if (!target) {
49
192
  return;
50
193
  }
51
- if (label) {
52
- target.attribs['android:label'] = '@string/' + label;
53
- modified = true;
54
- }
55
- if (theme) {
56
- target.attribs['android:theme'] = '@style/' + theme;
57
- modified = true;
58
- }
59
- if (supportsRtl !== undefined) {
60
- target.attribs['android:supportsRtl'] = supportsRtl.toString();
61
- modified = true;
62
- }
63
- if (activityName || activity) {
64
- const activities = domutils.getElementsByTagName('activity', target, true);
65
- if (activityName) {
66
- for (const item of activities) {
67
- const intentFilter = domutils.findAll(elem => elem.tagName === 'intent-filter', [item]);
68
- if (intentFilter.length > 0) {
69
- const action = domutils.findOne(elem => elem.tagName === 'action' && elem.attribs['android:name'] === 'android.intent.action.MAIN', intentFilter);
70
- if (action) {
71
- const attribs = item.attribs;
72
- attribs['android:name'] = activityName;
73
- attribs['android:exported'] = 'true';
74
- modified = true;
75
- break;
194
+ if (existing) {
195
+ if (label) {
196
+ target.attribs['android:label'] = '@string/' + label;
197
+ modified = true;
198
+ }
199
+ if (theme) {
200
+ target.attribs['android:theme'] = '@style/' + theme;
201
+ modified = true;
202
+ }
203
+ if (supportsRtl !== undefined) {
204
+ target.attribs['android:supportsRtl'] = supportsRtl.toString();
205
+ modified = true;
206
+ }
207
+ if (activityName || activity) {
208
+ const activities = domutils.getElementsByTagName('activity', target, true);
209
+ if (activityName) {
210
+ for (const item of activities) {
211
+ const intentFilter = domutils.findAll(elem => elem.tagName === 'intent-filter', [item]);
212
+ if (intentFilter.length > 0) {
213
+ const action = domutils.findOne(elem => elem.tagName === 'action' && elem.attribs['android:name'] === 'android.intent.action.MAIN', intentFilter);
214
+ if (action) {
215
+ const attribs = item.attribs;
216
+ attribs['android:name'] = activityName;
217
+ attribs['android:exported'] = 'true';
218
+ modified = true;
219
+ break;
220
+ }
76
221
  }
77
222
  }
78
223
  }
79
- }
80
- for (const name in activity) {
81
- const { layout: attribs } = activity[name];
82
- if (attribs) {
224
+ for (const name in activity) {
225
+ const data = activity[name];
226
+ const attribs = data.layout;
227
+ delete data.layout;
228
+ const activityKeys = getValidKeys(instance, data, ACTIVITY_ATTR);
229
+ if (!(0, types_1.isPlainObject)(attribs) && activityKeys.length === 0) {
230
+ continue;
231
+ }
83
232
  let element = domutils.findOne(elem => elem.attribs['android:name'] === name, activities);
84
233
  if (!element) {
85
234
  domutils.appendChild(target, element = new domhandler.Element('activity', { 'android:name': name }));
@@ -91,6 +240,9 @@ function finalize(instance) {
91
240
  domutils.append(layout, new domhandler.Text('\n'));
92
241
  found = false;
93
242
  }
243
+ if (applyAttributes(layout, activityKeys)) {
244
+ modified = true;
245
+ }
94
246
  for (const attr in attribs) {
95
247
  switch (attr) {
96
248
  case 'defaultHeight':
@@ -109,17 +261,20 @@ function finalize(instance) {
109
261
  }
110
262
  }
111
263
  }
112
- }
113
- if (profileable !== undefined) {
114
- const attribs = profileable ? { 'android:shell': 'true', 'android:enabled': 'true' } : { 'android:enabled': 'false' };
115
- const element = domutils.findOne(elem => elem.tagName === 'profileable', [target]);
116
- if (element) {
117
- Object.assign(element.attribs, attribs);
118
- }
119
- else if (profileable) {
120
- domutils.appendChild(target, new domhandler.Element('profileable', attribs));
121
- domutils.appendChild(target, new domhandler.Text('\n'));
264
+ if (profileable !== undefined) {
265
+ const attribs = profileable ? { 'android:shell': 'true', 'android:enabled': 'true' } : { 'android:enabled': 'false' };
266
+ const element = domutils.findOne(elem => elem.tagName === 'profileable', [target]);
267
+ if (element) {
268
+ Object.assign(element.attribs, attribs);
269
+ }
270
+ else if (profileable) {
271
+ domutils.appendChild(target, new domhandler.Element('profileable', attribs));
272
+ domutils.appendChild(target, new domhandler.Text('\n'));
273
+ }
274
+ modified = true;
122
275
  }
276
+ }
277
+ if (applyAttributes(target, applicationKeys)) {
123
278
  modified = true;
124
279
  }
125
280
  if (modified) {
@@ -130,22 +285,15 @@ function finalize(instance) {
130
285
  if (fontProvider) {
131
286
  metaData.push({ name: 'preloaded_fonts', resource: '@array/' + fontProvider });
132
287
  }
133
- const keys = Object.keys(manifest).map(attr => MANIFEST_ATTR.includes(attr) ? attr : attr !== 'package' && MANIFEST_ATTR.includes('android:' + attr) ? attr : '').filter(item => item);
134
- if (keys.length > 0 || (0, types_1.isArray)(metaData)) {
288
+ if (manifestKeys.length > 0 || (0, types_1.isArray)(metaData)) {
135
289
  new Parser(new DomHandler((err, dom) => {
136
290
  if (err) {
137
291
  instance.writeFail(['Unable to parse XML document', "AndroidManifest.xml"], err, 0);
138
292
  return;
139
293
  }
140
294
  let target = null;
141
- if (keys.length > 0 && (target = domutils.findOne(elem => elem.tagName === 'manifest', dom, true))) {
142
- for (let key of keys) {
143
- if (!key.startsWith('android:') && key !== 'package') {
144
- key = 'android:' + key;
145
- }
146
- target.attribs[key] = manifest[key]?.toString() || '';
147
- modified = true;
148
- }
295
+ if (manifestKeys.length > 0 && (target = domutils.findOne(elem => elem.tagName === 'manifest', dom, true)) && applyAttributes(target, manifestKeys)) {
296
+ modified = true;
149
297
  }
150
298
  if ((0, types_1.isArray)(metaData) && (target = domutils.findOne(elem => elem.tagName === 'application', dom, true))) {
151
299
  for (const { name, resource, value } of metaData) {
@@ -434,7 +434,7 @@ function finalize(instance) {
434
434
  output = Document.updateGradle(output, ['android', 'buildFeatures'], 'compose = true');
435
435
  }
436
436
  else {
437
- const stdLib = instance.findVersion('org.jetbrains.kotlin:kotlin-stdlib', "2.1.20");
437
+ const stdLib = instance.findVersion('org.jetbrains.kotlin:kotlin-stdlib', "2.2.0");
438
438
  output = Document.updateGradle(output, ['plugins'], "id 'org.jetbrains.kotlin.android'", { upgrade: true, multiple: true, addendum: `version '${stdLib}'` });
439
439
  output = Document.updateGradle(output, ['android', 'buildFeatures'], "compose true");
440
440
  if (stdLib.startsWith('1.')) {
@@ -561,8 +561,7 @@ function finalize(instance) {
561
561
  const targetAPI = instance.targetAPI;
562
562
  let output = source;
563
563
  if (targetAPI) {
564
- const [compileSdk, targetSdk] = typeof targetAPI === 'string' ? [`"android-${targetAPI}"`, `"${targetAPI}"`] : [targetAPI, targetAPI];
565
- const updateOnly = +targetAPI >= 33;
564
+ const [compileSdk, targetSdk, updateOnly] = typeof targetAPI === 'string' ? [`"android-${targetAPI}"`, `"${targetAPI}"`, true] : [targetAPI, targetAPI, targetAPI >= 33];
566
565
  let content = Document.updateGradle(output, ['android'], kotlin ? `compileSdkVersion(${compileSdk})` : 'compileSdkVersion ' + compileSdk, { upgrade: true, updateOnly });
567
566
  if (content === output) {
568
567
  output = Document.updateGradle(output, ['android'], kotlin ? `compileSdk(${compileSdk})` : 'compileSdk ' + compileSdk, true);
@@ -91,7 +91,7 @@ async function finalize(instance) {
91
91
  const { stdout, stderr } = child_process.spawn((0, types_1.sanitizeCmd)(command, (0, types_1.sanitizeArgs)(args)), { cwd: baseDirectory, shell: true, stdio: Document.hasLogType(32768) && !broadcastId ? 'inherit' : undefined, signal: instance.signal, uid, gid })
92
92
  .on('exit', code => {
93
93
  if (!code) {
94
- instance.addLog(types_1.STATUS_TYPE.INFO, out);
94
+ instance.addLog(4, out);
95
95
  this.writeTimeProcess(title, 'Success -> ' + task, startTime);
96
96
  resolve();
97
97
  }
@@ -103,7 +103,7 @@ async function finalize(instance) {
103
103
  if (stdout) {
104
104
  stdout.setEncoding('utf8').on('data', (value) => {
105
105
  if (broadcastId) {
106
- this.formatMessage(types_1.STATUS_TYPE.INFO, '', value, null, { sessionId: '' });
106
+ this.formatMessage(4, '', value, null, { sessionId: '' });
107
107
  }
108
108
  out += value;
109
109
  });
@@ -111,7 +111,7 @@ async function finalize(instance) {
111
111
  if (stderr) {
112
112
  stderr.setEncoding('utf8').on('data', (value) => {
113
113
  if (broadcastId) {
114
- this.formatMessage(types_1.STATUS_TYPE.ERROR, '', value, null, { sessionId: '' });
114
+ this.formatMessage(2, '', value, null, { sessionId: '' });
115
115
  }
116
116
  message += value;
117
117
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-r/android",
3
- "version": "0.10.1",
3
+ "version": "0.10.2",
4
4
  "description": "Android document constructor for E-mc.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -20,8 +20,8 @@
20
20
  "license": "MIT",
21
21
  "homepage": "https://github.com/anpham6/pi-r#readme",
22
22
  "dependencies": {
23
- "@e-mc/document": "^0.12.3",
24
- "@e-mc/types": "^0.12.3",
23
+ "@e-mc/document": "^0.12.5",
24
+ "@e-mc/types": "^0.12.5",
25
25
  "dom-serializer": "^2.0.0",
26
26
  "domhandler": "^5.0.3",
27
27
  "domutils": "^3.2.2",
@@ -1,5 +1,5 @@
1
1
  distributionBase=GRADLE_USER_HOME
2
2
  distributionPath=wrapper/dists
3
- distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
3
+ distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
4
4
  zipStoreBase=GRADLE_USER_HOME
5
5
  zipStorePath=wrapper/dists
@@ -3,13 +3,13 @@ plugins {
3
3
  }
4
4
 
5
5
  android {
6
- namespace ''
7
- compileSdk 35
6
+ namespace = ''
7
+ compileSdk = 36
8
8
 
9
9
  defaultConfig {
10
10
  applicationId ''
11
- minSdk 24
12
- targetSdk 35
11
+ minSdk = 24
12
+ targetSdk = 36
13
13
  versionCode 1
14
14
  versionName '1.0'
15
15
 
@@ -19,7 +19,7 @@ android {
19
19
  release {
20
20
  debuggable false
21
21
  minifyEnabled true
22
- shrinkResources false
22
+ shrinkResources = false
23
23
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
24
24
  }
25
25
  }
@@ -28,7 +28,7 @@ android {
28
28
  targetCompatibility JavaVersion.VERSION_1_8
29
29
  }
30
30
  buildFeatures {
31
- viewBinding false
31
+ viewBinding = false
32
32
  }
33
33
  }
34
34
 
@@ -1,18 +1,18 @@
1
- pluginManagement {
2
- repositories {
3
- google()
4
- mavenCentral()
5
- gradlePluginPortal()
6
- }
7
- }
8
-
9
- dependencyResolutionManagement {
10
- repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
11
- repositories {
12
- google()
13
- mavenCentral()
14
- }
15
- }
16
-
17
- rootProject.name = '{{projectName}}'
1
+ pluginManagement {
2
+ repositories {
3
+ google()
4
+ mavenCentral()
5
+ gradlePluginPortal()
6
+ }
7
+ }
8
+
9
+ dependencyResolutionManagement {
10
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
11
+ repositories {
12
+ google()
13
+ mavenCentral()
14
+ }
15
+ }
16
+
17
+ rootProject.name = '{{projectName}}'
18
18
  include '{{name}}'
@@ -1,4 +1,4 @@
1
1
  plugins {
2
- id 'com.android.application' version '8.10.0' apply false
3
- id 'com.android.library' version '8.10.0' apply false
2
+ id 'com.android.application' version '8.12.0' apply false
3
+ id 'com.android.library' version '8.12.0' apply false
4
4
  }
@@ -1,16 +1,18 @@
1
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2
+
1
3
  plugins {
2
4
  alias libs.plugins.android.application
3
5
  alias libs.plugins.kotlin.android
4
6
  }
5
7
 
6
8
  android {
7
- namespace ''
8
- compileSdk 35
9
+ namespace = ''
10
+ compileSdk = 36
9
11
 
10
12
  defaultConfig {
11
13
  applicationId ''
12
- minSdk 24
13
- targetSdk 35
14
+ minSdk = 24
15
+ targetSdk = 36
14
16
  versionCode 1
15
17
  versionName '1.0'
16
18
 
@@ -20,7 +22,7 @@ android {
20
22
  release {
21
23
  debuggable false
22
24
  minifyEnabled true
23
- shrinkResources false
25
+ shrinkResources = false
24
26
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
25
27
  }
26
28
  }
@@ -28,14 +30,17 @@ android {
28
30
  sourceCompatibility JavaVersion.VERSION_11
29
31
  targetCompatibility JavaVersion.VERSION_11
30
32
  }
31
- kotlinOptions {
32
- jvmTarget = '11'
33
- }
34
33
  buildFeatures {
35
- viewBinding true
34
+ viewBinding = true
35
+ }
36
+ lint {
37
+ checkDependencies = false
36
38
  }
37
- lintOptions {
38
- checkDependencies false
39
+ }
40
+
41
+ kotlin {
42
+ compilerOptions {
43
+ jvmTarget = JvmTarget.fromTarget('11')
39
44
  }
40
45
  }
41
46
 
@@ -1,6 +1,6 @@
1
1
  [versions]
2
- agp = "8.10.0"
3
- kotlin = "2.1.20"
2
+ agp = "8.12.0"
3
+ kotlin = "2.2.0"
4
4
  coreKtx = "1.16.0"
5
5
  junit = "4.13.2"
6
6
  junitVersion = "1.2.1"
@@ -1,3 +1,5 @@
1
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2
+
1
3
  plugins {
2
4
  alias(libs.plugins.android.application)
3
5
  alias(libs.plugins.kotlin.android)
@@ -6,12 +8,12 @@ plugins {
6
8
 
7
9
  android {
8
10
  namespace = ""
9
- compileSdk = 35
11
+ compileSdk = 36
10
12
 
11
13
  defaultConfig {
12
14
  applicationId = ""
13
15
  minSdk = 24
14
- targetSdk = 35
16
+ targetSdk = 36
15
17
  versionCode = 1
16
18
  versionName = "1.0"
17
19
 
@@ -25,14 +27,11 @@ android {
25
27
  proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
26
28
  }
27
29
  }
28
- kotlinOptions {
29
- jvmTarget = "11"
30
- }
31
30
  buildFeatures {
32
31
  viewBinding = true
33
32
  }
34
33
  lint {
35
- isCheckDependencies = false
34
+ checkDependencies = false
36
35
  }
37
36
  }
38
37
 
@@ -41,6 +40,12 @@ java {
41
40
  targetCompatibility = JavaVersion.VERSION_11
42
41
  }
43
42
 
43
+ kotlin {
44
+ compilerOptions {
45
+ jvmTarget = JvmTarget.fromTarget("11")
46
+ }
47
+ }
48
+
44
49
  dependencies {
45
50
  implementation(libs.jetbrains.kotlin)
46
51
  implementation(libs.androidx.core.ktx)
@@ -1,11 +1,11 @@
1
1
  [versions]
2
- agp = "8.10.0"
3
- kotlin = "2.1.20"
2
+ agp = "8.12.0"
3
+ kotlin = "2.2.0"
4
4
  coreKtx = "1.16.0"
5
5
  junit = "4.13.2"
6
6
  junitVersion = "1.2.1"
7
7
  espressoCore = "3.6.1"
8
- appcompat = "1.7.0"
8
+ appcompat = "1.7.1"
9
9
  material = "1.12.0"
10
10
  constraintlayout = "2.2.1"
11
11
 
@@ -75,10 +75,10 @@ export interface ManifestData extends PlainObject {
75
75
  minHeight?: string;
76
76
  gravity?: string;
77
77
  };
78
- }>;
78
+ } & PlainObject>;
79
79
  activityName?: string;
80
80
  fontProvider?: string;
81
- };
81
+ } & PlainObject;
82
82
  }
83
83
 
84
84
  export interface ControllerSettingsDirectoryUI {