Merge branch 'purge-description-formatting' into 'master'

Purge description formatting

Closes #845 and #678

See merge request fdroid/fdroidserver!828
This commit is contained in:
Hans-Christoph Steiner 2020-12-09 18:28:08 +00:00
commit ac5ed93428
17 changed files with 88 additions and 1558 deletions

View File

@ -54,7 +54,7 @@
repo_url: https://MyFirstFDroidRepo.org/fdroid/repo
repo_name: My First F-Droid Repo Demo
repo_icon: fdroid-icon.png
repo_description: |
repo_description: >-
This is a repository of apps to be used with F-Droid. Applications in this
repository are either official binaries built by the original application
developers, or are binaries built from source by the admin of f-droid.org
@ -68,7 +68,7 @@ archive_older: 3
archive_url: https://f-droid.org/archive
archive_name: My First F-Droid Archive Demo
archive_icon: fdroid-icon.png
archive_description: |
archive_description: >-
The repository of older versions of packages from the main demo repository.
# This allows a specific kind of insecure APK to be included in the

View File

@ -355,10 +355,6 @@ def read_config(opts):
fill_config_defaults(config)
for k in ["repo_description", "archive_description"]:
if k in config:
config[k] = clean_description(config[k])
if 'serverwebroot' in config:
if isinstance(config['serverwebroot'], str):
roots = [config['serverwebroot']]
@ -671,19 +667,6 @@ def get_extension(filename):
publish_name_regex = re.compile(r"^(.+)_([0-9]+)\.(apk|zip)$")
def clean_description(description):
'Remove unneeded newlines and spaces from a block of description text'
returnstring = ''
# this is split up by paragraph to make removing the newlines easier
for paragraph in re.split(r'\n\n', description):
paragraph = re.sub('\r', '', paragraph)
paragraph = re.sub('\n', ' ', paragraph)
paragraph = re.sub(' {2,}', ' ', paragraph)
paragraph = re.sub(r'^\s*(\w)', r'\1', paragraph)
returnstring += paragraph + '\n\n'
return returnstring.rstrip('\n')
def publishednameinfo(filename):
filename = os.path.basename(filename)
m = publish_name_regex.match(filename)

View File

@ -405,7 +405,7 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing
addElement('icon', app.icon, doc, apel)
addElementCheckLocalized('desc', app, 'Description', doc, apel,
'<p>No description available</p>')
'No description available')
addElement('license', app.License, doc, apel)
if app.Categories:

View File

@ -583,7 +583,7 @@ def main():
config = common.read_config(options)
# Get all apps...
allapps = metadata.read_metadata(xref=True)
allapps = metadata.read_metadata(options.appid)
apps = common.read_app_args(options.appid, allapps, False)
anywarns = check_for_unsupported_metadata_files()

View File

