Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@
/app/build
/releases
images/scaled
scripts/artifacts
scripts/dist
35 changes: 35 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Security Policy

## Reporting a Vulnerability

Please do not report security vulnerabilities through public GitHub issues.

Send security reports to maxim.starikov@gmail.com.

When possible, include:

- affected app version
- Android version and device model
- steps to reproduce
- expected and actual behavior
- security impact
- proof-of-concept details, screenshots, or logs

I will review reports as time allows and coordinate fixes before discussing confirmed vulnerabilities publicly.

## Supported Versions

The latest published version of Simple Text Editor is the only actively supported version.

## Scope

In scope:

- Simple Text Editor Android app
- repository release or build configuration if it affects distributed app security

Out of scope:

- general feature requests
- non-security bugs
- issues in third-party services not controlled by this project
4 changes: 2 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="58"
android:versionName="1.29.1" >
android:versionCode="59"
android:versionName="1.29.2" >

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,30 +31,23 @@ public RecentFilesService() {
public void addRecentFile(String url, Context context) {
loadItems(context);

//items.remove(url);
items.add(url);
removeOldestItems(url);

items = addRecentFile(items, url);

saveRecentFiles(items, context);
}

private void removeOldestItems(String url) {
ArrayList<String> newItems = new ArrayList<>();
int counter = 0;
int lastIndex = items.size();
int skip = items.size() - MAX_ELEMENTS_STORED;
for(String item: items) {
counter++;
if (counter != lastIndex && item.equals(url)) {
continue;
}
if (counter <= skip) {
continue;
}
newItems.add(item);
static ArrayList<String> addRecentFile(ArrayList<String> items, String url) {
ArrayList<String> newItems = new ArrayList<>(items);
while (newItems.remove(url)) {
// Remove all previous occurrences before appending the latest entry.
}
newItems.add(url);

while (newItems.size() > MAX_ELEMENTS_STORED) {
newItems.remove(0);
}
this.items = newItems;

return newItems;
}

private void loadItems(Context context) {
Expand All @@ -72,6 +65,10 @@ private void loadItems(Context context) {
*/
public ArrayList<String> getLastFiles(int skip, Context context) {
loadItems(context);
return getLastFiles(items, skip);
}

static ArrayList<String> getLastFiles(ArrayList<String> items, int skip) {
ArrayList<String> result = new ArrayList<>();
int counter = 0;
ListIterator<String> it = items.listIterator(items.size());
Expand All @@ -82,8 +79,8 @@ public ArrayList<String> getLastFiles(int skip, Context context) {
if (counter <= skip) {
continue;
}
if (counter > MAX_ELEMENTS_SHOWN + 1) {
continue;
if (result.size() >= MAX_ELEMENTS_SHOWN) {
break;
}

result.add(name);
Expand Down
7 changes: 2 additions & 5 deletions app/src/main/res/xml/preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -134,13 +134,10 @@
</PreferenceCategory>
<PreferenceCategory
android:title="@string/About">
<Preference
android:key="version_name"
android:summary=""
android:title="@string/Version" />
<com.maxistar.textpad.AboutBox
android:key="version_name"
android:title="@string/About_Editor"
android:summary="@string/Just_a_little_FYI"
android:dialogTitle="@string/Warranty_Information" />
</PreferenceCategory>
</PreferenceScreen>
</PreferenceScreen>
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.maxistar.textpad.service;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Arrays;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class RecentFilesServiceTest {
@Test
public void addingDuplicateMovesItToNewestPosition() {
ArrayList<String> items = list("url1", "url2", "url3");

ArrayList<String> result = RecentFilesService.addRecentFile(items, "url2");

assertEquals(list("url1", "url3", "url2"), result);
}

@Test
public void addingDuplicateLeavesOnlyOneOccurrence() {
ArrayList<String> items = list("url1", "url2", "url3", "url2");

ArrayList<String> result = RecentFilesService.addRecentFile(items, "url2");

assertEquals(list("url1", "url3", "url2"), result);
}

@Test
public void trimmingRemovesOnlyOldestEntries() {
ArrayList<String> items = list(
"url1", "url2", "url3", "url4", "url5",
"url6", "url7", "url8", "url9", "url10"
);

ArrayList<String> result = RecentFilesService.addRecentFile(items, "url11");

assertEquals(list(
"url2", "url3", "url4", "url5", "url6",
"url7", "url8", "url9", "url10", "url11"
), result);
}

@Test
public void duplicateRemovalHappensBeforeTrimming() {
ArrayList<String> items = list(
"url1", "url2", "url3", "url4", "url5",
"url6", "url7", "url8", "url9", "url10"
);

ArrayList<String> result = RecentFilesService.addRecentFile(items, "url2");

assertEquals(list(
"url1", "url3", "url4", "url5", "url6",
"url7", "url8", "url9", "url10", "url2"
), result);
}

@Test
public void lastFilesAreReturnedNewestFirst() {
ArrayList<String> items = list("url1", "url2", "url3", "url4");

ArrayList<String> result = RecentFilesService.getLastFiles(items, 0);

assertEquals(list("url4", "url3", "url2", "url1"), result);
}

@Test
public void lastFilesRespectSkipArgument() {
ArrayList<String> items = list("url1", "url2", "url3", "url4");

ArrayList<String> result = RecentFilesService.getLastFiles(items, 1);

assertEquals(list("url3", "url2", "url1"), result);
}

@Test
public void lastFilesRespectDisplayLimit() {
ArrayList<String> items = list("url1", "url2", "url3", "url4", "url5", "url6", "url7");

ArrayList<String> result = RecentFilesService.getLastFiles(items, 0);

assertEquals(list("url7", "url6", "url5", "url4", "url3"), result);
}

private ArrayList<String> list(String... values) {
return new ArrayList<>(Arrays.asList(values));
}
}
3 changes: 3 additions & 0 deletions fastlane/metadata/android/en-US/changelogs/59.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Fixed recent files bug
- Updated About section in Settings screen
- Fixed Chinese translation issue
3 changes: 3 additions & 0 deletions fastlane/metadata/android/es-ES/changelogs/59.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Se corrigió un error en los archivos recientes
- Se actualizó la sección Acerca de en la pantalla de ajustes
- Se corrigió un problema con la traducción al chino
3 changes: 3 additions & 0 deletions fastlane/metadata/android/pl-PL/changelogs/59.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Naprawiono błąd listy ostatnich plików
- Zaktualizowano sekcję O aplikacji na ekranie ustawień
- Naprawiono problem z tłumaczeniem na język chiński
3 changes: 3 additions & 0 deletions fastlane/metadata/android/ru-RU/changelogs/59.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- Исправлена ошибка списка недавних файлов
- Обновлен раздел «О приложении» на экране настроек
- Исправлена проблема с переводом на китайский язык
Loading
Loading