mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-11-04 22:40:12 +01:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
185c31a7b0
42
common.py
42
common.py
@ -19,7 +19,7 @@
|
|||||||
import glob, os, sys, re
|
import glob, os, sys, re
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import time
|
||||||
|
|
||||||
def getvcs(vcstype, remote, local):
|
def getvcs(vcstype, remote, local):
|
||||||
if vcstype == 'git':
|
if vcstype == 'git':
|
||||||
@ -782,3 +782,43 @@ def prepare_source(vcs, app, build, build_dir, sdk_path, ndk_path, javacc_path,
|
|||||||
|
|
||||||
return root_dir
|
return root_dir
|
||||||
|
|
||||||
|
|
||||||
|
class KnownApks:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.path = os.path.join('stats', 'known_apks.txt')
|
||||||
|
self.apks = {}
|
||||||
|
if os.path.exists(self.path):
|
||||||
|
for line in file( self.path):
|
||||||
|
t = line.rstrip().split(' ')
|
||||||
|
if len(t) == 2:
|
||||||
|
self.apks[t[0]] = (t[1], None)
|
||||||
|
else:
|
||||||
|
self.apks[t[0]] = (t[1], time.strptime(t[2], '%Y-%m-%d'))
|
||||||
|
self.changed = False
|
||||||
|
|
||||||
|
def writeifchanged(self):
|
||||||
|
if self.changed:
|
||||||
|
if not os.path.exists('stats'):
|
||||||
|
os.mkdir('stats')
|
||||||
|
f = open(self.path, 'w')
|
||||||
|
lst = []
|
||||||
|
for apk, app in self.apks.iteritems():
|
||||||
|
appid, added = app
|
||||||
|
line = apk + ' ' + appid
|
||||||
|
if added:
|
||||||
|
line += ' ' + time.strftime('%Y-%m-%d', added)
|
||||||
|
lst.append(line)
|
||||||
|
for line in sorted(lst):
|
||||||
|
f.write(line + '\n')
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def recordapk(self, apk, app):
|
||||||
|
if not apk in self.apks:
|
||||||
|
self.apks[apk] = (app, time.gmtime(time.time()))
|
||||||
|
self.changed = True
|
||||||
|
|
||||||
|
def getapp(self, apkname):
|
||||||
|
if apkname in self.apks:
|
||||||
|
return self.apks[apkname]
|
||||||
|
return None
|
||||||
|
@ -20,7 +20,9 @@ Build Version:1.9.2,78,v1.9.2
|
|||||||
Build Version:1.9.3.1,80,v1.9.3.1
|
Build Version:1.9.3.1,80,v1.9.3.1
|
||||||
Build Version:1.9.5,82,v1.9.5
|
Build Version:1.9.5,82,v1.9.5
|
||||||
Build Version:1.9.6,83,v1.9.6
|
Build Version:1.9.6,83,v1.9.6
|
||||||
|
Build Version:1.9.7,84,v1.9.7,target=android-8
|
||||||
|
|
||||||
Market Version:1.9.6
|
Update Check Mode:Market
|
||||||
Market Version Code:83
|
Market Version:1.9.7
|
||||||
|
Market Version Code:84
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Category:Office
|
Category:Office
|
||||||
License:Apache2
|
License:Apache2
|
||||||
Web Site:http://evancharlton.com/projects/mileage/
|
Web Site:http://evancharlton.com/projects/mileage/source
|
||||||
Source Code:http://evancharlton.com/projects/mileage/source/
|
Source Code:http://code.google.com/p/android-mileage/source/checkout
|
||||||
Issue Tracker:
|
Issue Tracker:http://code.google.com/p/android-mileage/issues/list
|
||||||
Donate:http://evancharlton.com/donate/
|
Donate:http://evancharlton.com/donate/
|
||||||
|
|
||||||
Summary:A Mileage tracker
|
Summary:A Mileage tracker
|
||||||
@ -12,11 +12,12 @@ exporting of data in various formats, so it is easy to sync with
|
|||||||
your existing logs.
|
your existing logs.
|
||||||
.
|
.
|
||||||
|
|
||||||
Repo Type:hg
|
Repo Type:git
|
||||||
Repo:http://hg.evancharlton.com/mileage
|
Repo:https://code.google.com/p/android-mileage/
|
||||||
|
|
||||||
Build Version:3.0.0,3000,0766c4f352a5,subdir=trunk,oldsdkloc=yes
|
#Apparently no corresponding commit available, since conversion from hg to git
|
||||||
Build Version:3.0.8,3080,!No source in repo
|
#Build Version:3.0.0,3000,0766c4f352a5,subdir=trunk,oldsdkloc=yes
|
||||||
|
Build Version:3.0.8,3080,16b397029a76,subdir=trunk,oldsdkloc=yes
|
||||||
|
|
||||||
Market Version:3.0.8
|
Market Version:3.0.8
|
||||||
Market Version Code:3080
|
Market Version Code:3080
|
||||||
|
@ -12,7 +12,8 @@ A git client - currently read-only.
|
|||||||
Repo Type:git
|
Repo Type:git
|
||||||
Repo:https://github.com/rtyley/agit.git
|
Repo:https://github.com/rtyley/agit.git
|
||||||
|
|
||||||
|
Update Check Mode:Market
|
||||||
#No builds yet - another 'need to figure out how to make maven work' scenario
|
#No builds yet - another 'need to figure out how to make maven work' scenario
|
||||||
Market Version:1.25
|
Market Version:1.27
|
||||||
Market Version Code:110900321
|
Market Version Code:120101721
|
||||||
|
|
||||||
|
@ -12,8 +12,9 @@ TODO/task management based on emacs org-mode files.
|
|||||||
Repo Type:git
|
Repo Type:git
|
||||||
Repo:https://github.com/matburt/mobileorg-android.git
|
Repo:https://github.com/matburt/mobileorg-android.git
|
||||||
|
|
||||||
|
Update Check Mode:Market
|
||||||
#Needs dropbox consumer key
|
#Needs dropbox consumer key
|
||||||
#Build Version:0.5.2,51,38dfe967ee99c71b12b8
|
#Build Version:0.5.2,51,38dfe967ee99c71b12b8
|
||||||
Market Version:0.7.1
|
Market Version:0.7.2
|
||||||
Market Version Code:71
|
Market Version Code:72
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ Description:
|
|||||||
Internet Relay Chat client with a twin-pane view.
|
Internet Relay Chat client with a twin-pane view.
|
||||||
.
|
.
|
||||||
|
|
||||||
Market Version:2011.0622.1
|
Update Check Mode:Market
|
||||||
Market Version Code:201106221
|
Market Version:2012.0117.1
|
||||||
|
Market Version Code:201201171
|
||||||
|
|
||||||
|
@ -19,7 +19,9 @@ Build Version:0.2.5,40,!source has wrong version code at r442,prebuild=mv lib/ l
|
|||||||
Build Version:0.2.11,46,614,prebuild=mv lib/ libs/
|
Build Version:0.2.11,46,614,prebuild=mv lib/ libs/
|
||||||
#Still guessing, see previous comment
|
#Still guessing, see previous comment
|
||||||
Build Version:0.3.1,48,659,prebuild=mv lib/ libs/
|
Build Version:0.3.1,48,659,prebuild=mv lib/ libs/
|
||||||
|
Build Version:0.4.4,54,957,prebuild=mv lib/ libs/
|
||||||
|
|
||||||
Market Version:0.4.3
|
Update Check Mode:Market
|
||||||
Market Version Code:53
|
Market Version:0.4.4
|
||||||
|
Market Version Code:54
|
||||||
|
|
||||||
|
@ -21,8 +21,9 @@ Build Version:1.18,19,0b9985398b9eef7baf6aadd0dbb12002bc199d2e,subdir=org_adaway
|
|||||||
Build Version:1.19,20,ab27f4dab5f3ea5e228cfb4a6b0e1fbf53695f22,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
|
Build Version:1.19,20,ab27f4dab5f3ea5e228cfb4a6b0e1fbf53695f22,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
|
||||||
Build Version:1.20,21,695e3801e4081026c8f7213a2345fc451d5eb89c,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
|
Build Version:1.20,21,695e3801e4081026c8f7213a2345fc451d5eb89c,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
|
||||||
Build Version:1.21,22,65138c11cc8b6affd28b68e125fbc1dff0886a4e,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
|
Build Version:1.21,22,65138c11cc8b6affd28b68e125fbc1dff0886a4e,subdir=org_adaway/,buildjni=yes,patch=defprop.patch
|
||||||
|
Build Version:1.23,24,!no source in repo
|
||||||
|
|
||||||
|
Update Check Mode:Market
|
||||||
Market Version:1.21
|
Market Version:1.23
|
||||||
Market Version Code:22
|
Market Version Code:24
|
||||||
|
|
||||||
|
@ -54,8 +54,9 @@ Build Version:3.0.54-38,308,cr3.0.54-38,subdir=android,rm=android/build.properti
|
|||||||
Build Version:3.0.54-47,447,cr3.0.54-47,subdir=android,rm=android/build.properties,buildjni=yes
|
Build Version:3.0.54-47,447,cr3.0.54-47,subdir=android,rm=android/build.properties,buildjni=yes
|
||||||
Build Version:3.0.55-5,505,cr3.0.55-5,subdir=android,rm=android/build.properties,buildjni=yes
|
Build Version:3.0.55-5,505,cr3.0.55-5,subdir=android,rm=android/build.properties,buildjni=yes
|
||||||
Build Version:3.0.55-9,509,cr3.0.55-9,subdir=android,rm=android/build.properties,buildjni=yes
|
Build Version:3.0.55-9,509,cr3.0.55-9,subdir=android,rm=android/build.properties,buildjni=yes
|
||||||
|
Build Version:3.0.55-14,514,cr3.0.55-14,subdir=android,rm=android/build.properties,buildjni=yes
|
||||||
|
|
||||||
Update Check Mode:Market
|
Update Check Mode:Market
|
||||||
Market Version:3.0.55-9
|
Market Version:3.0.55-14
|
||||||
Market Version Code:509
|
Market Version Code:514
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ License:GPLv3
|
|||||||
Web Site:http://code.google.com/p/notification-plus/
|
Web Site:http://code.google.com/p/notification-plus/
|
||||||
Source Code:https://code.google.com/p/notification-plus/source/browse/
|
Source Code:https://code.google.com/p/notification-plus/source/browse/
|
||||||
Issue Tracker:https://code.google.com/p/notification-plus/issues/list
|
Issue Tracker:https://code.google.com/p/notification-plus/issues/list
|
||||||
Donate:
|
|
||||||
|
|
||||||
Summary:Recurring acoustic notifications
|
Summary:Recurring acoustic notifications
|
||||||
Description:
|
Description:
|
||||||
@ -17,3 +16,7 @@ Repo:https://code.google.com/p/notification-plus/
|
|||||||
|
|
||||||
Build Version:1.1,2,396686558905
|
Build Version:1.1,2,396686558905
|
||||||
|
|
||||||
|
Update Check Mode:Market
|
||||||
|
Market Version:1.1
|
||||||
|
Market Version Code:2
|
||||||
|
|
||||||
|
@ -16,7 +16,9 @@ Repo:http://daap-client.googlecode.com/svn/trunk
|
|||||||
Build Version:.9.1,30,62
|
Build Version:.9.1,30,62
|
||||||
Build Version:.9.2,31,!Repo code is missing at least one file update - the manifest
|
Build Version:.9.2,31,!Repo code is missing at least one file update - the manifest
|
||||||
Build Version:.9.6.2,38,!No corresponding source in repo
|
Build Version:.9.6.2,38,!No corresponding source in repo
|
||||||
|
Build Version:.9.6.5,39,89
|
||||||
|
|
||||||
Market Version:.9.6.2
|
Update Check Mode:Market
|
||||||
Market Version Code:38
|
Market Version:.9.6.5
|
||||||
|
Market Version Code:39
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ Repo:http://android.svn.wordpress.org/trunk/
|
|||||||
Build Version:1.3.9,31,202,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8
|
Build Version:1.3.9,31,202,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8
|
||||||
Build Version:1.4.1,33,228,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8
|
Build Version:1.4.1,33,228,prebuild=mkdir libs && mv *.jar libs && sed -i "s@checkStats(accounts.size());@// MY PRIVACY > YOUR STATS@" src/org/wordpress/android/wpAndroid.java,encoding=utf-8
|
||||||
|
|
||||||
Market Version:2.0.3
|
Update Check Mode:Market
|
||||||
Market Version Code:42
|
Market Version:2.0.4
|
||||||
|
Market Version Code:43
|
||||||
|
|
||||||
|
@ -20,8 +20,9 @@ Personal finance manager
|
|||||||
Repo Type:bzr
|
Repo Type:bzr
|
||||||
Repo:lp:financisto
|
Repo:lp:financisto
|
||||||
|
|
||||||
Market Version:1.5.4u1
|
Update Check Mode:Market
|
||||||
Market Version Code:59
|
Market Version:1.5.5
|
||||||
|
Market Version Code:60
|
||||||
|
|
||||||
# Build fails, wrong path to GreenDroid library
|
# Build fails, wrong path to GreenDroid library
|
||||||
#Build Version:1.5.4,57,303,target=android-4
|
#Build Version:1.5.4,57,303,target=android-4
|
||||||
|
1
stats/.gitignore
vendored
Normal file
1
stats/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
logs/
|
576
stats/known_apks.txt
Normal file
576
stats/known_apks.txt
Normal file
@ -0,0 +1,576 @@
|
|||||||
|
0.2.2.14-alpha-orbot-1.0.4.apk org.torproject.android
|
||||||
|
0.2.2.22-alpha-orbot-1.0.4.1.apk org.torproject.android
|
||||||
|
2010-12-09-OpenSatNav-snapshot-r197.apk org.opensatnav
|
||||||
|
APG-1.0.7-release.apk org.thialfihar.android.apg
|
||||||
|
APG-1.0.8-release.apk org.thialfihar.android.apg
|
||||||
|
AlarmKlock_1.6.apk com.angrydoughnuts.android.alarmclock
|
||||||
|
An.stop_9.apk An.stop
|
||||||
|
AppBak_1.0.apk org.moparisthebest.appbak
|
||||||
|
Aptoide.apk cm.aptoide.pt
|
||||||
|
Aptoide_1.2.0.apk cm.aptoide.pt
|
||||||
|
Aptoide_2.0.apk cm.aptoide.pt
|
||||||
|
Audalyzer_1.14.apk org.hermit.audalyzer
|
||||||
|
BarcodeScanner3.4.apk com.google.zxing.client.android
|
||||||
|
BarcodeScanner3.5.apk com.google.zxing.client.android
|
||||||
|
BarcodeScanner3.51.apk com.google.zxing.client.android
|
||||||
|
BarcodeScanner3.52.apk com.google.zxing.client.android
|
||||||
|
BarcodeScanner3.53.apk com.google.zxing.client.android
|
||||||
|
BarcodeScanner3.6.apk com.google.zxing.client.android
|
||||||
|
BarcodeScanner3.7.apk com.google.zxing.client.android 2011-11-01
|
||||||
|
BarcodeScanner3.72.apk com.google.zxing.client.android 2011-11-15
|
||||||
|
Beem_0.1.4.apk com.beem.project.beem
|
||||||
|
CSipSimple-0.01-01.apk com.csipsimple
|
||||||
|
CSipSimple-0.02-01.apk com.csipsimple
|
||||||
|
CSipSimple-0.02-03.apk com.csipsimple
|
||||||
|
CSipSimple-0.03-00.apk com.csipsimple 2011-11-14
|
||||||
|
CSipSimple-0.03-01.apk com.csipsimple 2011-11-17
|
||||||
|
CSipSimple_0.00-15-06.apk com.csipsimple
|
||||||
|
CSipSimple_0.00-16.apk com.csipsimple
|
||||||
|
ConnectBot_1.7.1.apk org.connectbot
|
||||||
|
Cubed_1.0.67.apk org.abrantix.rockon.rockonnggl
|
||||||
|
Cubed_1.0.68.apk org.abrantix.rockon.rockonnggl
|
||||||
|
DesktopLabel_1.3.0.apk com.serone.desktoplabel
|
||||||
|
DroidLife.apk org.jtb.droidlife
|
||||||
|
FBReaderJ-0.7.11.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.7.13.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.7.14.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.7.16.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.7.17.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.7.5.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.99.2.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.99.4.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.99.7.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FBReaderJ-0.99.9.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
FDroid_0.10.apk org.fdroid.fdroid
|
||||||
|
FDroid_0.11.apk org.fdroid.fdroid
|
||||||
|
FDroid_0.12.apk org.fdroid.fdroid
|
||||||
|
FDroid_0.13.apk org.fdroid.fdroid
|
||||||
|
FDroid_0.14.apk org.fdroid.fdroid
|
||||||
|
FDroid_0.15.apk org.fdroid.fdroid
|
||||||
|
FDroid_0.16.apk org.fdroid.fdroid
|
||||||
|
Jamendo_0.9.9.1.apk com.teleca.jamendo
|
||||||
|
KeePassDroid-1.8.3.apk com.android.keepass
|
||||||
|
KeePassDroid-1.8.5.1.apk com.android.keepass
|
||||||
|
KeePassDroid-1.8.6.0.1.apk com.android.keepass
|
||||||
|
KeePassDroid-1.8.6.4.apk com.android.keepass
|
||||||
|
KeePassDroid-1.8.6.apk com.android.keepass
|
||||||
|
KeePassDroid_1.7.2.apk com.android.keepass
|
||||||
|
LifeSaver2_1.0.apk com.textuality.lifesaver2
|
||||||
|
Mandelbrot2_v0.13_20110313a.apk com.alfray.mandelbrot2
|
||||||
|
MandelbrotMap.apk com.alfray.mandelbrot2
|
||||||
|
MathDoku_1.5.apk net.cactii.mathdoku
|
||||||
|
MathDoku_1.6.apk net.cactii.mathdoku
|
||||||
|
Mathdoku-1.7.apk net.cactii.mathdoku
|
||||||
|
MissileIntercept.apk com.kirit.android.mintercept
|
||||||
|
Mixare_0.5.apk org.mixare
|
||||||
|
MobileC64-1.1.3.apk de.joergjahnke.c64.android
|
||||||
|
MyTracks-1.0.21.apk com.google.android.maps.mytracks
|
||||||
|
MyTracks_1.0.19.apk com.google.android.maps.mytracks
|
||||||
|
MythMote_1.4.0.apk tkj.android.homecontrol.mythmote
|
||||||
|
NetCounter_0.14.1.apk net.jaqpot.netcounter
|
||||||
|
OpenGPSTracker-0.9.20.apk nl.sogeti.android.gpstracker
|
||||||
|
OpenGPSTracker-0.9.21.apk nl.sogeti.android.gpstracker
|
||||||
|
OpenGPSTracker-0.9.22.apk nl.sogeti.android.gpstracker
|
||||||
|
OpenGPSTracker-0.9.23.apk nl.sogeti.android.gpstracker
|
||||||
|
OpenGPSTracker-0.9.24.apk nl.sogeti.android.gpstracker
|
||||||
|
OpenGPSTracker-1.0.apk nl.sogeti.android.gpstracker
|
||||||
|
OpenManager_1.1.2.apk com.nexes.manager
|
||||||
|
OpenSatNav-snapshot-r179.apk org.opensatnav
|
||||||
|
OpenSatNav_0.9.apk org.opensatnav
|
||||||
|
Orbot-1.0.6-Tor-0.2.3.7-alpha-FINAL.apk org.torproject.android 2011-11-14
|
||||||
|
OsmAnd-0.5.1beta-b2.apk net.osmand
|
||||||
|
OsmAnd-0.5.1beta-b3.apk net.osmand
|
||||||
|
Osmdroid_2.0.apk org.andnav.osm
|
||||||
|
PiwikMobile_1.apk org.piwik.mobile
|
||||||
|
Postcode_1.0.apk net.tevp.postcode
|
||||||
|
Postcode_1.1.apk net.tevp.postcode
|
||||||
|
ReplicaIsland_1.3.apk com.replica.replicaisland
|
||||||
|
Ringdroid-2.3.apk com.ringdroid
|
||||||
|
Ringdroid-2.4-rc2.apk com.ringdroid
|
||||||
|
SayMyName_2.5.3.2.apk org.mailboxer.saymyname
|
||||||
|
Scrambled_Net-5.0.apk org.hermit.netscramble
|
||||||
|
Sipdroid-1.6.1.apk org.sipdroid.sipua
|
||||||
|
Sipdroid-2.0.1.apk org.sipdroid.sipua
|
||||||
|
Sipdroid-2.1.apk org.sipdroid.sipua
|
||||||
|
Sipdroid-2.3.apk org.sipdroid.sipua
|
||||||
|
SparseRSS_0.6.2.apk de.shandschuh.sparserss
|
||||||
|
SparseRSS_0.7.1.apk de.shandschuh.sparserss
|
||||||
|
SparseRSS_0.7.2.apk de.shandschuh.sparserss
|
||||||
|
SparseRSS_0.7.apk de.shandschuh.sparserss
|
||||||
|
SparseRSS_0.8.3.apk de.shandschuh.sparserss
|
||||||
|
StatusNet1.0.2.apk net.status.client.mobile
|
||||||
|
SwiFTP_1.24.apk org.swiftp
|
||||||
|
TiltMazes-V1.2.apk com.lecz.android.tiltmazes
|
||||||
|
Timeriffic_v1.09.04_20101120a.apk com.alfray.timeriffic
|
||||||
|
Tricorder_5.11.apk org.hermit.tricorder
|
||||||
|
WhereRing_1.99.0.apk seanfoy.wherering
|
||||||
|
WiFiKeyboard.apk com.volosyukivan
|
||||||
|
XCSoar6.2.4.apk org.xcsoar 2011-12-24
|
||||||
|
XWords4_android_beta_18.apk org.eehouse.android.xw4
|
||||||
|
aarddict.android_10.apk aarddict.android 2012-01-13
|
||||||
|
alogcat-2.1.4.apk org.jtb.alogcat
|
||||||
|
andLess_05202011.apk net.avs234 2011-05-20
|
||||||
|
android.androidVNC_13.apk android.androidVNC
|
||||||
|
androidVNC_build20100725.apk android.androidVNC
|
||||||
|
at.tomtasche.reader_11.apk at.tomtasche.reader
|
||||||
|
at.tomtasche.reader_12.apk at.tomtasche.reader
|
||||||
|
at.tomtasche.reader_15.apk at.tomtasche.reader
|
||||||
|
caldwell.ben.trolly_6.apk caldwell.ben.trolly
|
||||||
|
cmupdaterapp.ui_501.apk cmupdaterapp.ui
|
||||||
|
com.FireFart.Permissions_2.apk com.FireFart.Permissions
|
||||||
|
com.agiro.scanner.android_2.apk com.agiro.scanner.android
|
||||||
|
com.alfray.timeriffic_10903.apk com.alfray.timeriffic
|
||||||
|
com.alfray.timeriffic_10905.apk com.alfray.timeriffic
|
||||||
|
com.andrewshu.android.reddit_67.apk com.andrewshu.android.reddit
|
||||||
|
com.andrewshu.android.reddit_68.apk com.andrewshu.android.reddit
|
||||||
|
com.andrewshu.android.reddit_69.apk com.andrewshu.android.reddit
|
||||||
|
com.andrewshu.android.reddit_70.apk com.andrewshu.android.reddit
|
||||||
|
com.andrewshu.android.reddit_71.apk com.andrewshu.android.reddit
|
||||||
|
com.andrewshu.android.reddit_73.apk com.andrewshu.android.reddit 2011-11-28
|
||||||
|
com.andrewshu.android.reddit_75.apk com.andrewshu.android.reddit 2011-12-02
|
||||||
|
com.andrewshu.android.reddit_76.apk com.andrewshu.android.reddit 2011-12-05
|
||||||
|
com.andrewshu.android.reddit_83.apk com.andrewshu.android.reddit 2012-01-15
|
||||||
|
com.android.inputmethod.norwegian_13.apk com.android.inputmethod.norwegian
|
||||||
|
com.android.inputmethod.norwegian_15.apk com.android.inputmethod.norwegian
|
||||||
|
com.android.keepass_64.apk com.android.keepass
|
||||||
|
com.android.keepass_65.apk com.android.keepass
|
||||||
|
com.android.keepass_76.apk com.android.keepass
|
||||||
|
com.android.keepass_77.apk com.android.keepass
|
||||||
|
com.android.keepass_78.apk com.android.keepass
|
||||||
|
com.android.keepass_80.apk com.android.keepass
|
||||||
|
com.android.keepass_82.apk com.android.keepass
|
||||||
|
com.android.keepass_83.apk com.android.keepass 2011-12-31
|
||||||
|
com.android.keepass_84.apk com.android.keepass 2012-01-19
|
||||||
|
com.angrydoughnuts.android.alarmclock_8.apk com.angrydoughnuts.android.alarmclock
|
||||||
|
com.appengine.paranoid_android.lost_12.apk com.appengine.paranoid_android.lost 2012-01-08
|
||||||
|
com.beem.project.beem_7.apk com.beem.project.beem
|
||||||
|
com.beem.project.beem_9.apk com.beem.project.beem 2012-01-10
|
||||||
|
com.boardgamegeek_20.apk com.boardgamegeek 2011-09-26
|
||||||
|
com.boardgamegeek_21.apk com.boardgamegeek 2011-12-31
|
||||||
|
com.bwx.bequick_201012060.apk com.bwx.bequick
|
||||||
|
com.bwx.bequick_201106160.apk com.bwx.bequick
|
||||||
|
com.bwx.bequick_201107260.apk com.bwx.bequick
|
||||||
|
com.bwx.qs.battery_201010020.apk com.bwx.qs.battery
|
||||||
|
com.chessclock.android_8.apk com.chessclock.android 2012-01-08
|
||||||
|
com.commonsware.android.arXiv_92.apk com.commonsware.android.arXiv
|
||||||
|
com.danga.squeezer_5.apk com.danga.squeezer
|
||||||
|
com.dozingcatsoftware.bouncy_10.apk com.dozingcatsoftware.bouncy
|
||||||
|
com.dozingcatsoftware.bouncy_4.apk com.dozingcatsoftware.bouncy
|
||||||
|
com.eddyspace.networkmonitor_2.apk com.eddyspace.networkmonitor
|
||||||
|
com.eleybourn.bookcatalogue_35.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_36.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_47.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_49.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_51.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_53.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_59.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_61.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_62.apk com.eleybourn.bookcatalogue
|
||||||
|
com.eleybourn.bookcatalogue_68.apk com.eleybourn.bookcatalogue 2011-09-26
|
||||||
|
com.eleybourn.bookcatalogue_69.apk com.eleybourn.bookcatalogue 2011-11-21
|
||||||
|
com.eleybourn.bookcatalogue_70.apk com.eleybourn.bookcatalogue 2011-12-31
|
||||||
|
com.episode6.android.appalarm.lite_30.apk com.episode6.android.appalarm.pro 2012-01-11
|
||||||
|
com.evancharlton.mileage_3000.apk com.evancharlton.mileage
|
||||||
|
com.evancharlton.mileage_3080.apk com.evancharlton.mileage 2012-01-17
|
||||||
|
com.example.android.maxpapers_35.apk com.example.android.maxpapers
|
||||||
|
com.funambol.androidsync_10.apk com.funambol.androidsync
|
||||||
|
com.funambol.androidsync_14.apk com.funambol.androidsync
|
||||||
|
com.funambol.androidsync_15.apk com.funambol.androidsync
|
||||||
|
com.funambol.androidsync_16.apk com.funambol.androidsync
|
||||||
|
com.funambol.androidsync_8.apk com.funambol.androidsync
|
||||||
|
com.funambol.androidsync_9.apk com.funambol.androidsync
|
||||||
|
com.ghostsq.commander_110.apk com.ghostsq.commander
|
||||||
|
com.ghostsq.commander_94.apk com.ghostsq.commander
|
||||||
|
com.ghostsq.commander_97.apk com.ghostsq.commander
|
||||||
|
com.google.android.diskusage_2004.apk com.google.android.diskusage
|
||||||
|
com.google.android.diskusage_2005.apk com.google.android.diskusage
|
||||||
|
com.google.android.diskusage_2103.apk com.google.android.diskusage
|
||||||
|
com.google.android.diskusage_3010.apk com.google.android.diskusage
|
||||||
|
com.google.android.diskusage_3020.apk com.google.android.diskusage 2011-12-08
|
||||||
|
com.google.android.maps.mytracks_23.apk com.google.android.maps.mytracks
|
||||||
|
com.google.code.appsorganizer_162.apk com.google.code.appsorganizer
|
||||||
|
com.google.code.appsorganizer_163.apk com.google.code.appsorganizer
|
||||||
|
com.google.code.appsorganizer_164.apk com.google.code.appsorganizer
|
||||||
|
com.google.code.appsorganizer_166.apk com.google.code.appsorganizer
|
||||||
|
com.google.code.appsorganizer_167.apk com.google.code.appsorganizer 2011-11-28
|
||||||
|
com.googlecode.androidcells_1.apk com.googlecode.androidcells
|
||||||
|
com.googlecode.androidcells_9.apk com.googlecode.androidcells
|
||||||
|
com.googlecode.chartdroid_18.apk com.googlecode.chartdroid
|
||||||
|
com.googlecode.droidwall_146.apk com.googlecode.droidwall
|
||||||
|
com.googlecode.droidwall_148.apk com.googlecode.droidwall
|
||||||
|
com.googlecode.droidwall_153.apk com.googlecode.droidwall 2011-10-03
|
||||||
|
com.googlecode.droidwall_156.apk com.googlecode.droidwall 2011-12-11
|
||||||
|
com.gpl.rpg.AndorsTrail_20.apk com.gpl.rpg.AndorsTrail 2011-10-02
|
||||||
|
com.gpl.rpg.AndorsTrail_25.apk com.gpl.rpg.AndorsTrail 2011-10-24
|
||||||
|
com.ichi2.anki_12.apk com.ichi2.anki
|
||||||
|
com.ichi2.anki_18.apk com.ichi2.anki
|
||||||
|
com.ichi2.anki_20.apk com.ichi2.anki
|
||||||
|
com.ichi2.anki_21.apk com.ichi2.anki 2011-10-03
|
||||||
|
com.ichi2.anki_22.apk com.ichi2.anki 2011-11-27
|
||||||
|
com.jadn.cc_129.apk com.jadn.cc 2012-01-07
|
||||||
|
com.kmagic.solitaire_450.apk com.kmagic.solitaire
|
||||||
|
com.liato.bankdroid_102.apk com.liato.bankdroid
|
||||||
|
com.liato.bankdroid_110.apk com.liato.bankdroid
|
||||||
|
com.liato.bankdroid_120.apk com.liato.bankdroid
|
||||||
|
com.mobilepearls.sokoban_12.apk com.mobilepearls.sokoban
|
||||||
|
com.morphoss.acal_14.apk com.morphoss.acal
|
||||||
|
com.morphoss.acal_15.apk com.morphoss.acal
|
||||||
|
com.morphoss.acal_16.apk com.morphoss.acal
|
||||||
|
com.morphoss.acal_18.apk com.morphoss.acal
|
||||||
|
com.morphoss.acal_27.apk com.morphoss.acal
|
||||||
|
com.morphoss.acal_28.apk com.morphoss.acal
|
||||||
|
com.morphoss.acal_30.apk com.morphoss.acal
|
||||||
|
com.morphoss.acal_32.apk com.morphoss.acal 2011-12-03
|
||||||
|
com.morphoss.acal_33.apk com.morphoss.acal 2011-12-08
|
||||||
|
com.morphoss.acal_34.apk com.morphoss.acal 2011-12-12
|
||||||
|
com.morphoss.acal_35.apk com.morphoss.acal 2012-01-03
|
||||||
|
com.morphoss.acal_36.apk com.morphoss.acal 2012-01-09
|
||||||
|
com.morphoss.acal_37.apk com.morphoss.acal 2012-01-15
|
||||||
|
com.mp3tunes.android.player_89.apk com.mp3tunes.android.player
|
||||||
|
com.nexes.manager_212.apk com.nexes.manager
|
||||||
|
com.nexes.manager_218.apk com.nexes.manager
|
||||||
|
com.nexes.manager_4.apk com.nexes.manager
|
||||||
|
com.proch.practicehub_1.apk com.proch.practicehub 2011-11-25
|
||||||
|
com.replica.replicaisland_14.apk com.replica.replicaisland
|
||||||
|
com.ringdroid_20500.apk com.ringdroid
|
||||||
|
com.roozen.SoundManager_18.apk com.roozen.SoundManager
|
||||||
|
com.smorgasbork.hotdeath_3.apk com.smorgasbork.hotdeath 2011-12-06
|
||||||
|
com.teleca.jamendo_31.apk com.teleca.jamendo
|
||||||
|
com.teleca.jamendo_32.apk com.teleca.jamendo
|
||||||
|
com.teleca.jamendo_33.apk com.teleca.jamendo
|
||||||
|
com.totsp.bookworm_18.apk com.totsp.bookworm
|
||||||
|
com.totsp.bookworm_19.apk com.totsp.bookworm
|
||||||
|
com.totsp.crossword.shortyz_30100.apk com.totsp.crossword.shortyz 2012-01-08
|
||||||
|
com.unitedcoders.android.gpodroid_12.apk com.unitedcoders.android.gpodroid 2012-01-08
|
||||||
|
com.voidcode.diasporawebclient_3.apk com.voidcode.diasporawebclient 2011-12-08
|
||||||
|
com.volosyukivan_23.apk com.volosyukivan
|
||||||
|
com.volosyukivan_25.apk com.volosyukivan
|
||||||
|
com.volosyukivan_26.apk com.volosyukivan
|
||||||
|
com.wanghaus.remembeer_48.apk com.wanghaus.remembeer
|
||||||
|
com.wanghaus.remembeer_50.apk com.wanghaus.remembeer
|
||||||
|
com.webworxshop.swallowcatcher_5.apk com.webworxshop.swallowcatcher
|
||||||
|
com.webworxshop.swallowcatcher_6.apk com.webworxshop.swallowcatcher
|
||||||
|
com.webworxshop.swallowcatcher_7.apk com.webworxshop.swallowcatcher 2011-12-07
|
||||||
|
cz.hejl.chesswalk_7.apk cz.hejl.chesswalk 2012-01-12
|
||||||
|
cz.romario.opensudoku_1104.apk cz.romario.opensudoku 2012-01-12
|
||||||
|
cz.romario.opensudoku_1105.apk cz.romario.opensudoku 2012-01-12
|
||||||
|
de.blau.android.Application_14.apk de.blau.android
|
||||||
|
de.shandschuh.slightbackup_12.apk de.shandschuh.slightbackup
|
||||||
|
de.shandschuh.slightbackup_13.apk de.shandschuh.slightbackup 2011-10-10
|
||||||
|
de.shandschuh.slightbackup_6.apk de.shandschuh.slightbackup
|
||||||
|
de.shandschuh.sparserss_47.apk de.shandschuh.sparserss
|
||||||
|
de.shandschuh.sparserss_50.apk de.shandschuh.sparserss
|
||||||
|
de.shandschuh.sparserss_57.apk de.shandschuh.sparserss
|
||||||
|
de.shandschuh.sparserss_65.apk de.shandschuh.sparserss
|
||||||
|
de.shandschuh.sparserss_68.apk de.shandschuh.sparserss 2011-10-02
|
||||||
|
de.shandschuh.sparserss_69.apk de.shandschuh.sparserss 2011-11-03
|
||||||
|
de.shandschuh.sparserss_70.apk de.shandschuh.sparserss 2011-12-12
|
||||||
|
de.ub0r.android.adBlock_5.apk de.ub0r.android.adBlock
|
||||||
|
dk.andsen.asqlitemanager_7.apk dk.andsen.asqlitemanager 2011-12-05
|
||||||
|
dk.andsen.asqlitemanager_9.apk dk.andsen.asqlitemanager 2011-12-08
|
||||||
|
edu.nyu.cs.omnidroid.app_6.apk edu.nyu.cs.omnidroid.app 2011-10-04
|
||||||
|
edu.rit.poe.atomix_2.apk edu.rit.poe.atomix
|
||||||
|
fennec-5.0.multi.eabi-arm.apk org.mozilla.firefox
|
||||||
|
fennec-6.0.multi.eabi-arm.apk org.mozilla.firefox
|
||||||
|
fm.libre.droid_3.apk fm.libre.droid
|
||||||
|
fm.libre.droid_4.apk fm.libre.droid
|
||||||
|
fr.seeks_4.apk fr.seeks
|
||||||
|
goo.TeaTimer_9.apk goo.TeaTimer
|
||||||
|
gvSIG_Mini_1_0_0_SDK16.apk es.prodevelop.gvsig.mini
|
||||||
|
gvSIG_Mini_1_1_0_SDK16.apk es.prodevelop.gvsig.mini
|
||||||
|
gvSIG_Mini_1_2_2_SDK16-456.apk es.prodevelop.gvsig.mini 2011-03-28
|
||||||
|
httpmon.apk org.jtb.httpmon
|
||||||
|
httpmon_0.4.10.apk org.jtb.httpmon
|
||||||
|
info.guardianproject.browser_3.apk info.guardianproject.browser 2011-12-07
|
||||||
|
info.guardianproject.cacert_3.apk info.guardianproject.cacert 2011-10-03
|
||||||
|
info.guardianproject.cacert_4.apk info.guardianproject.cacert 2011-12-11
|
||||||
|
info.lamatricexiste.network_42.apk info.lamatricexiste.network
|
||||||
|
info.staticfree.android.units_7.apk info.staticfree.android.units
|
||||||
|
info.staticfree.android.units_8.apk info.staticfree.android.units
|
||||||
|
k9-3.200-release.apk com.fsck.k9
|
||||||
|
k9-3.202-release.apk com.fsck.k9
|
||||||
|
k9-3.204-release.apk com.fsck.k9
|
||||||
|
k9-3.206-release.apk com.fsck.k9
|
||||||
|
k9-3.207-release.apk com.fsck.k9
|
||||||
|
k9-3.304-release.apk com.fsck.k9
|
||||||
|
k9-3.307-release.apk com.fsck.k9
|
||||||
|
k9-3.400-release.apk com.fsck.k9
|
||||||
|
k9-3.403-release.apk com.fsck.k9
|
||||||
|
k9-3.593-release.apk com.fsck.k9
|
||||||
|
k9-3.600-release.apk com.fsck.k9
|
||||||
|
k9-3.601-release.apk com.fsck.k9
|
||||||
|
k9-3.603-release.apk com.fsck.k9
|
||||||
|
k9-3.604-release.apk com.fsck.k9
|
||||||
|
k9-3.605-release.apk com.fsck.k9
|
||||||
|
k9-3.800-release.apk com.fsck.k9 2011-05-25
|
||||||
|
k9-4.001-release.apk com.fsck.k9 2011-12-28
|
||||||
|
k9-4.003-release.apk com.fsck.k9 2012-01-08
|
||||||
|
linphone-android-1.0.15.apk org.linphone
|
||||||
|
linphone-android-1.1.6.apk org.linphone
|
||||||
|
linphone-android-1.2.1.apk org.linphone 2011-09-29
|
||||||
|
me.guillaumin.android.osmtracker_20.apk me.guillaumin.android.osmtracker
|
||||||
|
me.guillaumin.android.osmtracker_21.apk me.guillaumin.android.osmtracker 2011-10-02
|
||||||
|
mixare-0061.apk org.mixare
|
||||||
|
mixare-0062.apk org.mixare
|
||||||
|
mixare-0063.apk org.mixare
|
||||||
|
mixedbit.speechtrainer_2.apk mixedbit.speechtrainer 2011-11-28
|
||||||
|
mobileorg-release.apk com.matburt.mobileorg
|
||||||
|
mustard-0.1.10.apk org.mustard.android
|
||||||
|
mustard-0.1.12b.apk org.mustard.android
|
||||||
|
mustard-0.1.12c.apk org.mustard.android
|
||||||
|
mustard-0.1.12f.apk org.mustard.android
|
||||||
|
mustard-0.1.14b.apk org.mustard.android
|
||||||
|
mustard-0.1.9.6-2.apk org.mustard.android
|
||||||
|
mustard-0.1.9.7a.apk org.mustard.android
|
||||||
|
mustard-0.2.0.apk org.mustard.android
|
||||||
|
mustard-0.2.1.apk org.mustard.android 2011-10-29
|
||||||
|
mustard-0.3.0.apk org.mustard.android 2011-12-12
|
||||||
|
mythmote-1.5.1.apk tkj.android.homecontrol.mythmote
|
||||||
|
name.bagi.levente.pedometer_6.apk name.bagi.levente.pedometer
|
||||||
|
navit-0.2.0.apk org.navitproject.navit
|
||||||
|
net.androgames.level_27.apk net.androgames.level 2012-01-11
|
||||||
|
net.bytten.xkcdviewer_15.apk net.bytten.xkcdviewer
|
||||||
|
net.bytten.xkcdviewer_17.apk net.bytten.xkcdviewer
|
||||||
|
net.bytten.xkcdviewer_21.apk net.bytten.xkcdviewer
|
||||||
|
net.cactii.mathdoku_70.apk net.cactii.mathdoku
|
||||||
|
net.fercanet.LNM_3.apk net.fercanet.LNM
|
||||||
|
net.gaast.giggity_4.apk net.gaast.giggity
|
||||||
|
net.mafro.android.wakeonlan_12.apk net.mafro.android.wakeonlan 2011-11-24
|
||||||
|
net.osmand.plus_34.apk net.osmand.plus
|
||||||
|
net.osmand.plus_36.apk net.osmand.plus
|
||||||
|
net.osmand.plus_37.apk net.osmand.plus 2011-09-26
|
||||||
|
net.osmand.plus_39.apk net.osmand.plus 2011-10-07
|
||||||
|
net.osmand.plus_42.apk net.osmand.plus 2011-12-08
|
||||||
|
net.osmand_25.apk net.osmand
|
||||||
|
net.osmand_26.apk net.osmand
|
||||||
|
net.rocrail.androc_219.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_221.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_228.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_230.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_252.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_266.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_273.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_280.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_281.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_284.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_286.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_289.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_315.apk net.rocrail.androc
|
||||||
|
net.rocrail.androc_324.apk net.rocrail.androc 2011-10-10
|
||||||
|
net.sf.andbatdog.batterydog_11.apk net.sf.andbatdog.batterydog
|
||||||
|
net.sourceforge.servestream_35.apk net.sourceforge.servestream
|
||||||
|
net.sourceforge.servestream_46.apk net.sourceforge.servestream
|
||||||
|
net.sourceforge.servestream_48.apk net.sourceforge.servestream
|
||||||
|
net.sourceforge.servestream_54.apk net.sourceforge.servestream 2012-01-19
|
||||||
|
net.sylvek.sharemyposition_16.apk net.sylvek.sharemyposition
|
||||||
|
net.sylvek.sharemyposition_20.apk net.sylvek.sharemyposition 2012-01-10
|
||||||
|
net.tapi.handynotes_1.apk net.tapi.handynotes
|
||||||
|
net.tapi.handynotes_3.apk net.tapi.handynotes
|
||||||
|
net.tedstein.AndroSS_10.apk net.tedstein.AndroSS
|
||||||
|
net.tedstein.AndroSS_13.apk net.tedstein.AndroSS
|
||||||
|
net.tedstein.AndroSS_6.apk net.tedstein.AndroSS
|
||||||
|
net.tedstein.AndroSS_7.apk net.tedstein.AndroSS
|
||||||
|
net.tedstein.AndroSS_8.apk net.tedstein.AndroSS
|
||||||
|
nu.firetech.android.pactrack_1310.apk nu.firetech.android.pactrack
|
||||||
|
org.adaway_13.apk org.adaway 2011-10-17
|
||||||
|
org.adaway_16.apk org.adaway 2011-10-28
|
||||||
|
org.adaway_19.apk org.adaway 2011-11-14
|
||||||
|
org.adaway_20.apk org.adaway 2012-01-10
|
||||||
|
org.adaway_21.apk org.adaway 2012-01-11
|
||||||
|
org.adaway_22.apk org.adaway 2012-01-15
|
||||||
|
org.adw.launcher_34.apk org.adw.launcher 2011-12-05
|
||||||
|
org.androidsoft.games.memory.kids_13.apk org.androidsoft.games.memory.kids 2011-12-08
|
||||||
|
org.coolreader_103.apk org.coolreader
|
||||||
|
org.coolreader_109.apk org.coolreader
|
||||||
|
org.coolreader_121.apk org.coolreader
|
||||||
|
org.coolreader_124.apk org.coolreader
|
||||||
|
org.coolreader_131.apk org.coolreader
|
||||||
|
org.coolreader_135.apk org.coolreader
|
||||||
|
org.coolreader_141.apk org.coolreader
|
||||||
|
org.coolreader_155.apk org.coolreader
|
||||||
|
org.coolreader_162.apk org.coolreader
|
||||||
|
org.coolreader_165.apk org.coolreader
|
||||||
|
org.coolreader_169.apk org.coolreader
|
||||||
|
org.coolreader_176.apk org.coolreader
|
||||||
|
org.coolreader_184.apk org.coolreader
|
||||||
|
org.coolreader_197.apk org.coolreader 2011-10-10
|
||||||
|
org.coolreader_241.apk org.coolreader 2011-11-17
|
||||||
|
org.coolreader_244.apk org.coolreader 2011-11-21
|
||||||
|
org.coolreader_247.apk org.coolreader 2011-11-27
|
||||||
|
org.coolreader_255.apk org.coolreader 2011-11-29
|
||||||
|
org.coolreader_259.apk org.coolreader 2011-12-02
|
||||||
|
org.coolreader_263.apk org.coolreader 2011-12-04
|
||||||
|
org.coolreader_264.apk org.coolreader 2011-12-04
|
||||||
|
org.coolreader_275.apk org.coolreader 2011-12-12
|
||||||
|
org.coolreader_279.apk org.coolreader 2011-12-13
|
||||||
|
org.coolreader_303.apk org.coolreader 2011-12-31
|
||||||
|
org.coolreader_308.apk org.coolreader 2012-01-09
|
||||||
|
org.coolreader_447.apk org.coolreader 2012-01-11
|
||||||
|
org.coolreader_505.apk org.coolreader 2012-01-13
|
||||||
|
org.coolreader_509.apk org.coolreader 2012-01-15
|
||||||
|
org.coolreader_514.apk org.coolreader 2012-01-19
|
||||||
|
org.coolreader_60.apk org.coolreader
|
||||||
|
org.coolreader_64.apk org.coolreader
|
||||||
|
org.coolreader_69.apk org.coolreader
|
||||||
|
org.coolreader_75.apk org.coolreader
|
||||||
|
org.coolreader_81.apk org.coolreader
|
||||||
|
org.coolreader_86.apk org.coolreader
|
||||||
|
org.coolreader_94.apk org.coolreader
|
||||||
|
org.coolreader_96.apk org.coolreader
|
||||||
|
org.curiouscreature.android.shelves_1.apk org.curiouscreature.android.shelves
|
||||||
|
org.damazio.notifier_11.apk org.damazio.notifier
|
||||||
|
org.droidseries_12.apk org.droidseries
|
||||||
|
org.droidseries_13.apk org.droidseries 2011-11-28
|
||||||
|
org.eehouse.android.xw4_26.apk org.eehouse.android.xw4 2012-01-13
|
||||||
|
org.eehouse.android.xw4_30.apk org.eehouse.android.xw4 2012-01-13
|
||||||
|
org.eehouse.android.xw4_31.apk org.eehouse.android.xw4 2012-01-13
|
||||||
|
org.example.pushupbuddy_1.apk org.example.pushupbuddy 2011-10-17
|
||||||
|
org.fdroid.fdroid_10.apk org.fdroid.fdroid
|
||||||
|
org.fdroid.fdroid_11.apk org.fdroid.fdroid
|
||||||
|
org.fdroid.fdroid_12.apk org.fdroid.fdroid
|
||||||
|
org.fdroid.fdroid_13.apk org.fdroid.fdroid
|
||||||
|
org.fdroid.fdroid_14.apk org.fdroid.fdroid 2011-11-09
|
||||||
|
org.fdroid.fdroid_15.apk org.fdroid.fdroid 2011-12-05
|
||||||
|
org.fdroid.fdroid_16.apk org.fdroid.fdroid 2012-01-12
|
||||||
|
org.fdroid.fdroid_8.apk org.fdroid.fdroid
|
||||||
|
org.fdroid.fdroid_9.apk org.fdroid.fdroid
|
||||||
|
org.fdroid.taskstrid_170.apk org.fdroid.taskstrid
|
||||||
|
org.fosdem_4.apk org.fosdem
|
||||||
|
org.geometerplus.zlibrary.ui.android_10011.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_10013.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_10014.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_10100.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_10101.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_10102.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_101081.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_101091.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_101101.apk org.geometerplus.zlibrary.ui.android 2011-11-25
|
||||||
|
org.geometerplus.zlibrary.ui.android_102021.apk org.geometerplus.zlibrary.ui.android 2011-11-25
|
||||||
|
org.geometerplus.zlibrary.ui.android_102031.apk org.geometerplus.zlibrary.ui.android 2011-11-25
|
||||||
|
org.geometerplus.zlibrary.ui.android_102041.apk org.geometerplus.zlibrary.ui.android 2011-12-04
|
||||||
|
org.geometerplus.zlibrary.ui.android_102061.apk org.geometerplus.zlibrary.ui.android 2012-01-06
|
||||||
|
org.geometerplus.zlibrary.ui.android_9903.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_9911.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_9912.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_9915.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.geometerplus.zlibrary.ui.android_9918.apk org.geometerplus.zlibrary.ui.android
|
||||||
|
org.helllabs.android.xmp_15.apk org.helllabs.android.xmp
|
||||||
|
org.jessies.mathdroid_25.apk org.jessies.mathdroid 2011-12-06
|
||||||
|
org.jfedor.frozenbubble_11.apk org.jfedor.frozenbubble
|
||||||
|
org.jfedor.frozenbubble_12.apk org.jfedor.frozenbubble 2011-10-10
|
||||||
|
org.jfedor.frozenbubble_8.apk org.jfedor.frozenbubble
|
||||||
|
org.jfedor.frozenbubble_9.apk org.jfedor.frozenbubble
|
||||||
|
org.jmoyer.NotificationPlus_2.apk org.jmoyer.NotificationPlus 2012-01-15
|
||||||
|
org.johanhil.flygtider_9.apk org.johanhil.flygtider
|
||||||
|
org.jtb.alogcat_34.apk org.jtb.alogcat
|
||||||
|
org.jtb.alogcat_36.apk org.jtb.alogcat
|
||||||
|
org.jtb.alogcat_38.apk org.jtb.alogcat
|
||||||
|
org.jtb.droidlife_21.apk org.jtb.droidlife 2011-11-27
|
||||||
|
org.kost.externalip_3.apk org.kost.externalip 2011-09-26
|
||||||
|
org.kreed.vanilla_16.apk org.kreed.vanilla
|
||||||
|
org.marcus905.wifi.ace_20100924.apk org.marcus905.wifi.ace
|
||||||
|
org.mixare_14.apk org.mixare
|
||||||
|
org.mult.daap_30.apk org.mult.daap
|
||||||
|
org.mult.daap_39.apk org.mult.daap 2012-01-19
|
||||||
|
org.mythdroid_4.apk org.mythdroid
|
||||||
|
org.mythdroid_53.apk org.mythdroid 2012-01-06
|
||||||
|
org.paulmach.textedit_12.apk org.paulmach.textedit
|
||||||
|
org.paulmach.textedit_14.apk org.paulmach.textedit
|
||||||
|
org.penghuang.tools.rotationlock_5.apk org.penghuang.tools.rotationlock 2012-01-11
|
||||||
|
org.pocketworkstation.pckeyboard_1018.apk org.pocketworkstation.pckeyboard
|
||||||
|
org.pocketworkstation.pckeyboard_1020.apk org.pocketworkstation.pckeyboard
|
||||||
|
org.pocketworkstation.pckeyboard_1022.apk org.pocketworkstation.pckeyboard 2011-10-02
|
||||||
|
org.pocketworkstation.pckeyboard_1029.apk org.pocketworkstation.pckeyboard 2012-01-15
|
||||||
|
org.scoutant.blokish_1.apk org.scoutant.blokish
|
||||||
|
org.scoutant.blokish_7.apk org.scoutant.blokish 2011-11-27
|
||||||
|
org.scoutant.blokish_8.apk org.scoutant.blokish 2011-11-27
|
||||||
|
org.scoutant.blokish_9.apk org.scoutant.blokish 2011-12-31
|
||||||
|
org.sixgun.ponyexpress_11.apk org.sixgun.ponyexpress
|
||||||
|
org.sixgun.ponyexpress_12.apk org.sixgun.ponyexpress 2011-11-24
|
||||||
|
org.sixgun.ponyexpress_5.apk org.sixgun.ponyexpress
|
||||||
|
org.sixgun.ponyexpress_8.apk org.sixgun.ponyexpress
|
||||||
|
org.sixgun.ponyexpress_9.apk org.sixgun.ponyexpress
|
||||||
|
org.sparkleshare.android_1.apk org.sparkleshare.android 2012-01-02
|
||||||
|
org.thoughtcrime.securesms_21.apk org.thoughtcrime.securesms 2012-01-02
|
||||||
|
org.tomdroid_6.apk org.tomdroid
|
||||||
|
org.ttrssreader_1000.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1002.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1023.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1032.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1040.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1050.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1074.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1075.apk org.ttrssreader
|
||||||
|
org.ttrssreader_1210.apk org.ttrssreader 2011-11-24
|
||||||
|
org.ttrssreader_1220.apk org.ttrssreader 2012-01-02
|
||||||
|
org.ttrssreader_807.apk org.ttrssreader
|
||||||
|
org.ttrssreader_840.apk org.ttrssreader
|
||||||
|
org.ttrssreader_850.apk org.ttrssreader
|
||||||
|
org.ttrssreader_860.apk org.ttrssreader
|
||||||
|
org.ttrssreader_880.apk org.ttrssreader
|
||||||
|
org.ttrssreader_892.apk org.ttrssreader
|
||||||
|
org.ttrssreader_911.apk org.ttrssreader
|
||||||
|
org.ttrssreader_931.apk org.ttrssreader
|
||||||
|
org.ttrssreader_973.apk org.ttrssreader
|
||||||
|
org.vudroid_3.apk org.vudroid
|
||||||
|
org.vudroid_4.apk org.vudroid
|
||||||
|
org.vudroid_5.apk org.vudroid
|
||||||
|
org.wahtod.wififixer_620.apk org.wahtod.wififixer
|
||||||
|
org.wahtod.wififixer_758.apk org.wahtod.wififixer
|
||||||
|
org.wahtod.wififixer_759.apk org.wahtod.wififixer
|
||||||
|
org.wahtod.wififixer_760.apk org.wahtod.wififixer
|
||||||
|
org.wahtod.wififixer_770.apk org.wahtod.wififixer
|
||||||
|
org.wahtod.wififixer_822.apk org.wahtod.wififixer
|
||||||
|
org.wahtod.wififixer_838.apk org.wahtod.wififixer
|
||||||
|
org.wordpress.android_31.apk org.wordpress.android
|
||||||
|
org.wordpress.android_33.apk org.wordpress.android
|
||||||
|
org.xbmc.android.remote_730.apk org.xbmc.android.remote
|
||||||
|
org.xbmc.android.remote_768.apk org.xbmc.android.remote
|
||||||
|
org.yaaic_10.apk org.yaaic
|
||||||
|
org.yaaic_11.apk org.yaaic
|
||||||
|
org.yaaic_9.apk org.yaaic
|
||||||
|
org.yaxim.androidclient_10.apk org.yaxim.androidclient 2011-09-26
|
||||||
|
org.yaxim.androidclient_11.apk org.yaxim.androidclient 2011-10-03
|
||||||
|
org.yaxim.androidclient_5.apk org.yaxim.androidclient
|
||||||
|
org.yaxim.androidclient_6.apk org.yaxim.androidclient
|
||||||
|
org.yaxim.androidclient_7.apk org.yaxim.androidclient
|
||||||
|
org.yaxim.androidclient_8.apk org.yaxim.androidclient
|
||||||
|
org.yaxim.androidclient_9.apk org.yaxim.androidclient
|
||||||
|
org.zirco_10.apk org.zirco
|
||||||
|
org.zirco_11.apk org.zirco
|
||||||
|
org.zirco_12.apk org.zirco
|
||||||
|
org.zirco_13.apk org.zirco
|
||||||
|
org.zirco_15.apk org.zirco 2011-10-10
|
||||||
|
org.zirco_16.apk org.zirco 2011-12-12
|
||||||
|
org.zirco_17.apk org.zirco 2012-01-08
|
||||||
|
pl.magot.vetch.ancal_32.apk pl.magot.vetch.ancal
|
||||||
|
regalandroid-1.0.0-20101204.212606-5.apk net.dahanne.android.regalandroid
|
||||||
|
regalandroid-1.0.1-aligned.apk net.dahanne.android.regalandroid
|
||||||
|
remuco.client.android_1.apk remuco.client.android 2012-01-08
|
||||||
|
ru.gelin.android.weather.notification_23.apk ru.gelin.android.weather.notification 2011-12-11
|
||||||
|
se.johanhil.clipboard_2.apk se.johanhil.clipboard
|
||||||
|
se.johanhil.duckduckgo_1.apk se.johanhil.duckduckgo
|
||||||
|
se.peterbjorkman.android.trafikinfo_12.apk se.peterbjorkman.android.trafikinfo
|
||||||
|
se.peterbjorkman.android.trafikinfo_13.apk se.peterbjorkman.android.trafikinfo
|
||||||
|
sms-backup-plus-v1.2.apk com.zegoggles.smssync
|
||||||
|
sms-backup-plus-v1.3.2.apk com.zegoggles.smssync
|
||||||
|
sms-backup-plus-v1.3.3.apk com.zegoggles.smssync
|
||||||
|
sms-backup-plus-v1.3.4.apk com.zegoggles.smssync
|
||||||
|
sms-backup-plus-v1.3.7.apk com.zegoggles.smssync
|
||||||
|
sms-backup-plus-v1.4.0.apk com.zegoggles.smssync
|
||||||
|
talkmyphone-2.06-beta.apk com.googlecode.talkmyphone
|
||||||
|
to.networld.android.divedroid_1.apk to.networld.android.divedroid
|
||||||
|
transdroid-0.22.0.apk org.transdroid
|
||||||
|
transdroid-0.22.2.apk org.transdroid
|
||||||
|
transdroid-0.22.3.apk org.transdroid
|
||||||
|
transdroid-1.0.4.apk org.transdroid 2011-05-24
|
||||||
|
transdroid-1.1.0-beta.apk org.transdroid 2011-10-21
|
||||||
|
tuioDroid.impl_4.apk tuioDroid.impl 2011-11-28
|
||||||
|
tuxrider_1.0.4.apk com.drodin.tuxrider
|
||||||
|
urbanstew.RehearsalAssistant_22.apk urbanstew.RehearsalAssistant
|
||||||
|
vu.de.urpool.quickdroid_31.apk vu.de.urpool.quickdroid
|
||||||
|
vu.de.urpool.quickdroid_37.apk vu.de.urpool.quickdroid
|
||||||
|
vu.de.urpool.quickdroid_38.apk vu.de.urpool.quickdroid
|
||||||
|
yaaic-0.5.apk org.yaaic
|
||||||
|
yaaic-0.6.1.apk org.yaaic
|
||||||
|
yaaic-0.6.apk org.yaaic
|
@ -79,6 +79,9 @@ apks = []
|
|||||||
for apkfile in glob.glob(os.path.join('repo','*.apk')):
|
for apkfile in glob.glob(os.path.join('repo','*.apk')):
|
||||||
|
|
||||||
apkfilename = apkfile[5:]
|
apkfilename = apkfile[5:]
|
||||||
|
if apkfilename.find(' ') != -1:
|
||||||
|
print "No spaces in APK filenames!"
|
||||||
|
sys.exit(1)
|
||||||
srcfilename = apkfilename[:-4] + "_src.tar.gz"
|
srcfilename = apkfilename[:-4] + "_src.tar.gz"
|
||||||
|
|
||||||
if not options.quiet:
|
if not options.quiet:
|
||||||
@ -460,6 +463,12 @@ if repo_keyalias != None:
|
|||||||
iconfilename = os.path.join(icon_dir, os.path.basename(repo_icon))
|
iconfilename = os.path.join(icon_dir, os.path.basename(repo_icon))
|
||||||
shutil.copyfile(repo_icon, iconfilename)
|
shutil.copyfile(repo_icon, iconfilename)
|
||||||
|
|
||||||
|
#Update known apks info...
|
||||||
|
knownapks = common.KnownApks()
|
||||||
|
for apk in apks:
|
||||||
|
knownapks.recordapk(apk['apkname'], apk['id'])
|
||||||
|
knownapks.writeifchanged()
|
||||||
|
|
||||||
print "Finished."
|
print "Finished."
|
||||||
print str(apps_inrepo) + " apps in repo"
|
print str(apps_inrepo) + " apps in repo"
|
||||||
print str(apps_disabled) + " disabled"
|
print str(apps_disabled) + " disabled"
|
||||||
|
133
updatestats.py
Executable file
133
updatestats.py
Executable file
@ -0,0 +1,133 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# updatestats.py - part of the FDroid server tools
|
||||||
|
# Copyright (C) 2010-12, Ciaran Gultnieks, ciaran@ciarang.com
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import re
|
||||||
|
import urllib
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
|
import glob
|
||||||
|
from optparse import OptionParser
|
||||||
|
import HTMLParser
|
||||||
|
import paramiko
|
||||||
|
import common
|
||||||
|
|
||||||
|
#Read configuration...
|
||||||
|
execfile('config.py')
|
||||||
|
|
||||||
|
|
||||||
|
# Parse command line...
|
||||||
|
parser = OptionParser()
|
||||||
|
parser.add_option("-v", "--verbose", action="store_true", default=False,
|
||||||
|
help="Spew out even more information than normal")
|
||||||
|
parser.add_option("-d", "--download", action="store_true", default=False,
|
||||||
|
help="Download logs we don't have")
|
||||||
|
(options, args) = parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
statsdir = 'stats'
|
||||||
|
logsdir = os.path.join(statsdir, 'logs')
|
||||||
|
logsarchivedir = os.path.join(logsdir, 'archive')
|
||||||
|
datadir = os.path.join(statsdir, 'data')
|
||||||
|
if not os.path.exists(statsdir):
|
||||||
|
os.mkdir(statsdir)
|
||||||
|
if not os.path.exists(logsdir):
|
||||||
|
os.mkdir(logsdir)
|
||||||
|
if not os.path.exists(datadir):
|
||||||
|
os.mkdir(datadir)
|
||||||
|
|
||||||
|
if options.download:
|
||||||
|
# Get any access logs we don't have...
|
||||||
|
ssh = None
|
||||||
|
ftp = None
|
||||||
|
try:
|
||||||
|
print 'Retrieving logs'
|
||||||
|
ssh = paramiko.SSHClient()
|
||||||
|
ssh.load_system_host_keys()
|
||||||
|
ssh.connect('f-droid.org', username='fdroid', timeout=10,
|
||||||
|
key_filename=webserver_keyfile)
|
||||||
|
ftp = ssh.open_sftp()
|
||||||
|
ftp.get_channel().settimeout(15)
|
||||||
|
print "...connected"
|
||||||
|
|
||||||
|
ftp.chdir('logs')
|
||||||
|
files = ftp.listdir()
|
||||||
|
for file in files:
|
||||||
|
if file.startswith('access-') and file.endswith('.log'):
|
||||||
|
|
||||||
|
destpath = os.path.join(logsdir, file)
|
||||||
|
archivepath = os.path.join(logsarchivedir, file + '.gz')
|
||||||
|
if os.path.exists(archivepath):
|
||||||
|
if os.path.exists(destpath):
|
||||||
|
# Just in case we have it archived but failed to remove
|
||||||
|
# the original...
|
||||||
|
os.remove(destpath)
|
||||||
|
else:
|
||||||
|
destsize = ftp.stat(file).st_size
|
||||||
|
if (not os.path.exists(destpath) or
|
||||||
|
os.path.getsize(destpath) != destsize):
|
||||||
|
print "...retrieving " + file
|
||||||
|
ftp.get(file, destpath)
|
||||||
|
except Exception as e:
|
||||||
|
traceback.print_exc()
|
||||||
|
sys.exit(1)
|
||||||
|
finally:
|
||||||
|
#Disconnect
|
||||||
|
if ftp != None:
|
||||||
|
ftp.close()
|
||||||
|
if ssh != None:
|
||||||
|
ssh.close()
|
||||||
|
|
||||||
|
# Process logs
|
||||||
|
logexpr = '(?P<ip>[.:0-9a-fA-F]+) - - \[(?P<time>.*?)\] "GET (?P<uri>.*?) HTTP/1.\d" (?P<statuscode>\d+) \d+ "(?P<referral>.*?)" "(?P<useragent>.*?)"'
|
||||||
|
logsearch = re.compile(logexpr).search
|
||||||
|
apps = {}
|
||||||
|
unknownapks = []
|
||||||
|
knownapks = common.KnownApks()
|
||||||
|
for logfile in glob.glob(os.path.join(logsdir,'access-*.log')):
|
||||||
|
logdate = logfile[len(logsdir) + 1 + len('access-'):-4]
|
||||||
|
matches = (logsearch(line) for line in file(logfile))
|
||||||
|
for match in matches:
|
||||||
|
if match and match.group('statuscode') == '200':
|
||||||
|
uri = match.group('uri')
|
||||||
|
if uri.endswith('.apk'):
|
||||||
|
_, apkname = os.path.split(uri)
|
||||||
|
app = knownapks.getapp(apkname)
|
||||||
|
if app:
|
||||||
|
appid, _ = app
|
||||||
|
if appid in apps:
|
||||||
|
apps[appid] += 1
|
||||||
|
else:
|
||||||
|
apps[appid] = 1
|
||||||
|
else:
|
||||||
|
if not apkname in unknownapks:
|
||||||
|
unknownapks.append(apkname)
|
||||||
|
|
||||||
|
for app, count in apps.iteritems():
|
||||||
|
print app + " " + str(count)
|
||||||
|
|
||||||
|
if len(unknownapks) > 0:
|
||||||
|
print '\nUnknown apks:'
|
||||||
|
for apk in unknownapks:
|
||||||
|
print apk
|
||||||
|
|
||||||
|
print "Finished."
|
||||||
|
|
1639
wp-fdroid/AndroidManifest.xml
Normal file
1639
wp-fdroid/AndroidManifest.xml
Normal file
File diff suppressed because it is too large
Load Diff
114
wp-fdroid/android-permissions.php
Normal file
114
wp-fdroid/android-permissions.php
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
<?php
|
||||||
|
// Class that provides PHP-friendly android permissions information from the raw Andoid source XML files that describes the permissions.
|
||||||
|
class AndroidPermissions
|
||||||
|
{
|
||||||
|
|
||||||
|
// Path to the AndroidManifest.xml-file from the Android source. Get it from https://raw.github.com/android/platform_frameworks_base/master/core/res/AndroidManifest.xml for example.
|
||||||
|
private $android_manifest_file_path;
|
||||||
|
// Path to the strings.xml-file from the Android source. Get it from https://raw.github.com/android/platform_frameworks_base/master/core/res/res/values/strings.xml for example.
|
||||||
|
private $android_strings_file_path;
|
||||||
|
// Path to the file where the resulting permissions data will be cached. NOTE: Must be writable by PHP!
|
||||||
|
private $cache_file_path;
|
||||||
|
|
||||||
|
public function __construct($android_manifest_file_path_in = 'AndroidManifest.xml', $android_strings_file_path_in = 'strings.xml', $cache_file_path_in = 'android-permissions.cache') {
|
||||||
|
$this->android_manifest_file_path = $android_manifest_file_path_in;
|
||||||
|
$this->android_strings_file_path = $android_strings_file_path_in;
|
||||||
|
$this->cache_file_path = $cache_file_path_in;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns an associative array with android permissions and data about them
|
||||||
|
function get_permissions_array() {
|
||||||
|
|
||||||
|
// Check status of cache
|
||||||
|
$android_manifest_file_stat = stat($this->android_manifest_file_path);
|
||||||
|
$android_manifest_file_mtime = $android_manifest_file_stat['mtime'];
|
||||||
|
$android_strings_file_stat = stat($this->android_strings_file_path);
|
||||||
|
$android_strings_file_mtime = $android_strings_file_stat['mtime'];
|
||||||
|
$cache_file_mtime = 0;
|
||||||
|
if(file_exists($this->cache_file_path)) {
|
||||||
|
$cache_file_stat = stat($this->cache_file_path);
|
||||||
|
$cache_file_mtime = $cache_file_stat['mtime'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the cache is fresh, use it instead
|
||||||
|
if($android_manifest_file_mtime < $cache_file_mtime && $android_strings_file_mtime < $cache_file_mtime ) {
|
||||||
|
$cache_file_handle = fopen($this->cache_file_path, 'r');
|
||||||
|
$cache_file_content = fread($cache_file_handle, filesize($this->cache_file_path));
|
||||||
|
fclose($cache_file_handle);
|
||||||
|
|
||||||
|
$permissions = unserialize($cache_file_content);
|
||||||
|
|
||||||
|
return $permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are updating the cache, touch the file (note: race condition possible between stating the cache file above and this line...)
|
||||||
|
touch($this->cache_file_path);
|
||||||
|
|
||||||
|
// Get permission raw data from XML
|
||||||
|
$manifestDoc = new DOMDocument;
|
||||||
|
$manifestDoc->load($this->android_manifest_file_path);
|
||||||
|
$manifestXpath = new DOMXPath($manifestDoc);
|
||||||
|
|
||||||
|
$stringsDoc = new DOMDocument;
|
||||||
|
$stringsDoc->load($this->android_strings_file_path);
|
||||||
|
$stringsXpath = new DOMXPath($stringsDoc);
|
||||||
|
|
||||||
|
$comment = '';
|
||||||
|
foreach ($manifestXpath->query('node()') as $node) {
|
||||||
|
// Save permissions and permission groups from tags
|
||||||
|
if($node->nodeName == 'permission-group' || $node->nodeName == 'permission') {
|
||||||
|
$name = $node->attributes->getNamedItem('name')->value;
|
||||||
|
$name = substr(strrchr($name,'.'), 1);
|
||||||
|
|
||||||
|
// Lookup the human readable title
|
||||||
|
$labelObject = $node->attributes->getNamedItem('label');
|
||||||
|
$labelString = $name;
|
||||||
|
if( $labelObject !== NULL ) {
|
||||||
|
$labelName = substr(strrchr($labelObject->value,'/'),1);
|
||||||
|
$labelStringObject = $stringsXpath->query('//string[@name="'.$labelName.'"]');
|
||||||
|
$labelString = ucfirst($labelStringObject->item(0)->nodeValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lookup the human readable description
|
||||||
|
$descriptionObject = $node->attributes->getNamedItem('description');
|
||||||
|
$descriptionString = '(Description missing)';
|
||||||
|
if($descriptionObject !== NULL) {
|
||||||
|
$descriptionName = substr(strrchr($descriptionObject->value,'/'),1);
|
||||||
|
$descriptionStringObject = $stringsXpath->query('//string[@name="'.$descriptionName.'"]');
|
||||||
|
$descriptionString = ucfirst($descriptionStringObject->item(0)->nodeValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
$permissions[$node->nodeName][$name]['label'] = stripslashes($labelString);
|
||||||
|
$permissions[$node->nodeName][$name]['description'] = stripslashes($descriptionString);
|
||||||
|
$permissions[$node->nodeName][$name]['comment'] = stripslashes(str_replace(array("\r\n", "\r", "\n", "\t", ' '), '', $comment));
|
||||||
|
|
||||||
|
if($node->nodeName == 'permission') {
|
||||||
|
$permissionGroupObject = $node->attributes->getNamedItem('permissionGroup');
|
||||||
|
$permissionGroup = 'none';
|
||||||
|
if($permissionGroupObject !== NULL) {
|
||||||
|
$permissionGroup = substr(strrchr($permissionGroupObject->value,'.'), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$permissions[$node->nodeName][$name]['permissionGroup'] = $permissionGroup;
|
||||||
|
$permissions[$node->nodeName][$name]['protectionLevel'] = $node->attributes->getNamedItem('protectionLevel')->value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache descriptions from comments preceding the tags
|
||||||
|
if($node->nodeName == '#comment') {
|
||||||
|
$comment .= $node->textContent;
|
||||||
|
}
|
||||||
|
elseif($node->nodeName != '#text') {
|
||||||
|
$comment = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update cache with serialized permissions
|
||||||
|
$cache_file_handle = fopen($this->cache_file_path, 'w');
|
||||||
|
fwrite($cache_file_handle, serialize($permissions));
|
||||||
|
fclose($cache_file_handle);
|
||||||
|
|
||||||
|
return $permissions;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
3389
wp-fdroid/strings.xml
Normal file
3389
wp-fdroid/strings.xml
Normal file
File diff suppressed because it is too large
Load Diff
@ -12,441 +12,542 @@ Revision history
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
include('android-permissions.php');
|
||||||
|
|
||||||
class FDroid
|
class FDroid
|
||||||
{
|
{
|
||||||
|
|
||||||
// Our text domain, for internationalisation
|
// Our text domain, for internationalisation
|
||||||
private $textdom='wp-fdroid';
|
private $textdom='wp-fdroid';
|
||||||
|
|
||||||
private $site_path;
|
private $site_path;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
function FDroid() {
|
function FDroid() {
|
||||||
// Add filters etc here!
|
// Add filters etc here!
|
||||||
add_shortcode('fdroidrepo',array($this, 'do_shortcode'));
|
add_shortcode('fdroidrepo',array($this, 'do_shortcode'));
|
||||||
add_filter('query_vars',array($this, 'queryvars'));
|
add_filter('query_vars',array($this, 'queryvars'));
|
||||||
$this->inited=false;
|
$this->inited=false;
|
||||||
$this->site_path=getenv('DOCUMENT_ROOT');
|
$this->site_path=getenv('DOCUMENT_ROOT');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Register additional query variables. (Handler for the 'query_vars' filter)
|
// Register additional query variables. (Handler for the 'query_vars' filter)
|
||||||
function queryvars($qvars) {
|
function queryvars($qvars) {
|
||||||
$qvars[]='fdfilter';
|
$qvars[]='fdfilter';
|
||||||
$qvars[]='fdid';
|
$qvars[]='fdid';
|
||||||
$qvars[]='fdpage';
|
$qvars[]='fdpage';
|
||||||
$qvars[]='fdstyle';
|
$qvars[]='fdstyle';
|
||||||
return $qvars;
|
return $qvars;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Lazy initialise. All non-trivial members should call this before doing anything else.
|
// Lazy initialise. All non-trivial members should call this before doing anything else.
|
||||||
function lazyinit() {
|
function lazyinit() {
|
||||||
if(!$this->inited) {
|
if(!$this->inited) {
|
||||||
load_plugin_textdomain($this->textdom, PLUGINDIR.'/'.dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__)));
|
load_plugin_textdomain($this->textdom, PLUGINDIR.'/'.dirname(plugin_basename(__FILE__)), dirname(plugin_basename(__FILE__)));
|
||||||
|
|
||||||
$this->inited=true;
|
$this->inited=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets a required query parameter by name.
|
// Gets a required query parameter by name.
|
||||||
function getrequiredparam($name) {
|
function getrequiredparam($name) {
|
||||||
global $wp_query;
|
global $wp_query;
|
||||||
if(!isset($wp_query->query_vars[$name]))
|
if(!isset($wp_query->query_vars[$name]))
|
||||||
wp_die("Missing parameter ".$name,"Error");
|
wp_die("Missing parameter ".$name,"Error");
|
||||||
return $wp_query->query_vars[$name];
|
return $wp_query->query_vars[$name];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handler for the 'fdroidrepo' shortcode.
|
// Handler for the 'fdroidrepo' shortcode.
|
||||||
// $attribs - shortcode attributes
|
// $attribs - shortcode attributes
|
||||||
// $content - optional content enclosed between the starting and
|
// $content - optional content enclosed between the starting and
|
||||||
// ending shortcode
|
// ending shortcode
|
||||||
// Returns the generated content.
|
// Returns the generated content.
|
||||||
function do_shortcode($attribs,$content=null) {
|
function do_shortcode($attribs,$content=null) {
|
||||||
global $wp_query,$wp_rewrite;
|
global $wp_query,$wp_rewrite;
|
||||||
$this->lazyinit();
|
$this->lazyinit();
|
||||||
|
|
||||||
|
// Init local query vars
|
||||||
|
foreach($this->queryvars(array()) as $qv) {
|
||||||
|
if(array_key_exists($qv,$wp_query->query_vars)) {
|
||||||
|
$query_vars[$qv] = $wp_query->query_vars[$qv];
|
||||||
|
} else {
|
||||||
|
$query_vars[$qv] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Santiy check query vars
|
||||||
|
if(!isset($query_vars['fdpage']) || !is_numeric($query_vars['fdpage']) || $query_vars['fdpage'] <= 0) {
|
||||||
|
$query_vars['fdpage'] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out = '';
|
||||||
|
|
||||||
|
if(isset($attribs['search']) && $query_vars['fdfilter']===null) {
|
||||||
|
$query_vars['fdfilter'] = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if($query_vars['fdid']!==null) {
|
||||||
|
$out.=$this->get_app($query_vars);
|
||||||
|
} else {
|
||||||
|
if($query_vars['fdfilter'] !== null)
|
||||||
|
$out.=$this->show_search($query_vars);
|
||||||
|
|
||||||
|
$out.=$this->get_apps($query_vars);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Init local query vars
|
function get_app($query_vars) {
|
||||||
foreach($this->queryvars(array()) as $qv) {
|
global $permissions_data;
|
||||||
if(array_key_exists($qv,$wp_query->query_vars)) {
|
$permissions_object = new AndroidPermissions($this->site_path.'/wp-content/plugins/wp-fdroid/AndroidManifest.xml',
|
||||||
$query_vars[$qv] = $wp_query->query_vars[$qv];
|
$this->site_path.'/wp-content/plugins/wp-fdroid/strings.xml',
|
||||||
} else {
|
sys_get_temp_dir().'/android-permissions.cache');
|
||||||
$query_vars[$qv] = null;
|
$permissions_data = $permissions_object->get_permissions_array();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Santiy check query vars
|
$xml = simplexml_load_file($this->site_path.'/repo/index.xml');
|
||||||
if(!isset($query_vars['fdpage']) || !is_numeric($query_vars['fdpage']) || $query_vars['fdpage'] <= 0) {
|
foreach($xml->children() as $app) {
|
||||||
$query_vars['fdpage'] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
$out = '';
|
$attrs=$app->attributes();
|
||||||
|
if($attrs['id']==$query_vars['fdid']) {
|
||||||
|
$apks=array();;
|
||||||
|
foreach($app->children() as $el) {
|
||||||
|
switch($el->getName()) {
|
||||||
|
case "name":
|
||||||
|
$name=$el;
|
||||||
|
break;
|
||||||
|
case "icon":
|
||||||
|
$icon=$el;
|
||||||
|
break;
|
||||||
|
case "summary":
|
||||||
|
$summary=$el;
|
||||||
|
break;
|
||||||
|
case "description":
|
||||||
|
$desc=$el;
|
||||||
|
break;
|
||||||
|
case "license":
|
||||||
|
$license=$el;
|
||||||
|
break;
|
||||||
|
case "source":
|
||||||
|
$source=$el;
|
||||||
|
break;
|
||||||
|
case "tracker":
|
||||||
|
$issues=$el;
|
||||||
|
break;
|
||||||
|
case "donate":
|
||||||
|
$donate=$el;
|
||||||
|
break;
|
||||||
|
case "web":
|
||||||
|
$web=$el;
|
||||||
|
break;
|
||||||
|
case "package":
|
||||||
|
$thisapk=array();
|
||||||
|
foreach($el->children() as $pel) {
|
||||||
|
switch($pel->getName()) {
|
||||||
|
case "version":
|
||||||
|
$thisapk['version']=$pel;
|
||||||
|
break;
|
||||||
|
case "vercode":
|
||||||
|
$thisapk['vercode']=$pel;
|
||||||
|
break;
|
||||||
|
case "apkname":
|
||||||
|
$thisapk['apkname']=$pel;
|
||||||
|
break;
|
||||||
|
case "srcname":
|
||||||
|
$thisapk['srcname']=$pel;
|
||||||
|
break;
|
||||||
|
case "hash":
|
||||||
|
$thisapk['hash']=$pel;
|
||||||
|
break;
|
||||||
|
case "size":
|
||||||
|
$thisapk['size']=$pel;
|
||||||
|
break;
|
||||||
|
case "sdkver":
|
||||||
|
$thisapk['sdkver']=$pel;
|
||||||
|
break;
|
||||||
|
case "permissions":
|
||||||
|
$thisapk['permissions']=$pel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$apks[]=$thisapk;
|
||||||
|
|
||||||
if(isset($attribs['search']) && $query_vars['fdfilter']===null) {
|
}
|
||||||
$query_vars['fdfilter'] = '';
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if($query_vars['fdid']!==null) {
|
$out='<div id="appheader">';
|
||||||
$out.=$this->get_app($query_vars);
|
$out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$icon.'" width=48></div>';
|
||||||
} else {
|
$out.='<p><span style="font-size:20px">'.$name."</span>";
|
||||||
if($query_vars['fdfilter'] !== null)
|
$out.="<br>".$summary."</p>";
|
||||||
$out.=$this->show_search($query_vars);
|
$out.="</div>";
|
||||||
|
|
||||||
$out.=$this->get_apps($query_vars);
|
$out.="<p>".$desc."</p>";
|
||||||
}
|
|
||||||
return $out;
|
|
||||||
|
|
||||||
}
|
$out.="<p><b>License:</b> ".$license."</p>";
|
||||||
|
|
||||||
|
$out.="<p>";
|
||||||
|
if(strlen($web)>0)
|
||||||
|
$out.='<b>Website:</b> <a href="'.$web.'">'.$web.'</a><br />';
|
||||||
|
if(strlen($issues)>0)
|
||||||
|
$out.='<b>Issue Tracker:</b> <a href="'.$issues.'">'.$issues.'</a><br />';
|
||||||
|
if(strlen($source)>0)
|
||||||
|
$out.='<b>Source Code:</b> <a href="'.$source.'">'.$source.'</a><br />';
|
||||||
|
if($donate && strlen($donate)>0)
|
||||||
|
$out.='<b>Donate:</b> <a href="'.$donate.'">'.$donate.'</a><br />';
|
||||||
|
$out.="</p>";
|
||||||
|
|
||||||
|
$out.='<script type="text/javascript">';
|
||||||
|
$out.='function showHidePermissions(id) {';
|
||||||
|
$out.=' if(document.getElementById(id).style.display==\'none\')';
|
||||||
|
$out.=' document.getElementById(id).style.display=\'block\';';
|
||||||
|
$out.=' else';
|
||||||
|
$out.=' document.getElementById(id).style.display=\'none\';';
|
||||||
|
$out.=' return false;';
|
||||||
|
$out.='}';
|
||||||
|
$out.='</script>';
|
||||||
|
|
||||||
|
$out.="<h3>Packages</h3>";
|
||||||
|
$i=0;
|
||||||
|
foreach($apks as $apk) {
|
||||||
|
$out.="<p><b>Version ".$apk['version']."</b><br />";
|
||||||
|
$out.='<a href="http://f-droid.org/repo/'.$apk['apkname'].'">download apk</a> ';
|
||||||
|
$out.=$apk['size']." bytes";
|
||||||
|
if($apk['srcname'])
|
||||||
|
$out.='<br><a href="http://f-droid.org/repo/'.$apk['srcname'].'">source tarball</a>';
|
||||||
|
|
||||||
|
if(isset($apk['permissions'])) {
|
||||||
|
/*if($i==0)
|
||||||
|
$divStyleDisplay='block';
|
||||||
|
else*/
|
||||||
|
$divStyleDisplay='none';
|
||||||
|
$divId='permissions'.$i;
|
||||||
|
$out.='<br /><a href="javascript:void(0);" onClick="showHidePermissions(\''.$divId.'\');">view permissions</a><br/>';
|
||||||
|
$out.='<div style="display:'.$divStyleDisplay.';" id="'.$divId.'">';
|
||||||
|
$permissions = explode(',',$apk['permissions']);
|
||||||
|
usort($permissions, "permissions_cmp");
|
||||||
|
|
||||||
|
$permission_group_last = '';
|
||||||
|
foreach($permissions as $permission) {
|
||||||
|
$permission_group = $permissions_data['permission'][$permission]['permissionGroup'];
|
||||||
|
if($permission_group != $permission_group_last) {
|
||||||
|
$permission_group_label = $permissions_data['permission-group'][$permission_group]['label'];
|
||||||
|
if($permission_group_label=='') $permission_group_label = 'Extra/Custom';
|
||||||
|
$out.='<strong>'.strtoupper($permission_group_label).'</strong><br/>';
|
||||||
|
$permission_group_last = $permission_group;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out.=$this->get_permission_protection_level_icon($permissions_data['permission'][$permission]['protectionLevel']).' ';
|
||||||
|
$out.='<strong>'.$permissions_data['permission'][$permission]['label'].'</strong> [<code>'.$permission.'</code>]<br/>';
|
||||||
|
if($permissions_data['permission'][$permission]['description']) $out.=$permissions_data['permission'][$permission]['description'].'<br/>';
|
||||||
|
//$out.=$permissions_data['permission'][$permission]['comment'].'<br/>';
|
||||||
|
$out.='<br/>';
|
||||||
|
}
|
||||||
|
$out.='</div>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$out.='<br /><span style="color:#999999;">no permissions</span><br />';
|
||||||
|
}
|
||||||
|
|
||||||
|
$out.='</p>';
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$out.='<hr><p><a href="'.makelink($query_vars,array('fdid'=>null)).'">Index</a></p>';
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "<p>Application not found</p>";
|
||||||
|
}
|
||||||
|
|
||||||
|
private function get_permission_protection_level_icon($protection_level) {
|
||||||
|
if($protection_level=='dangerous') {
|
||||||
|
return '<span style="color:#DD9900;font-size:150%;">⚠</span>';
|
||||||
|
}
|
||||||
|
elseif($protection_level=='normal') {
|
||||||
|
return '<span style="color:#6666FF;font-size:110%;">ⓘ</span>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return '<span style="color:#33AA33;font-size:130%;">⚙</span>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_apps($query_vars) {
|
||||||
|
|
||||||
|
$xml = simplexml_load_file($this->site_path."/repo/index.xml");
|
||||||
|
$matches = $this->show_apps($xml,$query_vars,$numpages);
|
||||||
|
|
||||||
|
$out='';
|
||||||
|
|
||||||
|
if(($query_vars['fdfilter']===null || $query_vars['fdfilter']!='') && $numpages>0)
|
||||||
|
{
|
||||||
|
$out.='<div style="float:left;">';
|
||||||
|
if($query_vars['fdfilter']===null)
|
||||||
|
$out.="All applications";
|
||||||
|
else
|
||||||
|
$out.='Applications matching "'.$query_vars['fdfilter'].'"';
|
||||||
|
$out.="</div>";
|
||||||
|
|
||||||
|
$out.='<div style="float:right;">';
|
||||||
|
$out.='<a href="'.makelink($query_vars, array('fdstyle'=>'list','fdpage'=>'1')).'">List</a> | ';
|
||||||
|
$out.='<a href="'.makelink($query_vars, array('fdstyle'=>'grid','fdpage'=>'1')).'">Grid</a>';
|
||||||
|
$out.='</div>';
|
||||||
|
|
||||||
|
$out.='<br break="all"/>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if($numpages>0) {
|
||||||
|
$out.=$matches;
|
||||||
|
|
||||||
|
$out.='<hr><p>';
|
||||||
|
|
||||||
|
$out.='<div style="width:20%; float:left; text-align:left;">';
|
||||||
|
$out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' ';
|
||||||
|
$out.='</div>';
|
||||||
|
|
||||||
|
$out.='<div style="width:60%; float:left; text-align:center;">';
|
||||||
|
if($numpages>1) {
|
||||||
|
for($i=1;$i<=$numpages;$i++) {
|
||||||
|
if($i == $query_vars['fdpage']) {
|
||||||
|
$out.='<b>'.$i.'</b>';
|
||||||
|
} else {
|
||||||
|
$out.='<a href="'.makelink($query_vars, array('fdpage'=>$i)).'">';
|
||||||
|
$out.=$i;
|
||||||
|
$out.='</a>';
|
||||||
|
}
|
||||||
|
$out.=' ';
|
||||||
|
}
|
||||||
|
$out.=' ';
|
||||||
|
}
|
||||||
|
$out.='</div>';
|
||||||
|
|
||||||
|
$out.='<div style="width:20%; float:left; text-align:right;">';
|
||||||
|
if($query_vars['fdpage']!=$numpages) {
|
||||||
|
$out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']+1))).'">next></a> ';
|
||||||
|
}
|
||||||
|
$out.='</div>';
|
||||||
|
|
||||||
|
$out.='</p>';
|
||||||
|
} else if($query_vars['fdfilter']!='') {
|
||||||
|
$out.='<p>No matches</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function get_app($query_vars) {
|
function show_search($query_vars) {
|
||||||
|
|
||||||
$xml = simplexml_load_file($this->site_path."/repo/index.xml");
|
$out='';
|
||||||
foreach($xml->children() as $app) {
|
$out.='<form name="searchform" action="" method="get">';
|
||||||
|
$out.='<p><input name="fdfilter" type="text" value="'.$query_vars['fdfilter'].'" size="30"> ';
|
||||||
|
$out.='<input type="submit" value="Search"></p>';
|
||||||
|
|
||||||
$attrs=$app->attributes();
|
$out.='<input type="hidden" name="page_id" value="'.get_query_var('page_id').'">';
|
||||||
if($attrs['id']==$query_vars['fdid']) {
|
foreach($query_vars as $name => $value) {
|
||||||
$apks=array();;
|
if($value !== null && $name != 'fdfilter')
|
||||||
foreach($app->children() as $el) {
|
$out.='<input type="hidden" name="'.$name.'" value="'.$value.'">';
|
||||||
switch($el->getName()) {
|
}
|
||||||
case "name":
|
|
||||||
$name=$el;
|
|
||||||
break;
|
|
||||||
case "icon":
|
|
||||||
$icon=$el;
|
|
||||||
break;
|
|
||||||
case "summary":
|
|
||||||
$summary=$el;
|
|
||||||
break;
|
|
||||||
case "description":
|
|
||||||
$desc=$el;
|
|
||||||
break;
|
|
||||||
case "license":
|
|
||||||
$license=$el;
|
|
||||||
break;
|
|
||||||
case "source":
|
|
||||||
$source=$el;
|
|
||||||
break;
|
|
||||||
case "tracker":
|
|
||||||
$issues=$el;
|
|
||||||
break;
|
|
||||||
case "donate":
|
|
||||||
$donate=$el;
|
|
||||||
break;
|
|
||||||
case "web":
|
|
||||||
$web=$el;
|
|
||||||
break;
|
|
||||||
case "package":
|
|
||||||
$thisapk=array();
|
|
||||||
foreach($el->children() as $pel) {
|
|
||||||
switch($pel->getName()) {
|
|
||||||
case "version":
|
|
||||||
$thisapk['version']=$pel;
|
|
||||||
break;
|
|
||||||
case "vercode":
|
|
||||||
$thisapk['vercode']=$pel;
|
|
||||||
break;
|
|
||||||
case "apkname":
|
|
||||||
$thisapk['apkname']=$pel;
|
|
||||||
break;
|
|
||||||
case "srcname":
|
|
||||||
$thisapk['srcname']=$pel;
|
|
||||||
break;
|
|
||||||
case "hash":
|
|
||||||
$thisapk['hash']=$pel;
|
|
||||||
break;
|
|
||||||
case "size":
|
|
||||||
$thisapk['size']=$pel;
|
|
||||||
break;
|
|
||||||
case "sdkver":
|
|
||||||
$thisapk['sdkver']=$pel;
|
|
||||||
break;
|
|
||||||
case "permissions":
|
|
||||||
$thisapk['permissions']=$pel;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$apks[]=$thisapk;
|
|
||||||
|
|
||||||
}
|
$out.='</form>'."\n";
|
||||||
}
|
|
||||||
|
|
||||||
$out='<div id="appheader">';
|
return $out;
|
||||||
$out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$icon.'" width=48></div>';
|
}
|
||||||
$out.='<p><span style="font-size:20px">'.$name."</span>";
|
|
||||||
$out.="<br>".$summary."</p>";
|
|
||||||
$out.="</div>";
|
|
||||||
|
|
||||||
$out.="<p>".$desc."</p>";
|
|
||||||
|
|
||||||
$out.="<p><b>License:</b> ".$license."</p>";
|
|
||||||
|
|
||||||
$out.="<p>";
|
|
||||||
if(strlen($web)>0)
|
|
||||||
$out.='<b>Website:</b> <a href="'.$web.'">'.$web.'</a><br />';
|
|
||||||
if(strlen($issues)>0)
|
|
||||||
$out.='<b>Issue Tracker:</b> <a href="'.$issues.'">'.$issues.'</a><br />';
|
|
||||||
if(strlen($source)>0)
|
|
||||||
$out.='<b>Source Code:</b> <a href="'.$source.'">'.$source.'</a><br />';
|
|
||||||
if($donate && strlen($donate)>0)
|
|
||||||
$out.='<b>Donate:</b> <a href="'.$donate.'">'.$donate.'</a><br />';
|
|
||||||
$out.="</p>";
|
|
||||||
|
|
||||||
$out.="<h3>Packages</h3>";
|
|
||||||
foreach($apks as $apk) {
|
|
||||||
$out.="<p><b>Version ".$apk['version']."</b> - ";
|
|
||||||
$out.='<a href="http://f-droid.org/repo/'.$apk['apkname'].'">download</a> ';
|
|
||||||
$out.=$apk['size']." bytes";
|
|
||||||
if($apk['srcname'])
|
|
||||||
$out.='<br><a href="http://f-droid.org/repo/'.$apk['srcname'].'">source tarball</a>';
|
|
||||||
$out.="</p>";
|
|
||||||
}
|
|
||||||
|
|
||||||
$out.='<hr><p><a href="'.makelink($query_vars,array('fdid'=>null)).'">Index</a></p>';
|
|
||||||
|
|
||||||
return $out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "<p>Application not found</p>";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function get_apps($query_vars) {
|
function show_apps($xml,$query_vars,&$numpages) {
|
||||||
|
|
||||||
$xml = simplexml_load_file($this->site_path."/repo/index.xml");
|
$skipped=0;
|
||||||
$matches = $this->show_apps($xml,$query_vars,$numpages);
|
$got=0;
|
||||||
|
$total=0;
|
||||||
|
|
||||||
$out='';
|
if($query_vars['fdstyle']=='grid') {
|
||||||
|
$outputter = new FDOutGrid();
|
||||||
|
} else {
|
||||||
|
$outputter = new FDOutList();
|
||||||
|
}
|
||||||
|
|
||||||
if(($query_vars['fdfilter']===null || $query_vars['fdfilter']!='') && $numpages>0)
|
$out = "";
|
||||||
{
|
|
||||||
$out.='<div style="float:left;">';
|
|
||||||
if($query_vars['fdfilter']===null)
|
|
||||||
$out.="All applications";
|
|
||||||
else
|
|
||||||
$out.='Applications matching "'.$query_vars['fdfilter'].'"';
|
|
||||||
$out.="</div>";
|
|
||||||
|
|
||||||
$out.='<div style="float:right;">';
|
$out.=$outputter->outputStart();
|
||||||
$out.='<a href="'.makelink($query_vars, array('fdstyle'=>'list','fdpage'=>'1')).'">List</a> | ';
|
|
||||||
$out.='<a href="'.makelink($query_vars, array('fdstyle'=>'grid','fdpage'=>'1')).'">Grid</a>';
|
|
||||||
$out.='</div>';
|
|
||||||
|
|
||||||
$out.='<br break="all"/>';
|
foreach($xml->children() as $app) {
|
||||||
}
|
|
||||||
|
|
||||||
if($numpages>0) {
|
if($app->getName() == 'repo') continue;
|
||||||
$out.=$matches;
|
$appinfo['attrs']=$app->attributes();
|
||||||
|
$appinfo['id']=$appinfo['attrs']['id'];
|
||||||
|
foreach($app->children() as $el) {
|
||||||
|
switch($el->getName()) {
|
||||||
|
case "name":
|
||||||
|
$appinfo['name']=$el;
|
||||||
|
break;
|
||||||
|
case "icon":
|
||||||
|
$appinfo['icon']=$el;
|
||||||
|
break;
|
||||||
|
case "summary":
|
||||||
|
$appinfo['summary']=$el;
|
||||||
|
break;
|
||||||
|
case "description":
|
||||||
|
$appinfo['description']=$el;
|
||||||
|
break;
|
||||||
|
case "license":
|
||||||
|
$appinfo['license']=$el;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$out.='<hr><p>';
|
if($query_vars['fdfilter']===null || $query_vars['fdfilter']!='' && (stristr($appinfo['name'],$query_vars['fdfilter']) || stristr($appinfo['summary'],$query_vars['fdfilter']) || stristr($appinfo['description'],$query_vars['fdfilter']))) {
|
||||||
if($query_vars['fdpage']==1) {
|
if($skipped<($query_vars['fdpage']-1)*$outputter->perpage) {
|
||||||
$out.="<<first ";
|
$skipped++;
|
||||||
$out.="<prev ";
|
} else if($got<$outputter->perpage) {
|
||||||
} else {
|
$out.=$outputter->outputEntry($query_vars, $appinfo);
|
||||||
$out.='<a href="'.makelink($query_vars, array('fdpage'=>1)).'"><<first</a> ';
|
$got++;
|
||||||
$out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']-1))).'"><<prev</a> ';
|
}
|
||||||
}
|
$total++;
|
||||||
$out.=' Page '.$query_vars['fdpage'].' of '.$numpages.' ';
|
}
|
||||||
if($query_vars['fdpage']==$numpages) {
|
|
||||||
$out.="next> ";
|
|
||||||
$out.="last>> ";
|
|
||||||
} else {
|
|
||||||
$out.='<a href="'.makelink($query_vars, array('fdpage'=>($query_vars['fdpage']+1))).'">next></a> ';
|
|
||||||
$out.='<a href="'.makelink($query_vars, array('fdpage'=>$numpages)).'">last>></a> ';
|
|
||||||
}
|
|
||||||
$out.='</p>';
|
|
||||||
} else if($query_vars['fdfilter']!='') {
|
|
||||||
$out.='<p>No matches</p>';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $out;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
$out.=$outputter->outputEnd();
|
||||||
|
|
||||||
function show_search($query_vars) {
|
$numpages = ceil((float)$total/$outputter->perpage);
|
||||||
|
|
||||||
$out='';
|
return $out;
|
||||||
$out.='<form name="searchform" action="" method="get">';
|
}
|
||||||
$out.='<p><input name="fdfilter" type="text" value="'.$query_vars['fdfilter'].'" size="30"> ';
|
|
||||||
$out.='<input type="submit" value="Search"></p>';
|
|
||||||
|
|
||||||
$out.='<input type="hidden" name="page_id" value="'.get_query_var('page_id').'">';
|
|
||||||
foreach($query_vars as $name => $value) {
|
|
||||||
if($value !== null && $name != 'fdfilter')
|
|
||||||
$out.='<input type="hidden" name="'.$name.'" value="'.$value.'">';
|
|
||||||
}
|
|
||||||
|
|
||||||
$out.='</form>'."\n";
|
|
||||||
|
|
||||||
return $out;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function show_apps($xml,$query_vars,&$numpages) {
|
|
||||||
|
|
||||||
$skipped=0;
|
|
||||||
$got=0;
|
|
||||||
$total=0;
|
|
||||||
|
|
||||||
if($query_vars['fdstyle']=='grid') {
|
|
||||||
$outputter = new FDOutGrid();
|
|
||||||
} else {
|
|
||||||
$outputter = new FDOutList();
|
|
||||||
}
|
|
||||||
|
|
||||||
$out = "";
|
|
||||||
|
|
||||||
$out.=$outputter->outputStart();
|
|
||||||
|
|
||||||
foreach($xml->children() as $app) {
|
|
||||||
|
|
||||||
if($app->getName() == 'repo') continue;
|
|
||||||
$appinfo['attrs']=$app->attributes();
|
|
||||||
$appinfo['id']=$appinfo['attrs']['id'];
|
|
||||||
foreach($app->children() as $el) {
|
|
||||||
switch($el->getName()) {
|
|
||||||
case "name":
|
|
||||||
$appinfo['name']=$el;
|
|
||||||
break;
|
|
||||||
case "icon":
|
|
||||||
$appinfo['icon']=$el;
|
|
||||||
break;
|
|
||||||
case "summary":
|
|
||||||
$appinfo['summary']=$el;
|
|
||||||
break;
|
|
||||||
case "license":
|
|
||||||
$appinfo['license']=$el;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($query_vars['fdfilter']===null || $query_vars['fdfilter']!='' && (stristr($appinfo['name'],$query_vars['fdfilter']) || stristr($appinfo['summary'],$query_vars['fdfilter']))) {
|
|
||||||
if($skipped<($query_vars['fdpage']-1)*$outputter->perpage) {
|
|
||||||
$skipped++;
|
|
||||||
} else if($got<$outputter->perpage) {
|
|
||||||
$out.=$outputter->outputEntry($query_vars, $appinfo);
|
|
||||||
$got++;
|
|
||||||
}
|
|
||||||
$total++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$out.=$outputter->outputEnd();
|
|
||||||
|
|
||||||
$numpages = ceil((float)$total/$outputter->perpage);
|
|
||||||
|
|
||||||
return $out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Class to output app entries in a detailed list format
|
// Class to output app entries in a detailed list format
|
||||||
class FDOutList
|
class FDOutList
|
||||||
{
|
{
|
||||||
var $perpage=30;
|
var $perpage=30;
|
||||||
|
|
||||||
function FDOutList() {
|
function FDOutList() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputStart() {
|
function outputStart() {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputEntry($query_vars, $appinfo) {
|
function outputEntry($query_vars, $appinfo) {
|
||||||
$out="";
|
$out="";
|
||||||
$out.="<hr>\n";
|
$out.="<hr>\n";
|
||||||
$out.='<div id="appheader">';
|
$out.='<div id="appheader">';
|
||||||
|
|
||||||
$out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;"></div>';
|
$out.='<div style="float:left;padding-right:10px;"><img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;"></div>';
|
||||||
|
|
||||||
$out.='<div style="float:right;">';
|
$out.='<div style="float:right;">';
|
||||||
$out.='<p><a href="';
|
$out.='<p><a href="';
|
||||||
$out.=makelink($query_vars, array('fdid'=>$appinfo['id']));
|
$out.=makelink($query_vars, array('fdid'=>$appinfo['id']));
|
||||||
$out.='">Details...</a>';
|
$out.='">Details...</a>';
|
||||||
$out.="</p>";
|
$out.="</p>";
|
||||||
$out.="</div>\n";
|
$out.="</div>\n";
|
||||||
|
|
||||||
$out.='<p><span style="font-size:20px">'.$appinfo['name']."</span>";
|
$out.='<p><span style="font-size:20px">'.$appinfo['name']."</span>";
|
||||||
$out.="<br>".$appinfo['summary']."</p>\n";
|
$out.="<br>".$appinfo['summary']."</p>\n";
|
||||||
|
|
||||||
$out.="</div>\n";
|
$out.="</div>\n";
|
||||||
|
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputEnd() {
|
function outputEnd() {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Class to output app entries in a compact grid format
|
// Class to output app entries in a compact grid format
|
||||||
class FDOutGrid
|
class FDOutGrid
|
||||||
{
|
{
|
||||||
var $perpage=80;
|
var $perpage=80;
|
||||||
|
|
||||||
var $itemCount = 0;
|
var $itemCount = 0;
|
||||||
|
|
||||||
function FDOutGrid() {
|
function FDOutGrid() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputStart() {
|
function outputStart() {
|
||||||
return "\n".'<table border="0" width="100%"><tr>'."\n";
|
return "\n".'<table border="0" width="100%"><tr>'."\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputEntry($query_vars, $appinfo) {
|
function outputEntry($query_vars, $appinfo) {
|
||||||
$link=makelink($query_vars, array('fdid'=>$appinfo['id']));
|
$link=makelink($query_vars, array('fdid'=>$appinfo['id']));
|
||||||
|
|
||||||
$out='';
|
$out='';
|
||||||
|
|
||||||
if($this->itemCount%4 == 0 && $this->itemCount > 0)
|
if($this->itemCount%4 == 0 && $this->itemCount > 0)
|
||||||
{
|
{
|
||||||
$out.='</tr><tr>'."\n";
|
$out.='</tr><tr>'."\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
$out.='<td align="center" valign="top" style="background-color:#F8F8F8;">';
|
$out.='<td align="center" valign="top" style="background-color:#F8F8F8;">';
|
||||||
$out.='<p>';
|
$out.='<p>';
|
||||||
$out.='<div id="appheader" style="text-align:center;width:110px;">';
|
$out.='<div id="appheader" style="text-align:center;width:110px;">';
|
||||||
|
|
||||||
$out.='<a href="'.$link.'" style="border-bottom-style:none;">';
|
$out.='<a href="'.$link.'" style="border-bottom-style:none;">';
|
||||||
$out.='<img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;border-width:0;padding-top:5px;padding-bottom:5px;"><br/>';
|
$out.='<img src="http://f-droid.org/repo/icons/'.$appinfo['icon'].'" style="width:48px;border-width:0;padding-top:5px;padding-bottom:5px;"><br/>';
|
||||||
$out.=$appinfo['name'].'<br/>';
|
$out.=$appinfo['name'].'<br/>';
|
||||||
$out.='</a>';
|
$out.='</a>';
|
||||||
|
|
||||||
$out.="</div>";
|
$out.="</div>";
|
||||||
$out.='</p>';
|
$out.='</p>';
|
||||||
$out.="</td>\n";
|
$out.="</td>\n";
|
||||||
|
|
||||||
$this->itemCount++;
|
$this->itemCount++;
|
||||||
return $out;
|
return $out;
|
||||||
}
|
}
|
||||||
|
|
||||||
function outputEnd() {
|
function outputEnd() {
|
||||||
return '</tr></table>'."\n";
|
return '</tr></table>'."\n";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function permissions_cmp($a, $b) {
|
||||||
|
global $permissions_data;
|
||||||
|
|
||||||
|
$aProtectionLevel = $permissions_data['permission'][$a]['protectionLevel'];
|
||||||
|
$bProtectionLevel = $permissions_data['permission'][$b]['protectionLevel'];
|
||||||
|
|
||||||
|
if($aProtectionLevel != $bProtectionLevel) {
|
||||||
|
if(strlen($aProtectionLevel)==0) return 1;
|
||||||
|
if(strlen($bProtectionLevel)==0) return -1;
|
||||||
|
|
||||||
|
return strcmp($aProtectionLevel, $bProtectionLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
$aGroup = $permissions_data['permission'][$a]['permissionGroup'];
|
||||||
|
$bGroup = $permissions_data['permission'][$b]['permissionGroup'];
|
||||||
|
|
||||||
|
if($aGroup != $bGroup) {
|
||||||
|
return strcmp($aGroup, $bGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
return strcmp($a, $b);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make a link to this page, with the current query vars attached and desired params added/modified
|
// Make a link to this page, with the current query vars attached and desired params added/modified
|
||||||
function makelink($query_vars, $params=array()) {
|
function makelink($query_vars, $params=array()) {
|
||||||
$link=get_permalink();
|
$link=get_permalink();
|
||||||
$vars=linkify(array_merge($query_vars, $params));
|
$vars=linkify(array_merge($query_vars, $params));
|
||||||
if(strlen($vars)==0)
|
if(strlen($vars)==0)
|
||||||
return $link;
|
return $link;
|
||||||
if(strpos($link,'?')===false)
|
if(strpos($link,'?')===false)
|
||||||
$link.='?';
|
$link.='?';
|
||||||
else
|
else
|
||||||
$link.='&';
|
$link.='&';
|
||||||
return $link.$vars;
|
return $link.$vars;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the key value pairs in http-get-parameter format as a string
|
// Return the key value pairs in http-get-parameter format as a string
|
||||||
function linkify($vars) {
|
function linkify($vars) {
|
||||||
$retvar = '';
|
$retvar = '';
|
||||||
foreach($vars as $k => $v) {
|
foreach($vars as $k => $v) {
|
||||||
if($k!==null && $v!==null && $v!='')
|
if($k!==null && $v!==null && $v!='')
|
||||||
$retvar .= $k.'='.$v.'&';
|
$retvar .= $k.'='.$v.'&';
|
||||||
}
|
}
|
||||||
return substr($retvar,0,-1);
|
return substr($retvar,0,-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user