@ -21,10 +21,7 @@
import os
import re
import glob
import html
import logging
import textwrap
import io
import yaml
try:
from yaml import CSafeLoader as SafeLoader
@ -467,196 +464,6 @@ def check_metadata(app):
v.check(app[k], app.id)
# Formatter for descriptions. Create an instance, and call parseline() with
# each line of the description source from the metadata. At the end, call
# end() and then text_txt and text_html will contain the result.
class DescriptionFormatter:
stNONE = 0
stPARA = 1
stUL = 2
stOL = 3
def __init__(self, linkres):
self.bold = False
self.ital = False
self.state = self.stNONE
self.laststate = self.stNONE
self.text_html = ''
self.text_txt = ''
self.html = io.StringIO()
self.text = io.StringIO()
self.para_lines = []
self.linkResolver = None
self.linkResolver = linkres
def endcur(self, notstates=None):
if notstates and self.state in notstates:
return
if self.state == self.stPARA:
self.endpara()
elif self.state == self.stUL:
self.endul()
elif self.state == self.stOL:
self.endol()
def endpara(self):
self.laststate = self.state
self.state = self.stNONE
whole_para = ' '.join(self.para_lines)
self.addtext(whole_para)
wrapped = textwrap.fill(whole_para, 80,
break_long_words=False,
break_on_hyphens=False)
self.text.write(wrapped)
self.html.write('</p>')
del self.para_lines[:]
def endul(self):
self.html.write('</ul>')
self.laststate = self.state
self.state = self.stNONE
def endol(self):
self.html.write('</ol>')
self.laststate = self.state
self.state = self.stNONE
def formatted(self, txt, htmlbody):
res = ''
if htmlbody:
txt = html.escape(txt, quote=False)
while True:
index = txt.find("''")
if index == -1:
return res + txt
res += txt[:index]
txt = txt[index:]
if txt.startswith("'''"):
if htmlbody:
if self.bold:
res += '</b>'
else:
res += '<b>'
self.bold = not self.bold
txt = txt[3:]
else:
if htmlbody:
if self.ital:
res += '</i>'
else:
res += '<i>'
self.ital = not self.ital
txt = txt[2:]
def linkify(self, txt):
res_plain = ''
res_html = ''
while True:
index = txt.find("[")
if index == -1:
return (res_plain + self.formatted(txt, False), res_html + self.formatted(txt, True))
res_plain += self.formatted(txt[:index], False)
res_html += self.formatted(txt[:index], True)
txt = txt[index:]
if txt.startswith("[["):
index = txt.find("]]")
if index == -1:
_warn_or_exception(_("Unterminated ]]"))
url = txt[2:index]
if self.linkResolver:
url, urltext = self.linkResolver.resolve_description_link(url)
else:
urltext = url
res_html += '<a href="' + url + '">' + html.escape(urltext, quote=False) + '</a>'
res_plain += urltext
txt = txt[index + 2:]
else:
index = txt.find("]")
if index == -1:
_warn_or_exception(_("Unterminated ]"))
url = txt[1:index]
index2 = url.find(' ')
if index2 == -1:
urltxt = url
else:
urltxt = url[index2 + 1:]
url = url[:index2]
if url == urltxt:
_warn_or_exception(_("URL title is just the URL, use brackets: [URL]"))
res_html += '<a href="' + url + '">' + html.escape(urltxt, quote=False) + '</a>'
res_plain += urltxt
if urltxt != url:
res_plain += ' (' + url + ')'
txt = txt[index + 1:]
def addtext(self, txt):
p, h = self.linkify(txt)
self.html.write(h)
def parseline(self, line):
if not line:
self.endcur()
elif line.startswith('* '):
self.endcur([self.stUL])
if self.state != self.stUL:
self.html.write('<ul>')
self.state = self.stUL
if self.laststate != self.stNONE:
self.text.write('\n\n')
else:
self.text.write('\n')
self.text.write(line)
self.html.write('<li>')
self.addtext(line[1:])
self.html.write('</li>')
elif line.startswith('# '):
self.endcur([self.stOL])
if self.state != self.stOL:
self.html.write('<ol>')
self.state = self.stOL
if self.laststate != self.stNONE:
self.text.write('\n\n')
else:
self.text.write('\n')
self.text.write(line)
self.html.write('<li>')
self.addtext(line[1:])
self.html.write('</li>')
else:
self.para_lines.append(line)
self.endcur([self.stPARA])
if self.state == self.stNONE:
self.state = self.stPARA
if self.laststate != self.stNONE:
self.text.write('\n\n')
self.html.write('<p>')
def end(self):
self.endcur()
self.text_txt = self.text.getvalue()
self.text_html = self.html.getvalue()
self.text.close()
self.html.close()
# Parse multiple lines of description as written in a metadata file, returning
# a single string in wiki format. Used for the Maintainer Notes field as well,
# because it's the same format.
def description_wiki(s):
return s
# Parse multiple lines of description as written in a metadata file, returning
# a single string in HTML format.
def description_html(s, linkres):
ps = DescriptionFormatter(linkres)
for line in s.splitlines():
ps.parseline(line)
ps.end()
return ps.text_html
def parse_yaml_srclib(metadatapath):
thisinfo = {'RepoType': '',
@ -734,7 +541,7 @@ def read_srclibs():
srclibs[srclibname] = parse_yaml_srclib(metadatapath)
def read_metadata(xref=True, check_vcs=[], refresh=True, sort_by_time=False):
def read_metadata(appids=None, check_vcs=[], refresh=True, sort_by_time=False):
"""Return a list of App instances sorted newest first
This reads all of the metadata files in a 'data' repository, then
@ -756,8 +563,22 @@ def read_metadata(xref=True, check_vcs=[], refresh=True, sort_by_time=False):
if not os.path.exists(basedir):
os.makedirs(basedir)
metadatafiles = (glob.glob(os.path.join('metadata', '*.yml'))
+ glob.glob('.fdroid.yml'))
if appids:
vercodes = fdroidserver.common.read_pkg_args(appids)
found_invalid = False
metadatafiles = []
for appid in vercodes.keys():
f = os.path.join('metadata', '%s.yml' % appid)
if os.path.exists(f):
metadatafiles.append(f)
else:
found_invalid = True
logging.critical(_("No such package: %s") % appid)
if found_invalid:
raise FDroidException(_("Found invalid appids in arguments"))
else:
metadatafiles = (glob.glob(os.path.join('metadata', '*.yml'))
+ glob.glob('.fdroid.yml'))
if sort_by_time:
entries = ((os.stat(path).st_mtime, path) for path in metadatafiles)
@ -780,16 +601,6 @@ def read_metadata(xref=True, check_vcs=[], refresh=True, sort_by_time=False):
check_metadata(app)
apps[app.id] = app
if xref:
# Parse all descriptions at load time, just to ensure cross-referencing
# errors are caught early rather than when they hit the build server.
for appid, app in apps.items():
try:
description_html(app.Description, DummyDescriptionResolver(apps))
except MetaDataException as e:
_warn_or_exception(_("Problem with description of {appid}: {error}")
.format(appid=appid, error=str(e)))
return apps
@ -1179,23 +990,3 @@ def add_metadata_arguments(parser):
'''add common command line flags related to metadata processing'''
parser.add_argument("-W", choices=['error', 'warn', 'ignore'], default='error',
help=_("force metadata errors (default) to be warnings, or to be ignored."))
class DescriptionResolver:
def __init__(self, apps):
self.apps = apps
def resolve_description_link(self, appid):
if appid in self.apps:
if self.apps[appid].Name:
return "fdroid.app:" + appid, self.apps[appid].Name
raise MetaDataException(_('Cannot resolve application ID {appid}')
.format(appid=appid))
class DummyDescriptionResolver(DescriptionResolver):
def resolve_description_link(self, appid):
if appid in self.apps:
return "fdroid.app:" + appid, "Dummy name - don't know yet"
_warn_or_exception(_('Cannot resolve application ID {appid}')
.format(appid=appid))

View File

@ -32,7 +32,7 @@ def main():
metadata.warnings_action = options.W
common.read_config(None)
metadata.read_metadata(xref=True)
metadata.read_metadata()
if __name__ == "__main__":

View File

@ -61,7 +61,7 @@ def main():
config = common.read_config(options)
# Get all apps...
allapps = metadata.read_metadata(xref=True)
allapps = metadata.read_metadata(options.appid)
apps = common.read_app_args(options.appid, allapps, False)
for appid, app in apps.items():

View File

@ -234,11 +234,11 @@ def update_wiki(apps, apks):
wikidata += " - [https://f-droid.org/repository/browse/?fdid=" + appid + " view in repository]\n\n"
wikidata += "=Description=\n"
wikidata += metadata.description_wiki(app.Description) + "\n"
wikidata += app.Description + "\n"
wikidata += "=Maintainer Notes=\n"
if app.MaintainerNotes:
wikidata += metadata.description_wiki(app.MaintainerNotes) + "\n"
wikidata += app.MaintainerNotes + "\n"
wikidata += "\nMetadata: [https://gitlab.com/fdroid/fdroiddata/blob/master/metadata/{0}.yml current] [https://gitlab.com/fdroid/fdroiddata/commits/master/metadata/{0}.yml history]\n".format(appid)
# Get a list of all packages for this application...
@ -2120,16 +2120,6 @@ def read_names_from_apks(apps, apks):
app.Name = bestapk['name']
def render_app_descriptions(apps, all_apps):
"""
Renders the app html description.
For resolving inter-app links it needs the full list of apps, even if they end up in
separate repos (i.e. archive or per app repos).
"""
for app in apps.values():
app['Description'] = metadata.description_html(app['Description'], metadata.DescriptionResolver(all_apps))
def get_apps_with_packages(apps, apks):
"""Returns a deepcopy of that subset apps that actually has any associated packages. Skips disabled apps."""
appsWithPackages = collections.OrderedDict()
@ -2157,7 +2147,6 @@ def prepare_apps(apps, apks, repodir):
"""
apps_with_packages = get_apps_with_packages(apps, apks)
apply_info_from_latest_apk(apps_with_packages, apks)
render_app_descriptions(apps_with_packages, apps)
insert_funding_yml_donation_links(apps)
# This is only currently done for /repo because doing it for the archive
# will take a lot of time and bloat the archive mirrors and index

View File

@ -1,47 +0,0 @@
#!/usr/bin/env python3
import os
import sys
sys.path.insert(1, os.path.join(os.getcwd(), '..', 'fdroidserver'))
import common
config = common.get_default_config()
testtext = '''
This is a block of text that has been wrapped to fit nicely in PEP8 style:
GnuPrivacyGuard extends the gpgcli command line tool to bring an integrated
privacy engine to your Android. It gives you command line access to the entire
GnuPG suite of encryption software. It also serves as the test bed for
complete Android integration for all of GnuPG's crypto services, including
OpenPGP, symmetric encryption, and more.
GPG is GNUs tool for end-to-end secure communication and encrypted data
storage. This trusted protocol is the free software alternative to PGP. This
app is built upon GnuPG 2.1, the new modularized version of GnuPG that now
supports S/MIME.
GPG aims to provide an integrated experience, so clicking on PGP files should
"just work". You can also share files to GPG to encrypt them. GPG will also
respond when you click on a PGP fingerprint URL (one that starts with
openpgp4fpr:).
Before using GPG, be sure to launch the app and let it finish its installation
process. Once it has completed, then you're ready to use it. The easiest way
to get started with GPG is to install [[jackpal.androidterm]]. GPG will
automatically configure Android Terminal Emulator as long as you have the
"Allow PATH extensions" settings enabled.
'''
archive_description = """
The repository of older versions of applications from the main demo repository.
"""
print('\n\n\n----------------------------------------------------')
print(common.clean_description(testtext))
print('\n\n\n----------------------------------------------------')
print(common.clean_description(archive_description))
print('\n\n\n----------------------------------------------------')
print(common.clean_description(config['repo_description']))

View File

@ -84,7 +84,7 @@ savedir = os.path.join('metadata', 'dump_' + repo.git.describe())
if not os.path.isdir(savedir):
os.mkdir(savedir)
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
for appid, app in apps.items():
savepath = os.path.join(savedir, appid + '.yaml')
if hasattr(app, 'attr_to_field'):

View File

@ -133,7 +133,7 @@ class MetadataTest(unittest.TestCase):
fdroidserver.common.config = config
fdroidserver.metadata.warnings_action = None
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
for appid in ('org.smssecure.smssecure', 'org.adaway',
'org.videolan.vlc', 'com.politedroid'):
savepath = os.path.join('metadata', 'dump', appid + '.yaml')
@ -154,7 +154,7 @@ class MetadataTest(unittest.TestCase):
fdroidserver.metadata.warnings_action = None
# rewrite metadata
allapps = fdroidserver.metadata.read_metadata(xref=True)
allapps = fdroidserver.metadata.read_metadata()
for appid, app in allapps.items():
if appid == 'fake.ota.update':
fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app)
@ -170,7 +170,7 @@ class MetadataTest(unittest.TestCase):
fdroidserver.common.config = {'accepted_formats': ['yml']}
# rewrite metadata
allapps = fdroidserver.metadata.read_metadata(xref=True)
allapps = fdroidserver.metadata.read_metadata()
for appid, app in allapps.items():
if appid == 'org.fdroid.fdroid':
fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app)
@ -185,7 +185,7 @@ class MetadataTest(unittest.TestCase):
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
# rewrite metadata
allapps = fdroidserver.metadata.read_metadata(xref=True)
allapps = fdroidserver.metadata.read_metadata()
for appid, app in allapps.items():
if appid == 'app.with.special.build.params':
fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app)
@ -258,7 +258,7 @@ class MetadataTest(unittest.TestCase):
randomlist = [os.path.basename(f)[:-4]] + randomlist
i += 1
os.chdir(testdir)
allapps = fdroidserver.metadata.read_metadata(xref=True, sort_by_time=True)
allapps = fdroidserver.metadata.read_metadata(sort_by_time=True)
allappids = []
for appid, app in allapps.items():
allappids.append(appid)
@ -828,13 +828,6 @@ class MetadataTest(unittest.TestCase):
'Subdir': None,
'Prepare': None}})
def test_read_xref_metadata(self):
os.chdir('xref')
fdroidserver.metadata.warnings_action = 'error'
apps = fdroidserver.metadata.read_metadata(xref=True)
self.assertListEqual(list(apps.keys()),
['aarddict.android', 'org.coolreader', 'org.geometerplus.zlibrary.ui.android'])
if __name__ == "__main__":
os.chdir(os.path.dirname(__file__))

