From 61dd82dd9f22795a8391132d72918befa7b2acfb Mon Sep 17 00:00:00 2001 From: Nihar Thakkar Date: Tue, 21 Aug 2018 08:35:36 +0530 Subject: [PATCH 01/81] Create content provider for notes --- app/src/main/AndroidManifest.xml | 6 +++ .../notes/providers/AppContentProvider.java | 45 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/providers/AppContentProvider.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5b23bd715..4c740367c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -173,5 +173,11 @@ + + diff --git a/app/src/main/java/it/niedermann/owncloud/notes/providers/AppContentProvider.java b/app/src/main/java/it/niedermann/owncloud/notes/providers/AppContentProvider.java new file mode 100644 index 000000000..347554b15 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/providers/AppContentProvider.java @@ -0,0 +1,45 @@ +package it.niedermann.owncloud.notes.providers; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class AppContentProvider extends ContentProvider { + + @Override + public boolean onCreate() { + return false; + } + + @Nullable + @Override + public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) { + return null; + } + + @Nullable + @Override + public String getType(@NonNull Uri uri) { + return null; + } + + @Nullable + @Override + public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) { + return null; + } + + @Override + public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) { + return 0; + } + + @Override + public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) { + return 0; + } +} -- GitLab From 1d68dc6595bc715c5d47ba7d5aa0d4f85c2b8bbd Mon Sep 17 00:00:00 2001 From: Nihar Thakkar Date: Wed, 22 Aug 2018 09:50:42 +0530 Subject: [PATCH 02/81] Check if sync is enabled/disabled and show a Snackbar --- app/src/main/AndroidManifest.xml | 4 +- .../notes/persistence/NotesRepository.java | 133 +++++++++--------- .../notes/shared/util/AccountSyncUtil.java | 62 ++++++++ 3 files changed, 133 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/shared/util/AccountSyncUtil.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c740367c..4a0a35950 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,8 @@ + + @@ -175,7 +177,7 @@ diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java index 27865a3ba..6eff34f06 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java @@ -70,6 +70,7 @@ import it.niedermann.owncloud.notes.shared.model.ImportStatus; import it.niedermann.owncloud.notes.shared.model.NavigationCategory; import it.niedermann.owncloud.notes.shared.model.NotesSettings; import it.niedermann.owncloud.notes.shared.model.SyncResultStatus; +import it.niedermann.owncloud.notes.shared.util.AccountSyncUtil; import it.niedermann.owncloud.notes.shared.util.ApiVersionUtil; import it.niedermann.owncloud.notes.shared.util.NoteUtil; import it.niedermann.owncloud.notes.shared.util.SSOUtil; @@ -815,80 +816,82 @@ public class NotesRepository { syncActive.put(account.getId(), false); } Log.d(TAG, "Sync requested (" + (onlyLocalChanges ? "onlyLocalChanges" : "full") + "; " + (Boolean.TRUE.equals(syncActive.get(account.getId())) ? "sync active" : "sync NOT active") + ") ..."); - if (isSyncPossible() && (!Boolean.TRUE.equals(syncActive.get(account.getId())) || onlyLocalChanges)) { - syncActive.put(account.getId(), true); - try { - Log.d(TAG, "... starting now"); - final NotesServerSyncTask syncTask = new NotesServerSyncTask(context, this, account, onlyLocalChanges, apiProvider) { - @Override - void onPreExecute() { - syncStatus.postValue(true); - if (!syncScheduled.containsKey(localAccount.getId()) || syncScheduled.get(localAccount.getId()) == null) { - syncScheduled.put(localAccount.getId(), false); - } - if (!onlyLocalChanges && Boolean.TRUE.equals(syncScheduled.get(localAccount.getId()))) { - syncScheduled.put(localAccount.getId(), false); + if (AccountSyncUtil.isSyncEnable(context, account)) { + if (isSyncPossible() && (!Boolean.TRUE.equals(syncActive.get(account.getId())) || onlyLocalChanges)) { + syncActive.put(account.getId(), true); + try { + Log.d(TAG, "... starting now"); + final NotesServerSyncTask syncTask = new NotesServerSyncTask(context, this, account, onlyLocalChanges, apiProvider) { + @Override + void onPreExecute() { + syncStatus.postValue(true); + if (!syncScheduled.containsKey(localAccount.getId()) || syncScheduled.get(localAccount.getId()) == null) { + syncScheduled.put(localAccount.getId(), false); + } + if (!onlyLocalChanges && Boolean.TRUE.equals(syncScheduled.get(localAccount.getId()))) { + syncScheduled.put(localAccount.getId(), false); + } } - } - @Override - void onPostExecute(SyncResultStatus status) { - for (Throwable e : exceptions) { - Log.e(TAG, e.getMessage(), e); - } - if (!status.pullSuccessful || !status.pushSuccessful) { - syncErrors.postValue(exceptions); - } - syncActive.put(localAccount.getId(), false); - // notify callbacks - if (callbacks.containsKey(localAccount.getId()) && callbacks.get(localAccount.getId()) != null) { - for (ISyncCallback callback : Objects.requireNonNull(callbacks.get(localAccount.getId()))) { - callback.onFinish(); + @Override + void onPostExecute(SyncResultStatus status) { + for (Throwable e : exceptions) { + Log.e(TAG, e.getMessage(), e); } + if (!status.pullSuccessful || !status.pushSuccessful) { + syncErrors.postValue(exceptions); + } + syncActive.put(localAccount.getId(), false); + // notify callbacks + if (callbacks.containsKey(localAccount.getId()) && callbacks.get(localAccount.getId()) != null) { + for (ISyncCallback callback : Objects.requireNonNull(callbacks.get(localAccount.getId()))) { + callback.onFinish(); + } + } + notifyWidgets(); + updateDynamicShortcuts(localAccount.getId()); + // start next sync if scheduled meanwhile + if (syncScheduled.containsKey(localAccount.getId()) && syncScheduled.get(localAccount.getId()) != null && Boolean.TRUE.equals(syncScheduled.get(localAccount.getId()))) { + scheduleSync(localAccount, false); + } + syncStatus.postValue(false); } - notifyWidgets(); - updateDynamicShortcuts(localAccount.getId()); - // start next sync if scheduled meanwhile - if (syncScheduled.containsKey(localAccount.getId()) && syncScheduled.get(localAccount.getId()) != null && Boolean.TRUE.equals(syncScheduled.get(localAccount.getId()))) { - scheduleSync(localAccount, false); - } - syncStatus.postValue(false); + }; + syncTask.addCallbacks(account, callbacksPush.get(account.getId())); + callbacksPush.put(account.getId(), new ArrayList<>()); + if (!onlyLocalChanges) { + syncTask.addCallbacks(account, callbacksPull.get(account.getId())); + callbacksPull.put(account.getId(), new ArrayList<>()); } - }; - syncTask.addCallbacks(account, callbacksPush.get(account.getId())); - callbacksPush.put(account.getId(), new ArrayList<>()); - if (!onlyLocalChanges) { - syncTask.addCallbacks(account, callbacksPull.get(account.getId())); - callbacksPull.put(account.getId(), new ArrayList<>()); + syncExecutor.submit(syncTask); + } catch (NextcloudFilesAppAccountNotFoundException e) { + Log.e(TAG, "... Could not find " + SingleSignOnAccount.class.getSimpleName() + " for account name " + account.getAccountName()); + e.printStackTrace(); } - syncExecutor.submit(syncTask); - } catch (NextcloudFilesAppAccountNotFoundException e) { - Log.e(TAG, "... Could not find " + SingleSignOnAccount.class.getSimpleName() + " for account name " + account.getAccountName()); - e.printStackTrace(); - } - } else if (!onlyLocalChanges) { - Log.d(TAG, "... scheduled"); - syncScheduled.put(account.getId(), true); - if (callbacksPush.containsKey(account.getId()) && callbacksPush.get(account.getId()) != null) { - final var callbacks = callbacksPush.get(account.getId()); - if (callbacks != null) { - for (final var callback : callbacks) { - callback.onScheduled(); + } else if (!onlyLocalChanges) { + Log.d(TAG, "... scheduled"); + syncScheduled.put(account.getId(), true); + if (callbacksPush.containsKey(account.getId()) && callbacksPush.get(account.getId()) != null) { + final var callbacks = callbacksPush.get(account.getId()); + if (callbacks != null) { + for (final var callback : callbacks) { + callback.onScheduled(); + } + } else { + Log.w(TAG, "List of push-callbacks was set for account \"" + account.getAccountName() + "\" but it was null"); } - } else { - Log.w(TAG, "List of push-callbacks was set for account \"" + account.getAccountName() + "\" but it was null"); } - } - } else { - Log.d(TAG, "... do nothing"); - if (callbacksPush.containsKey(account.getId()) && callbacksPush.get(account.getId()) != null) { - final var callbacks = callbacksPush.get(account.getId()); - if (callbacks != null) { - for (final var callback : callbacks) { - callback.onScheduled(); + } else { + Log.d(TAG, "... do nothing"); + if (callbacksPush.containsKey(account.getId()) && callbacksPush.get(account.getId()) != null) { + final var callbacks = callbacksPush.get(account.getId()); + if (callbacks != null) { + for (final var callback : callbacks) { + callback.onScheduled(); + } + } else { + Log.w(TAG, "List of push-callbacks was set for account \"" + account.getAccountName() + "\" but it was null"); } - } else { - Log.w(TAG, "List of push-callbacks was set for account \"" + account.getAccountName() + "\" but it was null"); } } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/AccountSyncUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/AccountSyncUtil.java new file mode 100644 index 000000000..27c379e87 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/AccountSyncUtil.java @@ -0,0 +1,62 @@ +/* + * Copyright MURENA SAS 2023 + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package it.niedermann.owncloud.notes.shared.util; + +import android.accounts.AccountManager; +import android.content.ContentResolver; +import android.content.Context; +import android.util.Log; + +import it.niedermann.owncloud.notes.persistence.entity.Account; + +public class AccountSyncUtil { + + private static final String TAG = AccountSyncUtil.class.getSimpleName(); + private static final String murena_account_type = "e.foundation.webdav.eelo"; + private static final String notes_content_authority = "foundation.e.notes.android.providers.AppContentProvider"; + + private AccountSyncUtil() { + throw new UnsupportedOperationException("Do not instantiate this util class."); + } + + private static android.accounts.Account[] getMurenaAccountsOnDevice(AccountManager accountManager) { + return accountManager.getAccountsByType(murena_account_type); + } + + private static boolean isSyncEnable(android.accounts.Account account) { + return ContentResolver.getMasterSyncAutomatically() && ContentResolver.getSyncAutomatically(account, notes_content_authority); + } + + public static boolean isSyncEnable(Context context, Account account) { + AccountManager accountManager = AccountManager.get(context); + + try { + android.accounts.Account[] murenaAccounts = getMurenaAccountsOnDevice(accountManager); + + for (android.accounts.Account murenaAccount : murenaAccounts) { + if (account.getAccountName().equals(murenaAccount.name)) { + return isSyncEnable(murenaAccount); + } + } + } catch (SecurityException e) { + Log.e(TAG, "Failed to load murena accounts", e); + } + + return true; + } + +} -- GitLab From f0b4fd47a4c1764230d741d0e2016793ddf13480 Mon Sep 17 00:00:00 2001 From: Nihar Thakkar Date: Wed, 22 Aug 2018 09:51:50 +0530 Subject: [PATCH 03/81] Use a sharedUID --- app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4a0a35950..2faf4f510 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + android:sharedUserId="android.uid.system"> -- GitLab From 266bdf23d19f37024f919d738182d19dd1d8886d Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Thu, 23 Aug 2018 10:28:06 +0200 Subject: [PATCH 04/81] Setup CI --- .gitlab-ci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..b044ddb95 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,30 @@ +image: "registry.gitlab.eelo.io:5000/eelo/docker-android-apps-cicd:latest" + +stages: +- build + +before_script: +- if [ -d "/srv/userscripts" ]; then cp -R userscripts/* /srv/userscripts ; fi +- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' +- eval $(ssh-agent -s) +- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null +- mkdir -p ~/.ssh +- chmod 700 ~/.ssh +- echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts +- chmod 644 ~/.ssh/known_hosts +- export GRADLE_USER_HOME=$(pwd)/.gradle +- chmod +x ./gradlew + +cache: + key: ${CI_PROJECT_ID} + paths: + - .gradle/ + +build: + stage: build + script: + - git submodule update --recursive --init + - ./gradlew build + artifacts: + paths: + - app/build/outputs/apk/ -- GitLab From 6f03414ed2442100135b35c79c54058ca7590545 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 24 Aug 2018 16:56:31 +0200 Subject: [PATCH 05/81] Define submodule strategy as variable --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b044ddb95..264d0262b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,8 +22,9 @@ cache: build: stage: build + variables: + GIT_SUBMODULE_STRATEGY: recursive script: - - git submodule update --recursive --init - ./gradlew build artifacts: paths: -- GitLab From dcd251460d5c9cfe71ee40e92ec68fc9857207e2 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 24 Aug 2018 16:59:33 +0200 Subject: [PATCH 06/81] Revert "Define submodule strategy as variable" This reverts commit f18460e6a28412df79b5a032562fdbe3657b7703. To apply if we use a docker image with SSH inside --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 264d0262b..b044ddb95 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,9 +22,8 @@ cache: build: stage: build - variables: - GIT_SUBMODULE_STRATEGY: recursive script: + - git submodule update --recursive --init - ./gradlew build artifacts: paths: -- GitLab From 08552f7f8c764097ae530877d8e2107b9e32e27c Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Fri, 24 Aug 2018 17:04:11 +0200 Subject: [PATCH 07/81] Revert "Use a sharedUID" This reverts commit 13277541e90bedf58fd74975f1c13de7945d83c6. --- app/src/main/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2faf4f510..4a0a35950 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> -- GitLab From 62e91b88895be5cd8336fe049d95ec9a8eeab550 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Wed, 18 Jan 2023 21:24:21 +0600 Subject: [PATCH 08/81] Update docker image url --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b044ddb95..6e46d7c11 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: "registry.gitlab.eelo.io:5000/eelo/docker-android-apps-cicd:latest" +image: "registry.gitlab.eelo.io:5000/e/apps/docker-android-apps-cicd:latest" stages: - build -- GitLab From 5eebb7065a131854eb9d78b3c6633390acec8b64 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Thu, 30 Aug 2018 11:59:16 +0200 Subject: [PATCH 09/81] Change GitLab registry url --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6e46d7c11..1372a4755 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: "registry.gitlab.eelo.io:5000/e/apps/docker-android-apps-cicd:latest" +image: "registry.gitlab.e.foundation:5000/e/apps/docker-android-apps-cicd:latest" stages: - build -- GitLab From 5985aadf3e22d7c8ccd0a4d4c9a89083fd0c24e9 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Wed, 18 Jan 2023 21:34:55 +0600 Subject: [PATCH 10/81] Update minimum SDK version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 27ceced8b..87a2cc865 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,7 @@ android { defaultConfig { applicationId "it.niedermann.owncloud.notes" - minSdkVersion 23 + minSdkVersion 24 targetSdkVersion 33 versionCode 3007001 versionName "3.7.1" -- GitLab From e7ceca5755cd96276a57360be01d598dd2d76014 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Wed, 18 Jan 2023 21:55:19 +0600 Subject: [PATCH 11/81] Change applicationId --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 87a2cc865..1b8912fdf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { } defaultConfig { - applicationId "it.niedermann.owncloud.notes" + applicationId "foundation.e.notes" minSdkVersion 24 targetSdkVersion 33 versionCode 3007001 -- GitLab From f9a9ba79a2cb9ddc1792574b9b8ada3f2fee7787 Mon Sep 17 00:00:00 2001 From: Romain Hunault Date: Sat, 16 Mar 2019 19:58:19 +0000 Subject: [PATCH 12/81] Add /e/ licence --- AUTHORS | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 AUTHORS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..bcbdbb13f --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +© e Foundation 2018-2019 - Author: Nihar Thakkar +© ECORP SAS 2018-2019 - Author: Romain Hunault \ No newline at end of file -- GitLab From f0e7d4f7973c2b0cf5f9ae7159da15a60edc0da5 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Wed, 18 Jan 2023 22:19:21 +0600 Subject: [PATCH 13/81] Remove flaovors --- app/build.gradle | 24 --------------- .../res/drawable/ic_launcher_foreground.xml | 29 ------------------- app/src/dev/res/xml/shortcuts.xml | 17 ----------- .../notes/exception/ExceptionActivity.java | 2 +- .../exception/ExceptionDialogFragment.java | 2 +- 5 files changed, 2 insertions(+), 72 deletions(-) delete mode 100644 app/src/dev/res/drawable/ic_launcher_foreground.xml delete mode 100644 app/src/dev/res/xml/shortcuts.xml diff --git a/app/build.gradle b/app/build.gradle index 1b8912fdf..e38c969ca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,30 +39,6 @@ android { } } - - flavorDimensions "version" - - productFlavors { - fdroid { - dimension "version" - } - dev { - dimension "version" - applicationIdSuffix ".dev" - } - play { - dimension "version" - } - pfungstadt { - dimension "version" - applicationIdSuffix ".pfungstadt" - } - mdm { - dimension "version" - applicationIdSuffix ".mdm" - } - } - testOptions { unitTests { includeAndroidResources true diff --git a/app/src/dev/res/drawable/ic_launcher_foreground.xml b/app/src/dev/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 9cb8dccf2..000000000 --- a/app/src/dev/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/dev/res/xml/shortcuts.xml b/app/src/dev/res/xml/shortcuts.xml deleted file mode 100644 index 086d61f8c..000000000 --- a/app/src/dev/res/xml/shortcuts.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java index 0761b6036..cb51d736b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionActivity.java @@ -38,7 +38,7 @@ public class ExceptionActivity extends AppCompatActivity { } final var adapter = new TipsAdapter(this::startActivity); - final String debugInfos = ExceptionUtil.INSTANCE.getDebugInfos(this, throwable, BuildConfig.FLAVOR); + final String debugInfos = ExceptionUtil.INSTANCE.getDebugInfos(this, throwable, "PROD"); binding.tips.setAdapter(adapter); binding.tips.setNestedScrollingEnabled(false); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java index ca242a7fd..33a65173b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/exception/ExceptionDialogFragment.java @@ -57,7 +57,7 @@ public class ExceptionDialogFragment extends AppCompatDialogFragment { final var adapter = new TipsAdapter((actionIntent) -> requireActivity().startActivity(actionIntent)); - final String debugInfos = ExceptionUtil.INSTANCE.getDebugInfos(requireContext(), throwables, BuildConfig.FLAVOR); + final String debugInfos = ExceptionUtil.INSTANCE.getDebugInfos(requireContext(), throwables, "PROD"); binding.tips.setAdapter(adapter); binding.stacktrace.setText(debugInfos); -- GitLab From 153bc20e458e77c38b4276cbf79bd3ad1dcd6cf8 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Wed, 18 Jan 2023 22:22:56 +0600 Subject: [PATCH 14/81] Change app icon to adaptive icon --- .../res/drawable/ic_launcher_background.xml | 58 ++++++++++++------- .../res/drawable/ic_launcher_foreground.xml | 29 ++++++---- 2 files changed, 55 insertions(+), 32 deletions(-) diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 9127e535a..788ff6a73 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -2,26 +2,40 @@ xmlns:aapt="http://schemas.android.com/aapt" android:width="108dp" android:height="108dp" - android:viewportWidth="1344" - android:viewportHeight="1344"> - - - - - - - - + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index b3eb55f92..96540cd3c 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -2,13 +2,22 @@ - - - - \ No newline at end of file + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + -- GitLab From 3bd73ad100506ff3c06253cc48d0e6a69b42fc6d Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Wed, 18 Jan 2023 22:32:08 +0600 Subject: [PATCH 15/81] Updated app icon --- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 4323 -> 1328 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2716 -> 610 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 6070 -> 1700 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 9147 -> 3061 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 13007 -> 3942 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index ba3e251024ad47984447acd1830e1c6828431dc7..61a0df490637b3a55e8c4264c017f898d1aa6ce4 100644 GIT binary patch delta 1310 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 YACl}pTqO@}z5oCK07*qoM6N<$g8ecK^8f$< delta 2709 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 P00000NkvXXu0mjfPIMZZ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 9ee96303a71f41b9486a63558e6485cf1e5913d2..0e34b943aa97828cda48d6d3989668790867f7fd 100644 GIT binary patch delta 1685 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index b464fdc0e1bcff3d30ca6ee7f612ca17835724b9..0c3b63db803c44a22b77e8af6e02fa214cbe0df2 100644 GIT binary patch delta 3056 zcmV3D+Nbk#?p?ZT3W=hrL=+;kXjMzbey(2tvEud1W<}VLm>Q; z5CS1TAe$fi$9x$b zb$O<*_-hyn-AQd%Mw7oeo7ygWAQZraVaa|XWc{5IACEk3^O?w>>|*u$8$nmh$N)C+ zyPog)SoC?Dc~b0<&d)`L>OEG%yrT2B*K8XjG9?5|8$gih4Wl>rGG=C-g!HssP=9`V zC_B4h@X%Wuaewi%4WiTSkeTF%p=~SEA#`p|`1GL}NH_<~@Km_ckPBwGbBs8X?UP_P zDgzYniZei#$6DfdNAnP7`;YxicIIDT!DIQu&Y#Eh9(VAw|}n);PIGeya z92fXEAwZGEH=>E&oLU?^X+_o}>ozA-iLM$T+EC^*!M_TQReXnxaN-yYP?snFuU*)+ zRiH@4jMf}I4YUbUUdcjzIWF1Qcr_qh6+rZ>1%JiVeC|c6KQj-EkjJ*hF+iygkX4O5 zo-h^`zpWP*Jv!*I4K@8i)Gt8v-cPg5gYWKwi>JqfVMJb83{WpyZ;C#UfC|*L0U}*D z^}^vtvOY8CPMrJ0%Y8xACqR+PbGhanI)7qfY!C*>d6x_6Ex_{^N!9P+g}GuE7TF{v955qj z*}fXOb^JZqkFDPuoBlX}tm6su=6f0=;g1>)-Ig-8~B?#k0%`V?7Rk2XARV;w6oc$4bBNb@yNRdFWVH5t zK-Q@`t)2TJ)l|-mvxh4XSD=_~wKlqBkN4@fW<~qgJpjG6^nP>q_Sd`b?{Ed`Re*2y z3uOWui8gDXp5qP=rQbF0!9j~wz0p;h0IbVkbavMVbiQg@!upsi5Lcks^D+R?MvUI) zopk#h)}^$_*DAF2+n?1A?f4yp1AqApQ2g32b*{ADpbBK!lb&(OGj;X@S>?ZcKLU{P z?93I=T=%roO+wq25BGt39B|uNSYNL&OSQ*ig0JAmIcwg32Ix;zFb#(|XkRmP2bg?~i=${W%E z`NKYm!Jo~ZsW;Ys2u8@^cO;2eaUV#{K2Y4oT=$TfS1=2W-#qXf9ND$Zw)$`*G3E`< z+xR$u2tc1aV>O0fxn~a^ub9CAC03RA?+*i%0MLXf6=<&|7 zH&c-%j8%a~me!;3lW75HK7XIi05L$x0;J^^2GLkiYC@pZ`D!b7qPY{@s}miqK$ww9 zXe=8}(D{2=`+p1&1LOb@pay7~r;_?5qBCjyKPozarojNIn0Qf|86Z(kDjJ6YQZ(_R zWHUgboK!Rp8pcUpL@Szn5waN|5iTkmg8@=F`68q1Kcg8L4U*21wP+3)0O12{KaEFbt5YnHQuRL%a(UWTl#67$7zCE=)Cs zLfi)u=B9#y7$60cE>bcBB+^XRmcEIwb%W@86fxPSgJw>NUFW=56%F&KgUuP z;$_~2Nj2E*!5JX8XIQd621v5OZV%4@xjn;@^)Wz_4S#lfcx-Ov`#^3_vP^y0+Hq=Y{sTLM2$<$li7ZQ^0|XSpx`rcX5OIXWaX7R~9U!9rVpB`i4nX|0OEt1AnGO*B z9h+OKUVkFQa+%|BYR2TSSILM7FZqwo(LsBU0QjCzisxO#^bsIrfH^lmYwS)$ zjQbgw<6XqYma0by@Hqe)C}I*EBUK&1c7Fu=fzMm|qMZUqfa>dydi4RgiU=O!gVt0{ z{&mkghzPG59kjflU~EfL09g;$)>h@GXThro@YU;{3I|9z2MFL#K|efHR8)G&Y4ZJE zr$2l4?7)odwyhe#Jg!73$H28tIA{XAUEuY89kHmbuOR&b)Ln_Z@FW110r8sXT7R>W z5}!kC2cV6?7I>iEsceMuIiGJ4*=^lAffs+aiP|)Ipn^);zs~UR4E( z{m}WA%1?PfTZ;q}xY?L=j&9ZugbCqr7|h3qdB^=DnMo!Mkku!uzj9)XrW<8s!XiHQ zNXG7)@7c)lga(^UL*H01c+833eSe<*W}GxY(SV)D9$KkkXve4sO`91Q0-kdLr13M9&v= zUCFqf2?znmnn35Jv=ie@)0krd%m9MPh)~K~|LaMQkk1B*pb8KUXaE(OrfKiY%^Fi_ zT?P{oT^K;Ilc}S+%y45%Zn_rC2VK7%2&VwiH~<)hhy?&R2!N!FEy9%4jA5NoQ5zA} y1HdUjtOTTggJJwDXr^EC_`FSpSlB9B+y4NN&qm#Q(?LN10000gTAZrz1MB8zV{@yO?XxR8XmaYh$K==CuF0(%7@Jpp4+cJ_&%tZ>Gx)P^A+dlJ z1uDXzv7{OYH$`4~Tue^QecHU5k-FUKL|uMOKExJXzWxB*pM|J}sMoEkF~GeEg6LN1 zF-#DKm{t0Eh}xI}{aIas{s27Q0+AnEpihh`s2v$oP;*~=-qkp#K>4b8(OVFqf&clu zl2ne;=2vHE^Qv~~@~SFzdDX=0K#*9(G!6g^;IRvRCEWi2u_9(w-6;GFRE452h1t!L zp6qUzT6B4pk7#l#QvsH}+T5yo2tp$d?<;BOa;r?boJs?Y+)5*jJa~=|v%|=*<|D7# zgb|ZpZKRP`ZJ+^)MPagp4XXOs)pdJg3+qzb7hZmZra$|eCCx=|AyONFNS#;l-vCCs zHmCBG1ri!L^xmk=t}tkGDva9P3KN7Gf?((&ko*ab-2qhRRXzl;Y_dQ@BfH$7$u2WO5XazzDMSze z5r)wUlTDR2=~iF*A7{rQdh@J*WAz3wm_yXr)c9rZ_UD=RBFnvC)UO%|jo1cwi^CacV#$+}1ygX29&&LL_7Qt%+Mgdw)D z)@%c*t}s5oE};QP(VGj^fye61i__Fu<(ENuh?>F!X$rxyk6=RNB}g&;0m*2mNS9+) z)lRc2P*jZ?c^!6BW?lTXI;(6i1Yu!NXI(Ty5OrgK{0&h~SVGh&wO!iRAg#4}Z_{*M2P&9(n#zoy$RBqfk8xKSJ%C7JBCEmdK-dRU1eAFP-mBY zXN4#8qJe^AA5n;G{)nm(LUif74uzL`IBIpY{3!@aX`XTJFY3&)O8|{Ub<9oRi9*yg ztx+|)gdkmt%d7fdN5{4`_?-n59E_EqIx8;_8qNR;1w=V+AaVy%;2>gZ#8O&b%|bY& zZCbW3vQ$}Xj&RDA7uKo(90;>&C3qbRJnjH;0FgSvlt|}ah>YNi%oL>D%5{RYlj4?H z>NB&fN zXqJ>D0652ZcuH@nR-PvocpO6143NUw7x@U0JCI@u^tTv9$JJ?vd$kNDV(=)^Pxb>q z$|xvScr4M1APTTAvO<(!Ri<5fd_ZJF#L|``?c|*RMl}T_&-Gbq%((rCJ+FI#tlq=4CW`$?PSwh1OBBfg;Iv?f``MKd3Xo&J_h<3%P z&tYuZHX5t2OI-lZ*(3&!!3vKj5Jg-{3oJx_O=*R-hM2rcqDd=Gp&je6OJ%I$Ql_7M ziot`xn4199;vk9`UqlzE#blKdZOWbz;Z>P2nl(#)PJq;stX=5+5Z~`+-*ki0GPRS~2_aru>G@Tb*e+RiKFo3r&~U*%15 zvhEf+ed!h{s<}mWl-(rRN3N4+HrA0&1pr83AmaT{#u=iSvwbLqC~>`2JiX*c z#qzTN&p87CL@ePoNFjvCTP12vujp3*&Z=YA$(0*MVltUrhS6vuyUK5pky|d24yyt% zo6l02cInZ5FovSwr!tnhj8tTk1ezZW5y#a2kic z-bhv!T_*`2R{KAtVJgeIK(q^fnjYL##&z?(!8@i2!@)MxVEyiQ|rJy6ZtX+>Jx>?Vdx+p`%+IK zYOV_X2*w(#GryMkbeaQ<{-Ql!)80_P(il@8#li!_C_L#UW=LZM!zDzGK=Ku$kWa+A z04O%Mj6Armnsi!K;S?fNqUNSEtj?bNy3V_aSdSp8Gwae%5bcZ&j|WbLnEC)P>lr}C z<^bdnq+ml7fHGf~Q$}9dUPpU6^Y&gL9rG)krn84WuOX#Zo0ra(9lB;qWByvSze;aJ z71Ax(y*V%{Wbr-=58TJ#L2#@JuD3wTY$d5c!Tu%sM_C)_IWR~te9w~{cD*2RfttyinQXa#_Ho0L@m%4#R5DN zzpW$HzclnV2vf@bD^4NOff79e>Fju|cMxI6`kqhq&6`7W36b8Y!zqrW9e%FJEPbDU zZ0#&hKV2&a2;|Gon4AIBnjpeCrLkLUNyRnC#uy=*{nKTa=?o#daK&?DjVAnowR-X9iFp7b-IKBtH)fLa4YF*yj2-kP?Y1*Wrk zdoDXQ))?L>5vINSKdbToY(73$P;1m>ln~X7jfqr+>~>G_WzGvjDF5K(UQix{g8>u) z5P7@a+Czv?>R0h*sLej*S+iK)EkUs=B~@6LteR4 zPxRP&tj=63(U$W!NY{d@K&>k><9^oKv|^%~y5e+lJAjM>tlJVQzr!80MY|%b6)~=>KuutTC?(DsvuK0f+M|+Skjb+03 zpS5izE$N$`#w_V;c%nj`h=OC+NnCyq&itTh>^M>W{o_A1KaKIf zB$Oo|oJRoy^NawsHi%-F^7soLdry??BAwZ$J#Mo8&rLFTO?8mgTk9c>ohO(p6F2ZP4dE)+8{34uQB3z zWa^}ydw>C{_i2pHdx@v6?<4!*|Guw&1HV>fm^&XMUYc7v6j9gD}?(AC7V*mZl!t z>J%WaAquaQ<_IEP7Q#~<@U-PBouMZ}B?|R5KXiCCMtBd+?C*9`AB0SJs=GxVTw4{I3&+@lgqQZjT|E};DU%L; zz6)Q@d$LZ5m#TKMsq60naBj(#p5P6%Gk_u-A`A_{Gjd~9&^(W;s_f-$b#!H8$WN=r z>%@YQ)+{+}P>f4^koq9r8+&A+h0){2$j!BM zWn);Jn~$+dZ$=|6du`QNz8~a?k>&y7r1N&aLjhV+Y@z^#BSb!~w?^f81=3de)mtHj z2h-++?X`4eW7ur)fUoD*n6w#i9N%6$ADQqBpy7!eHP8!xUM@v|mYy(L0cr+B?#uiD zPsBQdC*v%69@18AedyEHn5}xcI4unKwl-?BN{Q+p8w!yL&j1>lh#p8PO*!;A0we{1 zr1k)L0#dj^)CeRr%;UFJha4X4aE}IfblKjW{SmZle&kmfb@2C8GdJR5dl_TH9Y90z zhh);lMLz*NL<%Vk0g`$HkS7rNJEeKpD^i28o8;a0X%_$ zsN6S*5TLwjqE6azN}!03GSmR4;?H zHEx@pptp#C-P33r`gp3)`9YODY)IZh%OBK3+AG8znX z#kJ6;t=f7cRDF87vN1xo;Nt;Ww7-@c`pR8&O2Y$yIBs;x?EuYH9-!l93Q&YXq{-mn zxfK}ll^hZU@rh#)*k?=Zvv1%APV9{EGo|{TSKorWmgSU zdFWc>h}sOaf(K~vp&Qbt-W@`FK`sH}n}}l3=p};yo|_HX;lB1a&pmY*Td ze_auB&x6W04*NV=e%vJ_XqRgMfWSm+79TW7pMLiN+6&_Qgl+&DwfJtylH;xc3geWf z0p%IDxhgECC!XI3|ARAqKbbMu5b+>c06KKbGk|z`5_2Px2LM37NO(}30~Cf3sX=+h zZ>b7-pQjwsCQg%RGyQi)tS0Cwt(*d+PB~C7ef*6f6rjN`i`)Y=Jn>G+l4Dm8APAF7 zfWinORr+c2+*cK(_LtD7t%DW%6|Xqy&eN3e*E=5lGLNs z7JvXI67CS8^1QscGUV`}@{Hb8Wd~10Lqq{mE!?da{buAq_W-e#h=P0n+*OiNblx7I zaE3?;%Jb5u%CMN8cx78Pooj0$muuhwO4?Z_9x$vgWrLs2a08G)5F<%Gd{mMO0Hq$Y z0u%~}+)cz<($>{5n4Wm2!6S%rD~wwBTZ*aca5;yLvEc@w!B5EW@?YZF->;w^$R40Z5QUR3>Q``!^>Pk;ama8yl~v8X`^|I; z(Bh+}1^|UIM1xkJqYwo{i7;)U@-%>_CGBrbpRX`!(u#?ELRK;|;SE44Zqoma;1%eo z8G?ihM0ezu5Z&@qE|mz=S)dK`OIy$|x8P0EsRC7+)v1SwY~+Fo$b@GAJvs@iFs1O> zxxWSjUC#p(9uTS0Pm&cs*OGr8yG*)gpK>vqx}P^V5Z>vdM$+}aBI4OPH>ta#?uC9D_Z03iQDxIEMV1AFd$6*K*2@nq?=5d}3Z6vLNU; zT;Z;Sw*kbL@;cG0t48qvfd^WAl+bVmk-vSB9X!gk6XX+srO8fTES<$=INyQ~Awnf; zPC7%+gR}dZDMZX(+HGvrW}^XdxIS(mKSP9ef{hMvgl>4~o@=tONRyNs0y03xb6-(8a2 z_v~+J3C}kX+js^LnkAi11&=$6=l=Aa7@?^-?z&MHJT%ZYBi;7_CEUkz?|iuc0TQPi zX$Vk|A)2+L%I%=v0Ej+3a*4FhaIQq2OnYF5dEDm8rpnVAAfor>CiT)|L^duX3yUd1 z@B3Ar8fcpj8t^byVzKQ;%zZ)(RTzb6@e#Av5T*JDq8%4JPd^BeDAC-eNlcArK^RbN3vys1QIznn1KTun_gg zKJC>)u^TL%IrT(oj;B2^ZK3j5;E9wSWmW!!DD$ET*KjMQeSRFqz7J)9XQ7RE0O47P z-TG_M2Z^SBnJP}P0puA({!3|pSzk)4EpH4kdLlH|POG!DhSMHsn8$A7(^f#XnhEyh z8kz$UJdgfIz2qp7ja{CLV=w43L`PZh5+HjY)V|%5(;pQtI((Bt1Zm6ykwcLD43RRe zn5@`e+w7|yJM9y(Ku`2(@fAp0a9KG1si@o(f_GwHc=+X}*tTQ)Z)w|;4B1mILO_0h+upqjp;0(F!<32u(r#)Kh zH9y=2RA0*EpNVAT`~@_9b-pi#GSH0lWlLjm{S;Kn`rJE6JaQvNl(od>CMXvK|3)08tZ= ze1J%{^f*~_?2`X3aKh3Vt|y8@WEc2+)=aZ#E-x8Msuh`e32f58m? zhbZ3LdW-wr3s2)%3$#7e&8@zgrZL>9ynT-jaNm=g_T}fi3LUknkS7o|LyewTd%oEx z3gWcK!K!*X0XuPP1sPCKLe~?imYodEK8``Z=7)z9u@?0KwUxSd39hDxhZ^rb5uwlja-i|8r_}UAkZ!Qd6nm?E=zP1+=D9II?dUF@vEA|HvfkX}f2|cSI>=P0i1-GP zb0zxzg6oM-tj>18&tRWu`1(?k04Xoh_i+rWFUmO2tIv|7ME*+FH#oLzj4g}D`~r~0 zOmhNN7gV8c?H+voQSSX8uG>_|{}9EmC?>zyb)Qj*^q?^4iO^V2gz5}SeC!h`KPVKJrb(xjHLDwj$AaIoAV>#aFW#uP%|L%vN{XonI9gVRvm05@^uca zF+`v~s?3Wf#oQl=eJ8*;S|4A+7<3^7fxRHA8!6W!Yw*%Xb6#)DJ{T@ z_GSK7qYz)Nq1h18$E5}(96$N1`MY5Z?_gu83554?UXjHm#ADB(-H>M=7tPrA3%BSH z;Tohe|NEkFKCL<&A#wte2|-d!-%!up|Ku~Y?-QWP%asa==&7!n_yoA`%Z*w(pPRjd z0>q&wYDo}<_`)#?AJ0K+01>P-4^F5J{n6nhePM}Fhpkv98XpZeUCdoB%`Op@}~L@VXwi%M3eq`#;Qb4(^(WEpCPiqlX8g2Cl#KP^z8o- zovKiE=|jha9~)sf!qaf|B5%;*ER`9BXyWQ(_ns&UQL`b!$1Bbn6^r&0*~EfV3?56x z701Rz6wdH8p6cLF2U5lLp%At2_JDAF?mp41|5zY0Hy0v*E!qzshe%36Tvx7)qTJ|3}#=pX2El_s8jUIb`3`F5(nmw(|IQ9kN z1xn>@bk0m98YCQ*`l;yMZwQ44)yQ8Eg>VbLphJX@mzNk7=_N!qa|@Bakg^Vr?cG#) z`2Vo+jmq_ifyWs{9at0V4)~%2MZ*&pi>7>Tsp&!r?jZK=6~*tNuFL} zk}uc`WqM($__re`P=uL!sB zK!Z|03Q-ey40tbvlqDJS!MDQLE)U`{6lgo#MUN?eY~_*Yc|27j5$i?ZL|#{b=uSF! z2EK@UYWgDX%{ABP!nBklW^NI$My(zq`uu5B9kXoVej=Un={50F@1)`}qjOt|_IAkx=AyvRL1`F&Pp z^=HQ_fgL+lC{`4P3q%%k9YfE_7AyM-I5|}#p|<01MSo3N&Asu-716BkScO((p!+ns z0?C(@7Roa}=;Ko+NLL1chsfsbfpoR*isY|J9|<+_4^q{EV+WPSalNw(~?5rRnPLv{7` z`Wwj<;$gX1$A8UX8@)jRw$iAJf|4$Db2EpZpc~#+vJ* zncE24+`-IFtv2)9??nhi{J+hhI7U<*{I?WO@|*ha>yj6je$Czcr;!Yt0rVK)vEWrF zmK`H;YgHXj)kw|qdp9cCat$`g22zmj0u%X{Ijgx>3ro4_8;KaCosuoE`^Tk{5%WIe`VD)AfisYPXFgqZXU9SvRUPlVk(^Z* z@$?{aiaTiK!4yfT)IPvHI(aVlxAfhj$)8>4-rG*Z^Kr9>WBeYDbQ?arKf>=G5^RY0 z#};6W?4HQrGf3zBK*Vo3DUI{!Su(=gWHOgq(xo;fa~t;K!cB z&(8Wee5&FVCxLxe9sBNLyYf5=j~_td6^Zvq{RJZVKsvVu|ATQRTJ)DTTHxrDWX79inGvEf)>`(~IyK?`5BLAbxhfpF=&4MR6?PNTT5Q zA0!DoxLUT(1&w7-ko-IO|G}I^m2iOW5q9nUuxQwr*Tv7imnD30>2~qNf>WZ&YcHdB zqA70<4D$SaM1ljJ!qOXFsoEOF4&pekQs`e6{!Ap`!6dVH04!UHco5|2sW zE`D})miYIh{|=ww5vDYEQ?-H5$bVMFo%FNw-=RJGPEo}P5=b0t+pAb*(vi&t^|Hcb zQzk1=5dX#9HsndsgQF)2AD_HXG$N@$_`>21qOlpfxCwbPm^>$tbR(2L(%S0#S)(^78IM`r+%BcgFDcL_(OZs4AqUm*GOTMNYSp7`EE zp>PQMTX(a+ZBZHvG`-ko?Z`g6ntc~83QllAYR4)Piz=z@V8Xef9*`RP(*6k!p3OHk zhUy-s5clHX3pMe>gk5_5LEL@NAH_ZHd4dK!#^>m3JRtYcbZPs28!Q$-gMoh=KLdUi z{xjJ_V@XpY_FbajgaD+*s$>sS3@d*-vH$T1R3BR5SfJ9x4Wi{TDg+OfeGF<8*4G49 zRe|57@4;Zf_r|}$1JjND?GEg-*hAA;ZKB|WDNHifc+)U*8pn)kXQl|<*A~KkD|^p)_BV9wZz|bmh(Z&gFtuZYCSvAP%6cja=ASHJ z#jw;8#|&);27`TcV6VlopN+8tMaAAz&i;m&{Y_z`^c00A!hy1f$^sV023*1hU&>U& zQCMD=u;1bAK(U7<3QQ}3sxe$`8-ZpYj((=``?R{-{{xK3r^qMr>D+CV>CNW&aN=6`D#dTL#S8vi&8tm<;qIIjJy6ELp%bocqrNu!p9fOt3yGPX1=-1 ze|z5RM@i@35?ew~9Wai+oG;o}?-)GPToE<7yVfJinsYvMc$P-fc)K(ip>*~foALkx zJ^bl`v0N&Ty4m+7lfAOk&Wox>To*^9!y~&-Y|H#Ok~d^i;-y}3h)Q21Q$k9cc?Scx1_^3~GyRfZcuF(&bcv0OLD5}P(VFRv{!hv6FBuHk8KA+%>Yu`i zHqc-pZ++_-^y5%^SKp{zZ$QvS3}>|UtKJ^{C1nV$zFoP|^-R=@fb8*C0q_>&r$Y=8 zB9HOpQp9~`=8k|$+Gu3{)tzp8wZOfH1NKL!Xx27Q``y}Q}^W1B#vI}>&wt_4n6E6FQ*A8a$CHub=q%Ao3zyS!S%Ag;% z7zYhLNR$5kb^Ta%;L;#V?ZFS3cHf`9jVC#%vIya8{)g*`iDsXxv@%sc4HgIr;{gr6 ziMKQxE#tl;s$V#m6VI>2jdp|dlP5jK7XNMtjQa9FP{=duL<2A+l8%p{BnXC~EJC_% z?lJM&~UFtNIC_9fHXfvm^=;Ko-}+)C^P!6Y&ULQ9awW+36FW-@B4GF9WL! z%b#ueuP;uxkc(V*#( zq^uh29)V*g3Ka{71NMOblg;?#V?lc}N*$W9@(`M0N4@uG=)|Y9OWN!o+nq|845B|T zKN3QPce)fu_SfLw=4M3C!Ct`#MXiDD;|&K9y(^Zlk#KDB2sZ7An>rv~v5@kY(Lc(| zr?tf5GNkSC2Xp5R)#w9mVIC-k=)*-_Mg&%vn7+j2TLJagKd{c1?ruo8et1;&7z@Bj zsZa|up;^<1(YLDZT{C1P`1=#=UTv7txSipotG`%+h(37?!81cc4bNOf*~acmAow$9 z8k5SPYJ<)jF7-$4NdZiZV8fg2Ru+?&x8DA^g>Y(8(QncQ zCBwL~)5`_a>d5He?T#O3=%I)QSK0cU6(WS>V%9#ytAZsI+W_a5X&dsb6+bJs2U0cT zo6)3gUbpE8j#a}NoE8#*O7T!nMMoM}5_A-{*7|Njcn-GCc~{#jsCH`rj*EEcs&p^{3M zzn56A(|VtuV^X-c+Wf&`kEUf^bcn`i2yFsF>@t2fMn`Cadv zycerQ2*`POaHB74Y-WeeHr{RMG-jnM=pyUULS2vsWa;jpZ<*j(G`PvbivX)B#ade; zweo&`@~V?X|J>L8g!8K!minQN6I49$`oZNGAkGM7*KhiBNywLzg`m*}qr=!p**nxQjAnt#MYi;l)U zJvy0wpa57RXQB&CO=%t|0xHZe_iRm-FO#2nrzZeNd@(c0`eNw0N%q1~otI5BV4oE} z!k#CjPYj0MEHups7q0c|7UR87FRCzn_P%%pnTW*-G_I=kT1-Z}2m;yKb*vNZC6zp= zTH;ty)Rn#hb?ZleTAkF4$~c@;bLkCv_~tuW87Bsx^i17b41d?|)>+fr@}(>Mz+qx# zGR(XBTTbp+K;zCys*6_aGYkd+3H5;&mtQupDFja}{bXW390Qn+>ePIPp@?c$un`;p zyp4woB%@u_p)@wg%yp5>^H3zlsh9Lz3`8*Gsv7|j7K{?&#X$ta z{KUs;0L;Q(NlexdfEs+l$%cTbv}U4R4WYDzMIcjy!W)yY6^2>=owD^hp{G}yP3o+&{5 zeD|U9-JA)@gmAES%@;c5Q5XQa39*SE!4e%E6=9#O&$yp9C9-3H8|8@=i9k%_iknFs zH#h5(K29P)(cm!UgRsUv;AZ{xZ~cGy!AP@7*ZV-+YmC@d3hbs<4Z}N5T@_m}y{bU8 z!woQte5vnGM5z1hbZ3+;HEY zq4P@=fNYMk^09z9#3^tX34@x{dc3Jw;FvFx(e1)!CuPiAI;x|Ah}6rBdqZCglBRlwGmo>;R1TT|6{$Ne!g zK{;Fdah^z#2TqIrK*l#@^fh%b$24&fX)yqD zf(Ie}o`bF@d%JH4C-!fYkeEz~t4}};N3vL%jX@1FRXB_VK@Dr%4K8H@Fj864r3H{B zL>&7j6LwR+hQVMRCwmPfpv0k_96*9>NwPE;|6lt~z$$+`Uh>q#z@7x0Q~5$~$HZYc zj81|y)z0ti{*zt+^k>yc%D+i%V|riQdOE@9-wumu^=L6Q$!_e*kcYdQP)VKDb}?i9 z{df47umI9RkIGx0zK!!zMGi^#1?sn=P}+FWb2zUYUZr_s9F`UN5l2j#BCH;Z8sQD9 zFYn5bfg2$4b3M(kZfp$nA5`KnT>!)smZI21i25<7JpO$)pHsgEM4_t9$$oPUJ;9@* zzr|^phO+?u#9M~@T`mzFe*OCM1J!dD6~IgWY8j}Ht*3w> z1cQ3dJl6e0qqR9Os1R6*St#(Dl2p>_Uq8qYg1cjgIoa`jA5xF~T!Lsowmx4m$aZ+3 z9URFGqZAN3hmDTq$eT$KFYwi*k397tTi5SPkp$tJMMU&vM^4$=K*0lM1yS}1VC;@09Vst^$TI(Rlo}5m z(XZ;sm>$KQ_}#(c!whvWrb?*Viofm)c?J8Opp%imKb|{TzeOVP!gs{*xx!M2>_NkZ zTW^G@UkUfdGli2ITDiX8k6K|Wh{b&7P{0-B$KA3my|sDd%uM%dQ>N_hw9I| zSb0`;DS=roIm^}yghT98*!2&YRxW;(X-m_!FK>M}d)KTR+I%6vzd*{%i^b6$ynP2S zJQQ9Zo3mgZV_U-xl+Xy2N&axIOE}_BwlKY_9*49)@E>*y-$sDRJu!S@j(WE8;utI} zWRG>oP1zDc9{PIMD`i?ixk&cH$Qycu6D+0VMZW~?(3OW-FG_^^I!mO+`)ND%`K}=U z6^;8+pE37bbF(SaT3I|fa!FAsmYLW`%*cYW{XXu%r~F9+-0?a7hM!jrQeHe{?Z9Pk zxNnY%N8KVFieNSY+TE2f)z4|3WEMH4d5$6W-*yYHWNVYhmT{X;um_Fk%aJ|-TCqwty%OPr}rnt`c$**lw@4y-DKX2aUYCqOpV*KE>;XW`n7TO+`r2Tl{ zFmj~B+b$z7vHlB>8=3WE@Sz}!D9s6Nni;+01=Cl@f%v-Kx>dhFb?>f^{E0~ee{i+j zpL}O^Rl!y9pDbH8W+}iwZOw}~>9hazvFGw8$D?I?SvHg7rvEI>%@ftx*s}dy8~;lS zb{XQ)try^DPhz+3%%7hUs3>H`?lFbFTH%9RpRA{Dt(E%Ee{I<2Hu}TG^+9{PC&|Jf zVQtX4WXdM|u(tREZ*Ny3(aXfscRR|MOLMeSRCq_Jr06e+DDB5RP^47QQwoL=^Gr+q4gfceHIW>R-mlp zA*94j;$HKnSFdkzUbWfhw^R(U*D(P2LO;6CPi|xFSPpxDzI_njkX%`w{oC!6$G1|1 zy$)~dP@1tE+sFxX_14I8_%lMvkm{lL=Ffi0)6E=vv--d?k-+iG;=D4+FOxA{-|M=O zHm30f{X7-jpCg9cqF|hXW|xd|lB*9}x5sMcmOVc29%fcXQx2+q1IJ5`cH8a8s7n7% zGyg$NdM(OU`U1K#C&G~KKRv{&N-hxi*VzysCJnWDY`Ci6&r^;Uju+;|nDpU~!#cGf zMW0$>x>^C$t5U>Ym7>7g~Z$Z&h1Ae&4DdeVS0Ul~A=z%8H>hVqT4C$A^Lm zWux**qSx0gj@Gsu`T1v!ENK4=qUn$%8hP2vrFxNN5IPn%ygsG{Fx0xeDY5N;}rvZ2VQ1)cP-&FECr3$2G}3GAD>gRX^60V;)<$|T_lAV z+y~*Y{bu~glk)|_5bfYVF2x{;Jldn;@1NmxwqPBIH^8U66%jaXn~(Gm`$#kUm(xjHB8_AYDVdzuweHyfgQFEX+fdok>G3CMYBq>x3zvVY6Tn zcwMr!pxzHVA^=lBO+iFR+Iy2GQ4xRE9lD;8xWB9tFvuHelodCiClQ*QsL_ra`)1RF~0qRl@r z=O38#mtP~JuS$B;Szs9yj^VGyq_q#oa7|6%oIt44`u(9N$x?8nFBeZ*NXM50q?yQ35G%9 zx%lEI#GTKkZOmi{3b2P;X{%EXkN;L;*7WSVR#9Ml?$2sijY ziG1jP%NU#OY?YpNU+w=OJMa+YRb+y#?STm_g?-Ev_%lUIwpdks!BAUa`0&H*v0X={>P=EcoTHG*Tw1p`N8AP zm|7deNVkq|2W*ZvjqHwP{f|jwtYPAw5P<>l!ujQS~`V{*?-j?W(^m>#Uj3T6G zczV3Mk@uZB0p}r?yl9E-giAu03@G%W@G7C7iXPcFQ}|@0Aij{HFZS|hr2pdmk9Vsv zXXtKW5ah4gcUU*UJUMOucb>*+QRhBEGJFsc%}%P25F289U}S~G9?_$0x(Pl-Tk%7* zJfHbVFi8?wWd(OWatJEv|4MySHe7Z+X!^HV=J)2aNp7d+*ft$#CnQ`y8V1RTjcCt# zy-KkVv(%&Fh;KRR$Mp8}XGv@RYUTY^U4niml9*TcyGgy$<*Oc8c8r@xi_ep7FUtcedDbmw_N@KqVeiM-s`CNJp6V` ztZx`h8M*@XY&2iZmnJe>!?Cb2A|KMW*`B8;OdlBP9nZa>4aJXuFHP>zo_y?yvU`%-*QDut;bKV$@-s{AQQ3A|eT^Zjy01_(15@OSjEb#=i&x}VRaqq@n_TGVGrL%*NVH6uoazI{T4nT$TNr z7k2RwuEIZ*5YN-S9z0<_&EOco3jCMdv`_2h6jgfmTW9h26RE?$l3;7#NV+TRJ7upatV_m+hpr+(HscRi)kT=@fo<+@%d9U{;hU^B2&@b~8Cc9;?d+i-vTK((nu} z-}`)OSaxL@FPR2RwGZEE_{4By;K`^x?MqjG1OhR1g^=%Q9mymTD9vk_)RVkE>3Uv6 z5-G>oJ#u?vZS1_^c+(q)GyJHBRZxbVnImK2P3!;0pIh8I{MW^Sy^bg2x(yiShuDp^ zlM@K3lDJX3nY<@<<7BPVKnRHVZnDSE5pF5Bk$9#z_3lLC>rRMYt3Lv-%m)+>l-t#{ zgi$LBcPC6IzFG33t3L&SVu?Yt49bV2H@gE$3);UNA|2UPuDq672YWyT<>V&oH$`>c zNg+??_N+aiOj-G#P5-Cb0*|ucu!Me9$mG!v~pEVy3;NH!w5ylRfr#x+fdtI(SOZJ-kEMZD@op^ z-{_&@+G{n+A_-IUKp44snQ};*S700~+DQwuTfVYTPZ24^*&R^vAV(%p>5MkTWc`!C%}92dya3143DO#_r_01PHMp^ZARb@lz82h z37s>^16kUGa7iIQ)MTaj=V-%VNa&j;gxy@_X-@-D_u=l~J^t`UztUD;(DR0%pt%{5 zeL4LXwafm!a=|98w>^>M|Ise9XzAfSFN|A~qM2jsp2-tXrv<1`2o8c;E0=`bI{Eq; zxX=Th(_iG1C2k=1@&L*gcq`ww7sKI*4VjqakiDympM20do2r=eP z_o7<-y{vB9Yy~DLYYm67kaC@|{ErqAPqqqr!{dhSsP;ME>>f$Fk3&E?!7Dsj*+*Lq z2+E}atw(H zYkRtF;V;hiigG1X>ZCEWASf{uY`aNpy#|8f5>W$qv~8p0+V|b4qwt(_!-C%6&Vrq{ zE@0(^c;wOaYf~Pp8LaWst%SpbJrd-oo6B!Wj_!ZV06=l}GaeLxFd1@wXx=w7p*hN4 z8rMSXfSsd48nxTso>$GOR9(Q!sX^w{B7L~q#)G$97vM!guO$I3dG94z6|80-YtFYm z8(0!_&}|EfX{GY9(vNLWZs?@MzY{d+_6^jId&^Su&{sYD{F}2B!7$4G91*&O1mR^@&ad?>ir}uB7?(>crc{T_=Z} zp1`{aFBh1>3%)mNHUu_RxI8tysyj?m9bORxd#{^^d!BZP;l6eb*iyI3f{(>TGR9;a zClRLRFByD{puN2JisI7 z(^vzsCfX`OkwUT`W$mOxi z6FN^-pII1IgHl^ z65ffEuA%=yUPR^ZYE{W+syGM9kzwRlqOThUNFoBCtGB~pxL&Vz>{>r&B~bb)LRI`( zWgu{&svn=&xIIZs)JO?zu>2zj?p)&GIg|i`YIU*QXyai$UZZ`%Pp9bm%`Rh>Qilc* zJ0%D{8D~@7Wfpk$s7?X!{9S8sqtz*qW2XM{Jus+%`VaEMrEs@SfFkHN;a!zHHY_-L zd2ubDb(Zo}oYx8u21VCZgs~nOt5Xr3GL?Vv00v7HF+0X*?~6jI0Y~QdfKQuGn>i9DBX^J%ja*j%UKm_00;=5VBQY= z@@vgCN&69+-Bp)e?jO-AORbG*VPFNA1(5VU(fp60`IdQ9WU__=xW_UbsWL(mr6b{u z!$E-BL}`;SCioFSBm|XjuO>w9|8ec|=i;q2;_zDo&lh!R0%0L(dnx6!n;Wb*f2^8O6U zO?SyxmE+N%Fr>q4$GMpx)Y^W&SD<03-L%kw9eA$t?~}lFclYjOT=t9*;2(xq0N}te z?g4zxzNn#Ow_HgdZBM5M0RWz8?dgol7F_)S7+?q4vH`UJUXE#-VtOWlBLdXjEQ!z$ zUVRx>p1Ys18I#T4?Ll>H8-h0g#RD+Er2~TEuBtDtyyTJhE0+38Xi8sdycFKM8IT7- zl_1@Q{99GxG5#T%^-_PEXV{3}`yA4P%X%2X#QLSz8*9tC`_8$`Mg#FgI4Xn*m*v>d zc+YL1KGxalHS&IOGiaRwQj~XAo+&&Z$oh2nqcoWBKw$}Q3nwaPMlB(?Z!EC&xE`d3 z5AKL1?IcDXrhj|>_<+E`3O08()`laCwQKXK}S z|9zb`LE!CY!1QIzi$5#;cRol6K>?satSo8q)S~CY7#1S4-O2_v#Pc)~J9-KS-nQU} z)gop~3liM>fM%P%XBfoa?`*lL4dG{ z@qTgNKGppqdtApEKG`JZUf4-g_aZ}>C>wx%NW}>bPb3Yj97MML)x2xCc7m z@y92`Ywm@Z&oY`Ilc=t@uHgtol4Up_F3!|AECD@iH7itz9!QuH`$$)L|EsyK3F*F0wb30Adtck#p6D zdk@@aQ~FN@3XZ-s<8conmN|Z=)lkw^Bd7VnhrK4aF|&Pix2>|)Ruw++rRE3!+be9(69r@FFl#BeG(@Sj!4ud2UY@>9^>EBJuaX^cbH;2ZNx z7Qx7slx+zxvRVbslVw@^7i{j05%?}Z1@WI-dw;3w^X0P!sUx}fi-)IpG7}>@ti(*l zJ}mhctYKeqVFJm#JK4Ois)@6mK1?omKcO*(DCzM(kJummHCVg)+@rru<3JfQy)AL8 z1iKY4W3|KUDpAZEm&0zfA-a4-FNni>$> zQa&J zc0YWW4;0f(b!w6R_GH+S3nXh0$hdHA_I2vv9m|Ce{j;C*UaOfGLHp!!4vF(p0DGj5 zUT$yZTbA2?QUG{p_X9iVr5yUcgysRskZc$vQk5{A9(M1t3~Dr6u9D$>PV(K`jogfQ zXEp#-qr9u6#|_&j^WSLeNX2k6pxPzIXc54k$S{VrjA#T+IQx;w_=+T~iViwNuEUhC zCGA5%VGi{sYHw_Uu|NeBP4%@siH4sky{Z_1A0sWD4N9pI)n7zoY3+}&E!F!eW11J? zH7a;osk3nW|FY`N%FnAG3a4`pFO8_Q7)7DJq{P7c$$v44$chn~deToM3#g3Z^m(LWWF_um%l)!A_$UWEh6VfeNH0u1$Mrk}qsBj;-~G%MO9gxGME z{w5zHvzi0{{I~fGv5>JDxz8f@P-1M78RV~{RWOw1L$keTP9TqPi}kZ;n83UP`D#aX zX1tt7+6!iRDL(P;#Usup=LQqsBB6WYWpqi^7CKWidxU-vJCMf2Rl8D}L`g zY_|S;3SF0da;JIV8-`iuwlRo5t{=F{0r?JrErU`S3!OJ6|2oY?4r*n@-X<>)0F=tW zxl?e)E4!$6h8pGB;_q|ZShw7})iTAp8R$fv7hm^BwY!@e#GX<&&P;PFFd#({71w4v zsdz7kz+Om|H-#fb3p384Y);7T*DO#W$m>|rSwWe^yIpnsh=7>apjAhY9(?AOyX=+(3IVOdxP`?Kb(s{>&|tb|48_XZez{Y(zO0owr61Zh&{B(fW*(_1MZTnalki<~95D0ER2p1`OKF2DG94caCS;+fv zJLSB>r^g8Ji&!@SRnS8xCMA)x%*HXQyS(X@gOThRv>ShT62G zK0R2XUONmE+S5?-Sk13L$&-o|9DV@r9O>c@88EdPzll}8NsL)8K_Us(@)eCSH zUXYWF?#3%JPO^7mL%7;~ifBaQMZnr&KhB>PEL~g$zQ`>l16?!_k1d8dg+SYco@{2R zns*G6fr!p=912 zCOkgO$R)~++85d0sQv6CdMS0Ea$u&{Krl-NZkpyHCD@O=EAC{}+@P`C$GD0|X3n>5 zaczL%B)$M0zO#@4&sTeeS&X$nNcZsRJ;bz_iYd0YxafW|*?$A5pg9#cD58hKFE>_O zmhr@Uu#=rWl1H25oaj2#el?_+Ii)pwHt!Qj?aY?$ZQBFpVtw(JuZ*Xr{6xYmJ;T#U zO-8V%Y0&v^S2W)}d+3gg9WEN;X2*)716E}FzJw!eq=bYJSGtX`$<#GP_zmu%lz557 zl?s8~`77-hCUa`$;@JI#h!0i&MCcS7N!njP4~4|$ZkigkWA|BV!;r8I z6k~uuRjTI3g0K$XoZt52x-t)kGpQT1S~3Hk)A%hHa}=3D>rDWaB|$j=B?dqImsnVt zM0oLl?rs6}5wNqSc6x}70B_xH$sS_IWJ7>Ro3Bu|;XV^t{!N*CL{5E-^m0yVkaeh@ zOu(zCal$A(R1RV*DY?ILD#+T4q-^u%?fJCdyrLFL9<5jy(&fN zO&OX@H2Vq3TSAQlhu$wZ3R!#h>3pqsOcfMhQzN=|FEAe)aXWwd*XnaaK?sd`2+9vs#+(Z*>y2 z=l>*kuZ!_>sjx1Y>W5+o@z6K)O6wOvve(NNUC4y^ElI&xNqjwQc{7ir2ts6@DT#b< z`Y`0dXTUIe0S`h4uJ0!JQ(W|4$tHr74fLX^jPO7p;tE7Fv#fTVL0a1{PZU01E`I_) zvfm`ewDnv{Dr2pRS+aOIi{-0$fIw{7Ma1}(e)CpvI{zw^Al3jyv^STzuf_f z2OMIYQ@8XhHKb7yLNs`?oAg1Mec9}Gapa|*&r4&CVScDQ*mf6QSc}7u#j=WQ1drx- zQq9c@V#r8fOpJihDs3#R@V+b|h-+Q`c!c&{Bi?C{x(ZkVKwXsux1; zUs%hq5e&jucp*tElVEsfC@U%p0NJ~YQEKMdKX8D6QXdR)8d>iz7qe?@5Q+B<-F8km z^#jWhwkv$23gt`fMCt4vJdU3Z*I}M!1Sn>fT_<)m4|`y-r)Z>x+B84KJMwA70o)wG z^{(ax-38s7FOl0~%U-KDmQJ`*z4#@0F0EmzrwqCET}iCz5vfiOsY6un(chE(fr0^E z;Wl%f3}xH$+x5BKGew;x=j2D{pDMAp_0hwP6~ zxi^(=>UA4Am&ByNPcrMT#5b7bO#8ksvIeX7He3!O&3;pX=t6ck&#i+ILh=x%m z=tg=z{H|u5dvNScmhjT;Dm#>8;i#^NB;w4mkT<=I>^DP6ee(KEizNZWY|?K-+gLmU zS&0D8iGg2Uik5bta6J`Zwl%!CyDm827h8#t{`U-6wNAE|YNs?l3=YU{@#q(McP?Jn zie5||zQD%XomVdM{`&aIoagj6Yrc8OYc5_*nGi9GFit2m)_Ifon=$k#y&VtOQn;mb zMrXg*;%j}MVXo&^)|GO8Di7Pp;K%edtG#_zo!*Tvc0tV#hECj5@^9AUN`;e%fst{f zHs{t^_T$>KiQ>u|$j{zVh4A#UiY$<|2gnY82AyLL@6oFYGKr!byB^12If8B_{s}5!Yt}g0tIcK)p1#*X zDcM)eVr)l@pgWVZp-^bmet5>e3x($5kms1@_h-&CDbM>Suf&aGG3D-2{R@wbn_M>4 zHnN?^)7L^&?(?7n@@VPa4BkzL1k*a zF=My>0;Lfg6go!KHZ-b`S)VtbELoHj^n^nandQLVT<;!OCcBO6Urhi!`3PDH&qlo+0ZR?N`P~%tBDIQN4giYrnh(E)N*rSz&R_z9&+Yb5Np0hMo(b?8wXoBWu8=AWu4CZh7` z)*uVGQBEP2@ta)cDcR7xllKTYfuPXyBWPqdm5h%mc2={^b}rR?`TeEuf1n?UFT#cW zcsaGP^$yYI$@F2l1m8s$*aOoTGeXiPh(8_H6XAnGU!fs{U`l3|t}qtdk5s>*5{s0; zt-`e@Nugnzhvgzt`&vCq98{tTw;$DQgJcf~wwWdiMuPP#1#c}c;bjc6^ZdPqkVMWJ zW2glx-PLe12dA z4e`m;uxR%}N~PsD#A#X%y6fKKCcH~G6dabtw@P=aSbjMD;EPBg!8+F;>b!`fFi;e` z^!68y+nl2M9Q1+cSjt&rwUP`Z^k8(`AM#x+DOfHdz-34k*)a&`gZy z5S1;N2ge1UMwlJ3y~L}$R14qqI9jbF1}TWRf41?lq`9XI(_57F0gJghOU98p?)i#{ zmG=>(K*G)Wpv#rqA?*11ao3E_R@U!6w>lj?=Lo^Fy}Nk#*!KjlQsCAcWUrt)tJYD& z`cpw!%b~G!8co4ton1RLL?zStR3z2o`({)UJL_z~`}N<6mPr%BT<%V?r@;)1Vo{Qx zWcNYtoEp9-Gi+wqdPF<@KojeOI>&eLPT?06>(pzh>6|83u!Ul=^O*$`{D93kC=!7V z>iil-vst{9d^MC#f5*tIp4=#~?^)?Cbvd5OyFtr_5wrtu>V(1PVQ-9{*GtL3n{Ku{ ze!+hdr5y&p?Qh^0qc9{fiO`r2P!h~QF)HqIe<+<;ZL=0T2r3TrwfeM^SYjP<5lyZ5 zbE9YMLP$+-CB5fRc`hViaW?spZ`n z2C{FtH0Vqfr<-DGh-2_%?q{JgB5l*Sr38!ErM^S5fTSjIC;qF&?S;Ug|BkN#yvK8P zg2T%Ue#H4+cxGe={vok1kFbgwt|GRw3vpkCp#MQ$qW}d(ipbFUui4+|ofWWjcMx=) z(6YZR)gOewww5)c<_L-_VB`%gCHnefK!XrP0kRcDc!7C{e0bQ{x zD`GME8qCd;)Dy38q)i;GWM03CsfyKu8G3g5S2(@M_&vAOlJ0fHEQgo-D8CkDgXJ@o z!aZ#D#<-h?eBfEYnOJI@Ez5#Q$mNUmC%Vv85bF?^R0$*D4<->Q z9`R3XJ`!7HKlZmx(uKP{92cJjr;Go=gZQhKhWMo33#SHe_L=!t_L5S^fjuvh5iyvI=#?4P-@sENa1{jw0}KRV|J9f#6UN!AuQ?+%tF zcbN&u+-lZ|^~(*Ln2xHEL2_cg4;nNcBf^Xd=feJ9jIt-Nu{%AiHug_$-)n7$dmQt(Hwk(IUd?f~zw$XCK; z*$VON(dgMiq2z2&$Anl3Ch^Ds$CJ?Xt}(5pN7GEo+RwJ zw!m4oVx|jxgQP(ohrACpR=#~tD}OWQQ7bsT`mWbJ9^Kk&e3dg$8^Qqh)XhA}E@b#F z-pG}%aa8UO6Zvo$_~de{Np*1fGG?Yxu~v-zCi0FflufVHT|WU(5#dBi@v^$hBdHIs zV4ABq#=cfOv?NM}q`_9GQE-!(=1eL-}q$vx(4Wz1{Vn&7mj0m%& za>=RNSt7sFW&K2(X3*5~J)XF>g`mg*`Xe%RX z<{Y`=7@~P7PF6zSO;quLAG9Y&=uy)2!-MGJAD<=8K7V{k6j(f%5 zwl^dUj}l5nK6AupyJ;6&?rPBg3f*qK#!^czJ7K!FBh%-4nj)tzW-pB1ZiG(~?N)DP z(w17qF7@A)Kxrf!E`Sc#B~~laoUuKDtYZt($jXvRUQQ?fV*7-72jvQ1Kx9(sIjX>VU}UJF$dU;&dC_H}Z??i;{7?-g|N z6VkOPM+v5S-)|!GSOqn%SzAUb?8aJt@SoOUb7HUmt$y%N>;isAxooxm1OD@f0&lC=iEdt=L&9GF2@Myx9$!+fH27%DOy!8um z9Z=eZ?`o-gJ zuYCqzpZ`I26&6}74B=RX3S-*RYh_rsTs#GXwe9{}QCEOG%4uvE1Ce_qZIy>bA#K{} ze$tF9KTowGd@Cw(Sh;uEKQMUH#m$q)(57|y8cXM>aYE_XeM04UI-4+ep=D@;AEo=&alx93lkBO^w(+5akqY z>gBK6ev~rR*QiMN98*p{u5A#}4gMY<0N{jzZ_h|B7xD#FY&@1dV01Cm!So%jBXjRJ zPU}U+rqt*{A|u*~23}toHt{`M1L6DIEk5Wd%QO->g${mcDH?qED$LE`Jm>}Z-*Rc( zFLlKyy`9+i!6Chbj-F#We*K;JdoBq{)gHx8pVfp$x_x5Bm&*ycJ_U_Fvo9p zh9*_ZrA*eVIYnz`3V8db3rH`-?$VK;tx%le`F31h%Hd^uzvkY)ZW16%?GXR%DeN4L zTKX)D{R#>ipV2;@Y8pC!{V0{f-C;!vfaXk8@tKz5+~B5+v*Ybm)M%u~{X!HC9D&Cl zsW#q)PlMf3RSon`TYRlWtE#TrN{G z_lyp6j-Ko$SIiwex*s(D0qcGw+j;owW_X`KESU7F(do|tGYA~v ztKS2)Ew2N}@Ht}{{b3kdj-1)}jS0KDLc1RsB(;LH&a!y-u}zC^5XC8U$dK=8P+h^& zKc*`&^U=JSv|DoQy%AFM#pxS?z{?YQLS4iWe`NG5i9Bt79ASnr-yj3un4@8p91r%n zX3P-|vnf$z&8*y(nI7UnePb4QRV#sFTufbd_&s2Pu<<17q^9BHQ>(Y>86}22gcw70 zBXB>gj(p9-`zKGG{HdC`I|d3fE0d8cuZVSh>MrK`%wkZRMk=Ws$_%uKV-0!hX4Qo -- GitLab From a3945fd26edd57b7d2bc6fb6af3936f8ce040b95 Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Mon, 23 Mar 2020 14:28:45 +0000 Subject: [PATCH 16/81] Updated about content --- README.md | 72 +++------------ .../owncloud/notes/about/AboutActivity.java | 87 +----------------- .../owncloud/notes/about/AboutFragment.java | 24 +++++ .../about/AboutFragmentContributingTab.java | 28 ------ .../notes/about/AboutFragmentCreditsTab.java | 31 ------- .../notes/about/AboutFragmentLicenseTab.java | 42 --------- app/src/main/res/layout/activity_about.xml | 40 +------- .../fragment_about_contribution_tab.xml | 54 ----------- .../res/layout/fragment_about_credits_tab.xml | 92 ------------------- .../res/layout/fragment_about_license_tab.xml | 55 ----------- app/src/main/res/values/strings.xml | 12 +++ app/src/main/res/xml/about_preferences.xml | 55 +++++++++++ 12 files changed, 111 insertions(+), 481 deletions(-) create mode 100644 app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragment.java delete mode 100644 app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java delete mode 100644 app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java delete mode 100644 app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java delete mode 100644 app/src/main/res/layout/fragment_about_contribution_tab.xml delete mode 100644 app/src/main/res/layout/fragment_about_credits_tab.xml delete mode 100644 app/src/main/res/layout/fragment_about_license_tab.xml create mode 100644 app/src/main/res/xml/about_preferences.xml diff --git a/README.md b/README.md index c9bcdbd2b..db30ed489 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,21 @@ -# Nextcloud Notes for Android -An android client for [Nextcloud Notes App](https://github.com/nextcloud/notes/). +# Notes +An android client for [Nextcloud Notes App](https://github.com/nextcloud/notes/) +Notes is forked from [Nextcloud Notes](https://github.com/stefan-niedermann/nextcloud-notes) -[![Android CI](https://github.com/stefan-niedermann/nextcloud-notes/workflows/Android%20CI/badge.svg)](https://github.com/stefan-niedermann/nextcloud-notes/actions) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/9f784826834042e8b512d531cab84711)](https://www.codacy.com/manual/info_147/nextcloud-notes?utm_source=github.com&utm_medium=referral&utm_content=stefan-niedermann/nextcloud-notes&utm_campaign=Badge_Grade) -[![GitHub issues](https://img.shields.io/github/issues/stefan-niedermann/nextcloud-notes.svg)](https://github.com/stefan-niedermann/nextcloud-notes/issues) -[![GitHub stars](https://img.shields.io/github/stars/stefan-niedermann/nextcloud-notes.svg)](https://github.com/stefan-niedermann/nextcloud-notes/stargazers) -[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) +## Authors -## :arrow_forward: Access +[Authors](https://gitlab.e.foundation/e/apps/Notes/-/blob/master/AUTHORS) -[![Latest Release](https://img.shields.io/github/v/tag/stefan-niedermann/nextcloud-notes?label=latest+release&sort=semver)](https://github.com/stefan-niedermann/nextcloud-notes/tags) -[![F-Droid Release](https://img.shields.io/f-droid/v/it.niedermann.owncloud.notes)](https://f-droid.org/de/packages/it.niedermann.owncloud.notes/) +## Release Notes -[Get it on Play Store](https://play.google.com/store/apps/details?id=it.niedermann.owncloud.notes) -[Get it on F-Droid](https://f-droid.org/repository/browse/?fdid=it.niedermann.owncloud.notes) -[Donate with PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=K7HVLE6J7SXXA) -[Donate using Liberapay](https://liberapay.com/stefan-niedermann/donate) +Check out the [Release Notes](https://gitlab.e.foundation/e/apps/Notes/-/releases) to find out what changed +in each version of Notes. -## :eyes: Screenshots +## Privacy Policy -| _ | _ | _ | -| :--: | :--: | :--: | -| ![Screenshot of list view](/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png) | ![Screenshot of edit mode](/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png) | ![Screenshot of preview](/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png) | +[Privacy Policy](https://e.foundation/legal-notice-privacy) +[Terms of service](https://e.foundation/legal-notice-privacy) -## :rocket: Features - * Multiple accounts - * List, create, edit, share, search and delete notes - * Share text and links as new note into the app - * Toggling checkboxes in view mode - * Mark notes as favorite - * Bulk delete - * In-note search - * Single note widget and note list widget - * Render Markdown (using [Markwon](https://noties.io/Markwon)) - * Translated in many languages on [Transifex](https://www.transifex.com/nextcloud/nextcloud/android-notes/) - * Context based formatting ([#363](https://github.com/stefan-niedermann/nextcloud-notes/issues/363)) - * Password protection ([#354](https://github.com/stefan-niedermann/nextcloud-notes/issues/354)) +## License -## :checkered_flag: Roadmap - * We usually focus on [pinned issues](https://github.com/stefan-niedermann/nextcloud-notes/issues) in our issue tracker - * Since this is an Open Source freetime project, there is no guarantee when and if and how we implement new features - -## :family: Join the team - * Test the app with different devices - * Report issues in the [issue tracker](https://github.com/stefan-niedermann/nextcloud-notes/issues) - * [Pick a good first issue](https://github.com/stefan-niedermann/nextcloud-notes/labels/Good%20first%20issue) :notebook: - * Create a [Pull Request](https://opensource.guide/how-to-contribute/#opening-a-pull-request) - * Help translating this app on [Transifex](https://www.transifex.com/nextcloud/nextcloud/android-notes/) 🌎 - * Buy this app on [Google Play Store](https://play.google.com/store/apps/details?id=it.niedermann.owncloud.notes) - * Send me a bottle of your favorite beer :beers: :wink: - -## :link: Requirements - * [Nextcloud](https://nextcloud.com/) instance running - * [Nextcloud Android](https://github.com/nextcloud/android) app installed (≥ 3.9.0) - * [Nextcloud Notes](https://github.com/nextcloud/notes) app enabled - -## :notebook: License -This project is licensed under the [GNU GENERAL PUBLIC LICENSE](/LICENSE). +Notes is licensed under the [GNU General Public License v3.0](https://gitlab.e.foundation/e/apps/Notes/-/blob/master/LICENSE) \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java index 5c5bf519f..f321d4aa6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java @@ -2,94 +2,15 @@ package it.niedermann.owncloud.notes.about; import android.os.Bundle; -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.appcompat.app.AppCompatActivity; -import com.google.android.material.tabs.TabLayoutMediator; - -import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.branding.BrandingUtil; -import it.niedermann.owncloud.notes.databinding.ActivityAboutBinding; - -public class AboutActivity extends LockedActivity { - - private ActivityAboutBinding binding; - private final static int POS_CREDITS = 0; - private final static int POS_CONTRIB = 1; - private final static int POS_LICENSE = 2; - private final static int TOTAL_COUNT = 3; +public class AboutActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - binding = ActivityAboutBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - setSupportActionBar(binding.toolbar); - binding.pager.setAdapter(new TabsStateAdapter(this)); - // generate title based on given position - new TabLayoutMediator(binding.tabs, binding.pager, (tab, position) -> { - switch (position) { - default: // Fall-through to credits tab - case POS_CREDITS: - tab.setText(R.string.about_credits_tab_title); - break; - case POS_CONTRIB: - tab.setText(R.string.about_contribution_tab_title); - break; - case POS_LICENSE: - tab.setText(R.string.about_license_tab_title); - break; - } - }).attach(); - } - - @Override - public void applyBrand(int mainColor, int textColor) { - applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar); - @ColorInt int finalMainColor = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(this, mainColor); - binding.tabs.setSelectedTabIndicatorColor(finalMainColor); - } - - private static class TabsStateAdapter extends FragmentStateAdapter { - - TabsStateAdapter(FragmentActivity fa) { - super(fa); - } - - @Override - public int getItemCount() { - return TOTAL_COUNT; - } - - /** - * return the right fragment for the given position - */ - @NonNull - @Override - public Fragment createFragment(int position) { - switch (position) { - default: // Fall-through to credits tab - case POS_CREDITS: - return new AboutFragmentCreditsTab(); - - case POS_CONTRIB: - return new AboutFragmentContributingTab(); - - case POS_LICENSE: - return new AboutFragmentLicenseTab(); - } - } - } - - @Override - public boolean onSupportNavigateUp() { - finish(); // close this activity as oppose to navigating up - return true; + setContentView(R.layout.activity_about); + getFragmentManager().beginTransaction().replace(R.id.container, new AboutFragment()).commit(); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragment.java new file mode 100644 index 000000000..14ddf19c3 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragment.java @@ -0,0 +1,24 @@ +package it.niedermann.owncloud.notes.about; + +import android.os.Bundle; +import android.preference.PreferenceFragment; + +import androidx.annotation.Nullable; + +import it.niedermann.owncloud.notes.BuildConfig; +import it.niedermann.owncloud.notes.R; + +public class AboutFragment extends PreferenceFragment { + + private static final String BUILD_VERSION = "build_version"; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.about_preferences); + + findPreference(BUILD_VERSION).setSummary(BuildConfig.VERSION_NAME); + + } +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java deleted file mode 100644 index 90a9a3bce..000000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentContributingTab.java +++ /dev/null @@ -1,28 +0,0 @@ -package it.niedermann.owncloud.notes.about; - -import static it.niedermann.owncloud.notes.shared.util.SupportUtil.setTextWithURL; - -import android.os.Bundle; -import android.text.method.LinkMovementMethod; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; - -import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.databinding.FragmentAboutContributionTabBinding; -import it.niedermann.owncloud.notes.shared.util.SupportUtil; - -public class AboutFragmentContributingTab extends Fragment { - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final var binding = FragmentAboutContributionTabBinding.inflate(inflater, container, false); - setTextWithURL(binding.aboutSource, getResources(), R.string.about_source, R.string.url_source, R.string.url_source); - setTextWithURL(binding.aboutIssues, getResources(), R.string.about_issues, R.string.url_issues, R.string.url_issues); - setTextWithURL(binding.aboutTranslate, getResources(), R.string.about_translate, R.string.url_translations, R.string.url_translations); - return binding.getRoot(); - } -} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java deleted file mode 100644 index 028bfa4e0..000000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentCreditsTab.java +++ /dev/null @@ -1,31 +0,0 @@ -package it.niedermann.owncloud.notes.about; - -import static it.niedermann.owncloud.notes.shared.util.SupportUtil.setTextWithURL; -import static it.niedermann.owncloud.notes.shared.util.SupportUtil.strong; -import static it.niedermann.owncloud.notes.shared.util.SupportUtil.url; - -import android.os.Bundle; -import android.text.method.LinkMovementMethod; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; - -import it.niedermann.owncloud.notes.BuildConfig; -import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.databinding.FragmentAboutCreditsTabBinding; - -public class AboutFragmentCreditsTab extends Fragment { - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final var binding = FragmentAboutCreditsTabBinding.inflate(inflater, container, false); - binding.aboutVersion.setText(getString(R.string.about_version, strong(BuildConfig.VERSION_NAME))); - binding.aboutMaintainer.setText(url(getString(R.string.about_maintainer), getString(R.string.url_maintainer))); - binding.aboutMaintainer.setMovementMethod(new LinkMovementMethod()); - setTextWithURL(binding.aboutTranslators, getResources(), R.string.about_translators_transifex, R.string.about_translators_transifex_label, R.string.url_translations); - return binding.getRoot(); - } -} \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java deleted file mode 100644 index 10cc02c74..000000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutFragmentLicenseTab.java +++ /dev/null @@ -1,42 +0,0 @@ -package it.niedermann.owncloud.notes.about; - -import static it.niedermann.owncloud.notes.shared.util.SupportUtil.setTextWithURL; - -import android.content.Intent; -import android.content.res.ColorStateList; -import android.net.Uri; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.core.graphics.drawable.DrawableCompat; - -import it.niedermann.android.util.ColorUtil; -import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.branding.BrandedFragment; -import it.niedermann.owncloud.notes.branding.BrandingUtil; -import it.niedermann.owncloud.notes.databinding.FragmentAboutLicenseTabBinding; - -public class AboutFragmentLicenseTab extends BrandedFragment { - - private FragmentAboutLicenseTabBinding binding; - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - binding = FragmentAboutLicenseTabBinding.inflate(inflater, container, false); - setTextWithURL(binding.aboutIconsDisclaimerAppIcon, getResources(), R.string.about_icons_disclaimer_app_icon, R.string.about_app_icon_author_link_label, R.string.url_about_icon_author); - setTextWithURL(binding.aboutIconsDisclaimerMdiIcons, getResources(), R.string.about_icons_disclaimer_mdi_icons, R.string.about_icons_disclaimer_mdi, R.string.url_about_icons_disclaimer_mdi); - binding.aboutAppLicenseButton.setOnClickListener((v) -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_license))))); - return binding.getRoot(); - } - - @Override - public void applyBrand(int mainColor, int textColor) { - @ColorInt final int finalMainColor = BrandingUtil.getSecondaryForegroundColorDependingOnTheme(requireContext(), mainColor); - DrawableCompat.setTintList(binding.aboutAppLicenseButton.getBackground(), ColorStateList.valueOf(finalMainColor)); - binding.aboutAppLicenseButton.setTextColor(ColorUtil.INSTANCE.getForegroundColorForBackgroundColor(finalMainColor)); - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 89c2aaa66..bdd332131 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -1,40 +1,6 @@ - - - - - - - - - - - - \ No newline at end of file + android:orientation="vertical" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_about_contribution_tab.xml b/app/src/main/res/layout/fragment_about_contribution_tab.xml deleted file mode 100644 index 8ae857f6d..000000000 --- a/app/src/main/res/layout/fragment_about_contribution_tab.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_about_credits_tab.xml b/app/src/main/res/layout/fragment_about_credits_tab.xml deleted file mode 100644 index fad03f626..000000000 --- a/app/src/main/res/layout/fragment_about_credits_tab.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_about_license_tab.xml b/app/src/main/res/layout/fragment_about_license_tab.xml deleted file mode 100644 index 9e425d4e8..000000000 --- a/app/src/main/res/layout/fragment_about_license_tab.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 961c42f30..0ae7db841 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -355,4 +355,16 @@ Importing notes… Importing note %1$d of %2$d… Account imported. + Notes information + + -List, create, edit, share, search and delete notes\n + -Share text and links as new note into the app\n + -Mark notes as favorite\n + -Bulk delete\n + -Render MarkDown\n + -Translated in many languages + Notes is forked from Nextcloud Notes + Privacy policy + Terms of service + Authors diff --git a/app/src/main/res/xml/about_preferences.xml b/app/src/main/res/xml/about_preferences.xml new file mode 100644 index 000000000..3911a35de --- /dev/null +++ b/app/src/main/res/xml/about_preferences.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- GitLab From b1d9da781b0acaf559860490a3104942f100826c Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Fri, 4 Sep 2020 15:08:06 +0530 Subject: [PATCH 17/81] get Accent color from OS, set on toolbar and StatusBar --- .../owncloud/notes/main/MainActivity.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 046f0e7d5..0225bf111 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -17,19 +17,27 @@ import static it.niedermann.owncloud.notes.shared.util.SSOUtil.askForNewAccount; import android.accounts.NetworkErrorException; import android.animation.AnimatorInflater; import android.app.SearchManager; +import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.PorterDuff; +import android.graphics.drawable.ColorDrawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; +import android.util.TypedValue; import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.view.ActionMode; +import androidx.appcompat.view.ContextThemeWrapper; import androidx.appcompat.widget.SearchView; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.app.ActivityCompat; @@ -136,6 +144,8 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A boolean canMoveNoteToAnotherAccounts = false; + public static int ACCENT_COLOR; + @Override protected void onCreate(Bundle savedInstanceState) { SplashScreen.installSplashScreen(this); @@ -357,6 +367,8 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A menuAdapter.updateAccount(this, nextAccount); } }); + + ACCENT_COLOR= fetchAccentColor(this); } @Override @@ -820,4 +832,40 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A categoryLiveData.observe(this, (next) -> categoryLiveData.removeObservers(this)); tracker.clearSelection(); } + + /* + * get Accent color from OS + * */ + private int fetchAccentColor(Context context) { + + TypedValue typedValue = new TypedValue(); + ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(this, + android.R.style.Theme_DeviceDefault); + contextThemeWrapper.getTheme().resolveAttribute(android.R.attr.colorAccent, + typedValue, true); + int color_accent = typedValue.data; + Log.e("TAG", "accent Colour #"+Integer.toHexString(color_accent)); + + //change toolbar color + getSupportActionBar().setBackgroundDrawable( + new ColorDrawable(color_accent)); + + //change status bar color + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(darkenColor(color_accent)); + } + + return color_accent; + } + + + @ColorInt + int darkenColor(@ColorInt int color) { + float[] hsv = new float[3]; + android.graphics.Color.colorToHSV(color, hsv); + hsv[2] *= 0.8f; + return android.graphics.Color.HSVToColor(hsv); + } } -- GitLab From 8449cfdd4bff05fed766619957001b4c86b5322f Mon Sep 17 00:00:00 2001 From: Narinder Rana Date: Fri, 4 Sep 2020 15:52:02 +0530 Subject: [PATCH 18/81] Manage Accent color all Activity, Feb button, navigation drawer, some Button --- .../owncloud/notes/about/AboutActivity.java | 28 ++++++++++++++++++ .../owncloud/notes/edit/EditNoteActivity.java | 27 +++++++++++++++++ .../owncloud/notes/main/MainActivity.java | 9 ++++++ .../preferences/PreferencesActivity.java | 29 +++++++++++++++++++ .../NoteListWidgetConfigurationActivity.java | 29 +++++++++++++++++++ 5 files changed, 122 insertions(+) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java index f321d4aa6..ae42339d5 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java @@ -1,10 +1,16 @@ package it.niedermann.owncloud.notes.about; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; +import androidx.annotation.ColorInt; import androidx.appcompat.app.AppCompatActivity; import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.main.MainActivity; public class AboutActivity extends AppCompatActivity { @Override @@ -12,5 +18,27 @@ public class AboutActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); getFragmentManager().beginTransaction().replace(R.id.container, new AboutFragment()).commit(); + updateAccentColor(); + } + + private void updateAccentColor() { + //change toolbar color + getSupportActionBar().setBackgroundDrawable( + new ColorDrawable(MainActivity.ACCENT_COLOR)); + + //change status bar color + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); + } + } + + @ColorInt + int darkenColor(@ColorInt int color) { + float[] hsv = new float[3]; + android.graphics.Color.colorToHSV(color, hsv); + hsv[2] *= 0.8f; + return android.graphics.Color.HSVToColor(hsv); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java index 8cb12bad1..c2624ddca 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java @@ -3,14 +3,18 @@ package it.niedermann.owncloud.notes.edit; import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES; import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.Window; import android.view.WindowManager; import android.widget.Toast; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; @@ -92,6 +96,8 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment setSupportActionBar(binding.toolbar); binding.toolbar.setOnClickListener((v) -> fragment.showEditTitleDialog()); + + updateAccentColor(); } @Override @@ -316,4 +322,25 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment public void applyBrand(int mainColor, int textColor) { applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar); } + + private void updateAccentColor(){ + //change toolbar color + getSupportActionBar().setBackgroundDrawable( + new ColorDrawable(MainActivity.ACCENT_COLOR)); + + //change status bar color + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); + } + } + + @ColorInt + int darkenColor(@ColorInt int color) { + float[] hsv = new float[3]; + android.graphics.Color.colorToHSV(color, hsv); + hsv[2] *= 0.8f; + return android.graphics.Color.HSVToColor(hsv); + } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 0225bf111..8564dd270 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -19,6 +19,7 @@ import android.animation.AnimatorInflater; import android.app.SearchManager; import android.content.Context; import android.content.Intent; +import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; @@ -369,6 +370,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A }); ACCENT_COLOR= fetchAccentColor(this); + fabCreate.setBackgroundTintList(ColorStateList.valueOf(darkenColor20(ACCENT_COLOR))); } @Override @@ -868,4 +870,11 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A hsv[2] *= 0.8f; return android.graphics.Color.HSVToColor(hsv); } + + @ColorInt int darkenColor20(@ColorInt int color) { + float[] hsv = new float[3]; + android.graphics.Color.colorToHSV(color, hsv); + hsv[2] *= 0.6f; + return android.graphics.Color.HSVToColor(hsv); + } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java index 2dcd99ec1..a05447ded 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java @@ -1,13 +1,19 @@ package it.niedermann.owncloud.notes.preferences; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; +import androidx.annotation.ColorInt; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ActivityPreferencesBinding; +import it.niedermann.owncloud.notes.main.MainActivity; public class PreferencesActivity extends LockedActivity { @@ -28,6 +34,29 @@ public class PreferencesActivity extends LockedActivity { getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container_view, new PreferencesFragment()) .commit(); + + updateAccentColor(); + } + + private void updateAccentColor(){ + //change toolbar color + getSupportActionBar().setBackgroundDrawable( + new ColorDrawable(MainActivity.ACCENT_COLOR)); + + //change status bar color + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); + } + } + + @ColorInt + int darkenColor(@ColorInt int color) { + float[] hsv = new float[3]; + android.graphics.Color.colorToHSV(color, hsv); + hsv[2] *= 0.8f; + return android.graphics.Color.HSVToColor(hsv); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java index fb94f7d86..6a97d37ca 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java @@ -3,10 +3,15 @@ package it.niedermann.owncloud.notes.widget.notelist; import android.app.Activity; import android.appwidget.AppWidgetManager; import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.os.Bundle; import android.util.Log; +import android.view.Window; +import android.view.WindowManager; import android.widget.Toast; +import androidx.annotation.ColorInt; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; @@ -21,6 +26,7 @@ import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ActivityNoteListConfigurationBinding; +import it.niedermann.owncloud.notes.main.MainActivity; import it.niedermann.owncloud.notes.main.navigation.NavigationAdapter; import it.niedermann.owncloud.notes.main.navigation.NavigationClickListener; import it.niedermann.owncloud.notes.main.navigation.NavigationItem; @@ -139,9 +145,32 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { } runOnUiThread(() -> viewModel.getAdapterCategories(localAccount.getId()).observe(this, (navigationItems) -> adapterCategories.setItems(navigationItems))); }); + + updateAccentColor(); } @Override public void applyBrand(int mainColor, int textColor) { } + + private void updateAccentColor(){ + //change toolbar color + getSupportActionBar().setBackgroundDrawable( + new ColorDrawable(MainActivity.ACCENT_COLOR)); + + //change status bar color + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); + } + } + + @ColorInt + int darkenColor(@ColorInt int color) { + float[] hsv = new float[3]; + android.graphics.Color.colorToHSV(color, hsv); + hsv[2] *= 0.8f; + return android.graphics.Color.HSVToColor(hsv); + } } -- GitLab From c2e7fd47452fe1108f42fb4ad416f63c0f5d3793 Mon Sep 17 00:00:00 2001 From: Mohit Mali Date: Tue, 27 Oct 2020 14:49:45 +0000 Subject: [PATCH 19/81] Setup /e/ colors --- app/build.gradle | 5 ++ .../owncloud/notes/about/AboutActivity.java | 28 --------- .../owncloud/notes/edit/BaseNoteFragment.java | 2 +- .../owncloud/notes/edit/EditNoteActivity.java | 27 --------- .../owncloud/notes/main/MainActivity.java | 57 ------------------ .../notes/main/items/NoteViewHolder.java | 2 +- .../notes/persistence/NotesRepository.java | 2 +- .../preferences/PreferencesActivity.java | 29 --------- .../NoteListWidgetConfigurationActivity.java | 42 +++---------- .../notelist/NoteListWidgetFactory.java | 2 +- .../drawable/ic_star_border_white_24dp.xml | 10 +-- .../main/res/drawable/ic_star_white_24dp.xml | 2 +- .../main/res/drawable/ic_star_yellow_24dp.xml | 2 +- .../main/res/layout/activity_exception.xml | 6 ++ .../res/layout/activity_notes_list_view.xml | 3 +- app/src/main/res/layout/drawer_layout.xml | 3 +- app/src/main/res/menu/menu_note_fragment.xml | 3 + app/src/main/res/values-night/colors.xml | 4 +- app/src/main/res/values-night/styles.xml | 20 ++++++ app/src/main/res/values/colors.xml | 10 +-- e-ui-sdk.jar | Bin 0 -> 118347 bytes 21 files changed, 64 insertions(+), 195 deletions(-) create mode 100644 app/src/main/res/values-night/styles.xml create mode 100644 e-ui-sdk.jar diff --git a/app/build.gradle b/app/build.gradle index e38c969ca..57ccd4bc8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,10 +49,15 @@ android { disable 'MissingTranslation' } namespace 'it.niedermann.owncloud.notes' + + aaptOptions { + additionalParameters '-I', 'e-ui-sdk.jar' + } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6' + compileOnly files("../e-ui-sdk.jar") // Nextcloud SSO implementation 'com.github.nextcloud:Android-SingleSignOn:0.6.1' diff --git a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java index ae42339d5..f321d4aa6 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/about/AboutActivity.java @@ -1,16 +1,10 @@ package it.niedermann.owncloud.notes.about; -import android.graphics.drawable.ColorDrawable; -import android.os.Build; import android.os.Bundle; -import android.view.Window; -import android.view.WindowManager; -import androidx.annotation.ColorInt; import androidx.appcompat.app.AppCompatActivity; import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.main.MainActivity; public class AboutActivity extends AppCompatActivity { @Override @@ -18,27 +12,5 @@ public class AboutActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); getFragmentManager().beginTransaction().replace(R.id.container, new AboutFragment()).commit(); - updateAccentColor(); - } - - private void updateAccentColor() { - //change toolbar color - getSupportActionBar().setBackgroundDrawable( - new ColorDrawable(MainActivity.ACCENT_COLOR)); - - //change status bar color - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Window window = getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); - } - } - - @ColorInt - int darkenColor(@ColorInt int color) { - float[] hsv = new float[3]; - android.graphics.Color.colorToHSV(color, hsv); - hsv[2] *= 0.8f; - return android.graphics.Color.HSVToColor(hsv); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java index b524e2fb2..d743868d1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java @@ -252,7 +252,7 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) { final var pinShortcutInfo = new ShortcutInfoCompat.Builder(context, String.valueOf(note.getId())) .setShortLabel(note.getTitle()) - .setIcon(IconCompat.createWithResource(context.getApplicationContext(), TRUE.equals(note.getFavorite()) ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp)) + .setIcon(IconCompat.createWithResource(context.getApplicationContext(), TRUE.equals(note.getFavorite()) ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_border_white_24dp)) .setIntent(new Intent(getActivity(), EditNoteActivity.class).putExtra(EditNoteActivity.PARAM_NOTE_ID, note.getId()).setAction(ACTION_SHORTCUT)) .build(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java index c2624ddca..8cb12bad1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java @@ -3,18 +3,14 @@ package it.niedermann.owncloud.notes.edit; import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES; import android.content.Intent; -import android.graphics.drawable.ColorDrawable; -import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.view.Window; import android.view.WindowManager; import android.widget.Toast; -import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; @@ -96,8 +92,6 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment setSupportActionBar(binding.toolbar); binding.toolbar.setOnClickListener((v) -> fragment.showEditTitleDialog()); - - updateAccentColor(); } @Override @@ -322,25 +316,4 @@ public class EditNoteActivity extends LockedActivity implements BaseNoteFragment public void applyBrand(int mainColor, int textColor) { applyBrandToPrimaryToolbar(binding.appBar, binding.toolbar); } - - private void updateAccentColor(){ - //change toolbar color - getSupportActionBar().setBackgroundDrawable( - new ColorDrawable(MainActivity.ACCENT_COLOR)); - - //change status bar color - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Window window = getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); - } - } - - @ColorInt - int darkenColor(@ColorInt int color) { - float[] hsv = new float[3]; - android.graphics.Color.colorToHSV(color, hsv); - hsv[2] *= 0.8f; - return android.graphics.Color.HSVToColor(hsv); - } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 8564dd270..046f0e7d5 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -17,28 +17,19 @@ import static it.niedermann.owncloud.notes.shared.util.SSOUtil.askForNewAccount; import android.accounts.NetworkErrorException; import android.animation.AnimatorInflater; import android.app.SearchManager; -import android.content.Context; import android.content.Intent; -import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.PorterDuff; -import android.graphics.drawable.ColorDrawable; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; -import android.util.TypedValue; import android.view.View; -import android.view.Window; -import android.view.WindowManager; -import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.view.ActionMode; -import androidx.appcompat.view.ContextThemeWrapper; import androidx.appcompat.widget.SearchView; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.app.ActivityCompat; @@ -145,8 +136,6 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A boolean canMoveNoteToAnotherAccounts = false; - public static int ACCENT_COLOR; - @Override protected void onCreate(Bundle savedInstanceState) { SplashScreen.installSplashScreen(this); @@ -368,9 +357,6 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A menuAdapter.updateAccount(this, nextAccount); } }); - - ACCENT_COLOR= fetchAccentColor(this); - fabCreate.setBackgroundTintList(ColorStateList.valueOf(darkenColor20(ACCENT_COLOR))); } @Override @@ -834,47 +820,4 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A categoryLiveData.observe(this, (next) -> categoryLiveData.removeObservers(this)); tracker.clearSelection(); } - - /* - * get Accent color from OS - * */ - private int fetchAccentColor(Context context) { - - TypedValue typedValue = new TypedValue(); - ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(this, - android.R.style.Theme_DeviceDefault); - contextThemeWrapper.getTheme().resolveAttribute(android.R.attr.colorAccent, - typedValue, true); - int color_accent = typedValue.data; - Log.e("TAG", "accent Colour #"+Integer.toHexString(color_accent)); - - //change toolbar color - getSupportActionBar().setBackgroundDrawable( - new ColorDrawable(color_accent)); - - //change status bar color - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Window window = getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(darkenColor(color_accent)); - } - - return color_accent; - } - - - @ColorInt - int darkenColor(@ColorInt int color) { - float[] hsv = new float[3]; - android.graphics.Color.colorToHSV(color, hsv); - hsv[2] *= 0.8f; - return android.graphics.Color.HSVToColor(hsv); - } - - @ColorInt int darkenColor20(@ColorInt int color) { - float[] hsv = new float[3]; - android.graphics.Color.colorToHSV(color, hsv); - hsv[2] *= 0.6f; - return android.graphics.Color.HSVToColor(hsv); - } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java b/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java index 609d1aeff..c3e46c587 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/items/NoteViewHolder.java @@ -104,7 +104,7 @@ public abstract class NoteViewHolder extends RecyclerView.ViewHolder { } protected void bindFavorite(@NonNull ImageView noteFavorite, boolean isFavorite) { - noteFavorite.setImageResource(isFavorite ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp); + noteFavorite.setImageResource(isFavorite ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_border_white_24dp); noteFavorite.setOnClickListener(view -> noteClickListener.onNoteFavoriteClick(getLayoutPosition(), view)); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java index 6eff34f06..014ab190c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesRepository.java @@ -595,7 +595,7 @@ public class NotesRepository { newShortcuts.add(new ShortcutInfo.Builder(this.context, note.getId() + "") .setShortLabel(note.getTitle() + "") - .setIcon(Icon.createWithResource(this.context, note.getFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_grey_ccc_24dp)) + .setIcon(Icon.createWithResource(this.context, note.getFavorite() ? R.drawable.ic_star_yellow_24dp : R.drawable.ic_star_border_white_24dp)) .setIntent(intent) .build()); } else { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java index a05447ded..2dcd99ec1 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/preferences/PreferencesActivity.java @@ -1,19 +1,13 @@ package it.niedermann.owncloud.notes.preferences; -import android.graphics.drawable.ColorDrawable; -import android.os.Build; import android.os.Bundle; -import android.view.Window; -import android.view.WindowManager; -import androidx.annotation.ColorInt; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ActivityPreferencesBinding; -import it.niedermann.owncloud.notes.main.MainActivity; public class PreferencesActivity extends LockedActivity { @@ -34,29 +28,6 @@ public class PreferencesActivity extends LockedActivity { getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container_view, new PreferencesFragment()) .commit(); - - updateAccentColor(); - } - - private void updateAccentColor(){ - //change toolbar color - getSupportActionBar().setBackgroundDrawable( - new ColorDrawable(MainActivity.ACCENT_COLOR)); - - //change status bar color - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Window window = getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); - } - } - - @ColorInt - int darkenColor(@ColorInt int color) { - float[] hsv = new float[3]; - android.graphics.Color.colorToHSV(color, hsv); - hsv[2] *= 0.8f; - return android.graphics.Color.HSVToColor(hsv); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java index 6a97d37ca..a488288dc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java @@ -1,17 +1,17 @@ package it.niedermann.owncloud.notes.widget.notelist; +import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_ALL; +import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_CATEGORY; +import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_STARRED; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT; + import android.app.Activity; import android.appwidget.AppWidgetManager; import android.content.Intent; -import android.graphics.drawable.ColorDrawable; -import android.os.Build; import android.os.Bundle; import android.util.Log; -import android.view.Window; -import android.view.WindowManager; import android.widget.Toast; -import androidx.annotation.ColorInt; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; @@ -26,7 +26,6 @@ import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.databinding.ActivityNoteListConfigurationBinding; -import it.niedermann.owncloud.notes.main.MainActivity; import it.niedermann.owncloud.notes.main.navigation.NavigationAdapter; import it.niedermann.owncloud.notes.main.navigation.NavigationClickListener; import it.niedermann.owncloud.notes.main.navigation.NavigationItem; @@ -34,11 +33,6 @@ import it.niedermann.owncloud.notes.persistence.NotesRepository; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData; -import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_ALL; -import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_CATEGORY; -import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_STARRED; -import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT; - public class NoteListWidgetConfigurationActivity extends LockedActivity { private static final String TAG = Activity.class.getSimpleName(); @@ -136,7 +130,8 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { executor.submit(() -> { try { this.localAccount = repo.getAccountByName(SingleAccountHelper.getCurrentSingleSignOnAccount(this).name); - } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { + } catch (NextcloudFilesAppAccountNotFoundException | + NoCurrentAccountSelectedException e) { e.printStackTrace(); Toast.makeText(this, R.string.widget_not_logged_in, Toast.LENGTH_LONG).show(); // TODO Present user with app login screen @@ -145,32 +140,9 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { } runOnUiThread(() -> viewModel.getAdapterCategories(localAccount.getId()).observe(this, (navigationItems) -> adapterCategories.setItems(navigationItems))); }); - - updateAccentColor(); } @Override public void applyBrand(int mainColor, int textColor) { } - - private void updateAccentColor(){ - //change toolbar color - getSupportActionBar().setBackgroundDrawable( - new ColorDrawable(MainActivity.ACCENT_COLOR)); - - //change status bar color - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Window window = getWindow(); - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(darkenColor(MainActivity.ACCENT_COLOR)); - } - } - - @ColorInt - int darkenColor(@ColorInt int color) { - float[] hsv = new float[3]; - android.graphics.Color.colorToHSV(color, hsv); - hsv[2] *= 0.8f; - return android.graphics.Color.HSVToColor(hsv); - } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java index 94548e982..81290f46d 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java @@ -135,7 +135,7 @@ public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFact note_content.setTextViewText(R.id.widget_entry_content_tv, note.getTitle()); note_content.setImageViewResource(R.id.widget_entry_fav_icon, note.getFavorite() ? R.drawable.ic_star_yellow_24dp - : R.drawable.ic_star_grey_ccc_24dp); + : R.drawable.ic_star_border_white_24dp); } return note_content; diff --git a/app/src/main/res/drawable/ic_star_border_white_24dp.xml b/app/src/main/res/drawable/ic_star_border_white_24dp.xml index 66887c8de..274314f93 100644 --- a/app/src/main/res/drawable/ic_star_border_white_24dp.xml +++ b/app/src/main/res/drawable/ic_star_border_white_24dp.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_star_white_24dp.xml b/app/src/main/res/drawable/ic_star_white_24dp.xml index b7fb611c0..a17b54a02 100644 --- a/app/src/main/res/drawable/ic_star_white_24dp.xml +++ b/app/src/main/res/drawable/ic_star_white_24dp.xml @@ -1,6 +1,6 @@