Files
foto-duplicate-finder/PRIVACY.md
T
SoftwareApp f45e3b79ab docs: cover the tablet screenshot slots and settle app pricing
Two Console-facing subjects, both decided here instead of in the Console.

Tablet screenshots (7-inch and 10-inch)
--------------------------------------
Play keeps a separate screenshot slot per form factor and asks for at least four
screenshots on tablets, so the four phone captures did not cover them. Both sets are now
captured on AOSP Android 12 AVDs, over the same generated 22-photo demo library, and
normalised with FORM_FACTOR=tablet-7in|tablet-10in:

- 7-inch - Nexus 7 2013: 1200x1920 portrait, sw600dp, 320 dpi, four files
- 10-inch - Medium Tablet: 1600x2560 portrait, sw800dp, 320 dpi, four files

This machine has no /dev/kvm - the node cannot even be created, because mknod is refused
for the container as root - so the emulator ran in pure software emulation (-accel off
-no-window -gpu swiftshader_indirect): about 3 minutes to boot, 1-12 s per screenshot.
hide_error_dialogs was switched on and the animation scales off, because under TCG
SystemUI raises an ANR dialog that would otherwise sit in the frame; the 10-inch profile
boots landscape and its portrait rotation is 3, not 0. The scanning frame comes from a
screencap burst started before the tap, since 22 photos scan in seconds, and the tap
coordinates come from uiautomator dumps rather than guesswork.

The results screens are not staged: a finished scan auto-selects all but best, so "14
selected, 43.7 MB" is the default state. 2 duplicate groups, 16 of 22 photos, 43.7 MB
reclaimable, scanned in 39.7 s (7-inch) and 53.1 s (10-inch). Nothing except the demo
library was ever pushed to either AVD and it is deleted again afterwards, so no real
photo can appear in the tablet sets. Screenshots stay out of git, as before.

App pricing: a one-time paid app
--------------------------------
The one irreversible decision in this release. Play's rule: an app can go paid -> free,
but "once your app has been offered for free, the app can't be changed to paid" - a new
package name would be needed - so this had to be settled before the first upload, which
has not happened yet (versionCode 2).

Chosen over free with a Pro unlock because it is the only model that costs the app
nothing: no Billing dependency, no com.android.vending.BILLING permission, no Data
Safety answers, and the "no internet permission at all" claim survives untouched.
Checked rather than assumed: unpacking com.android.billingclient:billing:9.1.0 shows its
manifest declares only com.android.vending.BILLING and the billing service queries, so
in-app purchase would not have added INTERNET either. Billing 8+ is the current
requirement (latest 9.1.0) if that is ever revisited.

Price: base EUR 2.99 with a 14-day 50% launch sale at EUR 1.49. A EUR 1 base price was
considered and rejected: a sale can always be added, but a low anchor cannot be undone,
and a paid app's first transaction is its only transaction. Play's fee for a paid app's
initial purchase is 10% + 5% billing fee (~15%) for the first $1M/year of new-install
transactions in the EEA, so EUR 2.99 nets ~EUR 2.54 against ~EUR 0.85 at EUR 1. The sale
rules shape the launch: 1-14 days live, 30 days between one sale ending and the next
starting, and the app must be published before a sale can be created. The strikethrough
does appear in Germany, which is not one of the 12 EU states and the UK that hide it.

The listing copy had to stop saying "free": the short description is now "Find and remove
duplicate photos. Ad-free, works offline, no uploads." (69/80 chars) and the full
description gains one factual pay-once line plus a "sold through Google Play as a
one-time purchase" bullet (2,426/4,000). The price stays out of the title, icon and
developer name, because Play's metadata policy forbids price and promotional wording
there. PRIVACY.md gains a Purchases section - Google Play processes the payment, the app
has no payment code and no network access at all - and its date moves to 2026-10-14, so
the published copy needs re-pushing to Gitea.

No code changed, so the signed 1.0.1 .aab is untouched (sha256 f8e6a29a...). What is
left is Console work: a payments profile, the price and the launch sale on Products >
App pricing, and a promo-code copy to test the paid listing end to end.
2026-10-14 09:48:57 +02:00

78 lines
3.2 KiB
Markdown

# Privacy Policy — Foto Dup Finder
_Last updated: 2026-10-14_
## Summary
Foto Dup Finder finds and removes duplicate photos **entirely on your device**.
The app does **not** collect, transmit, sell or share any of your data. It has no
network access at all. It is sold once through Google Play; the purchase is handled
entirely by Google Play, never by the app (see [Purchases](#purchases)).
## What the app accesses
| Data | Why | Where it goes |
|---|---|---|
| Your photos (images) | To compare them and detect duplicates | Never leaves your device |
| Photo metadata (file name, size, folder, dimensions, date) | To group and display results | Never leaves your device |
| A local cache of file hashes | To make repeat scans fast | Stored only in this app's private storage |
## What the app does NOT do
- It does **not** have the `INTERNET` permission, so it cannot send data anywhere.
- It does **not** collect analytics, crash reports, advertising identifiers or
location data.
- It does **not** contain advertising SDKs or third-party trackers.
- It does **not** create accounts and does **not** ask for your name, email or
phone number.
- It does **not** read photos other than the images you grant access to.
## Permissions and what they mean
| Permission | Purpose |
|---|---|
| Read photos (`READ_MEDIA_IMAGES` / `READ_EXTERNAL_STORAGE`) | Required to scan your photo library. You can deny this and the app simply will not scan. On Android 14+ you may grant access to *selected photos only*; the app then scans only those. |
| `READ_MEDIA_VISUAL_USER_SELECTED` | Supports Android 14's partial photo access. |
| `WRITE_EXTERNAL_STORAGE` (Android 10 only) | Used solely to delete photos you explicitly select on that older Android version. |
## Deleting photos
On Android 11 and newer, deletions are performed through the operating system's
own confirmation dialog (`MediaStore.createDeleteRequest` / `createTrashRequest`).
The app can never delete anything without your explicit confirmation, and it never
requests the broad `MANAGE_EXTERNAL_STORAGE` permission.
On Android 10, deletions use the standard media API and still only affect the files
you selected.
## Data retention and deletion
The app stores a small local database of file hashes in its private app storage so
that repeat scans are fast. This database contains no image content and never leaves
your device. Uninstalling the app, or clearing its storage in Android Settings,
removes it completely.
## Purchases
The app is **sold once through Google Play**. There is no subscription and there is nothing to buy
inside the app.
Google Play processes the payment and holds the payment details. The app contains no payment code
and never receives them, because it has no network access of any kind (see above). Refunds, order
problems and any question about a charge are handled by Google Play, and the developer can be
reached at the address below.
## Children
The app is a general-purpose utility and is not directed at children. It collects no
personal data from anyone.
## Changes
If this policy changes, the updated version will be published at this address with a
new "last updated" date.
## Contact
Questions about this policy: **softwareapp.hb@gmail.com**.