View File

@ -5,7 +5,7 @@
"name": "My First F-Droid Repo Demo",
"icon": "fdroid-icon.png",
"address": "https://MyFirstFDroidRepo.org/fdroid/repo",
"description": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid. ",
"description": "This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid.",
"mirrors": [
"http://foobarfoobarfoobar.onion/fdroid/repo",
"https://foo.bar/fdroid/repo"
@ -27,7 +27,7 @@
],
"suggestedVersionName": "0.9",
"suggestedVersionCode": "9",
"description": "<p>In order to keep away curious eyes, SMS-bypass filters incoming SMS messages before they reach your inbox. Based on bughunter2.smsfilter.</p><p>Features:</p><ul><li> Discrete fake app \"Battery level\": Long tap on Battery percentage will show SMS.</li><li> Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings</li><li> Add contact from contact list</li><li> Export messages to a text file</li></ul>",
"description": "In order to keep away curious eyes, SMS-bypass filters incoming SMS messages\nbefore they reach your inbox. Based on bughunter2.smsfilter.\n\nFeatures:\n\n* Discrete fake app \"Battery level\": Long tap on Battery percentage will show SMS.\n* Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings\n* Add contact from contact list\n* Export messages to a text file",
"donate": "http://rodolphe.souchaud.free.fr/donate",
"flattrID": "cad90e036b975ed129a3ce80a0750466",
"issueTracker": "https://gitlab.com/souch/SMSbypass/issues",
@ -73,7 +73,7 @@
],
"suggestedVersionName": "0.2.1",
"suggestedVersionCode": "2000",
"description": "<p>F-Droid can make use of system privileges or permissions to install, update and remove applications on its own. The only way to obtain those privileges is to become a system app.</p><p>This is where the Privileged Extension comes in - being a separate app and much smaller, it can be installed as a system app and communicate with the main app via AIDL IPC.</p><p>This has several advantages:</p><ul><li> Reduced disk usage in the system partition</li><li> System updates don't remove F-Droid</li><li> The process of installing into system via root is safer</li></ul><p>This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed using TWRP or other Android recovery that can flash updates to the system from the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone APK is called F-Droid Privileged Extension.</p>",
"description": "F-Droid can make use of system privileges or permissions to\ninstall, update and remove applications on its own. The only way to obtain those\nprivileges is to become a system app.\n\nThis is where the Privileged Extension comes in - being a separate app and much\nsmaller, it can be installed as a system app and communicate with the main app\nvia AIDL IPC.\n\nThis has several advantages:\n\n* Reduced disk usage in the system partition\n* System updates don't remove F-Droid\n* The process of installing into system via root is safer\n\nThis is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed\nusing TWRP or other Android recovery that can flash updates to the system from\nthe /data/data/org.fdroid.fdroid folder on the /data partition. The standalone\nAPK is called F-Droid Privileged Extension.",
"donate": "https://f-droid.org/about",
"issueTracker": "https://gitlab.com/fdroid/privileged-extension/issues",
"license": "Apache-2.0",
@ -162,7 +162,7 @@
],
"suggestedVersionName": "1.5",
"suggestedVersionCode": "6",
"description": "<p>Activates silent mode during calendar events.</p>",
"description": "Activates silent mode during calendar events.",
"issueTracker": "https://github.com/miguelvps/PoliteDroid/issues",
"license": "GPL-3.0-only",
"name": "Polite Droid",
@ -183,7 +183,7 @@
"2.0"
],
"suggestedVersionCode": "2147483647",
"description": "<p>It\u2019s Urzip \u662f\u4e00\u4e2a\u83b7\u5f97\u5df2\u5b89\u88c5 APK \u76f8\u5173\u4fe1\u606f\u7684\u5b9e\u7528\u5de5\u5177\u3002\u5b83\u4ece\u60a8\u7684\u8bbe\u5907\u4e0a\u5df2\u5b89\u88c5\u7684\u6240\u6709\u5e94\u7528\u5f00\u59cb\uff0c\u4e00\u952e\u89e6\u6478\u5373\u53ef\u663e\u793a APK \u7684\u6307\u7eb9\uff0c\u5e76\u4e14\u63d0\u4f9b\u5230\u8fbe virustotal.com \u548c androidobservatory.org \u7684\u5feb\u6377\u94fe\u63a5\uff0c\u8ba9\u60a8\u65b9\u4fbf\u5730\u4e86\u89e3\u7279\u5b9a APK \u7684\u6863\u6848\u3002\u5b83\u8fd8\u53ef\u4ee5\u8ba9\u60a8\u5bfc\u51fa\u7b7e\u540d\u8bc1\u4e66\u548c\u751f\u6210 ApkSignaturePin Pin \u6587\u4ef6\u4f9b TrustedIntents \u5e93\u4f7f\u7528\u3002</p><p>\u2605 Urzip \u652f\u6301\u4e0b\u5217\u8bed\u8a00\uff1a Deutsch, English, espa\u00f1ol, suomi, \u65e5\u672c\u8a9e, \ud55c\uad6d\uc5b4, Norsk, portugu\u00eas (Portugal), \u0420\u0443\u0441\u0441\u043a\u0438\u0439, Sloven\u0161\u010dina, T\u00fcrk\u00e7e \u6ca1\u770b\u5230\u60a8\u7684\u8bed\u8a00\uff1f\u5e2e\u5fd9\u7ffb\u8bd1\u672c\u5e94\u7528\u5427\uff1a https://www.transifex.com/projects/p/urzip</p><p>\u2605 \u81f4\u7528\u6237\uff1a\u6211\u4eec\u8fd8\u7f3a\u5c11\u4f60\u559c\u6b22\u7684\u529f\u80fd\uff1f\u53d1\u73b0\u4e86\u4e00\u4e2a bug\uff1f\u8bf7\u544a\u8bc9\u6211\u4eec\uff01\u6211\u4eec\u4e50\u4e8e\u542c\u53d6\u60a8\u7684\u610f\u89c1\u3002\u8bf7\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u81f3: support@guardianproject.info \u6216\u8005\u52a0\u5165\u6211\u4eec\u7684\u804a\u5929\u5ba4 https://guardianproject.info/contact</p>",
"description": "It\u2019s Urzip \u662f\u4e00\u4e2a\u83b7\u5f97\u5df2\u5b89\u88c5 APK \u76f8\u5173\u4fe1\u606f\u7684\u5b9e\u7528\u5de5\u5177\u3002\u5b83\u4ece\u60a8\u7684\u8bbe\u5907\u4e0a\u5df2\u5b89\u88c5\u7684\u6240\u6709\u5e94\u7528\u5f00\u59cb\uff0c\u4e00\u952e\u89e6\u6478\u5373\u53ef\u663e\u793a APK \u7684\u6307\u7eb9\uff0c\u5e76\u4e14\u63d0\u4f9b\u5230\u8fbe virustotal.com \u548c androidobservatory.org \u7684\u5feb\u6377\u94fe\u63a5\uff0c\u8ba9\u60a8\u65b9\u4fbf\u5730\u4e86\u89e3\u7279\u5b9a APK \u7684\u6863\u6848\u3002\u5b83\u8fd8\u53ef\u4ee5\u8ba9\u60a8\u5bfc\u51fa\u7b7e\u540d\u8bc1\u4e66\u548c\u751f\u6210 ApkSignaturePin Pin \u6587\u4ef6\u4f9b TrustedIntents \u5e93\u4f7f\u7528\u3002\n\n\u2605 Urzip \u652f\u6301\u4e0b\u5217\u8bed\u8a00\uff1a Deutsch, English, espa\u00f1ol, suomi, \u65e5\u672c\u8a9e, \ud55c\uad6d\uc5b4, Norsk, portugu\u00eas (Portugal), \u0420\u0443\u0441\u0441\u043a\u0438\u0439, Sloven\u0161\u010dina, T\u00fcrk\u00e7e\n\u6ca1\u770b\u5230\u60a8\u7684\u8bed\u8a00\uff1f\u5e2e\u5fd9\u7ffb\u8bd1\u672c\u5e94\u7528\u5427\uff1a\nhttps://www.transifex.com/projects/p/urzip\n\n\u2605 \u81f4\u7528\u6237\uff1a\u6211\u4eec\u8fd8\u7f3a\u5c11\u4f60\u559c\u6b22\u7684\u529f\u80fd\uff1f\u53d1\u73b0\u4e86\u4e00\u4e2a bug\uff1f\u8bf7\u544a\u8bc9\u6211\u4eec\uff01\u6211\u4eec\u4e50\u4e8e\u542c\u53d6\u60a8\u7684\u610f\u89c1\u3002\u8bf7\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u81f3: support@guardianproject.info \u6216\u8005\u52a0\u5165\u6211\u4eec\u7684\u804a\u5929\u5ba4 https://guardianproject.info/contact\n",
"issueTracker": "https://dev.guardianproject.info/projects/urzip/issues",
"liberapayID": "9999999",
"license": "GPL-3.0-only",

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<fdroid>
<repo icon="fdroid-icon.png" name="My First F-Droid Repo Demo" pubkey="308204e1308202c9a003020102020434597643300d06092a864886f70d01010b050030213110300e060355040b1307462d44726f6964310d300b06035504031304736f7661301e170d3136303931333230313930395a170d3434303133303230313930395a30213110300e060355040b1307462d44726f6964310d300b06035504031304736f766130820222300d06092a864886f70d01010105000382020f003082020a028202010086ef94b5aacf2ba4f38c875f4194b44f5644392e3715575d7c92828577e692c352b567172823851c8c72347fbc9d99684cd7ca3e1db3e4cca126382c53f2a5869fb4c19bdec989b2930501af3e758ff40588915fe96b10076ce3346a193a0277d79e83e30fd8657c20e35260dd085aa32eac7c4b85786ffefbf1555cafe2bc928443430cdbba48cfbe701e12ae86e676477932730d4fc7c00af820aef85038a5b4df084cf6470d110dc4c49ea1b749b80b34709d199b3db516b223625c5de4501e861f7d261b3838f8f616aa78831d618d41d25872dc810c9b2087b5a9e146ca95be740316dcdbcb77314e23ab87d4487913b800b1113c0603ea2294188b71d3e49875df097b56f9151211fc6832f9790c5c83d17481f14ad37915fd164f4fd713f6732a15f4245714b84cd665bdbd085660ea33ad7d7095dcc414f09e3903604a40facc2314a115c0045bb50e9df38efb57e1b8e7cc105f340a26eeb46aba0fa6672953eee7f1f92dcb408e561909bbd4bdf4a4948c4d57c467d21aa238c34ba43be050398be963191fa2b49828bc1e4eeed224b40dbe9dc3e570890a71a974a2f4527edb1b07105071755105edcb2af2f269facfb89180903a572a99b46456e80d4a01685a80b233278805f2c876678e731f4ec4f52075aeef6b2b023efbb8a3637ef507c4c37c27e428152ec1817fcba640ad601cb09f72f0fbe2d274a2410203010001a321301f301d0603551d0e04160414c28bf33dd5a9a17338e5b1d1a6edd8c7d141ed0b300d06092a864886f70d01010b0500038202010084e20458b2aafd7fc27146b0986f9324f4260f244920417a77c9bf15e2e2d22d2725bdd8093ec261c3779c3ca03312516506f9410075b90595b41345956d8eb2786fb5994f195611382c2b99dba13381b0100a30bc9e6e47248bf4325e2f6eec9d789216dc7536e753bf1f4be603d9fa2e6f5e192b4eb988b8cdb0bb1e8668a9225426f7d4636479f73ed24ad1d2657c31e63c93d9679b9080171b3bd1bf10a3b92b80bd790fbf62d3644900cd08eae8b9bf9c2567be98dc8cdd2ae19a8d57a3e3e2de899f81f1279f578989e6af906f80c8c2b67651730ee7e568c1af5bcb845b6d685dc55332a9984aeceaea3b7e883447edf1c76b155d95253e39b9710eaa22efa6c81468829702b5dce7126538f3ca70c2f0ad9a5795435fdb1f715f20d60359ef9a9926c7050116e802df651727447848827815f70bd82af3cedd08783156102d2d8ce995c4c43b8e47e91a3e6927f3505a5d395e6bebb84542c570903eeab4382a1c2151f1471c7a06a34dc4d268d8fa72e93bdcd2dccc4302ecac47b9e7e3d8bc9b46d21cd097874a24d529548018dc190ff568c6aa428f0a5eedff1a347730931c74f19277538e49647a4ad7254f4c1ec7d4da12cce9e1fad9607534e66ab40a56b473d9d7e3d563fd03cad2052bad365c5a29f8ae54f09b60dbca3ea768d7767cbe1c133ca08ce725c1c1370f4aab8e5b6e286f52dc0be8d0982b5a" timestamp="1480431575" url="https://MyFirstFDroidRepo.org/fdroid/repo" version="21">
<description>This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid. </description>
<description>This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/u/fdroid.</description>
<mirror>http://foobarfoobarfoobar.onion/fdroid/repo</mirror>
<mirror>https://foo.bar/fdroid/repo</mirror>
</repo>
@ -15,7 +15,15 @@
<name>Battery level</name>
<summary>Filter SMS and show them in a fake app</summary>
<icon>souch.smsbypass.9.png</icon>
<desc>&lt;p&gt;In order to keep away curious eyes, SMS-bypass filters incoming SMS messages before they reach your inbox. Based on bughunter2.smsfilter.&lt;/p&gt;&lt;p&gt;Features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt; Discrete fake app &quot;Battery level&quot;: Long tap on Battery percentage will show SMS.&lt;/li&gt;&lt;li&gt; Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings&lt;/li&gt;&lt;li&gt; Add contact from contact list&lt;/li&gt;&lt;li&gt; Export messages to a text file&lt;/li&gt;&lt;/ul&gt;</desc>
<desc>In order to keep away curious eyes, SMS-bypass filters incoming SMS messages
before they reach your inbox. Based on bughunter2.smsfilter.
Features:
* Discrete fake app &quot;Battery level&quot;: Long tap on Battery percentage will show SMS.
* Filter incoming SMS specified address: redirect the SMS to SMS-bypass messages list; remove SMS arrival sound or vibration; show a discreet notification icon (battery level); vibrate if checked in settings
* Add contact from contact list
* Export messages to a text file</desc>
<license>GPL-3.0-only</license>
<categories>Phone &amp; SMS</categories>
<category>Phone &amp; SMS</category>
@ -46,7 +54,7 @@
<name>Caffeine Tile</name>
<summary>Test app for extracting icons when an XML one is default</summary>
<icon>info.zwanenburg.caffeinetile.4.xml</icon>
<desc>&lt;p&gt;No description available&lt;/p&gt;</desc>
<desc>No description available</desc>
<license>Unknown</license>
<categories>Development</categories>
<category>Development</category>
@ -75,7 +83,7 @@
<name>Duplicate Permisssions</name>
<summary>Test app for all possible &lt;uses-permissions&gt;</summary>
<icon>duplicate.permisssions.9999999.png</icon>
<desc>&lt;p&gt;No description available&lt;/p&gt;</desc>
<desc>No description available</desc>
<license>Unknown</license>
<categories>tests</categories>
<category>tests</category>
@ -105,7 +113,24 @@
<lastupdated>2016-03-10</lastupdated>
<name>fake.ota.update_1234</name>
<summary>Tests whether OTA ZIP files are being include</summary>
<desc>&lt;p&gt;F-Droid can make use of system privileges or permissions to install, update and remove applications on its own. The only way to obtain those privileges is to become a system app.&lt;/p&gt;&lt;p&gt;This is where the Privileged Extension comes in - being a separate app and much smaller, it can be installed as a system app and communicate with the main app via AIDL IPC.&lt;/p&gt;&lt;p&gt;This has several advantages:&lt;/p&gt;&lt;ul&gt;&lt;li&gt; Reduced disk usage in the system partition&lt;/li&gt;&lt;li&gt; System updates don't remove F-Droid&lt;/li&gt;&lt;li&gt; The process of installing into system via root is safer&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed using TWRP or other Android recovery that can flash updates to the system from the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone APK is called F-Droid Privileged Extension.&lt;/p&gt;</desc>
<desc>F-Droid can make use of system privileges or permissions to
install, update and remove applications on its own. The only way to obtain those
privileges is to become a system app.
This is where the Privileged Extension comes in - being a separate app and much
smaller, it can be installed as a system app and communicate with the main app
via AIDL IPC.
This has several advantages:
* Reduced disk usage in the system partition
* System updates don't remove F-Droid
* The process of installing into system via root is safer
This is packaged as an OTA (Over-The-Air) update ZIP file. It must be installed
using TWRP or other Android recovery that can flash updates to the system from
the /data/data/org.fdroid.fdroid folder on the /data partition. The standalone
APK is called F-Droid Privileged Extension.</desc>
<license>Apache-2.0</license>
<categories>System</categories>
<category>System</category>
@ -131,7 +156,7 @@
<name>No minSdkVersion or targetSdkVersion</name>
<summary>An APK without any &lt;uses-sdk&gt; block in AndroidManifest.xml</summary>
<icon>no.min.target.sdk.987.png</icon>
<desc>&lt;p&gt;No description available&lt;/p&gt;</desc>
<desc>No description available</desc>
<license>Unknown</license>
<categories>Development</categories>
<category>Development</category>
@ -159,7 +184,7 @@
<name>OBB Main Old Version</name>
<summary></summary>
<icon>obb.main.oldversion.1444412523.png</icon>
<desc>&lt;p&gt;No description available&lt;/p&gt;</desc>
<desc>No description available</desc>
<license>GPL-3.0-only</license>
<categories>Development</categories>
<category>Development</category>
@ -194,7 +219,7 @@
<name>OBB Main Two Versions</name>
<summary></summary>
<icon>obb.main.twoversions.1101617.png</icon>
<desc>&lt;p&gt;No description available&lt;/p&gt;</desc>
<desc>No description available</desc>
<license>GPL-3.0-only</license>
<categories>Development</categories>
<category>Development</category>
@ -252,7 +277,7 @@
<name>OBB Main/Patch Current</name>
<summary></summary>
<icon>obb.mainpatch.current.1619.png</icon>
<desc>&lt;p&gt;No description available&lt;/p&gt;</desc>
<desc>No description available</desc>
<license>GPL-3.0-only</license>
<categories>Development</categories>
<category>Development</category>
@ -285,7 +310,7 @@
<name>Polite Droid</name>
<summary>Calendar tool</summary>
<icon>com.politedroid.6.png</icon>
<desc>&lt;p&gt;Activates silent mode during calendar events.&lt;/p&gt;</desc>
<desc>Activates silent mode during calendar events.</desc>
<license>GPL-3.0-only</license>
<categories>Time</categories>
<category>Time</category>
@ -349,7 +374,14 @@
<name>urzip-πÇÇπÇÇ现代汉语通用字-български-عربي1234</name>
<summary>一个实用工具,获取已安装在您的设备上的应用的有关信息</summary>
<icon>info.guardianproject.urzip.100.png</icon>
<desc>&lt;p&gt;Its Urzip 是一个获得已安装 APK 相关信息的实用工具。它从您的设备上已安装的所有应用开始,一键触摸即可显示 APK 的指纹,并且提供到达 virustotal.com 和 androidobservatory.org 的快捷链接,让您方便地了解特定 APK 的档案。它还可以让您导出签名证书和生成 ApkSignaturePin Pin 文件供 TrustedIntents 库使用。&lt;/p&gt;&lt;p&gt;★ Urzip 支持下列语言: Deutsch, English, español, suomi, 日本語, 한국어, Norsk, português (Portugal), Русский, Slovenščina, Türkçe 没看到您的语言?帮忙翻译本应用吧: https://www.transifex.com/projects/p/urzip&lt;/p&gt;&lt;p&gt;★ 致用户:我们还缺少你喜欢的功能?发现了一个 bug请告诉我们我们乐于听取您的意见。请发送电子邮件至: support@guardianproject.info 或者加入我们的聊天室 https://guardianproject.info/contact&lt;/p&gt;</desc>
<desc>Its Urzip 是一个获得已安装 APK 相关信息的实用工具。它从您的设备上已安装的所有应用开始,一键触摸即可显示 APK 的指纹,并且提供到达 virustotal.com 和 androidobservatory.org 的快捷链接,让您方便地了解特定 APK 的档案。它还可以让您导出签名证书和生成 ApkSignaturePin Pin 文件供 TrustedIntents 库使用。
★ Urzip 支持下列语言: Deutsch, English, español, suomi, 日本語, 한국어, Norsk, português (Portugal), Русский, Slovenščina, Türkçe
没看到您的语言?帮忙翻译本应用吧:
https://www.transifex.com/projects/p/urzip
★ 致用户:我们还缺少你喜欢的功能?发现了一个 bug请告诉我们我们乐于听取您的意见。请发送电子邮件至: support@guardianproject.info 或者加入我们的聊天室 https://guardianproject.info/contact
</desc>
<license>GPL-3.0-only</license>
<categories>Development,GuardianProject,1,2.0</categories>
<category>Development</category>

