chore: Clean up .gitignore and remove IDE files

This commit is contained in:
2025-11-05 21:21:11 +01:00
parent 2424068d59
commit f2e5750269
29 changed files with 186 additions and 349 deletions

35
.gitignore vendored
View File

@@ -1,16 +1,25 @@
# Created by Gemini
# Android Studio / IntelliJ
.idea/
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
.gradle/
.kotlin/
# Build files
build/
# Local properties
local.properties
gradle.properties
# Mac
.DS_Store
# Captures
captures/
# Other
.externalNativeBuild/
.cxx/
sharelist/

3
.idea/.gitignore generated vendored
View File

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

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AppInsightsSettings">
<option name="tabSettings">
<map>
<entry key="Firebase Crashlytics">
<value>
<InsightsFilterSettings>
<option name="connection">
<ConnectionSetting>
<option name="appId" value="PLACEHOLDER" />
<option name="mobileSdkAppId" value="" />
<option name="projectId" value="" />
<option name="projectNumber" value="" />
</ConnectionSetting>
</option>
<option name="signal" value="SIGNAL_UNSPECIFIED" />
<option name="timeIntervalDays" value="THIRTY_DAYS" />
<option name="visibilityType" value="ALL" />
</InsightsFilterSettings>
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@@ -1,123 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>

View File

@@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

6
.idea/compiler.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

View File

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

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="DESCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

View File

@@ -1,9 +0,0 @@
<component name="ProjectDictionaryState">
<dictionary name="project">
<words>
<w>hmac</w>
<w>noteshop</w>
<w>webscr</w>
</words>
</dictionary>
</component>

19
.idea/gradle.xml generated
View File

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

View File

@@ -1,61 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="ComposePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
</profile>
</component>

10
.idea/migrations.xml generated
View File

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

9
.idea/misc.xml generated
View File

@@ -1,9 +0,0 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

View File

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

6
.idea/studiobot.xml generated
View File

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

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@@ -1,4 +0,0 @@
kotlin version: 2.0.21
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
1. Kotlin compile daemon is ready

41
PRIVACY.md Normal file
View File

@@ -0,0 +1,41 @@
# Privacy Policy for Noteshop
**Last Updated:** 2025-11-05
This document outlines the privacy policy for the Noteshop application.
## Our Commitment to Privacy
Noteshop is a free and open-source application. We are committed to protecting your privacy and ensuring you have full control over your data. This app does not collect, store, or transmit any personal information to the developers or any third parties.
## Data You Create
All data you create within the app, such as notes, shopping lists, and recipes, is stored locally on your device. You have the option to encrypt this data with a password for added security.
## Data Synchronization (Optional)
Noteshop offers optional features to synchronize your data. These features are disabled by default.
### 1. Web App Integration
If you choose to use the Web App Integration feature, the app will transmit your notes, shopping lists, recipes, and credentials (username/password) to the server URL that **you provide** in the app's settings. The data is transmitted to your own server, and we, the developers of Noteshop, do not have access to your server or your data. You are in full control of your data. We recommend using a secure (HTTPS) connection to your server to protect your data during transmission.
### 2. Local File Synchronization (e.g., Syncthing)
Noteshop also supports synchronization via local files, which can be used with third-party tools like Syncthing. If you choose this method, the app will read from and write to a directory on your device that **you designate**. The synchronization process itself is handled by your chosen third-party tool (e.g., Syncthing), and we have no control over or access to this process or the data transmitted by it. You are solely responsible for the configuration and security of your local file synchronization setup.
In both synchronization scenarios, you are in full control of your data and the chosen synchronization method.
## No Analytics or Tracking
This application does not contain any analytics, advertising, or tracking code. We do not monitor your usage of the app.
## Source Code
Noteshop is fully open-source. You can review the source code to verify how the app works and how your data is handled. The source code is available at:
[**YOUR_GITEA_REPOSITORY_URL_HERE**](YOUR_GITEA_REPOSITORY_URL_HERE)
## Contact
If you have any questions about this privacy policy, please feel free to contact us at [**YOUR_EMAIL_OR_CONTACT_METHOD_HERE**].

52
README.md Normal file
View File

