From 1bd9c9d0dc016ee179acf4c8959f954e320aae50 Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Sat, 14 Jan 2012 15:11:59 +0100 Subject: [PATCH 01/11] "Human readable" style size displays for apk and source downloads. --- wp-fdroid/wp-fdroid.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 1fb3d1ac..0ea58d6c 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -211,9 +211,11 @@ class FDroid foreach($apks as $apk) { $out.="

Version ".$apk['version']."
"; $out.='download apk '; - $out.=$apk['size']." bytes"; - if($apk['srcname']) - $out.='
source tarball'; + $out.=$this->human_readable_size($apk['size']); + if($apk['srcname']) { + $out.='
source tarball '; + $out.=$this->human_readable_size(filesize($this->site_path.'/repo/'.$apk['srcname'])); + } if(isset($apk['permissions'])) { /*if($i==0) @@ -293,6 +295,17 @@ class FDroid return ''; } } + + private function human_readable_size($size) { + $si_prefix = array('bytes','kB','MB'); + $div = 1000; + + for($i=0;$size > $div && $i < count($si_prefix);$i++) { + $size /= $div; + } + + return round($size,max(0,$i-1)).' '.$si_prefix[$i]; + } function get_apps($query_vars) { From 89a6119bd55fde869c3dee2bb88a7b3d930009fc Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Tue, 17 Jan 2012 19:41:22 +0100 Subject: [PATCH 02/11] Added file size difference indicator for apks. --- wp-fdroid/wp-fdroid.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 0ea58d6c..935b4dcc 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -105,6 +105,7 @@ class FDroid $permissions_object = new AndroidPermissions($this->site_path.'/repo/AndroidManifest.xml', $this->site_path.'/repo/strings.xml', $this->site_path.'/repo/android-permissions.cache'); $permissions_data = $permissions_object->get_permissions_array(); + // Get app data $xml = simplexml_load_file($this->site_path.'/repo/index.xml'); foreach($xml->children() as $app) { @@ -174,7 +175,16 @@ class FDroid } } + + // Generate app diff data + foreach(array_reverse($apks, true) as $key=>$apk) { + if(isset($previous)) { + $apks[$key]['diff']['size'] = $apk['size']-$previous['size']; + } + $previous = $apk; + } + // Output app information $out='

'; $out.='
'; $out.='

'.$name.""; @@ -212,6 +222,12 @@ class FDroid $out.="

Version ".$apk['version']."
"; $out.='download apk '; $out.=$this->human_readable_size($apk['size']); + $diffSize = $apk['diff']['size']; + if(abs($diffSize) > 500) { + $out.=' ('; + $out.=$diffSize>0?'+':''; + $out.=$this->human_readable_size($diffSize, 1).')'; + } if($apk['srcname']) { $out.='
source tarball '; $out.=$this->human_readable_size(filesize($this->site_path.'/repo/'.$apk['srcname'])); @@ -296,11 +312,11 @@ class FDroid } } - private function human_readable_size($size) { + private function human_readable_size($size, $minDiv=0) { $si_prefix = array('bytes','kB','MB'); $div = 1000; - for($i=0;$size > $div && $i < count($si_prefix);$i++) { + for($i=0;(abs($size) > $div && $i < count($si_prefix)) || $i<$minDiv;$i++) { $size /= $div; } From e915f71a81d996c4802835553f4667949497ae7c Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Tue, 17 Jan 2012 21:48:48 +0100 Subject: [PATCH 03/11] Replaced the nifty anonymous permissions sorting comparison function with inherited scope variables with a regular function and a global (ick!) variable. Now the code should work with PHP versions prior to 5.3.0 as well... --- wp-fdroid/wp-fdroid.php | 48 +++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 0ea58d6c..6c981d83 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -102,6 +102,7 @@ class FDroid function get_app($query_vars) { + global $permissions_data; $permissions_object = new AndroidPermissions($this->site_path.'/repo/AndroidManifest.xml', $this->site_path.'/repo/strings.xml', $this->site_path.'/repo/android-permissions.cache'); $permissions_data = $permissions_object->get_permissions_array(); @@ -226,29 +227,7 @@ class FDroid $out.='
view permissions
'; $out.='

'; $permissions = explode(',',$apk['permissions']); - usort($permissions, - function ($a, $b) use (&$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); - } - ); + usort($permissions, "permissions_cmp"); $permission_group_last = ''; foreach($permissions as $permission) { @@ -536,6 +515,29 @@ class FDOutGrid } } +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 function makelink($query_vars, $params=array()) { $link=get_permalink(); From 8eea9350164e4feaf1bd2b65c351b64d17c1648d Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Sat, 21 Jan 2012 11:24:18 +0100 Subject: [PATCH 04/11] Removed some warnings... --- wp-fdroid/wp-fdroid.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 385e90c8..46612423 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -231,7 +231,7 @@ class FDroid $out.=$diffSize>0?'+':''; $out.=$this->human_readable_size($diffSize, 1).')'; } - if($apk['srcname']) { + if(isset($apk['srcname']) && file_exists($this->site_path.'/repo/'.$apk['srcname'])) { $out.='
source tarball '; $out.=$this->human_readable_size(filesize($this->site_path.'/repo/'.$apk['srcname'])); } From 43d1e13a4f0840bd3abef9926db91609da3f7370 Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Sat, 21 Jan 2012 13:22:37 +0100 Subject: [PATCH 05/11] Added a permissions diff view, and a summary view of the permission category count of an apk. --- wp-fdroid/wp-fdroid.php | 140 ++++++++++++++++++++++++++++++++-------- 1 file changed, 113 insertions(+), 27 deletions(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 46612423..2319aa25 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -178,12 +178,20 @@ class FDroid } } - + // Generate app diff data foreach(array_reverse($apks, true) as $key=>$apk) { if(isset($previous)) { - $apks[$key]['diff']['size'] = $apk['size']-$previous['size']; + // Apk size + $apks[$key]['diff']['size'] = $apk['size']-$previous['size']; } + + // Permissions + $permissions = explode(',',$apk['permissions']); + $permissionsPrevious = isset($previous['permissions'])?explode(',',$previous['permissions']):array(); + $apks[$key]['diff']['permissions']['added'] = array_diff($permissions, $permissionsPrevious); + $apks[$key]['diff']['permissions']['removed'] = array_diff($permissionsPrevious, $permissions); + $previous = $apk; } @@ -222,6 +230,7 @@ class FDroid $out.="

