Get and store anti-features data from repo
This commit is contained in:
		
							parent
							
								
									e1f3c2eb78
								
							
						
					
					
						commit
						bec725da56
					
				| @ -61,6 +61,7 @@ public class DB { | ||||
| 			trackerURL = ""; | ||||
| 			sourceURL = ""; | ||||
| 			webURL = ""; | ||||
| 			antiFeatures = null; | ||||
| 			hasUpdates = false; | ||||
| 			updated = false; | ||||
| 			apks = new Vector<Apk>(); | ||||
| @ -80,6 +81,10 @@ public class DB { | ||||
| 		public String marketVersion; | ||||
| 		public int marketVercode; | ||||
| 
 | ||||
| 		// Comma-separated list of anti-features (as defined in the metadata | ||||
| 		// documentation) or null if there aren't any. | ||||
| 		public String antiFeatures; | ||||
| 
 | ||||
| 		// True if there are new versions (apks) that the user hasn't | ||||
| 		// explicitly ignored. (We're currently not using the database | ||||
| 		// field for this - we make the decision on the fly in getApps(). | ||||
| @ -197,7 +202,10 @@ public class DB { | ||||
| 			{ "alter table " + TABLE_APK + " add apkSource text" }, | ||||
| 
 | ||||
| 			// Version 4... | ||||
| 			{ "alter table " + TABLE_APP + " add installedVerCode integer" } | ||||
| 			{ "alter table " + TABLE_APP + " add installedVerCode integer" }, | ||||
| 
 | ||||
| 			// Version 5... | ||||
| 			{ "alter table " + TABLE_APP + " add antiFeatures string" } | ||||
| 
 | ||||
| 	}; | ||||
| 
 | ||||
| @ -311,6 +319,8 @@ public class DB { | ||||
| 				app.marketVersion = c.getString(c | ||||
| 						.getColumnIndex("marketVersion")); | ||||
| 				app.marketVercode = c.getInt(c.getColumnIndex("marketVercode")); | ||||
| 				app.antiFeatures = c | ||||
| 						.getString(c.getColumnIndex("antiFeatures")); | ||||
| 				app.hasUpdates = false; | ||||
| 
 | ||||
| 				c2 = db.rawQuery("select * from " + TABLE_APK | ||||
| @ -523,6 +533,7 @@ public class DB { | ||||
| 		values.put("installedVerCode", upapp.installedVerCode); | ||||
| 		values.put("marketVersion", upapp.marketVersion); | ||||
| 		values.put("marketVercode", upapp.marketVercode); | ||||
| 		values.put("antiFeatures", upapp.antiFeatures); | ||||
| 		values.put("hasUpdates", upapp.hasUpdates ? 1 : 0); | ||||
| 		if (oldapp != null) { | ||||
| 			db.update(TABLE_APP, values, "id = ?", new String[] { oldapp.id }); | ||||
|  | ||||
| @ -42,201 +42,203 @@ import android.util.Log; | ||||
| 
 | ||||
| public class RepoXMLHandler extends DefaultHandler { | ||||
| 
 | ||||
|     String mserver; | ||||
| 	String mserver; | ||||
| 
 | ||||
|     private DB db; | ||||
| 	private DB db; | ||||
| 
 | ||||
|     private DB.App curapp = null; | ||||
|     private DB.Apk curapk = null; | ||||
|     private String curchars = null; | ||||
| 	private DB.App curapp = null; | ||||
| 	private DB.Apk curapk = null; | ||||
| 	private String curchars = null; | ||||
| 
 | ||||
|     public RepoXMLHandler(String srv, DB db) { | ||||
|         mserver = srv; | ||||
|         this.db = db; | ||||
|     } | ||||
| 	public RepoXMLHandler(String srv, DB db) { | ||||
| 		mserver = srv; | ||||
| 		this.db = db; | ||||
| 	} | ||||
| 
 | ||||
|     @Override | ||||
|     public void characters(char[] ch, int start, int length) | ||||
|             throws SAXException { | ||||
| 	@Override | ||||
| 	public void characters(char[] ch, int start, int length) | ||||
| 			throws SAXException { | ||||
| 
 | ||||
|         super.characters(ch, start, length); | ||||
| 		super.characters(ch, start, length); | ||||
| 
 | ||||
|         String str = new String(ch).substring(start, start + length); | ||||
|         if (curchars == null) | ||||
|             curchars = str; | ||||
|         else | ||||
|             curchars += str; | ||||
|     } | ||||
| 		String str = new String(ch).substring(start, start + length); | ||||
| 		if (curchars == null) | ||||
| 			curchars = str; | ||||
| 		else | ||||
| 			curchars += str; | ||||
| 	} | ||||
| 
 | ||||
|     @Override | ||||
|     public void endElement(String uri, String localName, String qName) | ||||
|             throws SAXException { | ||||
| 	@Override | ||||
| 	public void endElement(String uri, String localName, String qName) | ||||
| 			throws SAXException { | ||||
| 
 | ||||
|         super.endElement(uri, localName, qName); | ||||
|         String curel = localName; | ||||
|         String str = curchars; | ||||
| 		super.endElement(uri, localName, qName); | ||||
| 		String curel = localName; | ||||
| 		String str = curchars; | ||||
| 
 | ||||
|         if (curel == "application" && curapp != null) { | ||||
|             Log.d("FDroid", "Repo: Updating application " + curapp.id); | ||||
|             db.updateApplication(curapp); | ||||
|             getIcon(curapp); | ||||
|             curapp = null; | ||||
|         } else if (curel == "package" && curapk != null && curapp != null) { | ||||
|             Log.d("FDroid", "Repo: Package added (" + curapk.version + ")"); | ||||
|             curapp.apks.add(curapk); | ||||
|             curapk = null; | ||||
|         } else if (curapk != null && str != null) { | ||||
|             if (curel == "version") { | ||||
|                 curapk.version = str; | ||||
|             } else if (curel == "versioncode") { | ||||
|                 try { | ||||
|                     curapk.vercode = Integer.parseInt(str); | ||||
|                 } catch (NumberFormatException ex) { | ||||
|                     curapk.vercode = 0; | ||||
|                 } | ||||
|             } else if (curel == "size") { | ||||
|                 try { | ||||
|                     curapk.size = Integer.parseInt(str); | ||||
|                 } catch (NumberFormatException ex) { | ||||
|                     curapk.size = 0; | ||||
|                 } | ||||
|             } else if (curel == "hash") { | ||||
|                 curapk.hash = str; | ||||
|             } else if (curel == "apkname") { | ||||
|                 curapk.apkName = str; | ||||
|             } else if (curel == "apksource") { | ||||
|                 curapk.apkSource = str; | ||||
|             } | ||||
|         } else if (curapp != null && str != null) { | ||||
|             if (curel == "id") { | ||||
|                 Log.d("FDroid", "App id is " + str); | ||||
|                 curapp.id = str; | ||||
|             } else if (curel == "name") { | ||||
|                 curapp.name = str; | ||||
|             } else if (curel == "icon") { | ||||
|                 curapp.icon = str; | ||||
|             } else if (curel == "description") { | ||||
|                 curapp.description = str; | ||||
|             } else if (curel == "summary") { | ||||
|                 curapp.summary = str; | ||||
|             } else if (curel == "license") { | ||||
|                 curapp.license = str; | ||||
|             } else if (curel == "source") { | ||||
|                 curapp.sourceURL = str; | ||||
|             } else if (curel == "web") { | ||||
|                 curapp.webURL = str; | ||||
|             } else if (curel == "tracker") { | ||||
|                 curapp.trackerURL = str; | ||||
|             } else if (curel == "marketversion") { | ||||
|                 curapp.marketVersion = str; | ||||
|             } else if (curel == "marketvercode") { | ||||
|                 try { | ||||
|                     curapp.marketVercode = Integer.parseInt(str); | ||||
|                 } catch (NumberFormatException ex) { | ||||
|                     curapp.marketVercode = 0; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 		if (curel == "application" && curapp != null) { | ||||
| 			Log.d("FDroid", "Repo: Updating application " + curapp.id); | ||||
| 			db.updateApplication(curapp); | ||||
| 			getIcon(curapp); | ||||
| 			curapp = null; | ||||
| 		} else if (curel == "package" && curapk != null && curapp != null) { | ||||
| 			Log.d("FDroid", "Repo: Package added (" + curapk.version + ")"); | ||||
| 			curapp.apks.add(curapk); | ||||
| 			curapk = null; | ||||
| 		} else if (curapk != null && str != null) { | ||||
| 			if (curel == "version") { | ||||
| 				curapk.version = str; | ||||
| 			} else if (curel == "versioncode") { | ||||
| 				try { | ||||
| 					curapk.vercode = Integer.parseInt(str); | ||||
| 				} catch (NumberFormatException ex) { | ||||
| 					curapk.vercode = 0; | ||||
| 				} | ||||
| 			} else if (curel == "size") { | ||||
| 				try { | ||||
| 					curapk.size = Integer.parseInt(str); | ||||
| 				} catch (NumberFormatException ex) { | ||||
| 					curapk.size = 0; | ||||
| 				} | ||||
| 			} else if (curel == "hash") { | ||||
| 				curapk.hash = str; | ||||
| 			} else if (curel == "apkname") { | ||||
| 				curapk.apkName = str; | ||||
| 			} else if (curel == "apksource") { | ||||
| 				curapk.apkSource = str; | ||||
| 			} | ||||
| 		} else if (curapp != null && str != null) { | ||||
| 			if (curel == "id") { | ||||
| 				Log.d("FDroid", "App id is " + str); | ||||
| 				curapp.id = str; | ||||
| 			} else if (curel == "name") { | ||||
| 				curapp.name = str; | ||||
| 			} else if (curel == "icon") { | ||||
| 				curapp.icon = str; | ||||
| 			} else if (curel == "description") { | ||||
| 				curapp.description = str; | ||||
| 			} else if (curel == "summary") { | ||||
| 				curapp.summary = str; | ||||
| 			} else if (curel == "license") { | ||||
| 				curapp.license = str; | ||||
| 			} else if (curel == "source") { | ||||
| 				curapp.sourceURL = str; | ||||
| 			} else if (curel == "web") { | ||||
| 				curapp.webURL = str; | ||||
| 			} else if (curel == "tracker") { | ||||
| 				curapp.trackerURL = str; | ||||
| 			} else if (curel == "marketversion") { | ||||
| 				curapp.marketVersion = str; | ||||
| 			} else if (curel == "marketvercode") { | ||||
| 				try { | ||||
| 					curapp.marketVercode = Integer.parseInt(str); | ||||
| 				} catch (NumberFormatException ex) { | ||||
| 					curapp.marketVercode = 0; | ||||
| 				} | ||||
| 			} else if (curel == "antifeatures") { | ||||
| 				curapp.antiFeatures = str; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|     } | ||||
| 	} | ||||
| 
 | ||||
|     @Override | ||||
|     public void startElement(String uri, String localName, String qName, | ||||
|             Attributes attributes) throws SAXException { | ||||
| 	@Override | ||||
| 	public void startElement(String uri, String localName, String qName, | ||||
| 			Attributes attributes) throws SAXException { | ||||
| 
 | ||||
|         super.startElement(uri, localName, qName, attributes); | ||||
|         if (localName == "application" && curapp == null) { | ||||
|             Log.d("FDroid", "Repo: Found application at " + mserver); | ||||
|             curapp = new DB.App(); | ||||
|         } else if (localName == "package" && curapp != null && curapk == null) { | ||||
|             Log.d("FDroid", "Repo: Found package for " + curapp.id); | ||||
|             curapk = new DB.Apk(); | ||||
|             curapk.id = curapp.id; | ||||
|             curapk.server = mserver; | ||||
|         } | ||||
|         curchars = null; | ||||
|     } | ||||
| 		super.startElement(uri, localName, qName, attributes); | ||||
| 		if (localName == "application" && curapp == null) { | ||||
| 			Log.d("FDroid", "Repo: Found application at " + mserver); | ||||
| 			curapp = new DB.App(); | ||||
| 		} else if (localName == "package" && curapp != null && curapk == null) { | ||||
| 			Log.d("FDroid", "Repo: Found package for " + curapp.id); | ||||
| 			curapk = new DB.Apk(); | ||||
| 			curapk.id = curapp.id; | ||||
| 			curapk.server = mserver; | ||||
| 		} | ||||
| 		curchars = null; | ||||
| 	} | ||||
| 
 | ||||
|     private void getIcon(DB.App app) { | ||||
|         try { | ||||
| 	private void getIcon(DB.App app) { | ||||
| 		try { | ||||
| 
 | ||||
|             String destpath = DB.getIconsPath() + app.icon; | ||||
|             File f = new File(destpath); | ||||
|             if (f.exists()) | ||||
|                 return; | ||||
| 			String destpath = DB.getIconsPath() + app.icon; | ||||
| 			File f = new File(destpath); | ||||
| 			if (f.exists()) | ||||
| 				return; | ||||
| 
 | ||||
|             BufferedInputStream getit = new BufferedInputStream(new URL(mserver | ||||
|                     + "/icons/" + app.icon).openStream()); | ||||
|             FileOutputStream saveit = new FileOutputStream(destpath); | ||||
|             BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024); | ||||
|             byte data[] = new byte[1024]; | ||||
| 			BufferedInputStream getit = new BufferedInputStream(new URL(mserver | ||||
| 					+ "/icons/" + app.icon).openStream()); | ||||
| 			FileOutputStream saveit = new FileOutputStream(destpath); | ||||
| 			BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024); | ||||
| 			byte data[] = new byte[1024]; | ||||
| 
 | ||||
|             int readed = getit.read(data, 0, 1024); | ||||
|             while (readed != -1) { | ||||
|                 bout.write(data, 0, readed); | ||||
|                 readed = getit.read(data, 0, 1024); | ||||
|             } | ||||
|             bout.close(); | ||||
|             getit.close(); | ||||
|             saveit.close(); | ||||
|         } catch (Exception e) { | ||||
| 			int readed = getit.read(data, 0, 1024); | ||||
| 			while (readed != -1) { | ||||
| 				bout.write(data, 0, readed); | ||||
| 				readed = getit.read(data, 0, 1024); | ||||
| 			} | ||||
| 			bout.close(); | ||||
| 			getit.close(); | ||||
| 			saveit.close(); | ||||
| 		} catch (Exception e) { | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|     public static void doUpdates(Context ctx, DB db) { | ||||
|         db.beginUpdate(); | ||||
|         Vector<DB.Repo> repos = db.getRepos(); | ||||
|         for (DB.Repo repo : repos) { | ||||
|             if (repo.inuse) { | ||||
| 	public static void doUpdates(Context ctx, DB db) { | ||||
| 		db.beginUpdate(); | ||||
| 		Vector<DB.Repo> repos = db.getRepos(); | ||||
| 		for (DB.Repo repo : repos) { | ||||
| 			if (repo.inuse) { | ||||
| 
 | ||||
|                 try { | ||||
| 				try { | ||||
| 
 | ||||
|                     FileOutputStream f = ctx.openFileOutput( | ||||
|                             "tempindex.xml", Context.MODE_PRIVATE); | ||||
| 					FileOutputStream f = ctx.openFileOutput("tempindex.xml", | ||||
| 							Context.MODE_PRIVATE); | ||||
| 
 | ||||
|                     // Download the index file from the repo... | ||||
|                     BufferedInputStream getit = new BufferedInputStream( | ||||
|                             new URL(repo.address + "/index.xml").openStream()); | ||||
| 					// Download the index file from the repo... | ||||
| 					BufferedInputStream getit = new BufferedInputStream( | ||||
| 							new URL(repo.address + "/index.xml").openStream()); | ||||
| 
 | ||||
|                     BufferedOutputStream bout = new BufferedOutputStream(f, | ||||
|                             1024); | ||||
|                     byte data[] = new byte[1024]; | ||||
| 					BufferedOutputStream bout = new BufferedOutputStream(f, | ||||
| 							1024); | ||||
| 					byte data[] = new byte[1024]; | ||||
| 
 | ||||
|                     int readed = getit.read(data, 0, 1024); | ||||
|                     while (readed != -1) { | ||||
|                         bout.write(data, 0, readed); | ||||
|                         readed = getit.read(data, 0, 1024); | ||||
|                     } | ||||
|                     bout.close(); | ||||
|                     getit.close(); | ||||
|                     f.close(); | ||||
| 					int readed = getit.read(data, 0, 1024); | ||||
| 					while (readed != -1) { | ||||
| 						bout.write(data, 0, readed); | ||||
| 						readed = getit.read(data, 0, 1024); | ||||
| 					} | ||||
| 					bout.close(); | ||||
| 					getit.close(); | ||||
| 					f.close(); | ||||
| 
 | ||||
|                     // Process the index... | ||||
|                     SAXParserFactory spf = SAXParserFactory.newInstance(); | ||||
|                     SAXParser sp = spf.newSAXParser(); | ||||
|                     XMLReader xr = sp.getXMLReader(); | ||||
|                     RepoXMLHandler handler = new RepoXMLHandler(repo.address, | ||||
|                             db); | ||||
|                     xr.setContentHandler(handler); | ||||
| 					// Process the index... | ||||
| 					SAXParserFactory spf = SAXParserFactory.newInstance(); | ||||
| 					SAXParser sp = spf.newSAXParser(); | ||||
| 					XMLReader xr = sp.getXMLReader(); | ||||
| 					RepoXMLHandler handler = new RepoXMLHandler(repo.address, | ||||
| 							db); | ||||
| 					xr.setContentHandler(handler); | ||||
| 
 | ||||
|                     InputStreamReader isr = new FileReader(new File(ctx | ||||
|                             .getFilesDir() | ||||
|                             + "/tempindex.xml")); | ||||
|                     InputSource is = new InputSource(isr); | ||||
|                     xr.parse(is); | ||||
| 					InputStreamReader isr = new FileReader(new File(ctx | ||||
| 							.getFilesDir() | ||||
| 							+ "/tempindex.xml")); | ||||
| 					InputSource is = new InputSource(isr); | ||||
| 					xr.parse(is); | ||||
| 
 | ||||
|                 } catch (Exception e) { | ||||
|                     Log.d("FDroid", "Exception updating from " + repo.address | ||||
|                             + " - " + e.getMessage()); | ||||
|                 } finally { | ||||
|                     ctx.deleteFile("tempindex.xml"); | ||||
|                 } | ||||
| 				} catch (Exception e) { | ||||
| 					Log.d("FDroid", "Exception updating from " + repo.address | ||||
| 							+ " - " + e.getMessage()); | ||||
| 				} finally { | ||||
| 					ctx.deleteFile("tempindex.xml"); | ||||
| 				} | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
|         db.endUpdate(); | ||||
| 			} | ||||
| 		} | ||||
| 		db.endUpdate(); | ||||
| 
 | ||||
|     } | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ciaran Gultnieks
						Ciaran Gultnieks