/* * Copyright (C) 2009 Apps Organizer * * This file is part of Apps Organizer * * Apps Organizer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Apps Organizer 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Apps Organizer. If not, see <http://www.gnu.org/licenses/>. */ package com.google.code.appsorganizer.download; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.database.Cursor; import android.os.Handler; import android.os.Message; import com.google.code.appsorganizer.R; import com.google.code.appsorganizer.db.AppCacheDao; import com.google.code.appsorganizer.db.DatabaseHelper; import com.google.code.appsorganizer.dialogs.GenericDialogManager; import com.google.code.appsorganizer.dialogs.GenericDialogManagerActivity; import com.google.code.appsorganizer.dialogs.OnOkClickListener; import com.google.code.appsorganizer.dialogs.SingleSelectDialog; import com.google.code.appsorganizer.model.Label; /** * @author fabio * */ public class LabelDownloader { private final Activity activity; private final DatabaseHelper dbHelper; private final SingleSelectDialog confirmLabelDownloadDialog; private boolean operationCancelled = false; private final OnOkClickListener onOkClickListener; public LabelDownloader(Activity activity, DatabaseHelper dbHelper, OnOkClickListener onOkClickListener) { this.activity = activity; this.dbHelper = dbHelper; this.onOkClickListener = onOkClickListener; GenericDialogManager genericDialogManager = ((GenericDialogManagerActivity) activity).getGenericDialogManager(); confirmLabelDownloadDialog = new SingleSelectDialog(genericDialogManager, activity.getString(R.string.Download_labels_from_Cyrket), activity.getString(R.string.Download), new CharSequence[] { activity.getString(R.string.All_apps), activity.getString(R.string.Apps_with_no_label) }, 0) { private static final long serialVersionUID = 1L; @Override protected void onOkClick(DialogInterface dialog, int selectedItem) { startDownload(selectedItem == 0); } }; } private ProgressDialog pd; private final Handler handler = new Handler() { @Override public void handleMessage(android.os.Message msg) { if (msg.obj != null) { pd.incrementProgressBy(1); pd.setMessage(msg.obj.toString()); } else { if (msg.arg1 > 0) { pd.setIndeterminate(false); pd.setMax(msg.arg1); } else { pd.hide(); if (onOkClickListener != null) { onOkClickListener.onClick(null, null, 0); } } } } }; public void download() { operationCancelled = false; confirmLabelDownloadDialog.showDialog(); } public void startDownload(final boolean downloadAll) { createAndShowProgresDialog(); new Thread() { @Override public void run() { startDownloadExternalThread(downloadAll); } }.start(); } private void createAndShowProgresDialog() { pd = new ProgressDialog(activity); pd.setTitle(R.string.Downloading); pd.setMessage(activity.getString(R.string.Starting_download)); pd.setIndeterminate(true); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setCancelable(true); pd.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface dialog) { operationCancelled = true; } }); pd.show(); } private String download(String packageName) { BufferedReader in = null; try { URL u = new URL("http://www.cyrket.com/package/" + packageName); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); in = new BufferedReader(new InputStreamReader(c.getInputStream())); String s = null; while ((s = in.readLine()) != null) { int indexOf = s.indexOf("<label>Category</label>"); if (indexOf != -1) { s = in.readLine(); if (s != null) { String category = s.trim(); if (category.startsWith("<div>")) { category = category.substring(5, category.length() - 6); } return category.replace("&", "&"); } else { return null; } } } } catch (IOException e) { } finally { if (in != null) { try { in.close(); } catch (IOException ignored) { } } } return null; } private static Map<String, Integer> defaultIcons = createDefaultIconsMap(); private void startDownloadExternalThread(boolean downloadAll) { Map<String, Long> labelsMap = dbHelper.labelDao.getLabelsMap(); Cursor c; if (downloadAll) { c = dbHelper.appCacheDao.getAllApps(new String[] { AppCacheDao.NAME_COL_NAME, AppCacheDao.PACKAGE_NAME_COL_NAME, AppCacheDao.LABEL_COL_NAME }); } else { c = dbHelper.appCacheDao.getAppsNoLabelCursor(); } Message message = new Message(); message.arg1 = c.getCount(); handler.sendMessage(message); try { int i = 0; while (c.moveToNext() && !operationCancelled) { message = new Message(); message.arg1 = i++; message.obj = c.getString(2); handler.sendMessage(message); String packageName = c.getString(1); String label = download(packageName); if (label != null) { Long labelId = labelsMap.get(label); if (labelId == null) { Integer icon = defaultIcons.get(label); if (icon != null) { int iconDb = Label.convertToIconDb(icon); labelId = dbHelper.labelDao.insert(label, iconDb); } else { labelId = dbHelper.labelDao.insert(label); } labelsMap.put(label, labelId); } dbHelper.appsLabelDao.merge(packageName, c.getString(0), labelId); } } } finally { c.close(); handler.sendEmptyMessage(1); } } private static Map<String, Integer> createDefaultIconsMap() { HashMap<String, Integer> m = new HashMap<String, Integer>(); m.put("Arcade & Action", R.drawable.package_games_arcade); m.put("Cards & Casino", R.drawable.kpat); m.put("Brain & Puzzle", R.drawable.package_games_board); m.put("Casual", R.drawable.package_games_kids); m.put("Comics", R.drawable.kpaint); m.put("Communication", R.drawable.kmail); m.put("Entertainment", R.drawable.ksmiletris); m.put("Finance", R.drawable.kchart); m.put("Health", R.drawable.kstars); m.put("Lifestyle", R.drawable.kfm_home); m.put("Multimedia", R.drawable.multimedia); m.put("News & Weather", R.drawable.kweather); m.put("Productivity", R.drawable.kspread_ksp); m.put("Reference", R.drawable.globe); m.put("Shopping", R.drawable.kwallet); m.put("Social", R.drawable.kopete); m.put("Sports", R.drawable.agt_member); m.put("Themes", R.drawable.thumbnail); m.put("Tools", R.drawable.service_manager); m.put("Travel", R.drawable.image2); m.put("Demo", R.drawable.demo); m.put("Software libraries", R.drawable.blockdevice); return m; } }