From f9e03aa2c717ccf3776605c5c39fff8c51825cc0 Mon Sep 17 00:00:00 2001 From: mohit mali Date: Wed, 3 Mar 2021 09:49:33 +0530 Subject: [PATCH 01/14] Adding change ota server url setting in developer option --- AndroidManifest.xml | 6 + res/xml/development_settings.xml | 4 + .../ChangeSourcePreferenceController.java | 108 +++++++++++++ .../DevelopmentSettingsDashboardFragment.java | 1 + .../settings/development/OTAProvider.java | 143 ++++++++++++++++++ 5 files changed, 262 insertions(+) create mode 100644 src/com/android/settings/development/ChangeSourcePreferenceController.java create mode 100644 src/com/android/settings/development/OTAProvider.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4eb186d32c2..69fa9cf3fc0 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3321,6 +3321,12 @@ + + diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 0262556d092..fa04de7565b 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -614,6 +614,10 @@ android:summary="@string/kill_app_longpress_back_summary" android:defaultValue="false" /> + 0) + return true; + else + return false; + } + + private String retrieveStatus(){ + Cursor c = mContext.getContentResolver().query(Uri.parse("content://custom.setting.Provider.OTA_SERVER/cte"), null, OTAProvider.id+"=?", new String[]{"1"}, OTAProvider.Status); + if (c.moveToFirst()) { + do { + status = c.getString(c.getColumnIndex(OTAProvider.Status)); + android.util.Log.e("TAG", "onClickAddName: " + c.getString(c.getColumnIndex(OTAProvider.Status))); + } while (c.moveToNext()); + } + return status; + } +} \ No newline at end of file diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index f18225e8fb5..b00ef20df3d 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -483,6 +483,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra bluetoothA2dpConfigStore)); controllers.add(new BluetoothMaxConnectedAudioDevicesPreferenceController(context)); controllers.add(new ShowTapsPreferenceController(context)); + controllers.add(new ChangeSourcePreferenceController(context)); controllers.add(new PointerLocationPreferenceController(context)); controllers.add(new ShowSurfaceUpdatesPreferenceController(context)); controllers.add(new ShowLayoutBoundsPreferenceController(context)); diff --git a/src/com/android/settings/development/OTAProvider.java b/src/com/android/settings/development/OTAProvider.java new file mode 100644 index 00000000000..7c081d773a7 --- /dev/null +++ b/src/com/android/settings/development/OTAProvider.java @@ -0,0 +1,143 @@ +package com.android.settings.development; + +import java.util.HashMap; + +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteQueryBuilder; +import android.net.Uri; + +public class OTAProvider extends ContentProvider { + + static final String PROVIDER_NAME = "custom.setting.Provider.OTA_SERVER"; + static final String URL = "content://" + PROVIDER_NAME + "/cte"; + static final Uri CONTENT_URI = Uri.parse(URL); + + static final String id = "id"; + static final String Status = "Status"; + static final int uriCode = 1; + static final UriMatcher uriMatcher; + private static HashMap values; + static { + uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); + uriMatcher.addURI(PROVIDER_NAME, "cte", uriCode); + uriMatcher.addURI(PROVIDER_NAME, "cte/*", uriCode); + } + + @Override + public boolean onCreate() { + Context context = getContext(); + DatabaseHelper dbHelper = new DatabaseHelper(context); + db = dbHelper.getWritableDatabase(); + if (db != null) { + return true; + } + return false; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { + SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + qb.setTables(TABLE_NAME); + + switch (uriMatcher.match(uri)) { + case uriCode: + qb.setProjectionMap(values); + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); + } + if (sortOrder == null || sortOrder == "") { + sortOrder = Status; + } + Cursor c = qb.query(db, projection, selection, selectionArgs, null, + null, sortOrder); + c.setNotificationUri(getContext().getContentResolver(), uri); + return c; + } + + + @Override + public String getType(Uri uri) { + switch (uriMatcher.match(uri)) { + case uriCode: + return "vnd.android.cursor.dir/cte"; + + default: + throw new IllegalArgumentException("Unsupported URI: " + uri); + } + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + long rowID = db.insert(TABLE_NAME, "", values); + if (rowID > 0) { + Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); + getContext().getContentResolver().notifyChange(_uri, null); + return _uri; + } + throw new SQLException("Failed to add a record into " + uri); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + int count = 0; + switch (uriMatcher.match(uri)) { + case uriCode: + count = db.delete(TABLE_NAME, selection, selectionArgs); + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); + } + getContext().getContentResolver().notifyChange(uri, null); + return count; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, + String[] selectionArgs) { + int count = 0; + switch (uriMatcher.match(uri)) { + case uriCode: + count = db.update(TABLE_NAME, values, selection, selectionArgs); + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); + } + getContext().getContentResolver().notifyChange(uri, null); + return count; + } + + private SQLiteDatabase db; + static final String DATABASE_NAME = "mydb"; + static final String TABLE_NAME = "ota"; + static final int DATABASE_VERSION = 1; + static final String CREATE_DB_TABLE = " CREATE TABLE " + TABLE_NAME + + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + + " Status TEXT NOT NULL);"; + + private static class DatabaseHelper extends SQLiteOpenHelper { + DatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(CREATE_DB_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); + onCreate(db); + } + } +} \ No newline at end of file -- GitLab From de9eaf1e3943622645aceb74469b5031eb6878d7 Mon Sep 17 00:00:00 2001 From: mohit mali Date: Wed, 3 Mar 2021 10:55:35 +0530 Subject: [PATCH 02/14] changing imports --- .../ChangeSourcePreferenceController.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index 483210aff9f..901db0e71b7 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -2,19 +2,20 @@ package com.android.settings.development; import android.content.Context; import android.provider.Settings; -import android.support.annotation.VisibleForTesting; -import android.support.v14.preference.SwitchPreference; -import android.support.v7.preference.Preference; -import android.preference.PreferenceManager; -import android.content.SharedPreferences; + +import androidx.annotation.VisibleForTesting; +import androidx.preference.Preference; +import androidx.preference.SwitchPreference; import android.content.ContentValues; +import android.content.Context; import android.database.Cursor; import android.net.Uri; -import android.content.Context; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.development.DeveloperOptionsPreferenceController; + + public class ChangeSourcePreferenceController extends DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { -- GitLab From cef6b1092105975e3f3c6db0d7d54c7bf37fe1e5 Mon Sep 17 00:00:00 2001 From: mohit mali Date: Wed, 3 Mar 2021 11:21:02 +0530 Subject: [PATCH 03/14] Remove shared preference --- .../settings/development/ChangeSourcePreferenceController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index 901db0e71b7..58c19b74b46 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -19,7 +19,6 @@ import com.android.settingslib.development.DeveloperOptionsPreferenceController; public class ChangeSourcePreferenceController extends DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { - SharedPreferences preferences; private static final String CHANGE_URL_KEY = "change_update_source"; private String status; -- GitLab From 2d353b2dba74ba936ed36259b36fc5726ff368ef Mon Sep 17 00:00:00 2001 From: mohit mali Date: Thu, 18 Mar 2021 15:04:40 +0530 Subject: [PATCH 04/14] Implemented suggestions --- res/values/cm_strings.xml | 4 +++ res/xml/development_settings.xml | 4 +-- .../ChangeSourcePreferenceController.java | 32 +++++++++++++------ .../settings/development/OTAProvider.java | 30 +++++++++++++---- 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml index e9c1efc6e69..5915ac57837 100644 --- a/res/values/cm_strings.xml +++ b/res/values/cm_strings.xml @@ -57,6 +57,10 @@ Kill app back button Kill the foreground app by long-pressing the back button + + Use staging OTA server + Change to OTA/Production server + /e/ legal diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index fa04de7565b..1d72a8eb946 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -616,8 +616,8 @@ + android:title="@string/kill_app_longpress_back" + android:summary="@string/use_ota_summary" /> 0) + if (cursor.getCount() > 0) { return true; - else + }else { return false; + } } private String retrieveStatus(){ - Cursor c = mContext.getContentResolver().query(Uri.parse("content://custom.setting.Provider.OTA_SERVER/cte"), null, OTAProvider.id+"=?", new String[]{"1"}, OTAProvider.Status); - if (c.moveToFirst()) { + Cursor cursor = mContext.getContentResolver().query(Uri.parse(OTAProvider.CONTENT_URI), null, OTAProvider.id+"=?", new String[]{"1"}, OTAProvider.Status); + if (cursor.moveToFirst()) { do { - status = c.getString(c.getColumnIndex(OTAProvider.Status)); - android.util.Log.e("TAG", "onClickAddName: " + c.getString(c.getColumnIndex(OTAProvider.Status))); - } while (c.moveToNext()); + status = cursor.getString(cursor.getColumnIndex(OTAProvider.Status)); + } while (cursor.moveToNext()); } return status; } diff --git a/src/com/android/settings/development/OTAProvider.java b/src/com/android/settings/development/OTAProvider.java index 7c081d773a7..084723c4cad 100644 --- a/src/com/android/settings/development/OTAProvider.java +++ b/src/com/android/settings/development/OTAProvider.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + package com.android.settings.development; import java.util.HashMap; @@ -25,6 +41,13 @@ public class OTAProvider extends ContentProvider { static final int uriCode = 1; static final UriMatcher uriMatcher; private static HashMap values; + private SQLiteDatabase db; + static final String DATABASE_NAME = "mydb"; + static final String TABLE_NAME = "ota"; + static final int DATABASE_VERSION = 1; + static final String CREATE_DB_TABLE = " CREATE TABLE " + TABLE_NAME + + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + + " Status TEXT NOT NULL);"; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "cte", uriCode); @@ -116,13 +139,6 @@ public class OTAProvider extends ContentProvider { return count; } - private SQLiteDatabase db; - static final String DATABASE_NAME = "mydb"; - static final String TABLE_NAME = "ota"; - static final int DATABASE_VERSION = 1; - static final String CREATE_DB_TABLE = " CREATE TABLE " + TABLE_NAME - + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " - + " Status TEXT NOT NULL);"; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { -- GitLab From 3fd0ed66ec920e010b1c6aae65a9a69024576bdb Mon Sep 17 00:00:00 2001 From: mohit mali Date: Thu, 18 Mar 2021 17:13:42 +0530 Subject: [PATCH 05/14] Implemented suggestions --- .../settings/development/ChangeSourcePreferenceController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index afd62c98dcb..f1159ddd142 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -37,6 +37,7 @@ public class ChangeSourcePreferenceController extends DeveloperOptionsPreference private static final String CHANGE_URL_KEY = "change_update_source"; private String status; + private final String UPDATE_URI ="content://custom.setting.Provider.OTA_SERVER/cte"; @VisibleForTesting static final int SETTING_VALUE_ON = 1; @@ -111,7 +112,7 @@ public class ChangeSourcePreferenceController extends DeveloperOptionsPreference } private String retrieveStatus(){ - Cursor cursor = mContext.getContentResolver().query(Uri.parse(OTAProvider.CONTENT_URI), null, OTAProvider.id+"=?", new String[]{"1"}, OTAProvider.Status); + Cursor cursor = mContext.getContentResolver().query(Uri.parse(UPDATE_URI), null, OTAProvider.id+"=?", new String[]{"1"}, OTAProvider.Status); if (cursor.moveToFirst()) { do { status = cursor.getString(cursor.getColumnIndex(OTAProvider.Status)); -- GitLab From 53ff1e2fcfa1153054cfbe01ac2cf1315a3cfddc Mon Sep 17 00:00:00 2001 From: mohit mali Date: Thu, 18 Mar 2021 17:40:32 +0530 Subject: [PATCH 06/14] Implemented suggestions --- res/xml/development_settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 1d72a8eb946..ff8cd126644 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -616,7 +616,7 @@ -- GitLab From b11270646d7f4e230aa351992c64cef0a15f671b Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:26:49 +0000 Subject: [PATCH 07/14] Apply 1 suggestion(s) to 1 file(s) --- .../settings/development/ChangeSourcePreferenceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index f1159ddd142..c3f43388e34 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2021 ECORP SAS * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy -- GitLab From 9cf8817e0d3fd5e2b55571798b8d06388ff1daab Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:27:08 +0000 Subject: [PATCH 08/14] Apply 1 suggestion(s) to 1 file(s) --- src/com/android/settings/development/OTAProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/development/OTAProvider.java b/src/com/android/settings/development/OTAProvider.java index 084723c4cad..f01f55c32b5 100644 --- a/src/com/android/settings/development/OTAProvider.java +++ b/src/com/android/settings/development/OTAProvider.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2021 ECORP SAS * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy -- GitLab From 0dafe4e03709b0d67da43e4d7211e1ea45d92902 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:27:13 +0000 Subject: [PATCH 09/14] Apply 1 suggestion(s) to 1 file(s) --- .../settings/development/ChangeSourcePreferenceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index c3f43388e34..cf83dbd2827 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -107,7 +107,7 @@ public class ChangeSourcePreferenceController extends DeveloperOptionsPreference null, null, null); if (cursor.getCount() > 0) { return true; - }else { + } else { return false; } } -- GitLab From 0b4e316e585d6db87d258d19617cfb7690fee5d8 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:27:18 +0000 Subject: [PATCH 10/14] Apply 1 suggestion(s) to 1 file(s) --- .../settings/development/ChangeSourcePreferenceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index cf83dbd2827..31837abf6ab 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -80,7 +80,7 @@ public class ChangeSourcePreferenceController extends DeveloperOptionsPreference public void updateState(Preference preference) { if (retrieveStatus().equals("true")){ ((SwitchPreference) mPreference).setChecked(true); - }else{ + } else { ((SwitchPreference) mPreference).setChecked(false); } } -- GitLab From 5ffe3740a26d95720f104d4f6122d807ef05821a Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:27:31 +0000 Subject: [PATCH 11/14] Apply 1 suggestion(s) to 1 file(s) --- .../settings/development/ChangeSourcePreferenceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index 31837abf6ab..3d516708bdc 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -64,7 +64,7 @@ public class ChangeSourcePreferenceController extends DeveloperOptionsPreference if (retrieveStatus().equals("true")) { values.put(OTAProvider.Status, "false"); mContext.getContentResolver().update(OTAProvider.CONTENT_URI, values, OTAProvider.id + "=?", new String[]{"1"}); - }else{ + } else { values.put(OTAProvider.Status, "true"); mContext.getContentResolver().update(OTAProvider.CONTENT_URI, values, OTAProvider.id + "=?", new String[]{"1"}); } -- GitLab From 2addafe925f5b738400939c3c8f4edae9c429180 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:37:43 +0000 Subject: [PATCH 12/14] Apply 1 suggestion(s) to 1 file(s) --- .../settings/development/ChangeSourcePreferenceController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/android/settings/development/ChangeSourcePreferenceController.java b/src/com/android/settings/development/ChangeSourcePreferenceController.java index 3d516708bdc..3e26fbcc8a7 100644 --- a/src/com/android/settings/development/ChangeSourcePreferenceController.java +++ b/src/com/android/settings/development/ChangeSourcePreferenceController.java @@ -1,5 +1,4 @@ /* - * Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2021 ECORP SAS * * Licensed under the Apache License, Version 2.0 (the "License"); you may not -- GitLab From 8675efb612c401b9110f40ddfa2a3a76eb02ee82 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:38:32 +0000 Subject: [PATCH 13/14] Apply 1 suggestion(s) to 1 file(s) --- .../development/DevelopmentSettingsDashboardFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index b00ef20df3d..caf18e995c1 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2017 The Android Open Source Project + * Copyright (C) 2021 ECORP SAS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. -- GitLab From 3ee956b83ca20e5190946a3985136b636c43d526 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 2 Apr 2021 14:38:58 +0000 Subject: [PATCH 14/14] Apply 1 suggestion(s) to 1 file(s) --- src/com/android/settings/development/OTAProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/android/settings/development/OTAProvider.java b/src/com/android/settings/development/OTAProvider.java index f01f55c32b5..6dd785c43f1 100644 --- a/src/com/android/settings/development/OTAProvider.java +++ b/src/com/android/settings/development/OTAProvider.java @@ -1,5 +1,4 @@ /* - * Copyright (C) 2017 The Android Open Source Project * Copyright (C) 2021 ECORP SAS * * Licensed under the Apache License, Version 2.0 (the "License"); you may not -- GitLab