Skip to content

Commit b776c30

Browse files
authored
Merge pull request #236 from learningequality/android_35
Update to Android SDK 35.
2 parents 6ed026f + 6036fab commit b776c30

9 files changed

Lines changed: 84 additions & 41 deletions

File tree

.p4a

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
--dist_name "kolibri"
66
--private "src"
77
--requirements python3==3.9.13,hostpython3==3.9.13,android,pyjnius,genericndkbuild,sqlite3,cryptography,twisted,attrs,bcrypt,service_identity,pyasn1,pyasn1_modules,pyopenssl,openssl,six,kolibri,ifaddr
8-
--android-api 33
8+
--android-api 35
99
--minsdk 23
1010
--ndk-api 23
1111
--permission ACCESS_NETWORK_STATE

Makefile

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ else
1717
PLATFORM := linux
1818
endif
1919

20-
ANDROID_API := 33
21-
ANDROIDNDKVER := 25.2.9519653
20+
ANDROID_API := 35
21+
ANDROIDNDKVER := 28.2.13676358
22+
SDKMANAGER_VERSION := 13114758
2223

2324
ifdef ANDROID_SDK_ROOT
2425
else
@@ -191,19 +192,19 @@ logcat:
191192

192193
$(SDK)/cmdline-tools/latest/bin/sdkmanager:
193194
@echo "Downloading Android SDK command line tools"
194-
wget https://dl.google.com/android/repository/commandlinetools-$(PLATFORM)-9477386_latest.zip
195+
wget https://dl.google.com/android/repository/commandlinetools-$(PLATFORM)-${SDKMANAGER_VERSION}_latest.zip
195196
rm -rf cmdline-tools
196-
unzip commandlinetools-$(PLATFORM)-9477386_latest.zip -d $(SDK)
197+
unzip commandlinetools-$(PLATFORM)-${SDKMANAGER_VERSION}_latest.zip -d $(SDK)
197198
mv $(SDK)/cmdline-tools $(SDK)/latest
198199
mkdir -p $(SDK)/cmdline-tools
199200
mv $(SDK)/latest $(SDK)/cmdline-tools/latest
200-
rm commandlinetools-$(PLATFORM)-9477386_latest.zip
201+
rm commandlinetools-$(PLATFORM)-${SDKMANAGER_VERSION}_latest.zip
201202

202203
sdk: $(SDK)/cmdline-tools/latest/bin/sdkmanager
203204
yes y | $(SDK)/cmdline-tools/latest/bin/sdkmanager "platform-tools"
204205
yes y | $(SDK)/cmdline-tools/latest/bin/sdkmanager "platforms;android-$(ANDROID_API)"
205206
yes y | $(SDK)/cmdline-tools/latest/bin/sdkmanager "system-images;android-$(ANDROID_API);default;x86_64"
206-
yes y | $(SDK)/cmdline-tools/latest/bin/sdkmanager "build-tools;30.0.3"
207+
yes y | $(SDK)/cmdline-tools/latest/bin/sdkmanager "build-tools;35.0.0"
207208
yes y | $(SDK)/cmdline-tools/latest/bin/sdkmanager "ndk;$(ANDROIDNDKVER)"
208209
ln -sfT ndk/$(ANDROIDNDKVER) $(SDK)/ndk-bundle
209210
@echo "Accepting all licenses"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Wraps Kolibri in an android-compatibility layer. Relies on Python-For-Android to
66