View File

@ -205,7 +205,7 @@ class UpdateTest(unittest.TestCase):
fdroidserver.update.options = fdroidserver.common.options
os.chdir(tmptestsdir)
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
fdroidserver.update.copy_triple_t_store_metadata(apps)
# TODO ideally, this would compare the whole dict like in metadata.TestCase's test_read_metadata()
@ -236,7 +236,7 @@ class UpdateTest(unittest.TestCase):
fdroidserver.update.config = config
fdroidserver.update.options = fdroidserver.common.options
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
self.assertTrue(packageName in apps)
fdroidserver.update.copy_triple_t_store_metadata(apps)
correctlocales = ['de-DE', 'en-US', 'fr-FR', 'kn-IN']
@ -382,7 +382,7 @@ class UpdateTest(unittest.TestCase):
fdroidserver.update.options.rename_apks = False
fdroidserver.update.options.allow_disabled_algorithms = False
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
knownapks = fdroidserver.common.KnownApks()
apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False)
self.assertEqual(len(apks), 17)
@ -439,7 +439,7 @@ class UpdateTest(unittest.TestCase):
fdroidserver.update.options.rename_apks = False
fdroidserver.update.options.allow_disabled_algorithms = False
fdroidserver.metadata.read_metadata(xref=True)
fdroidserver.metadata.read_metadata()
knownapks = fdroidserver.common.KnownApks()
apkcache = fdroidserver.update.get_cache()
self.assertEqual(2, len(apkcache))
@ -817,7 +817,7 @@ class UpdateTest(unittest.TestCase):
fdroidserver.update.options.rename_apks = False
fdroidserver.update.options.allow_disabled_algorithms = False
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
knownapks = fdroidserver.common.KnownApks()
apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks, False)
fdroidserver.update.translate_per_build_anti_features(apps, apks)
@ -860,16 +860,16 @@ class UpdateTest(unittest.TestCase):
testfile = 'metadata/info.guardianproject.urzip.yml'
# create empty 0 byte .yml file, run read_metadata, it should work
open(testfile, 'a').close()
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
self.assertEqual(1, len(apps))
os.remove(testfile)
# test using internal template
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
self.assertEqual(0, len(apps))
fdroidserver.update.create_metadata_from_template(apk)
self.assertTrue(os.path.exists(testfile))
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
self.assertEqual(1, len(apps))
for app in apps.values():
self.assertEqual('urzip', app['Name'])
@ -882,7 +882,7 @@ class UpdateTest(unittest.TestCase):
shutil.copy(os.path.join(localmodule, 'examples', 'template.yml'), tmptestsdir)
fdroidserver.update.create_metadata_from_template(apk)
self.assertTrue(os.path.exists(testfile))
apps = fdroidserver.metadata.read_metadata(xref=True)
apps = fdroidserver.metadata.read_metadata()
self.assertEqual(1, len(apps))
for app in apps.values():
self.assertEqual('urzip', app['Name'])