Packages

"; $i=0; foreach($apks as $apk) { + $first = $i+1==count($apks); $out.="

Version ".$apk['version']."
"; $out.='download apk '; $out.=$this->human_readable_size($apk['size']); @@ -237,36 +246,67 @@ class FDroid } if(isset($apk['permissions'])) { + // Permissions diff link + if($first == false) { + $permissionsAddedCount = count($apk['diff']['permissions']['added']); + $permissionsRemovedCount = count($apk['diff']['permissions']['removed']); + $divIdDiff='permissionsDiff'.$i; + if($permissionsAddedCount || $permissionsRemovedCount) { + $out.='
permissions diff'; + $out.=' ('; + if($permissionsAddedCount) + $out.='+'.$permissionsAddedCount; + if($permissionsAddedCount && $permissionsRemovedCount) + $out.='/'; + if($permissionsRemovedCount) + $out.='-'.$permissionsRemovedCount; + $out.=')'; + } + else + { + $out.='
no permission changes'; + } + } + + // Permissions list link + $permissionsListString = $this->get_permission_list_string(explode(',',$apk['permissions']), $permissions_data, $summary); /*if($i==0) $divStyleDisplay='block'; else*/ $divStyleDisplay='none'; $divId='permissions'.$i; - $out.='
view permissions
'; - $out.='

'; - $permissions = explode(',',$apk['permissions']); - usort($permissions, "permissions_cmp"); + $out.='
view permissions'; + $out.=' ['.$summary.']'; + $out.='
'; - $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.=''.strtoupper($permission_group_label).'
'; - $permission_group_last = $permission_group; + // Permissions list + $out.='
'; + $out.=$permissionsListString; + $out.='
'; + + // Permissions diff + { + $out.='
'; + $permissionsRemoved = $apk['diff']['permissions']['removed']; + usort($permissionsRemoved, "permissions_cmp"); + + // Added permissions + if($permissionsAddedCount) { + $out.='
ADDED