77
1. Setup a Python virtual environment in which to do development. The Kolibri developer documentation has a [How To guide for doing this with pyenv](https://kolibri-dev.readthedocs.io/en/develop/howtos/pyenv_virtualenv.html) but any Python virtualenv should work.
88

9-
2. Ensure you have all [necessary packages for Python for Android](https://python-for-android.readthedocs.io/en/latest/quickstart/#installing-dependencies). Ensure you install java version 1.11, `sudo apt install openjdk-11-jdk` , and set it as the default java version: `sudo update-alternatives --auto javac` and `sudo update-alternatives --auto java`.
9+
2. Ensure you have all [necessary packages for Python for Android](https://python-for-android.readthedocs.io/en/latest/quickstart.html#installing-prerequisites). Ensure you install java version 1.17, `sudo apt install openjdk-17-jdk` , and set it as the default java version: `sudo update-alternatives --auto javac` and `sudo update-alternatives --auto java`.
1010

1111
3. The `make setup` command will install the Android SDK and Android NDK.
1212

python-for-android/dists/kolibri/build.gradle

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,17 @@
22
buildscript {
33
repositories {
44
google()
5-
jcenter()
5+
mavenCentral()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:7.1.2'
8+
classpath 'com.android.tools.build:gradle:8.13.0'
99
}
1010
}
1111

1212
allprojects {
1313
repositories {
1414
google()
15-
jcenter()
16-
flatDir {
17-
dirs 'libs'
18-
}
15+
mavenCentral()
1916
}
2017
}
2118

@@ -24,7 +21,9 @@ apply plugin: 'com.android.application'
2421

2522

2623
android {
27-
compileSdk 34
24+
namespace = 'org.learningequality.Kolibri'
25+
compileSdkVersion = 35
26+
buildToolsVersion = "35.0.0"
2827
def versionPropsFile = file('version.properties')
2928
Properties versionProps = new Properties()
3029

@@ -45,21 +44,23 @@ android {
4544
def nameNoDebug = name.replace("-debug", "")
4645

4746
defaultConfig {
48-
minSdkVersion 23
49-
targetSdk 34
50-
versionCode code
51-
versionName name
47+
minSdkVersion = 23
48+
targetSdk = 35
49+
versionCode = code
50+
versionName = name
5251
manifestPlaceholders = [:]
53-
multiDexEnabled true
52+
multiDexEnabled = true
5453
setProperty("archivesBaseName", "kolibri-$nameNoDebug")
54+
buildConfigField "String", "VERSION_CODE", "\"${code.toString()}\""
5555
}
5656

5757
packagingOptions {
5858
jniLibs {
5959
useLegacyPackaging = true
6060
}
61-
exclude 'lib/**/gdbserver'
62-
exclude 'lib/**/gdb.setup'
61+
resources {
62+
excludes += ['lib/**/gdbserver', 'lib/**/gdb.setup']
63+
}
6364
}
6465

6566
signingConfigs {
@@ -73,30 +74,32 @@ android {
7374

7475
buildTypes {
7576
debug {
76-
debuggable true
77+
debuggable = true
7778
}
7879
release {
79-
signingConfig signingConfigs.release
80+
signingConfig = signingConfigs.release
8081
}
8182
}
8283

8384
compileOptions {
8485

85-
sourceCompatibility JavaVersion.VERSION_1_8
86-
targetCompatibility JavaVersion.VERSION_1_8
86+
sourceCompatibility = JavaVersion.VERSION_1_8
87+
targetCompatibility = JavaVersion.VERSION_1_8
8788

8889
}
8990

9091
sourceSets {
9192
main {
9293
jniLibs.srcDir 'libs'
93-
java {
94-
}
9594
}
9695
}
9796

98-
aaptOptions {
99-
noCompress "tflite"
97+
98+
buildFeatures {
99+
buildConfig = true
100+
}
101+
androidResources {
102+
noCompress 'tflite'
100103
}
101104

102105
}

python-for-android/dists/kolibri/src/main/AndroidManifest.xml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
<manifest
33
xmlns:android="http://schemas.android.com/apk/res/android"
44
xmlns:tools="http://schemas.android.com/tools"
5-
package="org.learningequality.Kolibri"
65
android:installLocation="auto"
76
>
87

@@ -38,7 +37,6 @@
3837
android:theme="@android:style/Theme.NoTitleBar"
3938
android:hardwareAccelerated="true"
4039
android:usesCleartextTraffic="true"
41-
android:extractNativeLibs="true"
4240
>
4341

4442

@@ -82,14 +80,14 @@
8280
android:name="androidx.work.multiprocess.RemoteWorkManagerService"
8381
android:process="@string/task_worker_process"
8482
android:exported="true"
85-
tools:replace="android:process, android:exported"
83+
tools:replace="android:exported"
8684
/>
8785

8886
<service
8987
android:name="androidx.work.impl.background.systemjob.SystemJobService"
9088
android:process="@string/task_worker_process"
9189
android:exported="true"
92-
tools:replace="android:process, android:exported"
90+
tools:replace="android:exported"
9391
/>
9492

9593
<service

python-for-android/dists/kolibri/src/main/java/org/kivy/android/PythonActivity.java

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@
3232
import android.graphics.Color;
3333

3434
import android.widget.AbsoluteLayout;
35+
import android.widget.FrameLayout;
3536
import android.view.ViewGroup.LayoutParams;
37+
import android.view.WindowInsets;
38+
import android.view.View;
39+
import android.graphics.Insets;
3640

3741
import android.webkit.WebBackForwardList;
3842
import android.webkit.WebViewClient;
@@ -177,7 +181,6 @@ public void onClick(DialogInterface dialog,int id) {
177181
String unencodedHtml = PythonActivity.mActivity.getString(R.string.loading_page_html);
178182
String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING);
179183
mWebView.loadData(encodedHtml, "text/html", "base64");
180-
mWebView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
181184
mWebView.setWebViewClient(new WebViewClient() {
182185
@Override
183186
public boolean shouldOverrideUrlLoading(WebView view, String url) {
@@ -200,8 +203,46 @@ public void onPageFinished(WebView view, String url) {
200203

201204
}
202205
});
203-
mLayout = new AbsoluteLayout(PythonActivity.mActivity);
204-
mLayout.addView(mWebView);
206+
207+
// Handle edge-to-edge insets only on Android 15+ (API 35+) where edge-to-edge is enforced
208+
if (android.os.Build.VERSION.SDK_INT >= 35) {
209+
// Use FrameLayout for Android 15+ to properly support margins for edge-to-edge
210+
mLayout = new FrameLayout(PythonActivity.mActivity);
211+
212+
// Set WebView with FrameLayout params that support margins
213+
FrameLayout.LayoutParams webViewParams = new FrameLayout.LayoutParams(
214+
FrameLayout.LayoutParams.MATCH_PARENT,
215+
FrameLayout.LayoutParams.MATCH_PARENT
216+
);
217+
mWebView.setLayoutParams(webViewParams);
218+
mLayout.addView(mWebView);
219+
220+
mLayout.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
221+
@Override
222+
public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
223+
// Get system bar insets using the Android 11+ API
224+
android.graphics.Insets systemBarsInsets = insets.getInsets(WindowInsets.Type.systemBars());
225+
226+
// Apply margins to the WebView to avoid system bars
227+
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mWebView.getLayoutParams();
228+
params.leftMargin = systemBarsInsets.left;
229+
params.topMargin = systemBarsInsets.top;
230+
params.rightMargin = systemBarsInsets.right;
231+
params.bottomMargin = systemBarsInsets.bottom;
232+
mWebView.setLayoutParams(params);
233+
234+
// Return the insets unchanged to allow other views to also handle them
235+
return insets;
236+
}
237+
});
238+
// Enable edge-to-edge but handle insets properly
239+
mLayout.setFitsSystemWindows(false);
240+
} else {
241+
// For older Android versions, use the original AbsoluteLayout setup
242+
mLayout = new AbsoluteLayout(PythonActivity.mActivity);
243+
mWebView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
244+
mLayout.addView(mWebView);
245+
}
205246

206247
setContentView(mLayout);
207248

python-for-android/dists/kolibri/src/main/java/org/kivy/android/PythonUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class PythonUtil {
2323
// We read this directly from the VERSION_CODE,
2424
// so that any upgrade of the app causes the Python
2525
// code to be extracted again.
26-
private static final String PrivateVersion = Integer.toString(BuildConfig.VERSION_CODE);
26+
private static final String PrivateVersion = BuildConfig.VERSION_CODE;
2727

2828
protected static void addLibraryIfExists(ArrayList<String> libsList, String pattern, File libsDir) {
2929
// pattern should be the name of the lib file, without the

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cython~=0.29
22
ifaddr
33
virtualenv
44
setuptools
5-
git+https://github.com/learningequality/python-for-android@60f3bf7d653d3e4e97d8371feaef221ffcdeb421#egg=python-for-android
5+
git+https://github.com/learningequality/python-for-android@632047c77661710e1ed19b110ef78402c4c64228#egg=python-for-android
66
google-api-python-client==2.96.0
77
google-auth==2.22.0
88
google-auth-httplib2==0.1.0

scripts/create_strings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
XML_TEMPLATE = """
2222
<resources>
23-
<string name="loading_page_html"><![CDATA[
23+
<string name="loading_page_html" formatted="false"><![CDATA[
2424
{}
2525
]]></string>
2626
</resources>
@@ -53,7 +53,7 @@ def generate_loading_pages(output_dir):
5353
def _find_string(lang, string):
5454
from kolibri.main import initialize
5555
from django.utils.translation import override
56-
from django.utils.translation import ugettext as _
56+
from django.utils.translation import gettext as _
5757
from django.utils.translation import to_locale
5858

5959
initialize(skip_update=True)

0 commit comments

Comments
 (0)