@@ -0,0 +1,52 @@
# Noteshop
[![F-Droid](https://img.shields.io/f-droid/v/de.lxtools.noteshop.svg)](https://f-droid.org/packages/de.lxtools.noteshop/) <!-- Replace with your actual F-Droid link when available -->
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
Noteshop is a versatile and privacy-focused application for managing your notes, shopping lists, and recipes all in one place. It is designed to be simple, efficient, and fully under your control.
## Screenshots
| Notes Screen | Shopping List | Recipes |
|---|---|---|
| ![Screenshot of Notes Screen](screenshots/screenshot1.png) | ![Screenshot of Shopping List](screenshots/screenshot2.png) | ![Screenshot of Recipes](screenshots/screenshot3.png) |
*(To add screenshots, create a `screenshots` folder in your repository, add your images (e.g., `screenshot1.png`), and they will appear here.)*
## Features
* **📝 Notes:** Create and manage simple or detailed notes.
* **🛒 Shopping Lists:** An intelligent shopping list system with features like item completion, reordering, and a standard items catalog.
* **🍲 Recipes:** Store and organize your favorite recipes.
* **🔒 Privacy & Security:** Your data is yours. Noteshop offers robust, optional encryption for your data and the ability to lock individual items with a password, PIN, or pattern.
* **🔄 Synchronization:** Keep your data in sync across devices. Noteshop supports two methods:
* **Web App Integration:** Synchronize with a self-hosted web application.
* **Local File Sync:** Use tools like Syncthing to sync your data via a designated folder on your device.
* **🎨 Themes:** Customize the look and feel of the app with different color themes.
* **🌐 Open Source:** Noteshop is 100% free and open-source. No ads, no tracking.
## Download
* [<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80">](https://f-droid.org/packages/de.lxtools.noteshop/) <!-- Replace with your actual F-Droid link -->
## Building from Source
1. Clone the repository:
```sh
git clone YOUR_GITEA_REPOSITORY_URL_HERE
cd noteshop
```
2. Build the app using Gradle:
```sh
./gradlew assembleRelease
```
The resulting APK will be located in `app/build/outputs/apk/release/`.
## License
This project is licensed under the GNU General Public License v3.0. See the [LICENSE](https://www.gnu.org/licenses/gpl-3.0.html) file for details.
## Privacy
Please see our [Privacy Policy](PRIVACY.md) for details on how the app handles your data.

View File

@@ -31,13 +31,26 @@ android {
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
signingConfigs {
create("release") {
val keystoreFile = rootProject.file("app/keystore.jks")
if (keystoreFile.exists()) {
storeFile = keystoreFile
storePassword = project.property("noteshop.keystore.password") as String
keyAlias = project.property("noteshop.key.alias") as String
keyPassword = project.property("noteshop.key.password") as String
}
}
}
buildTypes {
release {
isMinifyEnabled = false
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
}
}
compileOptions {

BIN
app/keystore.jks Normal file

Binary file not shown.

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>

View File

@@ -2,10 +2,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<application
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
android:name=".NoteshopApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"

View File

@@ -146,6 +146,34 @@ fun AboutScreen() {
item { Spacer(modifier = Modifier.height(24.dp)) }
// Privacy Policy Section
item {
Text(
text = stringResource(id = R.string.about_privacy_policy_title),
style = MaterialTheme.typography.titleLarge,
modifier = Modifier.padding(bottom = 8.dp)
)
val privacyPolicyString = buildAnnotatedString {
append(stringResource(id = R.string.about_privacy_policy_description))
append(" ")
val linkStyle = SpanStyle(
color = MaterialTheme.colorScheme.primary,
textDecoration = TextDecoration.Underline
)
pushLink(LinkAnnotation.Url("https://www.example.com/privacy-policy")) // Placeholder URL
withStyle(linkStyle) {
append(stringResource(id = R.string.about_privacy_policy_link))
}
pop()
}
Text(
text = privacyPolicyString,
style = MaterialTheme.typography.bodyLarge
)
}
item { Spacer(modifier = Modifier.height(24.dp)) }
// Libraries Section
item {
Text(

View File

@@ -214,6 +214,9 @@
<string name="about_library_compose_markdown">• Compose Markdown (Markdown-Rendering)</string>
<string name="about_library_kotlinx_serialization_json">• Kotlinx Serialization (JSON-Parsing)</string>
<string name="about_library_ktor">• Ktor (HTTP-Client)</string>
<string name="about_privacy_policy_title">Datenschutzrichtlinie</string>
<string name="about_privacy_policy_description">Unsere Datenschutzrichtlinie finden Sie hier:</string>
<string name="about_privacy_policy_link">Datenschutzrichtlinie</string>
<string name="color_scheme">Farbschema</string>
<string name="selected">Ausgewählt</string>
<string name="security">Sicherheit</string>

View File

@@ -215,6 +215,9 @@
<string name="about_library_compose_markdown">• Compose Markdown (Markdown rendering)</string>
<string name="about_library_kotlinx_serialization_json">• Kotlinx Serialization (JSON parsing)</string>
<string name="about_library_ktor">• Ktor (HTTP Client)</string>
<string name="about_privacy_policy_title">Privacy Policy</string>
<string name="about_privacy_policy_description">You can find our privacy policy here:</string>
<string name="about_privacy_policy_link">Privacy Policy</string>
<string name="color_scheme">Color Scheme</string>
<string name="selected">Selected</string>
<string name="security">Security</string>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>

View File

@@ -20,4 +20,8 @@ kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
android.nonTransitiveRClass=true
noteshop.keystore.password=>3@kyCeN4)(u$"&!!ko-
noteshop.key.alias=noteshop
noteshop.key.password=>3@kyCeN4)(u$"&!!ko-