View File

@ -1,104 +0,0 @@
Categories:
- Reading
License: GPL-3.0-only
WebSite: http://aarddict.org
SourceCode: https://github.com/aarddict/android
IssueTracker: https://github.com/aarddict/android/issues
Donate: http://aarddict.org/android
FlattrID: '80944'
AutoName: Aard
Description: |-
'''Note:''' This app is no longer maintained.
* looks up words fast even with huge dictionaries like English Wikipedia
* looks up words in multiple dictionaries in multiple languages without switching
* works great as an offline Wikipedia reader
* uses same the efficient, highly compressed dictionary data storage format as the desktop version
* it can integrate with both [[org.geometerplus.zlibrary.ui.android]] and [[org.coolreader]]
Ready-made dictionaries can be found on the website, or you can roll your own
with the tools on the website.
RepoType: git
Repo: https://github.com/aarddict/android.git
Builds:
- versionName: 1.3.1
versionCode: 10
commit: 1.3.1
prebuild: mv lib libs
- versionName: 1.4.0
versionCode: 12
commit: 7df930161256324e31b2c720281629f58446b6d6
prebuild: mv lib libs
- versionName: 1.4.1
versionCode: 13
commit: b81c9c8c52de5f65b550e3c608a610962582e5cd
prebuild: mv lib libs
- versionName: 1.6.1
versionCode: 16
commit: 1.6.1
target: android-17
- versionName: 1.6.2
versionCode: 17
commit: 1.6.2
target: android-17
- versionName: 1.6.3
versionCode: 18
commit: 1.6.3
target: android-17
- versionName: 1.6.4
versionCode: 19
commit: 1.6.4
target: android-17
- versionName: 1.6.5
versionCode: 20
commit: 1.6.5
target: android-17
- versionName: 1.6.6
versionCode: 21
commit: 1.6.6
target: android-17
- versionName: 1.6.7
versionCode: 22
commit: 1.6.7
target: android-17
- versionName: 1.6.8
versionCode: 23
commit: 1.6.8
target: android-17
- versionName: 1.6.9
versionCode: 24
commit: 1.6.9
target: android-17
- versionName: 1.6.10
versionCode: 25
commit: 1.6.10
target: android-17
- versionName: 1.6.11
versionCode: 26
commit: 1.6.11
target: android-17
MaintainerNotes: |-
Github site points to https://github.com/itkach/aard2-android (itkach.aard2) as successor.
We cannot point to this app as all its builds are disabled (as of 2018-10-16).
AutoUpdateMode: Version %v
UpdateCheckMode: Tags
CurrentVersion: 1.6.11
CurrentVersionCode: 26