'; + $out.=$this->get_permission_list_string($apk['diff']['permissions']['added'], $permissions_data, $summary); } - $out.=$this->get_permission_protection_level_icon($permissions_data['permission'][$permission]['protectionLevel']).' '; - $out.=''.$permissions_data['permission'][$permission]['label'].' ['.$permission.']
'; - if($permissions_data['permission'][$permission]['description']) $out.=$permissions_data['permission'][$permission]['description'].'
'; - //$out.=$permissions_data['permission'][$permission]['comment'].'
'; - $out.='
'; + // Removed permissions + if($permissionsRemovedCount) { + $out.='
REMOVED

'; + $out.=$this->get_permission_list_string($apk['diff']['permissions']['removed'], $permissions_data, $summary); + } + + $out.='
'; } - $out.='
'; } else { - $out.='
no permissions
'; + $out.='
no extra permissions needed
'; } $out.='

'; @@ -281,22 +321,68 @@ class FDroid return "

Application not found

"; } - private function get_permission_protection_level_icon($protection_level) { + private function get_permission_list_string($permissions, $permissions_data, &$summary) { + $out=''; + 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.=''.strtoupper($permission_group_label).'
'; + $permission_group_last = $permission_group; + } + + $out.=$this->get_permission_protection_level_icon($permissions_data['permission'][$permission]['protectionLevel']).' '; + $out.=''.$permissions_data['permission'][$permission]['label'].' ['.$permission.']
'; + if($permissions_data['permission'][$permission]['description']) $out.=$permissions_data['permission'][$permission]['description'].'
'; + //$out.=$permissions_data['permission'][$permission]['comment'].'
'; + $out.='
'; + + if(!isset($summaryCount[$permissions_data['permission'][$permission]['protectionLevel']])) + $summaryCount[$permissions_data['permission'][$permission]['protectionLevel']] = 0; + $summaryCount[$permissions_data['permission'][$permission]['protectionLevel']]++; + } + + $summary = ''; + foreach($summaryCount as $protectionLevel => $count) { + $summary .= $this->get_permission_protection_level_icon($protectionLevel, 'regular').' '.$count; + $summary .= ', '; + } + $summary = substr($summary,0,-2); + + return $out; + } + + private function get_permission_protection_level_icon($protection_level, $size='adjusted') { + $iconString = ''; if($protection_level=='dangerous') { - return ''; + $iconString .= ''; } elseif($protection_level=='normal') { - return ''; + $iconString .= ''; } else { - return ''; + $iconString .= ''; } + + return $iconString; } - + private function human_readable_size($size, $minDiv=0) { $si_prefix = array('bytes','kB','MB'); $div = 1000; - + for($i=0;(abs($size) > $div && $i < count($si_prefix)) || $i<$minDiv;$i++) { $size /= $div; } From dd1ff8b6d952f5d4e107db9ccc729a4b40f82f08 Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Mon, 23 Jan 2012 21:07:33 +0100 Subject: [PATCH 06/11] Added a notice for apps with anti-features. --- wp-fdroid/wp-fdroid.php | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 2319aa25..fc18f6d3 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -144,6 +144,8 @@ class FDroid case "web": $web=$el; break; + case "antifeatures"; + $antifeatures=$el; case "package": $thisapk=array(); foreach($el->children() as $pel) { @@ -204,6 +206,15 @@ class FDroid $out.="

".$desc."

"; + if(isset($antifeatures)) { + $antifeaturesArray = explode(',',$antifeatures); + foreach($antifeaturesArray as $antifeature) { + $antifeatureDesctiption = $this->get_antifeature_description($antifeature); + $out.='

'.$antifeatureDesctiption['name'].'
'; + $out.=$antifeatureDesctiption['description'].'

'; + } + } + $out.="

License: ".$license."

"; $out.="

