Restrict suggested versions to those with the same sig as installed.
Only if there is actually a version installed.
This commit is contained in:
		
							parent
							
								
									44ffaa37d6
								
							
						
					
					
						commit
						b95a330ccf
					
				@ -977,6 +977,7 @@ public class AppProvider extends FDroidProvider {
 | 
				
			|||||||
                " FROM " + apk +
 | 
					                " FROM " + apk +
 | 
				
			||||||
                "   JOIN " + app + " AS appForThisApk ON (appForThisApk." + Cols.ROW_ID + " = " + apk + "." + ApkTable.Cols.APP_ID + ") " +
 | 
					                "   JOIN " + app + " AS appForThisApk ON (appForThisApk." + Cols.ROW_ID + " = " + apk + "." + ApkTable.Cols.APP_ID + ") " +
 | 
				
			||||||
                " WHERE " +
 | 
					                " WHERE " +
 | 
				
			||||||
 | 
					                    restrictToSameSigIfInstalled(app, apk) + " AND " +
 | 
				
			||||||
                    app + "." + Cols.PACKAGE_ID + " = appForThisApk." + Cols.PACKAGE_ID + " AND " +
 | 
					                    app + "." + Cols.PACKAGE_ID + " = appForThisApk." + Cols.PACKAGE_ID + " AND " +
 | 
				
			||||||
                    restrictToStable +
 | 
					                    restrictToStable +
 | 
				
			||||||
                    " ( " + app + "." + Cols.IS_COMPATIBLE + " = 0 OR " + apk + "." + Cols.IS_COMPATIBLE + " = 1 ) ) " +
 | 
					                    " ( " + app + "." + Cols.IS_COMPATIBLE + " = 0 OR " + apk + "." + Cols.IS_COMPATIBLE + " = 1 ) ) " +
 | 
				
			||||||
@ -1007,6 +1008,7 @@ public class AppProvider extends FDroidProvider {
 | 
				
			|||||||
                " FROM " + apk +
 | 
					                " FROM " + apk +
 | 
				
			||||||
                "   JOIN " + app + " AS appForThisApk ON (appForThisApk." + Cols.ROW_ID + " = " + apk + "." + ApkTable.Cols.APP_ID + ") " +
 | 
					                "   JOIN " + app + " AS appForThisApk ON (appForThisApk." + Cols.ROW_ID + " = " + apk + "." + ApkTable.Cols.APP_ID + ") " +
 | 
				
			||||||
                " WHERE " +
 | 
					                " WHERE " +
 | 
				
			||||||
 | 
					                    restrictToSameSigIfInstalled(app, apk) + " AND " +
 | 
				
			||||||
                    app + "." + Cols.PACKAGE_ID + " = appForThisApk." + Cols.PACKAGE_ID + " AND " +
 | 
					                    app + "." + Cols.PACKAGE_ID + " = appForThisApk." + Cols.PACKAGE_ID + " AND " +
 | 
				
			||||||
                    " ( " + app + "." + Cols.IS_COMPATIBLE + " = 0 OR " + apk + "." + ApkTable.Cols.IS_COMPATIBLE + " = 1 ) ) " +
 | 
					                    " ( " + app + "." + Cols.IS_COMPATIBLE + " = 0 OR " + apk + "." + ApkTable.Cols.IS_COMPATIBLE + " = 1 ) ) " +
 | 
				
			||||||
                " WHERE COALESCE(" + Cols.UPSTREAM_VERSION_CODE + ", 0) = 0 OR " + Cols.SUGGESTED_VERSION_CODE + " IS NULL ";
 | 
					                " WHERE COALESCE(" + Cols.UPSTREAM_VERSION_CODE + ", 0) = 0 OR " + Cols.SUGGESTED_VERSION_CODE + " IS NULL ";
 | 
				
			||||||
@ -1014,6 +1016,30 @@ public class AppProvider extends FDroidProvider {
 | 
				
			|||||||
        db().execSQL(updateSql);
 | 
					        db().execSQL(updateSql);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Limits results for an apk query. If the app in question is installed, then will limit apk
 | 
				
			||||||
 | 
					     * results to those matching the same signature as the installed one. Otherwise, allows all apks
 | 
				
			||||||
 | 
					     * to be returned.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static String restrictToSameSigIfInstalled(String appTable, String apkTable) {
 | 
				
			||||||
 | 
					        String installedSig =
 | 
				
			||||||
 | 
					                "(SELECT installed." + InstalledAppTable.Cols.SIGNATURE +
 | 
				
			||||||
 | 
					                        " FROM " + InstalledAppTable.NAME + " AS installed " +
 | 
				
			||||||
 | 
					                        " JOIN " + PackageTable.NAME + " AS pkg ON " +
 | 
				
			||||||
 | 
					                        "   (pkg." + PackageTable.Cols.ROW_ID + " = " + appTable + "." + Cols.PACKAGE_ID + " AND " +
 | 
				
			||||||
 | 
					                        "    installed." + InstalledAppTable.Cols.PACKAGE_NAME + " = pkg." + PackageTable.Cols.PACKAGE_NAME + ") " +
 | 
				
			||||||
 | 
					                        ")";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If the installed sig is not null, then the apk signature will need to match that.
 | 
				
			||||||
 | 
					        // If the installed sig IS null, then it will check whether the apk sig matches the apk sig
 | 
				
			||||||
 | 
					        // (i.e. it will always return the app).
 | 
				
			||||||
 | 
					        // This would be better writen as: `installedSig IS NULL OR installedSig = apk.sig`,
 | 
				
			||||||
 | 
					        // however that would require a separate sub query for each `installedSig` which is more
 | 
				
			||||||
 | 
					        // expensive. This is a less expressive way to write the same thing.
 | 
				
			||||||
 | 
					        return apkTable + "." + ApkTable.Cols.SIGNATURE + " = " +
 | 
				
			||||||
 | 
					                "COALESCE(" + installedSig + ", " + apkTable + "." + ApkTable.Cols.SIGNATURE + ")";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void updateIconUrls() {
 | 
					    private void updateIconUrls() {
 | 
				
			||||||
        final String appTable = getTableName();
 | 
					        final String appTable = getTableName();
 | 
				
			||||||
        final String apkTable = getApkTableName();
 | 
					        final String apkTable = getApkTableName();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user