View File

@ -1,551 +0,0 @@
Categories:
- Reading
License: GPL-2.0-only
AuthorName: Vadim Lopatin
AuthorEmail: coolreader.org@gmail.com
WebSite: https://sourceforge.net/projects/crengine/
SourceCode: https://github.com/buggins/coolreader
IssueTracker: https://github.com/buggins/coolreader/issues
Donate: https://sourceforge.net/p/crengine/donate
AutoName: Cool Reader
Description: |-
An e-book reader. Supported formats: FB2, TXT, RTF, TCR, HTML, EPUB, CHM. Browse
free books online and add your own OPDS shares.
The default dictionary app is non-free. However, you can choose
[[aarddict.android]] as a dictionary from the Dictionary section of the
Settings.
RepoType: git
Repo: https://github.com/buggins/coolreader
Builds:
- versionName: 3.0.39-35
versionCode: 60
commit: 68ad007ac1272ef322fd61cb6591618723422380
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.40-1
versionCode: 64
commit: cr3.0.40-1
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.40-6
versionCode: 69
commit: cr3.0.40-6
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.41-3
versionCode: 75
commit: cr3.0.41-3
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.41-9
versionCode: 81
commit: cr3.0.41-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.42-6
versionCode: 86
commit: cr3.0.42-6
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.43-4
versionCode: 94
commit: cr3.0.43-4
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.43-6
versionCode: 96
commit: cr3.0.43-6
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.44-03
versionCode: 103
commit: cr3.0.44-3
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.44-09
versionCode: 109
commit: cr3.0.44-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-04
versionCode: 114
disable: tag points to wrong version
commit: unknown - see disabled
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-09
versionCode: 119
disable: tag points to wrong version
commit: unknown - see disabled
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-11
versionCode: 121
commit: 6c42a9b65090da9640ccb6ee317bb32de24201fb
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-14
versionCode: 124
commit: cr3.0.45-14
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.46-1
versionCode: 131
commit: cr3.0.46-1
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.46-5
versionCode: 135
commit: cr3.0.46-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.46-11
versionCode: 141
commit: cr3.0.46-11
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.48-5
versionCode: 155
commit: cr3.0.48-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-2
versionCode: 162
commit: cr3.0.49-2
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-5
versionCode: 165
commit: cr3.0.49-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-9
versionCode: 169
commit: cr3.0.49-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-16
versionCode: 176
commit: cr3.0.49-16
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.51-7
versionCode: 197
commit: cr3.0.51-7
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.52-1
versionCode: 241
commit: cr3.0.52-1
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.52-4
versionCode: 244
commit: cr3.0.52-4
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-3
versionCode: 247
commit: cr3.0.53-3
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-10
versionCode: 255
commit: cr3.0.53-10
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-14
versionCode: 259
commit: cr3.0.53-14
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-18
versionCode: 263
commit: c555ecd66d18b218fb255733c8b33a0825992f76
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-19
versionCode: 264
commit: cr3.0.53-19
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-5
versionCode: 275
commit: cr3.0.54-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-9
versionCode: 279
commit: cr3.0.54-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-33
versionCode: 303
commit: cr3.0.54-33
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-38
versionCode: 308
commit: cr3.0.54-38
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-47
versionCode: 447
commit: cr3.0.54-47
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-5
versionCode: 505
commit: cr3.0.55-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-9
versionCode: 509
commit: cr3.0.55-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-14
versionCode: 514
commit: cr3.0.55-14
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-30
versionCode: 530
commit: cr3.0.55-30
subdir: android
rm:
- android/ant.properties
buildjni:
- yes
- versionName: 3.0.55-32
versionCode: 532
commit: cr3.0.55-32
subdir: android
rm:
- android/ant.properties
buildjni:
- yes
- versionName: 3.0.56-5
versionCode: 565
disable: builds ok but crashes at cr3.0.56-5
commit: cr3.0.56-5
subdir: android
rm:
- android/ant.properties
target: android-14
buildjni:
- yes
- versionName: 3.0.57-15
versionCode: 625
disable: builds ok but crashes at cr3.0.57-15
commit: cr3.0.57-15
subdir: android
rm:
- android/ant.properties
target: android-14
buildjni:
- yes
- versionName: 3.0.57-16
versionCode: 626
disable: builds ok but crashes at 2f3d5fb86df316d
commit: 2f3d5fb86df316d
subdir: android
rm:
- android/ant.properties
target: android-14
buildjni:
- yes
- versionName: 3.1.2-27
versionCode: 847
commit: cr3-3.1.2-27
subdir: android
rm:
- android/ant.properties
target: android-16
buildjni:
- yes
- versionName: 3.1.2-38
versionCode: 858
disable: ndk build errors
commit: cr3-3.1.2-38
subdir: android
buildjni:
- yes
- versionName: 3.1.2-39
versionCode: 859
commit: cr3-3.1.2-39-market
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-48
versionCode: 868
commit: cr3.1.2-48
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-50
versionCode: 870
commit: cr3.1.2-50
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-51
versionCode: 871
commit: cr3-3.1.2-51
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-55
versionCode: 875
commit: cr3-3.1.2-55
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-68
versionCode: 888
commit: cr3.1.2-68
subdir: android
rm:
- android/build.properties
target: android-22
buildjni:
- yes
- versionName: 3.1.2-72
versionCode: 892
commit: cr3.1.2-71
subdir: android
rm:
- android/build.properties
prebuild: sed -i -e 's/^APP_ABI\s*:=.*/APP_ABI := all/' jni/Application.mk
target: android-22
buildjni:
- yes
- versionName: 3.1.2-87
versionCode: 907
commit: 1e07d15d4644c690
subdir: android
rm:
- android/build.properties
prebuild: sed -i -e 's/^APP_ABI\s*:=.*/APP_ABI := all/' jni/Application.mk
target: android-22
scanignore:
- cr3wx
buildjni:
- yes
- versionName: 3.2.9-1
versionCode: 2091
commit: bf48e5b7a5e89e5fc8b1f971573b5046e6b27bd3
subdir: android
gradle:
- yes
output: app/build/outputs/apk/release/app-universal-release-unsigned.apk
rm:
- android/build.properties
prebuild: sed -i -e 's/^APP_ABI\s*:=.*/APP_ABI := all/' jni/Application.mk
scanignore:
- cr3wx
ndk: r16b
- versionName: 3.2.38-1
versionCode: 32380
commit: cr3.2.38
subdir: android/app
gradle:
- yes
rm:
- cr3wx/src/resources/crrcconv.exe
prebuild:
- sed -i -e 's/\r//' ../gradle/wrapper/gradle-wrapper.properties
- sed -i -e 's/enable true/enable false/' build.gradle
ndk: r21
AutoUpdateMode: None
UpdateCheckMode: Tags
CurrentVersion: 3.2.39-1
CurrentVersionCode: 32390