"; @@ -390,6 +401,23 @@ class FDroid return round($size,max(0,$i-1)).' '.$si_prefix[$i]; } + private function get_antifeature_description($antifeature) { + // Anti feature names and descriptions + $antifeatureDesctiption['ads']['name'] = 'Advertising'; + $antifeatureDesctiption['ads']['description'] = 'This application contains advertising'; + $antifeatureDesctiption['tracking']['name'] = 'Tracks You'; + $antifeatureDesctiption['tracking']['description'] = 'This application tracks and reports your activity to somewhere'; + $antifeatureDesctiption['nonfreenet']['name'] = 'Non-Free Network Services'; + $antifeatureDesctiption['nonfreenet']['description'] = 'This application promotes a non-Free network service'; + $antifeatureDesctiption['nonfreeadd']['name'] = 'Non-Free Addons'; + $antifeatureDesctiption['nonfreeadd']['description'] = 'This application promotes non-Free add-ons'; + $antifeatureDesctiption['nonfreedep']['name'] = 'Non-Free Dependencies'; + $antifeatureDesctiption['nonfreedep']['description'] = 'This application depends on another non-Free application'; + + return $antifeatureDesctiption[strtolower($antifeature)]; + } + + function get_apps($query_vars) { $xml = simplexml_load_file($this->site_path."/repo/index.xml"); From 7b6d8b1646d7918081accf17785920db17399b7b Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Mon, 23 Jan 2012 21:13:32 +0100 Subject: [PATCH 07/11] Semi-graceful handling of unknown anti-features. --- wp-fdroid/wp-fdroid.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index fc18f6d3..0a8b2530 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -414,7 +414,11 @@ class FDroid $antifeatureDesctiption['nonfreedep']['name'] = 'Non-Free Dependencies'; $antifeatureDesctiption['nonfreedep']['description'] = 'This application depends on another non-Free application'; - return $antifeatureDesctiption[strtolower($antifeature)]; + $antifeatureLower = strtolower($antifeature); + if(isset($antifeatureDesctiption[$antifeatureLower])) { + return $antifeatureDesctiption[$antifeatureLower]; + } + return array('name'=>$antifeature); } From b1284377ca8e99258f84a535bd1b15d9df774160 Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Mon, 23 Jan 2012 21:19:33 +0100 Subject: [PATCH 08/11] Added missing break... --- wp-fdroid/wp-fdroid.php | 1 + 1 file changed, 1 insertion(+) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 0a8b2530..a4a945ab 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -146,6 +146,7 @@ class FDroid break; case "antifeatures"; $antifeatures=$el; + break; case "package": $thisapk=array(); foreach($el->children() as $pel) { From e2fe39f46956ebcfa1dd64acee8ed779f66bd42a Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Mon, 23 Jan 2012 21:21:40 +0100 Subject: [PATCH 09/11] Added basic displaying of additional reuirements for apps. --- wp-fdroid/wp-fdroid.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index a4a945ab..5efb416f 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -147,6 +147,9 @@ class FDroid case "antifeatures"; $antifeatures=$el; break; + case "requirements"; + $requirements=$el; + break; case "package": $thisapk=array(); foreach($el->children() as $pel) { @@ -216,7 +219,12 @@ class FDroid } } - $out.="

License: ".$license."

"; + $out.="

"; + $out.="License: ".$license; + if(isset($requirements)) { + $out.='
Additional requirements: '.$requirements; + } + $out.="

"; $out.="

"; if(strlen($web)>0) From 1cb46ccc80b2c2aaa9bb41833ff28a887d84b9ff Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Mon, 23 Jan 2012 21:34:03 +0100 Subject: [PATCH 10/11] Enabled clicking on the entire row of an app in list-view. --- wp-fdroid/wp-fdroid.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 5efb416f..80e9dad6 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -590,21 +590,20 @@ class FDOutList function outputEntry($query_vars, $appinfo) { $out=""; $out.="


\n"; + $out.=''; $out.='
'; - $out.='
'; + $out.='
'; $out.='
'; - $out.='

Details...'; - $out.="

"; + $out.='

Details...

'; $out.="
\n"; - $out.='

'.$appinfo['name'].""; + $out.='

'.$appinfo['name'].""; $out.="
".$appinfo['summary']."

\n"; $out.="
\n"; + $out.=''; return $out; } From 19c1925dfa8465464ca1f0bed77783669fd8a7cc Mon Sep 17 00:00:00 2001 From: Hans-Emil Skogh Date: Mon, 23 Jan 2012 21:39:27 +0100 Subject: [PATCH 11/11] Minor layout fix for list-view for large icons. --- wp-fdroid/wp-fdroid.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wp-fdroid/wp-fdroid.php b/wp-fdroid/wp-fdroid.php index 80e9dad6..33cb4838 100644 --- a/wp-fdroid/wp-fdroid.php +++ b/wp-fdroid/wp-fdroid.php @@ -589,7 +589,7 @@ class FDOutList function outputEntry($query_vars, $appinfo) { $out=""; - $out.="
\n"; + $out.='
'."\n"; $out.=''; $out.='
';