View File

@ -1,556 +0,0 @@
AntiFeatures:
- NonFreeAdd
- UpstreamNonFree
Categories:
- Reading
License: GPL-2.0-or-later
AuthorName: Nikolay Pultsin
AuthorEmail: geometer@fbreader.org
AuthorWebSite: https://fbreader.org/
WebSite: https://fbreader.org/FBReaderJ
SourceCode: https://github.com/geometer/FBReaderJ
IssueTracker: https://github.com/geometer/FBReaderJ/issues
Changelog: https://raw.githubusercontent.com/geometer/FBReaderJ/HEAD/ChangeLog
Donate: https://fbreader.org/donation/make.php
AutoName: FBReader
Description: |-
'''N.B'''There are three different apks to cover the different versions of
Android. Donut covers 1.5-1.6; Froyo covers 2.0-2.3 and Honeycomb covers 3.0+.
x86 and MIPS are supported natively in all apks.
An e-book reader. Features include the ability to stock up on books from online
OPDS libraries like Project Gutenberg straight from the app. F-Droid.org has two
other addon apps that provide text-to-speech functionality and one to support
''local'' OPDS shares.
Anti-features: Addons. While there are some addons for this app that are free,
the dictionaries that are suggested are not. However, it does support
[[aarddict.android]], as long as that is installed beforehand '''and''' you
choose it via the Dictionary section of the settings.
RepoType: git
Repo: https://github.com/geometer/FBReaderJ.git
Builds:
- versionName: 0.99.11
versionCode: 9911
commit: 0.99.11
antcommands:
- package
- versionName: 0.99.12
versionCode: 9912
commit: 0.99.12
antcommands:
- package
- versionName: 0.99.15
versionCode: 9915
commit: 0.99.15
antcommands:
- package
- versionName: 0.99.18
versionCode: 9918
commit: 0.99.18
antcommands:
- package
- versionName: 1.0.9
versionCode: 10011
commit: 1.0.9
antcommands:
- package
- versionName: 1.0.11
versionCode: 10013
commit: 1.0.11
antcommands:
- package
- versionName: 1.0.12
versionCode: 10014
commit: fd349108eff9caa9152a
antcommands:
- package
- versionName: 1.1.0
versionCode: 10100
commit: 5eb993e1fac2898d2361
antcommands:
- package
- versionName: 1.1.1
versionCode: 10101
commit: 1.1.1
antcommands:
- package
- versionName: 1.1.2
versionCode: 10102
commit: 1.1.2
antcommands:
- package
- versionName: 1.1.8
versionCode: 101081
commit: 1.1.8
antcommands:
- package
- versionName: 1.1.9
versionCode: 101091
commit: 1.1.9
antcommands:
- package
- versionName: 1.1.10
versionCode: 101101
commit: 13ee5d79431815dd694e
antcommands:
- package
- versionName: 1.2.2
versionCode: 102021
commit: e63c553aeb032da828b270a735f0171d8d22c54c
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.2.3
versionCode: 102031
commit: 46d83bb4351c2f6ec51e0d9aa6202c86c1297e7f
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.2.4
versionCode: 102041
commit: 6426bcf131d4
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.2.6
versionCode: 102061
commit: 1.2.6
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.3.3
versionCode: 103031
commit: 1.3.3
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.3.6
versionCode: 103061
commit: a16e3eb7ff731edea99248f8a7c1633148a26236
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.5.5
versionCode: 105051
commit: 1.5.5
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.6.1
versionCode: 106011
commit: 1.6.1
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.6.4-Donut
versionCode: 106040
commit: af881fe37
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.6.4-Froyo
versionCode: 106041
commit: 696ed7704
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.6.4
versionCode: 106042
commit: b3b4667ccb
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.2-Donut
versionCode: 107019
commit: a4a5e506b
forceversion: true
forcevercode: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.2-Froyo
versionCode: 107020
commit: 33ffc7e5b
forceversion: true
forcevercode: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.2-Honeycomb
versionCode: 107021
commit: 0520159677
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.3-Donut
versionCode: 107040
commit: 2c6253dd
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.3-Froyo
versionCode: 107041
commit: 934bf7f5
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.3-Honeycomb
versionCode: 107042
commit: c4a3c7a9a
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.8-Donut
versionCode: 107080
commit: c1470c9be1
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.8-Froyo
versionCode: 107084
commit: 1.7.8
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.8-Honeycomb
versionCode: 107085
commit: 1.7.8-ics
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.8.2-Donut
versionCode: 108020
commit: 9bec0ff445e66a
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
androidupdate:
- third-party/AmbilWarna
- .
buildjni:
- yes
- versionName: 1.8.2-Froyo
versionCode: 108021
commit: 0f02d4e9232227
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
androidupdate:
- third-party/AmbilWarna
- .
buildjni:
- yes
- versionName: 1.8.2-Honeycomb+
versionCode: 108022
commit: 1112df415d
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
androidupdate:
- third-party/AmbilWarna
- .
buildjni:
- yes
- versionName: 2.0.6-gb
versionCode: 2000610
disable: missing res with android-9
commit: 2.0.6
patch:
- fbreader-2.0.6.patch
srclibs:
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-14
buildjni:
- yes
- versionName: 2.0.6-ics
versionCode: 2000620
commit: b1dd70ff149560889e7548762046da4933e51e94
patch:
- fbreader-2.0.6.patch
srclibs:
- FBReaderJ@2.0.6
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
- sed -i -e '/com.google.android.gms.version/d' -e '/google_play_services/d' AndroidManifest.xml
- sed -i -e '/google.services.lib.dir/d' project.properties
- rm -fR src/org/geometerplus/android/fbreader/network/auth
- cp -fR $$FBReaderJ$$/src/org/geometerplus/android/fbreader/network/auth src/org/geometerplus/android/fbreader/network/
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-14
buildjni:
- yes
- versionName: 2.1-ics
versionCode: 2010020
commit: 33139e2b04ae36388956a57373ba74e8cc0ef23c
patch:
- fbreader-2.0.6.patch
srclibs:
- FBReaderJ@2.1
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
- sed -i -e '/com.google.android.gms.version/d' -e '/google_play_services/d' AndroidManifest.xml
- sed -i -e '/google.services.lib.dir/d' project.properties
- rm -fR src/org/geometerplus/android/fbreader/network/auth
- cp -fR $$FBReaderJ$$/src/org/geometerplus/android/fbreader/network/auth src/org/geometerplus/android/fbreader/network/
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-14
buildjni:
- yes
- versionName: 2.5.9-ics
versionCode: 2050920
commit: 43e14feedf10ad53ec68bf42b1644f488889381c
srclibs:
- FBReaderJ@2.5.9
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
- src/org/geometerplus/android/fbreader/dict/OpenDictionary.java
- src/org/geometerplus/android/fbreader/dict/Lingvo.java
extlibs:
- android/android-support-v4.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- echo 'APP_PLATFORM := android-11' >> jni/Application.mk
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package -Dmaven.javadoc.skip=true
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
- sed -i -e '/com.google.android.gms.version/d' -e '/google_play_services/d' AndroidManifest.xml
- sed -i -e '/google.services.lib.dir/d' project.properties
- mkdir third-party/drag-sort-listview/library/libs
- cp libs/android-support-v4.jar third-party/drag-sort-listview/library/libs/&&
sed -i -e '/Lingvo/d' src/org/geometerplus/android/fbreader/dict/DictionaryUtil.java
- rm -fR src/org/geometerplus/android/fbreader/network/auth
- cp -fR $$FBReaderJ$$/src/org/geometerplus/android/fbreader/network/auth src/org/geometerplus/android/fbreader/network/
- sed -i -e '/^\s*OpenDictionary.collect/d' src/org/geometerplus/android/fbreader/dict/DictionaryUtil.java
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-21
buildjni:
- yes
MaintainerNotes: |-
* LingvoIntegration and OpenDictionary APIs are non-free. Remove jars and patch
depending code. Currently done with rm and sed in prebuilds.
* %v tags are currently targeting gingerbread, but have ressource conflicts
with target=android-9; they build with target=android-14
* %v-ics tags are actually based on the yotaphone branch, so we have to
use raw commits for the ice-cream-sandwich branch (look for "Merge
branch 'master' into ice-cream-sandwich" after a commit with "version
=> ...")
* ics branch uses google play, so we have to sed AM.xml and ant files.
/fbreader/network/ depends on Google Play Services, so these are
removed and replaced with the master branch which does not depend on
these.
* UCM is set to master branch, we don't care for target or device specific
releases.
TODO:
* make gingerbread/master available for android-9!
ArchivePolicy: 6 versions
AutoUpdateMode: None
UpdateCheckMode: Tags ^[0-9.]*$
VercodeOperation: '%c + 10'
CurrentVersion: 2.5.9
CurrentVersionCode: 2050920