From 7a599a36e1ce0bd9883d5f893ca2cd174d717ced Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Mon, 11 Mar 2013 11:19:37 +0800 Subject: [PATCH 01/19] add Chinese support;change package and project name --- .project | 66 +- AndroidManifest.xml | 200 +- Makefile | 71 - project.properties | 2 +- res/layout/widgetpreferences.xml | 42 +- res/values-de/strings.xml | 334 ++-- res/values-es/strings.xml | 250 +-- res/values-fr/strings.xml | 316 ++-- res/values-ja/strings.xml | 328 ++-- res/values-nl/strings.xml | 232 +-- res/values-ru/strings.xml | 362 ++-- res/values-tr/strings.xml | 324 ++-- res/values-zh/strings.xml | 254 +++ res/values/strings.xml | 508 +++--- res/xml/widgetinfo.xml | 14 +- .../sparserss => cn/eric/rss}/Animations.java | 109 +- .../rss}/ApplicationPreferencesActivity.java | 253 +-- .../sparserss => cn/eric/rss}/BASE64.java | 182 +- .../rss}/BootCompletedBroadcastReceiver.java | 103 +- .../eric/rss}/CompatibilityHelper.java | 143 +- .../eric/rss}/EmptyActivity.java | 65 +- .../eric/rss}/EntriesListActivity.java | 555 +++--- .../eric/rss}/EntriesListAdapter.java | 511 +++--- .../eric/rss}/EntryActivity.java | 1613 +++++++++-------- .../eric/rss}/FeedConfigActivity.java | 357 ++-- .../eric/rss}/FeedPrefsActivity.java | 131 +- .../eric/rss}/MainTabActivity.java | 587 +++--- .../eric/rss}/RSSOverview.java | 1217 ++++++------- .../eric/rss}/RSSOverviewListAdapter.java | 409 ++--- .../eric/rss}/RefreshBroadcastReceiver.java | 79 +- .../sparserss => cn/eric/rss}/SimpleTask.java | 162 +- .../sparserss => cn/eric/rss}/Strings.java | 377 ++-- .../rss}/handler/PictureFilenameFilter.java | 118 +- .../eric/rss}/handler/RSSHandler.java | 1306 ++++++------- .../eric/rss}/provider/FeedData.java | 362 ++-- .../provider/FeedDataContentProvider.java | 1150 ++++++------ .../eric/rss}/provider/OPML.java | 432 ++--- .../eric/rss}/service/FetcherService.java | 1180 ++++++------ .../eric/rss}/service/RefreshService.java | 258 +-- .../widget/ColorPickerDialogPreference.java | 224 +-- .../rss/widget/MiniRSSAppWidgetProvider.java} | 272 +-- .../rss}/widget/WidgetConfigActivity.java | 284 +-- 42 files changed, 7972 insertions(+), 7770 deletions(-) delete mode 100644 Makefile create mode 100644 res/values-zh/strings.xml rename src/{de/shandschuh/sparserss => cn/eric/rss}/Animations.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/ApplicationPreferencesActivity.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/BASE64.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/BootCompletedBroadcastReceiver.java (93%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/CompatibilityHelper.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/EmptyActivity.java (94%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/EntriesListActivity.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/EntriesListAdapter.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/EntryActivity.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/FeedConfigActivity.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/FeedPrefsActivity.java (94%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/MainTabActivity.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/RSSOverview.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/RSSOverviewListAdapter.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/RefreshBroadcastReceiver.java (92%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/SimpleTask.java (93%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/Strings.java (91%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/handler/PictureFilenameFilter.java (92%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/handler/RSSHandler.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/provider/FeedData.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/provider/FeedDataContentProvider.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/provider/OPML.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/service/FetcherService.java (96%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/service/RefreshService.java (95%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/widget/ColorPickerDialogPreference.java (94%) rename src/{de/shandschuh/sparserss/widget/SparseRSSAppWidgetProvider.java => cn/eric/rss/widget/MiniRSSAppWidgetProvider.java} (91%) rename src/{de/shandschuh/sparserss => cn/eric/rss}/widget/WidgetConfigActivity.java (91%) diff --git a/.project b/.project index 5aadd53..6a9e9b8 100644 --- a/.project +++ b/.project @@ -1,33 +1,33 @@ - - - Sparse RSS - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - + + + Mini RSS Reader + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2bd62ee..0c85203 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,100 +1,100 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Makefile b/Makefile deleted file mode 100644 index 69501d6..0000000 --- a/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -# Adjust to your local settings -SDK_DIR = /home/android/android-sdks -API_LEVEL = 15 -KEYALIAS = rss - - -# From here on, the file should be left unchanged -AAPT = $(SDK_DIR)/platform-tools/aapt -ANDROID_JAR = $(SDK_DIR)/platforms/android-$(API_LEVEL)/android.jar -DX_JAR = $(SDK_DIR)/platform-tools/lib/dx.jar -SDKLIB_JAR = $(SDK_DIR)/tools/lib/sdklib.jar -ZIPALIGN = $(SDK_DIR)/tools/zipalign - - -all: zipalign - -icons: res/drawable/icon.png res/drawable/feed.png res/drawable/feed_grey.png res/drawable/ic_statusbar_rss.png res/drawable-v9/ic_statusbar_rss.png res/drawable-v11/ic_statusbar_rss.png - -res/drawable/icon.png: launcher.svg - mkdir -p res/drawable - convert launcher.svg -resize 60x60 -background Transparent -bordercolor Transparent -border 4x6 \( +clone -background Transparent -shadow 40x1+0+3 \) +swap -layers merge +repage res/drawable/icon.png - convert -extract 72x72+0+0 +repage res/drawable/icon.png res/drawable/icon.png - -res/drawable/feed.png: launcher.svg - mkdir -p res/drawable - convert launcher.svg -resize 19x19 -background Transparent -bordercolor Transparent -border 23x23 res/drawable/feed.png - convert -extract 44x44+0+21 +repage res/drawable/feed.png res/drawable/feed.png - -res/drawable/feed_grey.png: launcher.svg - mkdir -p res/drawable - convert launcher.svg -resize 19x19 -background Transparent -type Grayscale -bordercolor Transparent -border 23x23 res/drawable/feed_grey.png - convert -extract 44x44+0+21 +repage res/drawable/feed_grey.png res/drawable/feed_grey.png - -res/drawable/ic_statusbar_rss.png: status_icon.svg - mkdir -p res/drawable - convert status_icon.svg -background Transparent -resize 21x21 -bordercolor Transparent -border 2 res/drawable/ic_statusbar_rss.png - -res/drawable-v9/ic_statusbar_rss.png: status_icon_23.svg - mkdir -p res/drawable-v9 - convert status_icon_23.svg -background Transparent -resize 21x21 -bordercolor Transparent -border 2 res/drawable-v9/ic_statusbar_rss.png - -res/drawable-v11/ic_statusbar_rss.png: status_icon_30.svg - mkdir -p res/drawable-v11 - convert status_icon_30.svg -background Transparent -resize 21x21 -bordercolor Transparent -border 2 res/drawable-v11/ic_statusbar_rss.png - -aapt: icons AndroidManifest.xml res - mkdir -p gen/de/shandschuh/sparserss/ - mkdir -p bin - $(AAPT) p -f -M AndroidManifest.xml -F bin/resources.ap_ -I $(ANDROID_JAR) -S res -m -J gen - -javac: aapt - mkdir -p bin/classes - javac -d bin/classes -sourcepath gen gen/de/shandschuh/sparserss/*.java - javac -cp bin/classes:$(ANDROID_JAR) -d bin/classes -sourcepath src `find src -name *.java -print` - -bin/classes.dex: javac - java -jar $(DX_JAR) --dex --output=bin/classes.dex bin/classes - -bin/SparseRSS_unsigned.apk: bin/classes.dex - java -cp $(SDKLIB_JAR) com.android.sdklib.build.ApkBuilderMain bin/SparseRSS_unsigned.apk -u -z bin/resources.ap_ -f bin/classes.dex - -bin/SparseRSS_signed.apk: bin/SparseRSS_unsigned.apk - jarsigner -keystore keystore -signedjar bin/SparseRSS_signed.apk bin/SparseRSS_unsigned.apk $(KEYALIAS) - -zipalign: bin/SparseRSS_signed.apk - $(ZIPALIGN) 4 bin/SparseRSS_signed.apk bin/SparseRSS_signed_aligned.apk - -clean: - rm -fr res/drawable* - rm -fr gen - rm -fr bin diff --git a/project.properties b/project.properties index fd44ee5..8f81673 100644 --- a/project.properties +++ b/project.properties @@ -10,4 +10,4 @@ # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-17 +target=android-16 diff --git a/res/layout/widgetpreferences.xml b/res/layout/widgetpreferences.xml index 0c1eaf6..ab48b89 100644 --- a/res/layout/widgetpreferences.xml +++ b/res/layout/widgetpreferences.xml @@ -1,21 +1,21 @@ - - - - - - + + + + + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 1f7318d..a2aa34a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -1,167 +1,167 @@ - - - Sparse rss - Hinzufügen - Keine RSS Feeds - Keine Einträge - Aktualisieren - Löschen - Favoriten - - Diese Software ist unter der MIT Open source Lizenz veröffentlicht und der Quellcode befindet sich unter http://code.google.com/p/sparserss - - Feed bearbeiten - Neuer Feed - Bearbeiten - Aktualisieren - Einstellungen - Als gelesen markieren - Als ungelesen markieren - Verstecke gelesene Einträge - Zeige gelesene Einträge - Kopiere Link in Zwischenablage - Alle gelesenen Einträge löschen - Alle Einträge löschen - Aktualisierungsdatum zurücksetzen - Alle gelesen - Importiere von OPML - Exportiere nach OPML - Info - Sortieren aktivieren - Sortieren deaktivieren - Teilen - - Automatische Aktualisierung - Aktiviert - Diese Einstellung kontrolliert die Aktualisierung aller Feeds - Aktualisierungsintervall - Intervall zwischen zwei Aktualisierungen - - Benachrichtigungen - Kontrolliert das Vorhandensein von Benachrichtigungen - Klingelton - Auswahl eines Klingeltones, der bei neuem Inhalt abgespielt wird - Vibration - Kontrolliert die Vibration bei neuem Inhalt - - Inhaltsanzeige - Bevorzuge ungelesenen Inhalt - Zeige ungelesene Feedeinträge über gelesenen Einträgen - Zeit für die die Einträge aufbewahrt werden - Die Einträge, die älter sind, werden automatisch gelöscht - Bilder deaktivieren - Keine Bilder anzeigen oder laden - Bilder herunterladen - Alle Bilder herunterladen und local speichern - Helles Theme - Benutze helles Theme (Anwendung wird neugestartet) - Schwarzer Text auf weißem Hintergrund - Präsentiere rss-Einträge mit schwarzem Text auf weißem Hintergrund - Schriftgröße - Schriftgröße für einzelne Einträge - Gesten - Wechseln von Artikeln mittels Gesten - - Aktualisiere bei Start - Aktualisiere alle Feeds, wenn das Programm startet - - Überschreibe \"Nur mit WLan aktualisieren\" - Erlaube manuelles Aktualisieren einzelner \"nur WLan\" Feeds - - Anhang-Download-Warnung - Zeige eine Warnung vor dem öffnen/herunterladen von angehangenen Dateien - - Verstecke gelesene Einträge - Verstecke Einträge, wenn sie gelesen wurden - Einträgeeinstellungen - Sichtbare Feeds - Eintragsanzahl - Anzahl an Einträgen die im Widget gezeigt werden - Hintergrund - Farbe und Transparenz des Widgethintergrundes - Zeige Tabs - Zusätzliche Tabs für Favoriten und alle Einträge - - Netzwerk - Standard user-agent - Benutze den Standard-user-agent Namen - Folge http <-> https Weiterleitungen - Folge automatisch http zu https (und umgekehrt) Weiterleitungen - Effiziente Feed-Auswertung - Auswertung des Feeds wird automatisch bei vorhandenen oder zu alten Einträgen gestoppt - Nur WLan - Benutze den Proxy nur für WLan Verbindungen - - Aktualisiert - nie - ungelesen - neue Einträge - RSS Feeds - Fehler - Priorität - Feeds auswählen - Alle Feeds (inkl. zukünftige) - Alle - Überblick - - Die URL existiert bereits. - Die ausgewählte Datei konnte nicht importiert werden. - Der Export ist fehlgeschlagen. Bitte gehen Sie sicher, dass Sie eine schreibbare SD-Karte eingehängt haben. - Die ausgewählte Datei ist für den Import nicht gültig. - Der externe Speicher (z.B. SD-Karte) ist nicht verfügbar. - - Titel - Datei auswählen (SD-Wurzel) - Nur über WLan aktualisieren - - Rot - Grün - Blau - Transparenz - - (Webseite oder Feed) - - Wollen Sie wirklich diesen Feed und all seine Einträge löschen? - Wollen Sie wirklich diesen Feed ohne WLan aktualisieren? - Sind Sie sicher? - Wollen Sie die Datei %1$s von angeblicher Größe von %2$s herunterladen und abspielen?\nDas kann sehr viel Datenvolumen verbrauchen! - - Deaktivieren dieser Option verursacht mehr Datenverkehr (Traffic). - - Akzeptieren - Ablehnen - Immer Ok für alle - - In Datei %s exportiert. - - Lizenz - - - 1 Minute - 5 Minuten - 15 Minuten - 30 Minuten - 1 Stunde - 2 Stunden - 6 Stunden - 12 Stunden - 1 Tag - - - - 1 Tag - 2 Tage - 4 Tage - 1 Woche - 2 Wochen - 1 Monat - 2 Monate - 3 Monate - Für immer - - - Feeds lesen - Erlaubt dem Programm Sparse RSS Feeds und Einträge zu lesen. - Feeds schreiben - Erlaubt dem Programm Sparse RSS Feeds und Einträge zu schreiben. - + + + Sparse rss + Hinzufügen + Keine RSS Feeds + Keine Einträge + Aktualisieren + Löschen + Favoriten + + Diese Software ist unter der MIT Open source Lizenz veröffentlicht und der Quellcode befindet sich unter http://code.google.com/p/MiniRSS + + Feed bearbeiten + Neuer Feed + Bearbeiten + Aktualisieren + Einstellungen + Als gelesen markieren + Als ungelesen markieren + Verstecke gelesene Einträge + Zeige gelesene Einträge + Kopiere Link in Zwischenablage + Alle gelesenen Einträge löschen + Alle Einträge löschen + Aktualisierungsdatum zurücksetzen + Alle gelesen + Importiere von OPML + Exportiere nach OPML + Info + Sortieren aktivieren + Sortieren deaktivieren + Teilen + + Automatische Aktualisierung + Aktiviert + Diese Einstellung kontrolliert die Aktualisierung aller Feeds + Aktualisierungsintervall + Intervall zwischen zwei Aktualisierungen + + Benachrichtigungen + Kontrolliert das Vorhandensein von Benachrichtigungen + Klingelton + Auswahl eines Klingeltones, der bei neuem Inhalt abgespielt wird + Vibration + Kontrolliert die Vibration bei neuem Inhalt + + Inhaltsanzeige + Bevorzuge ungelesenen Inhalt + Zeige ungelesene Feedeinträge über gelesenen Einträgen + Zeit für die die Einträge aufbewahrt werden + Die Einträge, die älter sind, werden automatisch gelöscht + Bilder deaktivieren + Keine Bilder anzeigen oder laden + Bilder herunterladen + Alle Bilder herunterladen und local speichern + Helles Theme + Benutze helles Theme (Anwendung wird neugestartet) + Schwarzer Text auf weißem Hintergrund + Präsentiere rss-Einträge mit schwarzem Text auf weißem Hintergrund + Schriftgröße + Schriftgröße für einzelne Einträge + Gesten + Wechseln von Artikeln mittels Gesten + + Aktualisiere bei Start + Aktualisiere alle Feeds, wenn das Programm startet + + Überschreibe \"Nur mit WLan aktualisieren\" + Erlaube manuelles Aktualisieren einzelner \"nur WLan\" Feeds + + Anhang-Download-Warnung + Zeige eine Warnung vor dem öffnen/herunterladen von angehangenen Dateien + + Verstecke gelesene Einträge + Verstecke Einträge, wenn sie gelesen wurden + Einträgeeinstellungen + Sichtbare Feeds + Eintragsanzahl + Anzahl an Einträgen die im Widget gezeigt werden + Hintergrund + Farbe und Transparenz des Widgethintergrundes + Zeige Tabs + Zusätzliche Tabs für Favoriten und alle Einträge + + Netzwerk + Standard user-agent + Benutze den Standard-user-agent Namen + Folge http <-> https Weiterleitungen + Folge automatisch http zu https (und umgekehrt) Weiterleitungen + Effiziente Feed-Auswertung + Auswertung des Feeds wird automatisch bei vorhandenen oder zu alten Einträgen gestoppt + Nur WLan + Benutze den Proxy nur für WLan Verbindungen + + Aktualisiert + nie + ungelesen + neue Einträge + RSS Feeds + Fehler + Priorität + Feeds auswählen + Alle Feeds (inkl. zukünftige) + Alle + Überblick + + Die URL existiert bereits. + Die ausgewählte Datei konnte nicht importiert werden. + Der Export ist fehlgeschlagen. Bitte gehen Sie sicher, dass Sie eine schreibbare SD-Karte eingehängt haben. + Die ausgewählte Datei ist für den Import nicht gültig. + Der externe Speicher (z.B. SD-Karte) ist nicht verfügbar. + + Titel + Datei auswählen (SD-Wurzel) + Nur über WLan aktualisieren + + Rot + Grün + Blau + Transparenz + + (Webseite oder Feed) + + Wollen Sie wirklich diesen Feed und all seine Einträge löschen? + Wollen Sie wirklich diesen Feed ohne WLan aktualisieren? + Sind Sie sicher? + Wollen Sie die Datei %1$s von angeblicher Größe von %2$s herunterladen und abspielen?\nDas kann sehr viel Datenvolumen verbrauchen! + + Deaktivieren dieser Option verursacht mehr Datenverkehr (Traffic). + + Akzeptieren + Ablehnen + Immer Ok für alle + + In Datei %s exportiert. + + Lizenz + + + 1 Minute + 5 Minuten + 15 Minuten + 30 Minuten + 1 Stunde + 2 Stunden + 6 Stunden + 12 Stunden + 1 Tag + + + + 1 Tag + 2 Tage + 4 Tage + 1 Woche + 2 Wochen + 1 Monat + 2 Monate + 3 Monate + Für immer + + + Feeds lesen + Erlaubt dem Programm Sparse RSS Feeds und Einträge zu lesen. + Feeds schreiben + Erlaubt dem Programm Sparse RSS Feeds und Einträge zu schreiben. + diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 89f74de..900e63e 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -1,125 +1,125 @@ - - - Sparse rss - Añadir canal - No hay canales RSS - No hay entradas - Actualizar - Eliminar - Favoritos - - Editar canal - Editar - Actualizar - Ajustes - Marcar como leído - Marcar como no leído - Ocultar entradas leídas - Visualizar entradas leídas - Marcar todos como leídos - Importar desde OPML - Exportar a OPML - Acerca de - Ordenar activar - Ordenar off - - Este software se distribuye bajo licencia de código abierto MIT y el código fuente está disponible en http://code.google.com/p/sparserss - - Ajustes de actualizaciones - Habilitar - Este control activa las actualizaciones automáticas de todos los canales - Intervalo de actualización - Intervalo entre actualizaciones - - Notificaciones - Ajustar la configuración de notificaciones para nuevos contenidos - Melodía - Seleccione un tono de aviso al recibir nuevos contenidos - Vibrar - Activar vibración para aviso de nuevos contenidos - Tamaño de fuente - Tamaño de texto en las entradas - - Opciones de presentación - Dar prioridad a no leídos - Priorizar canales sin leer sobre los leídos - Tiempo que se mantendrán las entradas - Las entradas anteriores a la fecha indicada serán eliminadas - Descargar imágenes - Descargar todas las imágenes y guardar en local - Texto negro sobre fondo blanco - Visualizar entradas RSS texto negro sobre fondo blanco - - Al abrir actualizar canales - Al abrir actualizar todos los canales - - Ocultar entradas leídas - Ocultar entradas desde el widget si han sido leídas - Ajuste de entrada - Ver canales - Visualizar pestañas - Añadir pestañas para favoritos y todos los canales - Red - Solo Wi-Fi - Utilizar proxy solo para Wi-Fi - Host - Puerto - - nunca - Actualizado - no leídos - entradas nuevas - Canales RSS - Error - Prioridad - Seleccionar canales - Todos los canales (incluidos nuevos) - Todos - Agrupado - - La dirección URL ya existe. - El archivo seleccionado no puede ser importado. - Exportar ha fallado. Comprueba que la tarjeta SD tenga acceso de escritura. - El archivo seleccionado no es valido para ser importado. - - URL - (opcional) - (página web o canal) - Título - Seleccionar archivo (SD-raíz) - - Realmente quieres eliminar este canal y todas sus entradas? - - Exportado en %s. - - - 1 minuto - 5 minutos - 15 minutos - 30 minutos - 1 hora - 2 horas - 6 horas - 12 horas - 1 día - - - - 1 día - 2 días - 4 días - 1 semana - 2 semanas - 1 mes - 2 meses - 3 meses - Eternidad - - - - Estándar - +1 - +2 - +3 - - + + + Sparse rss + Añadir canal + No hay canales RSS + No hay entradas + Actualizar + Eliminar + Favoritos + + Editar canal + Editar + Actualizar + Ajustes + Marcar como leído + Marcar como no leído + Ocultar entradas leídas + Visualizar entradas leídas + Marcar todos como leídos + Importar desde OPML + Exportar a OPML + Acerca de + Ordenar activar + Ordenar off + + Este software se distribuye bajo licencia de código abierto MIT y el código fuente está disponible en http://code.google.com/p/MiniRSS + + Ajustes de actualizaciones + Habilitar + Este control activa las actualizaciones automáticas de todos los canales + Intervalo de actualización + Intervalo entre actualizaciones + + Notificaciones + Ajustar la configuración de notificaciones para nuevos contenidos + Melodía + Seleccione un tono de aviso al recibir nuevos contenidos + Vibrar + Activar vibración para aviso de nuevos contenidos + Tamaño de fuente + Tamaño de texto en las entradas + + Opciones de presentación + Dar prioridad a no leídos + Priorizar canales sin leer sobre los leídos + Tiempo que se mantendrán las entradas + Las entradas anteriores a la fecha indicada serán eliminadas + Descargar imágenes + Descargar todas las imágenes y guardar en local + Texto negro sobre fondo blanco + Visualizar entradas RSS texto negro sobre fondo blanco + + Al abrir actualizar canales + Al abrir actualizar todos los canales + + Ocultar entradas leídas + Ocultar entradas desde el widget si han sido leídas + Ajuste de entrada + Ver canales + Visualizar pestañas + Añadir pestañas para favoritos y todos los canales + Red + Solo Wi-Fi + Utilizar proxy solo para Wi-Fi + Host + Puerto + + nunca + Actualizado + no leídos + entradas nuevas + Canales RSS + Error + Prioridad + Seleccionar canales + Todos los canales (incluidos nuevos) + Todos + Agrupado + + La dirección URL ya existe. + El archivo seleccionado no puede ser importado. + Exportar ha fallado. Comprueba que la tarjeta SD tenga acceso de escritura. + El archivo seleccionado no es valido para ser importado. + + URL + (opcional) + (página web o canal) + Título + Seleccionar archivo (SD-raíz) + + Realmente quieres eliminar este canal y todas sus entradas? + + Exportado en %s. + + + 1 minuto + 5 minutos + 15 minutos + 30 minutos + 1 hora + 2 horas + 6 horas + 12 horas + 1 día + + + + 1 día + 2 días + 4 días + 1 semana + 2 semanas + 1 mes + 2 meses + 3 meses + Eternidad + + + + Estándar + +1 + +2 + +3 + + diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 9645b9e..48e7625 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1,158 +1,158 @@ - - - Sparse rss - Ajouter un flux - Aucun flux RSS - Aucun message - Actualiser - Effacer - Favoris - - Éditer le flux - Éditer - Actualiser - Réglages - Marquer comme lu - Marquer comme non lu - Cacher le contenu lu - Montrer le contenu lu - Effacer les entrées lues - Effacer toutes les entrées - Marquer tout comme lu - Importer depuis OPML - Exporter vers OPML - À propos - Activer le tri des flux - Désactiver le tri des flux - Partager - - Ce logiciel est distribué sous licence libre MIT et son code source est disponible sur http://code.google.com/p/sparserss - - Actualisation automatique - Activée - Contrôle le rafraîchissement automatique de tous les flux - Intervalle entre les actualisations - Délai entre deux mises à jour automatiques - - Notifications - Choisir les notifications en cas de nouveaux contenus - Sonnerie - Choisir une sonnerie annonçant les nouveaux contenus - Vibrer - Définit si l\'on active la vibration pour les nouveaux contenus - - Présentation des flux - Prioriser le contenu non lu - Montre le contenu non lu au-dessus du contenu déjà lu - Délai de conservation des flux - Le contenu plus ancien que le délai indiqué sera effacé - Télécharger les images - Télécharge toutes les images et les stocker localement - Texte noir sur fond blanc - Affiche le contenu en noir sur un fond blanc - Taille de la police - Taille de la police pour le contenu - Gestes - utiliser les gestes pour basculer d\'un message à l\'autre - - Actualiser à l\'ouverture - Actualise tous les flux à l\'ouverture de l\'application - - Ignorer \"rafraîchir uniquementvia Wifi\" - Autoriser le rafraîchissement des flux \"wifi seul\" - - Avertissement pour les pièces jointes - Afficher un avertissement avant de télécharger/ouvrir des pièces jointes - - Cacher le contenu lu - Cache le contenu déjà lu dans le widget - Réglages du contenu - Flux visibles - Nombre d\'entrées - Nombre d\'entrées à afficher dans le widget - Arrière-plan - Couleur et transparence de l\'arrière-plan du widget - Montrer les onglets - Onglets additionnels pour les favoris et l\'ensemble des flux - - Réseau - Suivre les redirections http <-> https - Suivre automatiquement les redirections http vers https et vice versa - Analyse de flux efficace - L\'analyse du flux sera automatiquement arrêtée pour les articles existants ou trop anciens - Wifi seulement - Utilise le proxy pour le wifi seulement - Hôte - Port - - Jamais - Mise à jour - \u00A0:\u00A0 - Non lu - Nouveau contenu - Flux RSS - Erreur - Priorité - Sélectionner les flux - Tous les flux (y compris ceux à venir) - Tous - Mes flux - ko - - L\'URL existe déjà. - Le fichier sélectionné n\'a pu être importé. - L\'export a échoué. Assurez-vous d\'avoir une carte SD montée et autorisée en écriture. - Le fichier sélectionné n\'est pas valide. - - URL - (optionnel) - (site web ou flux) - Titre - Sélectionner le fichier (racine SD) - Rafraîchir uniquement via Wifi - - Rouge - Vert - Bleu - Transparence - - Voulez-vous vraiment effacer ce flux et tout son contenu\u00A0? - Êtes-vous sûr de vouloir rafraîchir ce flux alors que vous n\'êtes pas sur wifi\u00A0? - Êtes-vous sûr\u00A0? - Voulez-vous télécharger et lire le fichier %1$s d\'une taille présumée de %2$s ?\nCela peut consommer beaucoup de bande passante\u00A0! - - Désactiver cette option provoquera davantage de trafic. - - Accepter - Refuser - Toujours Oui pour tout - - Exporté vers %s. - - Licence - Conseil - - - 1 minute - 5 minutes - 15 minutes - 30 minutes - 1 heure - 2 heures - 6 heures - 12 heures - 1 jour - - - - 1 jour - 2 jours - 4 jours - 1 semaine - 2 semaines - 1 mois - 2 mois - 3 mois - Jamais - - + + + Sparse rss + Ajouter un flux + Aucun flux RSS + Aucun message + Actualiser + Effacer + Favoris + + Éditer le flux + Éditer + Actualiser + Réglages + Marquer comme lu + Marquer comme non lu + Cacher le contenu lu + Montrer le contenu lu + Effacer les entrées lues + Effacer toutes les entrées + Marquer tout comme lu + Importer depuis OPML + Exporter vers OPML + À propos + Activer le tri des flux + Désactiver le tri des flux + Partager + + Ce logiciel est distribué sous licence libre MIT et son code source est disponible sur http://code.google.com/p/MiniRSS + + Actualisation automatique + Activée + Contrôle le rafraîchissement automatique de tous les flux + Intervalle entre les actualisations + Délai entre deux mises à jour automatiques + + Notifications + Choisir les notifications en cas de nouveaux contenus + Sonnerie + Choisir une sonnerie annonçant les nouveaux contenus + Vibrer + Définit si l\'on active la vibration pour les nouveaux contenus + + Présentation des flux + Prioriser le contenu non lu + Montre le contenu non lu au-dessus du contenu déjà lu + Délai de conservation des flux + Le contenu plus ancien que le délai indiqué sera effacé + Télécharger les images + Télécharge toutes les images et les stocker localement + Texte noir sur fond blanc + Affiche le contenu en noir sur un fond blanc + Taille de la police + Taille de la police pour le contenu + Gestes + utiliser les gestes pour basculer d\'un message à l\'autre + + Actualiser à l\'ouverture + Actualise tous les flux à l\'ouverture de l\'application + + Ignorer \"rafraîchir uniquementvia Wifi\" + Autoriser le rafraîchissement des flux \"wifi seul\" + + Avertissement pour les pièces jointes + Afficher un avertissement avant de télécharger/ouvrir des pièces jointes + + Cacher le contenu lu + Cache le contenu déjà lu dans le widget + Réglages du contenu + Flux visibles + Nombre d\'entrées + Nombre d\'entrées à afficher dans le widget + Arrière-plan + Couleur et transparence de l\'arrière-plan du widget + Montrer les onglets + Onglets additionnels pour les favoris et l\'ensemble des flux + + Réseau + Suivre les redirections http <-> https + Suivre automatiquement les redirections http vers https et vice versa + Analyse de flux efficace + L\'analyse du flux sera automatiquement arrêtée pour les articles existants ou trop anciens + Wifi seulement + Utilise le proxy pour le wifi seulement + Hôte + Port + + Jamais + Mise à jour + \u00A0:\u00A0 + Non lu + Nouveau contenu + Flux RSS + Erreur + Priorité + Sélectionner les flux + Tous les flux (y compris ceux à venir) + Tous + Mes flux + ko + + L\'URL existe déjà. + Le fichier sélectionné n\'a pu être importé. + L\'export a échoué. Assurez-vous d\'avoir une carte SD montée et autorisée en écriture. + Le fichier sélectionné n\'est pas valide. + + URL + (optionnel) + (site web ou flux) + Titre + Sélectionner le fichier (racine SD) + Rafraîchir uniquement via Wifi + + Rouge + Vert + Bleu + Transparence + + Voulez-vous vraiment effacer ce flux et tout son contenu\u00A0? + Êtes-vous sûr de vouloir rafraîchir ce flux alors que vous n\'êtes pas sur wifi\u00A0? + Êtes-vous sûr\u00A0? + Voulez-vous télécharger et lire le fichier %1$s d\'une taille présumée de %2$s ?\nCela peut consommer beaucoup de bande passante\u00A0! + + Désactiver cette option provoquera davantage de trafic. + + Accepter + Refuser + Toujours Oui pour tout + + Exporté vers %s. + + Licence + Conseil + + + 1 minute + 5 minutes + 15 minutes + 30 minutes + 1 heure + 2 heures + 6 heures + 12 heures + 1 jour + + + + 1 jour + 2 jours + 4 jours + 1 semaine + 2 semaines + 1 mois + 2 mois + 3 mois + Jamais + + diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 76f6e8c..7554f1a 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -1,164 +1,164 @@ - - - Sparse rss - 加える - RSSフィード無 - 記入しない - 更新 - 消去 - お気に入り - - このソフトウェアのライセンスは、MIT Licenseで公示されており、ソースコードは、http://code.google.com/p/sparserssにある - - フィード編集 - 編集 - 更新 - 設定 - 既読の印をつける - 未読の印をつける - 既読の記事を表示しない - 既読の記事を表示 - リンクをコピー - 既読済みを削除 - 全てを削除 - - 全て既読 - OPMLからインポート - OPMLへエクスポート - インフメーション - 仕分け開始 - 仕分け終了 - 共有… - - 自動更新 - ON - この設定は全てのフィードの更新状況をコントロールします - 更新頻度 - 二つの更新の間隔 - - 通知する - 通知の現存をコントロールする - 着信音 - 選択した着信音で記事の更新を知らせする - バイブレーション - 記事の更新をバイブレーションで知らせる - - 内容表示方法 - 未既読の内容を優先する - 未既読記事を既読記事の上に表示する - 記事の保存期間 - 過去の記事を自動的に消去する - 画像をダウンロード - 全ての画像をダウンロードし、保存する - テーマカラー・明るい - テーマカラーを明るくする(更新する) - 黒文字白背景 - 白色背景に黒い文字 - 文字の大きさ - 個々の記事の文字の大きさ - スライド - 記事をスライドさせる - - スタート時に更新する - プログラム開始時に全てのフィードを更新する - - 「ワイヤレス接続のみ」を無視する - 手動で個々の「ワイヤレス接続のみ」のフィードの更新を許可する - - 添付ファイルダウンロードの確認 - 記事の添付ファイルをダウンロードする前に確認メッセージを出す - - 既読の記事を表示しない - 既読の記事を表示しない - 記事設定 - 表示されているフィード - 記事数 - ウィジェットに表示する記事数 - 背景 - ウィジェットの背景の色と透明度 - タブを表示する - お気に入りと全ての記事のためのタブを追加 - - ネットワーク - 一般的なuser-agent - 一般的なuser-agentの名前を使う - http<->httpsの転送 - httpとhttps間の自動相互転送をする - 効率的なフィード解析 - 古いニュース、又は解析済みのニュースを含む場合はフィード解析を止める。 - ワイヤレスのみ - ワイヤレスの場合はProxyを使用する - - 更新 - 決してしない - 未読 - 新着記事 - RSSフィード - エラー - 優先順位 - フィード選択 - 全てのフィード(これからくるものも含め) - 全て - 概要 - - 登録のURLです - 選択されたデータは、インポートできませんでした - エクスポートに失敗しました。書き込み可能なSDカードが入っているかどうか確認して下さい - 選択されたデータはインポートが無効なデータです - - タイトル - データを選択(SDルート) - ワイヤレス接続のみ更新可 - 変更済み - - - - - 透明度 - - (ウェブサイト又はフィード) - - 本当にこのフィードとフィード内の全ての記事を消去しますか? - ワイヤレスの無い環境でも更新しますか? - 確認 - %1$sというファイル(大きさは%2$sらしい)をダウンロードしますか?\nデータ量を多く必要とするかもしれません! - - このオプションを無効にするとデータ量より多くのデータ量が必要になるます。. - - 許可する - 許可しない - - データ %s エクスポート - - 認可 - - 1分 - 5分 - 15分 - 30分 - 1時間 - 2時間 - 6時間 - 12時間 - 1日 - - - - 1日 - 2日 - 4日 - 1週間 - 2週間 - 1ヶ月 - 2ヶ月 - 3ヶ月 - 永遠に - - - - 標準 - +1 - +2 - +3 - - + + + Sparse rss + 加える + RSSフィード無 + 記入しない + 更新 + 消去 + お気に入り + + このソフトウェアのライセンスは、MIT Licenseで公示されており、ソースコードは、http://code.google.com/p/MiniRSSにある + + フィード編集 + 編集 + 更新 + 設定 + 既読の印をつける + 未読の印をつける + 既読の記事を表示しない + 既読の記事を表示 + リンクをコピー + 既読済みを削除 + 全てを削除 + + 全て既読 + OPMLからインポート + OPMLへエクスポート + インフメーション + 仕分け開始 + 仕分け終了 + 共有… + + 自動更新 + ON + この設定は全てのフィードの更新状況をコントロールします + 更新頻度 + 二つの更新の間隔 + + 通知する + 通知の現存をコントロールする + 着信音 + 選択した着信音で記事の更新を知らせする + バイブレーション + 記事の更新をバイブレーションで知らせる + + 内容表示方法 + 未既読の内容を優先する + 未既読記事を既読記事の上に表示する + 記事の保存期間 + 過去の記事を自動的に消去する + 画像をダウンロード + 全ての画像をダウンロードし、保存する + テーマカラー・明るい + テーマカラーを明るくする(更新する) + 黒文字白背景 + 白色背景に黒い文字 + 文字の大きさ + 個々の記事の文字の大きさ + スライド + 記事をスライドさせる + + スタート時に更新する + プログラム開始時に全てのフィードを更新する + + 「ワイヤレス接続のみ」を無視する + 手動で個々の「ワイヤレス接続のみ」のフィードの更新を許可する + + 添付ファイルダウンロードの確認 + 記事の添付ファイルをダウンロードする前に確認メッセージを出す + + 既読の記事を表示しない + 既読の記事を表示しない + 記事設定 + 表示されているフィード + 記事数 + ウィジェットに表示する記事数 + 背景 + ウィジェットの背景の色と透明度 + タブを表示する + お気に入りと全ての記事のためのタブを追加 + + ネットワーク + 一般的なuser-agent + 一般的なuser-agentの名前を使う + http<->httpsの転送 + httpとhttps間の自動相互転送をする + 効率的なフィード解析 + 古いニュース、又は解析済みのニュースを含む場合はフィード解析を止める。 + ワイヤレスのみ + ワイヤレスの場合はProxyを使用する + + 更新 + 決してしない + 未読 + 新着記事 + RSSフィード + エラー + 優先順位 + フィード選択 + 全てのフィード(これからくるものも含め) + 全て + 概要 + + 登録のURLです + 選択されたデータは、インポートできませんでした + エクスポートに失敗しました。書き込み可能なSDカードが入っているかどうか確認して下さい + 選択されたデータはインポートが無効なデータです + + タイトル + データを選択(SDルート) + ワイヤレス接続のみ更新可 + 変更済み + + + + + 透明度 + + (ウェブサイト又はフィード) + + 本当にこのフィードとフィード内の全ての記事を消去しますか? + ワイヤレスの無い環境でも更新しますか? + 確認 + %1$sというファイル(大きさは%2$sらしい)をダウンロードしますか?\nデータ量を多く必要とするかもしれません! + + このオプションを無効にするとデータ量より多くのデータ量が必要になるます。. + + 許可する + 許可しない + + データ %s エクスポート + + 認可 + + 1分 + 5分 + 15分 + 30分 + 1時間 + 2時間 + 6時間 + 12時間 + 1日 + + + + 1日 + 2日 + 4日 + 1週間 + 2週間 + 1ヶ月 + 2ヶ月 + 3ヶ月 + 永遠に + + + + 標準 + +1 + +2 + +3 + + diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 5e80599..af5441f 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -1,116 +1,116 @@ - - - Sparse rss - Feed toevoegen - Geen RSS feeds - Geen artikelen - Vernieuwen - Verwijder - Favorieten - - Wijzig feed - Wijzig - Vernieuwen - Instellingen - Markeer als gelezen - Markeer als ongelezen - Verberg gelezen artikelen - Toon gelezen artikelen - Alles als gelezen markeren - Importeer uit OPML - Exporteer naar OPML - Over - Sorteer activeren - Sort off - - De software wordt verspreid onder de MIT open source licentie en de broncode is beschikbaar via http://code.google.com/p/sparserss - - Automatisch vernieuwen - Aan - Deze instelling past het automatisch vernieuwen van feeds aan - Interval voor vernieuwen - Interval tussen twee keer automatisch vernieuwen - - Notificaties - Deze instelling bepaalt hoe u notificaties wilt ontvangen - Beltoon - Selecteer een beltoon bij het ontvangen van nieuwe artikelen - Trillen - Bepaalt of een de telefoon trilt bij het ontvangen van nieuwe artikelen - - Presentatie van inhoud - Prioriteer ongelezen artikelen - Toon ongelezen artikelen boven de gelezen artikelen - Tijd dat de artikelen bewaard worden - Artikelen verwijderen na - Lettergrootte - Lettergrootte voor enkele artikelen - - Artikelen vernieuwen bij openen - Alle feeds vernieuwen na het openen van de applicatie - - Verberg gelezen artikelen - Verberg items in de widget als ze gelezen zijn - Artikel instellingen - Zichtbare feeds - Bekijk Tabs - Additionele tabs voor favorieten en alle feed artikelen - - nooit - Bijwerken - ongelezen - nieuwe artikelen - RSS feeds - Fout - Prioriteit - Selecteer feeds - Alle feeds (incl. toekomst) - Alle - Overzicht - - Het adres bestaat al. - Het geselecteerde bestand kon niet worden geïmporteerd. - Het exporteren is mislukt. Zorg dat een schrijfbare SD kaart is gekoppeld. - Het geselecteerde bestand is niet geschikt voor import. - - Adres - (optioneel) - (website of feed) - Titel - Selecteer een bestand (SD-Root) - - Wilt u deze feed en alle bijbehorende artikelen echt verwijderen? - - Exporteren naar %s. - - - 1 minuut - 5 minuten - 15 minuten - 30 minuten - 1 uur - 2 uren - 6 uren - 12 uren - 1 dag - - - - 1 dag - 2 dagen - 4 dagen - 1 week - 2 weken - 1 maand - 2 maanden - 3 maanden - Voor altijd - - - - Standaard - +1 - +2 - +3 - - + + + Sparse rss + Feed toevoegen + Geen RSS feeds + Geen artikelen + Vernieuwen + Verwijder + Favorieten + + Wijzig feed + Wijzig + Vernieuwen + Instellingen + Markeer als gelezen + Markeer als ongelezen + Verberg gelezen artikelen + Toon gelezen artikelen + Alles als gelezen markeren + Importeer uit OPML + Exporteer naar OPML + Over + Sorteer activeren + Sort off + + De software wordt verspreid onder de MIT open source licentie en de broncode is beschikbaar via http://code.google.com/p/MiniRSS + + Automatisch vernieuwen + Aan + Deze instelling past het automatisch vernieuwen van feeds aan + Interval voor vernieuwen + Interval tussen twee keer automatisch vernieuwen + + Notificaties + Deze instelling bepaalt hoe u notificaties wilt ontvangen + Beltoon + Selecteer een beltoon bij het ontvangen van nieuwe artikelen + Trillen + Bepaalt of een de telefoon trilt bij het ontvangen van nieuwe artikelen + + Presentatie van inhoud + Prioriteer ongelezen artikelen + Toon ongelezen artikelen boven de gelezen artikelen + Tijd dat de artikelen bewaard worden + Artikelen verwijderen na + Lettergrootte + Lettergrootte voor enkele artikelen + + Artikelen vernieuwen bij openen + Alle feeds vernieuwen na het openen van de applicatie + + Verberg gelezen artikelen + Verberg items in de widget als ze gelezen zijn + Artikel instellingen + Zichtbare feeds + Bekijk Tabs + Additionele tabs voor favorieten en alle feed artikelen + + nooit + Bijwerken + ongelezen + nieuwe artikelen + RSS feeds + Fout + Prioriteit + Selecteer feeds + Alle feeds (incl. toekomst) + Alle + Overzicht + + Het adres bestaat al. + Het geselecteerde bestand kon niet worden geïmporteerd. + Het exporteren is mislukt. Zorg dat een schrijfbare SD kaart is gekoppeld. + Het geselecteerde bestand is niet geschikt voor import. + + Adres + (optioneel) + (website of feed) + Titel + Selecteer een bestand (SD-Root) + + Wilt u deze feed en alle bijbehorende artikelen echt verwijderen? + + Exporteren naar %s. + + + 1 minuut + 5 minuten + 15 minuten + 30 minuten + 1 uur + 2 uren + 6 uren + 12 uren + 1 dag + + + + 1 dag + 2 dagen + 4 dagen + 1 week + 2 weken + 1 maand + 2 maanden + 3 maanden + Voor altijd + + + + Standaard + +1 + +2 + +3 + + diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 56bda7e..f014322 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -1,181 +1,181 @@ - - - Добавить - Нет RSS-лент - Нет новостей - Обновить - Удалить - Закладки - - Правка ленты - Новая лента - Правка - Обновить - Настройки - Прочитано - Непрочитано - Фильтр - Показать всё - URL в буфер - Очистить - Очистить всё - Сбросить дату - Прочитано - Импорт - Экспорт - Сведения - Сортировка - Завершить - Отправить - - This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/sparserss - Также участвовали >> - << Лицензия - - Автообновление - Включить - Обновлять все ленты автоматически - Интервал - Промежуток времени между попытками автообновления - - Уведомления - Сопровождать появление новостей уведомлением - Мелодия - Выберите мелодию для уведомления - Вибрация - Использовать вибрацию для уведомления - - Интерфейс - Группы - Располагать прочитанные новости ниже непрочитанных - Автоочистка - Промежуток времени, спустя который новости будут удалены - Отключить графику - Не загружать и не показывать изображения - Сохранять графику - Сохранять все изображения на карте памяти - Светлая тема - Использовать светлую тему оформления - Чёрным по белому - Отображать открытую новость чёрным текстом на белом фоне - Размер шрифта - Размер шрифта открытой новости - Жесты - Перелистывать новости жестами - - При запуске - Обновлять все ленты при запуске Sparse rss - - Не только по Wi-Fi - Разрешать принудительное обновление ленты с отметкой \"Только по Wi-Fi\" через сотовую сеть - - Подтверждать загрузку - Предупреждать перед загрузкой и открытием вложенных файлов - - Скрывать прочитанное - Скрывать прочитанное на виджете - Настройки новостей - Отображаемые ленты - Количество новостей - Количество новостей, отображаемых на виджете - Фон - Цвет и прозрачность фона виджета - Вкладки - Использовать интерфейс с вкладками - - Сеть - Сменить user-agent - Использовать стандартное значение user-agent - Редирект http-https - Обрабатывать автоматическое перенаправление с http на https и обратно - Краткая проверка - Остановить проверку ленты при нахождении прочитанной или очень старой новости - Для Wi-Fi - Использовать только для Wi-Fi - Адрес - Порт - Тип - - никогда - Обновлено - новых - новых - Ленты RSS - Ошибка - Приоритет - Выбранные ленты - Все ленты (и будущие) - Новости - Ленты - Кб - - Сервер не отвечает - Лента с таким адресом уже существует - Импорт невозможен - Экспорт не выполнен. Убедитесь, что карта подключена и не защищена от записи - Неправильный формат OPML-файла - Карта недоступна - - Адрес - (необязательно) - (сайта или ленты) - Название - Выберите файл в корне карты - Только по Wi-Fi - Изменения - - Красный - Зелёный - Синий - Прозрачность - - Лента и новости будут удалены. Продолжить? - Обновить ленту через сотовую сеть? - Продолжить? - Загрузить и открыть файл %1$s, примерный размер %2$s?/nВозможен приём большого объёма данных! - - Отключение этой функции увеличит объём передаваемых данных - - Принять - Отклонить - Да для всех - Экспорт выполнен в %s - Лицензия - Совет - - - 1 минута - 5 минут - 15 минут - 30 минут - 1 час - 2 часа - 6 часов - 12 часов - 1 сутки - - - - 1 сутки - 2 суток - 4 суток - 1 неделя - 2 недели - 1 месяц - 2 месяца - 3 месяца - Никогда - - - - Обычный - +1 - +2 - +3 - - - Разрешить чтение - Разрешить приложениям чтение лент Sparse rss - Разрешить запись - Разрешить приложениям запись лент Sparse rss - + + + Добавить + Нет RSS-лент + Нет новостей + Обновить + Удалить + Закладки + + Правка ленты + Новая лента + Правка + Обновить + Настройки + Прочитано + Непрочитано + Фильтр + Показать всё + URL в буфер + Очистить + Очистить всё + Сбросить дату + Прочитано + Импорт + Экспорт + Сведения + Сортировка + Завершить + Отправить + + This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/MiniRSS + Также участвовали >> + << Лицензия + + Автообновление + Включить + Обновлять все ленты автоматически + Интервал + Промежуток времени между попытками автообновления + + Уведомления + Сопровождать появление новостей уведомлением + Мелодия + Выберите мелодию для уведомления + Вибрация + Использовать вибрацию для уведомления + + Интерфейс + Группы + Располагать прочитанные новости ниже непрочитанных + Автоочистка + Промежуток времени, спустя который новости будут удалены + Отключить графику + Не загружать и не показывать изображения + Сохранять графику + Сохранять все изображения на карте памяти + Светлая тема + Использовать светлую тему оформления + Чёрным по белому + Отображать открытую новость чёрным текстом на белом фоне + Размер шрифта + Размер шрифта открытой новости + Жесты + Перелистывать новости жестами + + При запуске + Обновлять все ленты при запуске Sparse rss + + Не только по Wi-Fi + Разрешать принудительное обновление ленты с отметкой \"Только по Wi-Fi\" через сотовую сеть + + Подтверждать загрузку + Предупреждать перед загрузкой и открытием вложенных файлов + + Скрывать прочитанное + Скрывать прочитанное на виджете + Настройки новостей + Отображаемые ленты + Количество новостей + Количество новостей, отображаемых на виджете + Фон + Цвет и прозрачность фона виджета + Вкладки + Использовать интерфейс с вкладками + + Сеть + Сменить user-agent + Использовать стандартное значение user-agent + Редирект http-https + Обрабатывать автоматическое перенаправление с http на https и обратно + Краткая проверка + Остановить проверку ленты при нахождении прочитанной или очень старой новости + Для Wi-Fi + Использовать только для Wi-Fi + Адрес + Порт + Тип + + никогда + Обновлено + новых + новых + Ленты RSS + Ошибка + Приоритет + Выбранные ленты + Все ленты (и будущие) + Новости + Ленты + Кб + + Сервер не отвечает + Лента с таким адресом уже существует + Импорт невозможен + Экспорт не выполнен. Убедитесь, что карта подключена и не защищена от записи + Неправильный формат OPML-файла + Карта недоступна + + Адрес + (необязательно) + (сайта или ленты) + Название + Выберите файл в корне карты + Только по Wi-Fi + Изменения + + Красный + Зелёный + Синий + Прозрачность + + Лента и новости будут удалены. Продолжить? + Обновить ленту через сотовую сеть? + Продолжить? + Загрузить и открыть файл %1$s, примерный размер %2$s?/nВозможен приём большого объёма данных! + + Отключение этой функции увеличит объём передаваемых данных + + Принять + Отклонить + Да для всех + Экспорт выполнен в %s + Лицензия + Совет + + + 1 минута + 5 минут + 15 минут + 30 минут + 1 час + 2 часа + 6 часов + 12 часов + 1 сутки + + + + 1 сутки + 2 суток + 4 суток + 1 неделя + 2 недели + 1 месяц + 2 месяца + 3 месяца + Никогда + + + + Обычный + +1 + +2 + +3 + + + Разрешить чтение + Разрешить приложениям чтение лент Sparse rss + Разрешить запись + Разрешить приложениям запись лент Sparse rss + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 51ba5f2..5829d51 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -1,162 +1,162 @@ - - - Sparse rss - Besleme ekle - Hiçbir RSS beslemesi yok - Hiçbir mesaj yok - Tazele - Sil - Favoriler - - Besleme düzenle - Düzenle - Tazele - Ayarlar - Okunmuş say - Okunmamış say - Okunmuş mesajları sakla - Okunmuş mesajları göster - Okunan mesajları sil - Tüm mesajları sil - Tümünü okunmuş say - OPML dosyasından içe aktar - OPML dosyası olarak dışa aktar - Hakkında - Besleme sıralamasını etkinleştir - Besleme sıralamasını devre dışı bırak - - Bu yazılım MIT özgür yazılım lisansı kapsamında yayınlanmıştır ve kaynak kodu şu adreste mevcuttur: http://code.google.com/p/sparserss - - Otomatik tazeleme - Etkin - Bu ayar tüm beslemelerin otomatik tazelenmesini yönetir - Tazeleme aralığı - Otomatik tazelemeler arasındaki süre - - Bildirimler - Yeni besleme mesajları için bildirimlerin biçimini yönetir - Zil - Yeni besleme içerikleri için çalınacak zil sesini seç - Titreşim - Yeni besleme içerikleri için titreşim olup olmayacağını yönetir - - İçerik gösterimi - Okunmamış içeriğe öncelik ver - Okunmamış besleme mesajlarını okunanların üstünde göster - Mesajların tutulma süresi - Belirtilen zamandan eski mesajlar silinecektir - Görselleri indir - Tüm görselleri indir ve yerel olarak tut - Beyaz zemin üzeri siyah metin - RSS mesajlarını siyah metin olarak beyaz bir zemin üzerinde göster - Yazı tipi boyutu - Mesajlar için yazı tipi boyutu - Hareketler - Hareketlerle mesajlar arası geçiş yapmayı etkinleştir - - Açılışta beslemeleri tazele - Tüm beslemeleri uygulama açıldığında tazele - - \"sadece wifi vasıtasıyla tazele\" ayarını görmezden gel - \"sadece wifi\" beslemelerinin tek tek elle tazelenmesine izin ver - - Ek dosya indirim uyarısı - Ek dosya indirimi/açılışı öncesinde bir uyarı göster - - Okunmuş tüm mesajları sakla - Okunmuş mesajları widget\'ten sakla - Mesaj ayarları - Gösterilen beslemeler - Unsur sayısı - Widget üzerinde gösterilecek unsur sayısı - Arka plan - Widget arka planının rengi ve şeffaflığı - Sekmeleri göster - Favori ve tüm beslemeler için ek sekmeler - - - http <-> https yönlendirmelerini izle - http\'den https\'e ve tersi yönlendirmeleri otomatik olarak izle - Verimli besleme analizi - Besleme analizi mevcut ya da çok eski mesajlar için otomatik olarak devre dışı bırakılır - Sadece Wifi - Vekil sunucusunu sadece wifi için kullan - Host - Port - - asla - Güncelleme - okunmamış - yeni mesajlar - RSS beslemeleri - Hata - Öncelik - Besleme seç - Tüm beslemeler (gelecektekiler de dahil) - Hepsi - Genel bakış - - URL halihazırda mevcut. - Seçilen dosya içe aktarılamadı. - Dışa aktarım başarısız oldu. Üzerine yazılabilecek ve monte edilmiş bir SD kartınız olduğundan emin olunuz. - Seçilen dosya içe aktarım için geçerli değil. - - URL - (isteğe bağlı) - (ağ sitesi veya besleme) - Başlık - Dosya seç (SD kökü) - Sadece Wifi vasıtasıyla tazele - - Kırmızı - Yeşil - Mavi - Şeffaflık - - Bu beslemeyi ve tüm mesajlarını silmek istediğinizden emin misiniz? - Bu beslemeyi wifi vasıtasıyla bağlanmadığınız hâlde tazelemek istediğinizden emin misiniz? - Emin misiniz? - Boyutu %2$s varsayılan %1$s dosyasını indirip okumak istediğinizden emin misiniz?\nBu yüksek ağ trafiğine yol açabilir! - - Bu şıkkı devre dışı bırakmak daha fazla trafiğe neden olur. - - Tamam - İptal - Her zaman hepsine evet - - %s olarak dışa aktarıldı. - - Lisans - İpucu - - - 1 dakika - 5 dakika - 15 dakika - 30 dakika - 1 saat - 2 saat - 6 saat - 12 saat - 1 gün - - - - 1 gün - 2 gün - 4 gün - 1 hafta - 2 hafta - 1 ay - 2 ay - 3 ay - sonsuza dek - - - - Standart - +1 - +2 - +3 - - + + + Sparse rss + Besleme ekle + Hiçbir RSS beslemesi yok + Hiçbir mesaj yok + Tazele + Sil + Favoriler + + Besleme düzenle + Düzenle + Tazele + Ayarlar + Okunmuş say + Okunmamış say + Okunmuş mesajları sakla + Okunmuş mesajları göster + Okunan mesajları sil + Tüm mesajları sil + Tümünü okunmuş say + OPML dosyasından içe aktar + OPML dosyası olarak dışa aktar + Hakkında + Besleme sıralamasını etkinleştir + Besleme sıralamasını devre dışı bırak + + Bu yazılım MIT özgür yazılım lisansı kapsamında yayınlanmıştır ve kaynak kodu şu adreste mevcuttur: http://code.google.com/p/MiniRSS + + Otomatik tazeleme + Etkin + Bu ayar tüm beslemelerin otomatik tazelenmesini yönetir + Tazeleme aralığı + Otomatik tazelemeler arasındaki süre + + Bildirimler + Yeni besleme mesajları için bildirimlerin biçimini yönetir + Zil + Yeni besleme içerikleri için çalınacak zil sesini seç + Titreşim + Yeni besleme içerikleri için titreşim olup olmayacağını yönetir + + İçerik gösterimi + Okunmamış içeriğe öncelik ver + Okunmamış besleme mesajlarını okunanların üstünde göster + Mesajların tutulma süresi + Belirtilen zamandan eski mesajlar silinecektir + Görselleri indir + Tüm görselleri indir ve yerel olarak tut + Beyaz zemin üzeri siyah metin + RSS mesajlarını siyah metin olarak beyaz bir zemin üzerinde göster + Yazı tipi boyutu + Mesajlar için yazı tipi boyutu + Hareketler + Hareketlerle mesajlar arası geçiş yapmayı etkinleştir + + Açılışta beslemeleri tazele + Tüm beslemeleri uygulama açıldığında tazele + + \"sadece wifi vasıtasıyla tazele\" ayarını görmezden gel + \"sadece wifi\" beslemelerinin tek tek elle tazelenmesine izin ver + + Ek dosya indirim uyarısı + Ek dosya indirimi/açılışı öncesinde bir uyarı göster + + Okunmuş tüm mesajları sakla + Okunmuş mesajları widget\'ten sakla + Mesaj ayarları + Gösterilen beslemeler + Unsur sayısı + Widget üzerinde gösterilecek unsur sayısı + Arka plan + Widget arka planının rengi ve şeffaflığı + Sekmeleri göster + Favori ve tüm beslemeler için ek sekmeler + + + http <-> https yönlendirmelerini izle + http\'den https\'e ve tersi yönlendirmeleri otomatik olarak izle + Verimli besleme analizi + Besleme analizi mevcut ya da çok eski mesajlar için otomatik olarak devre dışı bırakılır + Sadece Wifi + Vekil sunucusunu sadece wifi için kullan + Host + Port + + asla + Güncelleme + okunmamış + yeni mesajlar + RSS beslemeleri + Hata + Öncelik + Besleme seç + Tüm beslemeler (gelecektekiler de dahil) + Hepsi + Genel bakış + + URL halihazırda mevcut. + Seçilen dosya içe aktarılamadı. + Dışa aktarım başarısız oldu. Üzerine yazılabilecek ve monte edilmiş bir SD kartınız olduğundan emin olunuz. + Seçilen dosya içe aktarım için geçerli değil. + + URL + (isteğe bağlı) + (ağ sitesi veya besleme) + Başlık + Dosya seç (SD kökü) + Sadece Wifi vasıtasıyla tazele + + Kırmızı + Yeşil + Mavi + Şeffaflık + + Bu beslemeyi ve tüm mesajlarını silmek istediğinizden emin misiniz? + Bu beslemeyi wifi vasıtasıyla bağlanmadığınız hâlde tazelemek istediğinizden emin misiniz? + Emin misiniz? + Boyutu %2$s varsayılan %1$s dosyasını indirip okumak istediğinizden emin misiniz?\nBu yüksek ağ trafiğine yol açabilir! + + Bu şıkkı devre dışı bırakmak daha fazla trafiğe neden olur. + + Tamam + İptal + Her zaman hepsine evet + + %s olarak dışa aktarıldı. + + Lisans + İpucu + + + 1 dakika + 5 dakika + 15 dakika + 30 dakika + 1 saat + 2 saat + 6 saat + 12 saat + 1 gün + + + + 1 gün + 2 gün + 4 gün + 1 hafta + 2 hafta + 1 ay + 2 ay + 3 ay + sonsuza dek + + + + Standart + +1 + +2 + +3 + + diff --git a/res/values-zh/strings.xml b/res/values-zh/strings.xml new file mode 100644 index 0000000..e717310 --- /dev/null +++ b/res/values-zh/strings.xml @@ -0,0 +1,254 @@ + + + + Sparse RSS订阅 + 添加订阅 + 没有订阅 + 没有新鲜事 + 刷新 + 删除 + 收藏 + + 编辑订阅 + 新建订阅 + 编辑 + 刷新 + 设置 + 标记为已读 + 标记为未读 + 隐藏已读条目 + 显示已读条目 + 将链接复制到剪贴板 + 删除已读条目 + 删除所有条目 + 重置更新日期 + 全部标记为已读 + 从OPML文件导入设置 + 将设置导出到OPML文件 + 关于 + 启用新鲜事排序 + 禁用新鲜事排序 + 分享 + + + Copyright © 2010-2012 Stefan Handschuh (handschuh.stefan@googlemail.com)\n\n + Translators\n + - Dutch: Eelko Berkenpies\n + - Spanish: Sergio Martín\n + - Russian: Igor Nedoboy\n + - Swedish: Lars m + \n\nPermission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + \n\n + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + \n\n + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Additional contributors (other translations and code):\n\n - a very nice person that wants to be unnamed (French and Turkish translations)\n + - another nice unnamed person (Japanese translation)\n + - Joel Low (several patches [refresh spinner, UI adjustments and more]); see commit log for details + This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/MiniRSS + Additional contributors >> + << License + + 自动刷新 + 启用 + 控制所有新鲜事的自动刷新 + 刷新间隔 + 两次自动刷新之间的间隔时间 + + 提示 + 新鲜事有更新时的提示效果 + 铃声 + 选择新鲜事有更新时的铃声 + 震动 + 新鲜事有更新时是否要震动 + + 内容展示 + 未读内容优先 + 将未读内容显示在已读内容的上方 + 新鲜事的保存时间 + 比规定时间更旧的新鲜事将被删除 + 禁用图片 + 不加载或显示任何图片 + 下载图片 + 下载所有图片并保存到本地 + 清新主题 + 使用淡色调的主题(程序将自动重启) + 白底黑字 + 将新鲜事以白底黑字的风格来显示 + 字体大小 + 单条新鲜事的字体大小 + 手势 + 使用手势来切换新鲜事 + + 启动时刷新 + 打开软件时自动刷新新鲜事 + + 覆盖 \"仅在wifi下刷新\" + 允许手动刷新 \"仅在wifi下刷新\" 的新鲜事 + + 附件下载警告 + 打开过下载附件时显示警告 + + 隐藏已读新鲜事 + 隐藏已读新鲜事 + 新鲜事设置 + 可见的新鲜事 + 新鲜事数量 + 显示的新鲜事数量 + 背景 + 背景的颜色和透明度 + 显示标签 + \"收藏 \"和 \"所有 \"标签 + + 网络 + 标准用户代理 + 使用标准的用户代理名称 + 采用 http <-> https 重定向 + 自动采用http到https(反之亦然)的重定向 + 高效新鲜事解析 + 自动停止对过于陈旧的新鲜事进行解析 + 仅wifi + 只对wifi应用代理 + 主机 + 端口 + 类型 + + 从不 + 更新 + :\u00A0 + 未读 + 新的新鲜事 + RSS订阅 + 错误 + 优先级 + 选择订阅 + 所有订阅 + 全部 + 概观 + kb + + 订阅的网址无法被访问. + 网址已存在. + 选中的文件不能被导入. + 导出失败,请确保您已加载了可写入的SD卡. + 选中的文件无效,无法被导入. + SD卡不可用. + + 网址 + (可选) + (网站或订阅) + 标题 + 选择文件 (SD-root) + 仅在wifi下刷新 + 变更日志 + + + 绿 + + 透明度 + + 其他设置 + 自定义订阅铃声 + 启用: 使用下面定义的铃声 + 禁用: 使用设置中定义的铃声 + 选择铃声 + 略过提醒 + 启用: 有新鲜事时不提示 + 禁用: 有新鲜事时提示 + + Do you really want to delete this feed and all of its entries? + Do you really want to refresh this feed while not being on wifi? + Are you sure? + Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! + + Disabling this option causes more traffic. + + Accept + Decline + Always ok for all + + Exported into %s. + + License + Hint + + + 1 minute + 5 minutes + 15 minutes + 30 minutes + 1 hour + 2 hours + 6 hours + 12 hours + 1 day + + + + 1 day + 2 days + 4 days + 1 week + 2 weeks + 1 month + 2 months + 3 months + Forever + + + + Standard + +1 + +2 + +3 + + + + HTTP + SOCKS + + + Read feed data + Allows the application to read Sparse RSS feeds and entries. + Write feed data + Allows the application to write Sparse RSS feeds and entries. + diff --git a/res/values/strings.xml b/res/values/strings.xml index 9567ab8..5d4a821 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,254 +1,254 @@ - - - - Sparse rss - Add feed - No RSS feeds - No entries - Refresh - Delete - Favorites - - Edit feed - New feed - Edit - Refresh - Settings - Mark as read - Mark as unread - Hide read entries - Show read entries - Copy link into clipboard - Delete read entries - Delete all entries - Reset update-date - Mark all as read - Import from OPML - Export to OPML - About - Enable feed sort - Disable feed sort - Share - - - Copyright © 2010-2012 Stefan Handschuh (handschuh.stefan@googlemail.com)\n\n - Translators\n - - Dutch: Eelko Berkenpies\n - - Spanish: Sergio Martín\n - - Russian: Igor Nedoboy\n - - Swedish: Lars m - \n\nPermission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - \n\n - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - \n\n - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - Additional contributors (other translations and code):\n\n - a very nice person that wants to be unnamed (French and Turkish translations)\n - - another nice unnamed person (Japanese translation)\n - - Joel Low (several patches [refresh spinner, UI adjustments and more]); see commit log for details - This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/sparserss - Additional contributors >> - << License - - Automated refresh - Enabled - This setting controls the automatic refresh of all feeds - Refresh interval - Interval between two automated refreshes - - Notifications - Controls the appearance of notifications in case of new feed content - Ringtone - Select a ringtone that will be played on new feed content - Vibrate - Controls if there will be vibration on new feed content - - Content presentation - Prioritize unread content - Show unread feed entries above read entries - Time that the entries will be kept - The entries that are older than the given date will be deleted - Disable pictures - Do not show and load any pictures - Download pictures - Download all pictures and store them locally - Light theme - Use the light theme (application will be restarted) - Black text on white background - Present rss entries in black text on white background - Font size - Font size for single entries - Gestures - Use gestures to switch entries - - Refresh feeds on open - Refreshes all feeds after opening the application - - Override \"refresh on wifi only\" - Allow manual refreshing of single \"wifi-only\" feeds - - Enclosure download warning - Show warning before opening opening/downloading attached files - - Hide read entries - Hide entries from the widget if they have been read - Entry settings - Visible feeds - Entry count - Number of entries that are shown in the widget - Background - Color and transparency of the widget background - Show tabs - Additional tabs for favorite and all feed-entries - - Network - Standard user-agent - Use the standard user-agent name - Follow http <-> https redirects - Automatically follow http to https and vice versa redirects - Efficient feed parsing - Parsing the feed will be stopped automatically on existing or too old articles - Wifi only - Use Proxy only for wifi - Host - Port - Type - - never - Update - :\u00A0 - unread - new entries - RSS feeds - Error - Priority - Select feeds - All feeds (incl. future) - All - Overview - kb - - The Feed URL could not accessed. - The URL already exists. - The selected file could not be imported. - The export has failed. Make sure you have a writable SD-card mounted. - The selected file is not valid for import. - The external storage (e.g. SD-card) is not available. - - URL - (optional) - (website or feed) - Title - Select file (SD-root) - Refresh only over Wifi - Changelog - - Red - Green - Blue - Transparency - - Additional settings - Custom feed ringtone - Enabled: Use ringtone defined below - Disabled: Use ringtone defined in settings - Choose ringtone - Skip alerts - Enabled: Do NOT notify on updates - Disabled: Notify on updates - - Do you really want to delete this feed and all of its entries? - Do you really want to refresh this feed while not being on wifi? - Are you sure? - Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! - - Disabling this option causes more traffic. - - Accept - Decline - Always ok for all - - Exported into %s. - - License - Hint - - - 1 minute - 5 minutes - 15 minutes - 30 minutes - 1 hour - 2 hours - 6 hours - 12 hours - 1 day - - - - 1 day - 2 days - 4 days - 1 week - 2 weeks - 1 month - 2 months - 3 months - Forever - - - - Standard - +1 - +2 - +3 - - - - HTTP - SOCKS - - - Read feed data - Allows the application to read Sparse RSS feeds and entries. - Write feed data - Allows the application to write Sparse RSS feeds and entries. - + + + + Sparse rss + Add feed + No RSS feeds + No entries + Refresh + Delete + Favorites + + Edit feed + New feed + Edit + Refresh + Settings + Mark as read + Mark as unread + Hide read entries + Show read entries + Copy link into clipboard + Delete read entries + Delete all entries + Reset update-date + Mark all as read + Import from OPML + Export to OPML + About + Enable feed sort + Disable feed sort + Share + + + Copyright © 2010-2012 Stefan Handschuh (handschuh.stefan@googlemail.com)\n\n + Translators\n + - Dutch: Eelko Berkenpies\n + - Spanish: Sergio Martín\n + - Russian: Igor Nedoboy\n + - Swedish: Lars m + \n\nPermission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + \n\n + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + \n\n + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Additional contributors (other translations and code):\n\n - a very nice person that wants to be unnamed (French and Turkish translations)\n + - another nice unnamed person (Japanese translation)\n + - Joel Low (several patches [refresh spinner, UI adjustments and more]); see commit log for details + This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/MiniRSS + Additional contributors >> + << License + + Automated refresh + Enabled + This setting controls the automatic refresh of all feeds + Refresh interval + Interval between two automated refreshes + + Notifications + Controls the appearance of notifications in case of new feed content + Ringtone + Select a ringtone that will be played on new feed content + Vibrate + Controls if there will be vibration on new feed content + + Content presentation + Prioritize unread content + Show unread feed entries above read entries + Time that the entries will be kept + The entries that are older than the given date will be deleted + Disable pictures + Do not show and load any pictures + Download pictures + Download all pictures and store them locally + Light theme + Use the light theme (application will be restarted) + Black text on white background + Present rss entries in black text on white background + Font size + Font size for single entries + Gestures + Use gestures to switch entries + + Refresh feeds on open + Refreshes all feeds after opening the application + + Override \"refresh on wifi only\" + Allow manual refreshing of single \"wifi-only\" feeds + + Enclosure download warning + Show warning before opening opening/downloading attached files + + Hide read entries + Hide entries from the widget if they have been read + Entry settings + Visible feeds + Entry count + Number of entries that are shown in the widget + Background + Color and transparency of the widget background + Show tabs + Additional tabs for favorite and all feed-entries + + Network + Standard user-agent + Use the standard user-agent name + Follow http <-> https redirects + Automatically follow http to https and vice versa redirects + Efficient feed parsing + Parsing the feed will be stopped automatically on existing or too old articles + Wifi only + Use Proxy only for wifi + Host + Port + Type + + never + Update + :\u00A0 + unread + new entries + RSS feeds + Error + Priority + Select feeds + All feeds (incl. future) + All + Overview + kb + + The Feed URL could not accessed. + The URL already exists. + The selected file could not be imported. + The export has failed. Make sure you have a writable SD-card mounted. + The selected file is not valid for import. + The external storage (e.g. SD-card) is not available. + + URL + (optional) + (website or feed) + Title + Select file (SD-root) + Refresh only over Wifi + Changelog + + Red + Green + Blue + Transparency + + Additional settings + Custom feed ringtone + Enabled: Use ringtone defined below + Disabled: Use ringtone defined in settings + Choose ringtone + Skip alerts + Enabled: Do NOT notify on updates + Disabled: Notify on updates + + Do you really want to delete this feed and all of its entries? + Do you really want to refresh this feed while not being on wifi? + Are you sure? + Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! + + Disabling this option causes more traffic. + + Accept + Decline + Always ok for all + + Exported into %s. + + License + Hint + + + 1 minute + 5 minutes + 15 minutes + 30 minutes + 1 hour + 2 hours + 6 hours + 12 hours + 1 day + + + + 1 day + 2 days + 4 days + 1 week + 2 weeks + 1 month + 2 months + 3 months + Forever + + + + Standard + +1 + +2 + +3 + + + + HTTP + SOCKS + + + Read feed data + Allows the application to read Sparse RSS feeds and entries. + Write feed data + Allows the application to write Sparse RSS feeds and entries. + diff --git a/res/xml/widgetinfo.xml b/res/xml/widgetinfo.xml index 82536ff..247e7f0 100644 --- a/res/xml/widgetinfo.xml +++ b/res/xml/widgetinfo.xml @@ -1,7 +1,7 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/de/shandschuh/sparserss/Animations.java b/src/cn/eric/rss/Animations.java similarity index 95% rename from src/de/shandschuh/sparserss/Animations.java rename to src/cn/eric/rss/Animations.java index d91c7f6..41cf83d 100644 --- a/src/de/shandschuh/sparserss/Animations.java +++ b/src/cn/eric/rss/Animations.java @@ -1,54 +1,55 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.view.animation.Animation; -import android.view.animation.TranslateAnimation; - -public class Animations { - /** Slide in from right */ - public static final TranslateAnimation SLIDE_IN_RIGHT = generateAnimation(1, 0); - - /** Slide in from left */ - public static final TranslateAnimation SLIDE_IN_LEFT = generateAnimation(-1, 0); - - /** Slide out to right */ - public static final TranslateAnimation SLIDE_OUT_RIGHT = generateAnimation(0, 1); - - /** Slide out to left */ - public static final TranslateAnimation SLIDE_OUT_LEFT = generateAnimation(0, -1); - - /** Duration of one animation */ - private static final long DURATION = 180; - - private static TranslateAnimation generateAnimation(float fromX, float toX) { - TranslateAnimation transformAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, fromX, Animation.RELATIVE_TO_SELF, toX, 0, 0, 0, 0); - - transformAnimation.setDuration(DURATION); - return transformAnimation; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.view.animation.Animation; +import android.view.animation.TranslateAnimation; +import cn.eric.rss.R; + +public class Animations { + /** Slide in from right */ + public static final TranslateAnimation SLIDE_IN_RIGHT = generateAnimation(1, 0); + + /** Slide in from left */ + public static final TranslateAnimation SLIDE_IN_LEFT = generateAnimation(-1, 0); + + /** Slide out to right */ + public static final TranslateAnimation SLIDE_OUT_RIGHT = generateAnimation(0, 1); + + /** Slide out to left */ + public static final TranslateAnimation SLIDE_OUT_LEFT = generateAnimation(0, -1); + + /** Duration of one animation */ + private static final long DURATION = 180; + + private static TranslateAnimation generateAnimation(float fromX, float toX) { + TranslateAnimation transformAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, fromX, Animation.RELATIVE_TO_SELF, toX, 0, 0, 0, 0); + + transformAnimation.setDuration(DURATION); + return transformAnimation; + } + +} diff --git a/src/de/shandschuh/sparserss/ApplicationPreferencesActivity.java b/src/cn/eric/rss/ApplicationPreferencesActivity.java similarity index 95% rename from src/de/shandschuh/sparserss/ApplicationPreferencesActivity.java rename to src/cn/eric/rss/ApplicationPreferencesActivity.java index 1226a66..5894208 100644 --- a/src/de/shandschuh/sparserss/ApplicationPreferencesActivity.java +++ b/src/cn/eric/rss/ApplicationPreferencesActivity.java @@ -1,126 +1,127 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.Intent; -import android.content.SharedPreferences.Editor; -import android.os.Bundle; -import android.os.SystemClock; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceActivity; -import android.preference.PreferenceManager; -import de.shandschuh.sparserss.service.RefreshService; - -public class ApplicationPreferencesActivity extends PreferenceActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.layout.preferences); - - Preference preference = (Preference) findPreference(Strings.SETTINGS_REFRESHENABLED); - - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (Boolean.TRUE.equals(newValue)) { - new Thread() { - public void run() { - startService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); - } - }.start(); - } else { - getPreferences(MODE_PRIVATE).edit().putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0).commit(); - stopService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); - } - return true; - } - }); - - preference = (Preference) findPreference(Strings.SETTINGS_SHOWTABS); - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (MainTabActivity.INSTANCE != null ) { - MainTabActivity.INSTANCE.setTabWidgetVisible(Boolean.TRUE.equals(newValue)); - } - return true; - } - }); - - preference = (Preference) findPreference(Strings.SETTINGS_LIGHTTHEME); - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); - - editor.putBoolean(Strings.SETTINGS_LIGHTTHEME, Boolean.TRUE.equals(newValue)); - editor.commit(); - android.os.Process.killProcess(android.os.Process.myPid()); - - // this return statement will never be reached - return true; - } - }); - - preference = (Preference) findPreference(Strings.SETTINGS_EFFICIENTFEEDPARSING); - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(final Preference preference, Object newValue) { - if (newValue.equals(Boolean.FALSE)) { - AlertDialog.Builder builder = new AlertDialog.Builder(ApplicationPreferencesActivity.this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(android.R.string.dialog_alert_title); - builder.setPositiveButton(android.R.string.ok, new OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); - - editor.putBoolean(Strings.SETTINGS_EFFICIENTFEEDPARSING, Boolean.FALSE); - editor.commit(); - ((CheckBoxPreference) preference).setChecked(false); - dialog.dismiss(); - } - }); - builder.setNegativeButton(android.R.string.cancel, new OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.setMessage(R.string.warning_moretraffic); - builder.show(); - return false; - } else { - return true; - } - } - }); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.content.SharedPreferences.Editor; +import android.os.Bundle; +import android.os.SystemClock; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceActivity; +import android.preference.PreferenceManager; +import cn.eric.rss.R; +import cn.eric.rss.service.RefreshService; + +public class ApplicationPreferencesActivity extends PreferenceActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.layout.preferences); + + Preference preference = (Preference) findPreference(Strings.SETTINGS_REFRESHENABLED); + + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (Boolean.TRUE.equals(newValue)) { + new Thread() { + public void run() { + startService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); + } + }.start(); + } else { + getPreferences(MODE_PRIVATE).edit().putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0).commit(); + stopService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); + } + return true; + } + }); + + preference = (Preference) findPreference(Strings.SETTINGS_SHOWTABS); + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (MainTabActivity.INSTANCE != null ) { + MainTabActivity.INSTANCE.setTabWidgetVisible(Boolean.TRUE.equals(newValue)); + } + return true; + } + }); + + preference = (Preference) findPreference(Strings.SETTINGS_LIGHTTHEME); + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); + + editor.putBoolean(Strings.SETTINGS_LIGHTTHEME, Boolean.TRUE.equals(newValue)); + editor.commit(); + android.os.Process.killProcess(android.os.Process.myPid()); + + // this return statement will never be reached + return true; + } + }); + + preference = (Preference) findPreference(Strings.SETTINGS_EFFICIENTFEEDPARSING); + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(final Preference preference, Object newValue) { + if (newValue.equals(Boolean.FALSE)) { + AlertDialog.Builder builder = new AlertDialog.Builder(ApplicationPreferencesActivity.this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(android.R.string.dialog_alert_title); + builder.setPositiveButton(android.R.string.ok, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); + + editor.putBoolean(Strings.SETTINGS_EFFICIENTFEEDPARSING, Boolean.FALSE); + editor.commit(); + ((CheckBoxPreference) preference).setChecked(false); + dialog.dismiss(); + } + }); + builder.setNegativeButton(android.R.string.cancel, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.setMessage(R.string.warning_moretraffic); + builder.show(); + return false; + } else { + return true; + } + } + }); + } + +} diff --git a/src/de/shandschuh/sparserss/BASE64.java b/src/cn/eric/rss/BASE64.java similarity index 95% rename from src/de/shandschuh/sparserss/BASE64.java rename to src/cn/eric/rss/BASE64.java index 7190d46..b6e8643 100644 --- a/src/de/shandschuh/sparserss/BASE64.java +++ b/src/cn/eric/rss/BASE64.java @@ -1,90 +1,92 @@ -/** - * Sparse rss - * - * Copyright (c) 2010, 2011 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * (this is an excerpt from BASE64 class of jaolt, except for the license) - */ - -package de.shandschuh.sparserss; - - -public class BASE64 { - private static char[] TOCHAR = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; - - public static String encode(byte[] bytes) { - StringBuilder builder = new StringBuilder(); - - int i = bytes.length; - - int k = i/3; - - for (int n = 0; n < k; n++) { - if (n > 0 && n % 19 == 0) { - builder.append('\n'); - } - builder.append(convertToString(bytes[3*n], bytes[3*n+1], bytes[3*n+2])); - } - - k = i % 3; - if (k == 2) { - char[] chars = convertToString(bytes[i-2], bytes[i-1], 0); - - chars[3] = '='; - builder.append(chars); - } else if (k == 1) { - char[] chars = convertToString(bytes[i-1], 0, 0); - - chars[2] = '='; - chars[3] = '='; - builder.append(chars); - } - return builder.toString(); - } - - private static char[] convertToString(int b, int c, int d) { - char[] result = new char[4]; - if (b < 0) { - b += 256; - } - if (c < 0) { - c += 256; - } - if (d < 0) { - d += 256; - } - - int f = d+(c+b*256)*256; - - result[3] = TOCHAR[f % 64]; - f /= 64; - result[2] = TOCHAR[f % 64]; - f /= 64; - result[1] = TOCHAR[f % 64]; - f /= 64; - result[0] = TOCHAR[f % 64]; - - return result; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010, 2011 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * (this is an excerpt from BASE64 class of jaolt, except for the license) + */ + +package cn.eric.rss; + +import cn.eric.rss.R; + + +public class BASE64 { + private static char[] TOCHAR = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; + + public static String encode(byte[] bytes) { + StringBuilder builder = new StringBuilder(); + + int i = bytes.length; + + int k = i/3; + + for (int n = 0; n < k; n++) { + if (n > 0 && n % 19 == 0) { + builder.append('\n'); + } + builder.append(convertToString(bytes[3*n], bytes[3*n+1], bytes[3*n+2])); + } + + k = i % 3; + if (k == 2) { + char[] chars = convertToString(bytes[i-2], bytes[i-1], 0); + + chars[3] = '='; + builder.append(chars); + } else if (k == 1) { + char[] chars = convertToString(bytes[i-1], 0, 0); + + chars[2] = '='; + chars[3] = '='; + builder.append(chars); + } + return builder.toString(); + } + + private static char[] convertToString(int b, int c, int d) { + char[] result = new char[4]; + if (b < 0) { + b += 256; + } + if (c < 0) { + c += 256; + } + if (d < 0) { + d += 256; + } + + int f = d+(c+b*256)*256; + + result[3] = TOCHAR[f % 64]; + f /= 64; + result[2] = TOCHAR[f % 64]; + f /= 64; + result[1] = TOCHAR[f % 64]; + f /= 64; + result[0] = TOCHAR[f % 64]; + + return result; + } + +} diff --git a/src/de/shandschuh/sparserss/BootCompletedBroadcastReceiver.java b/src/cn/eric/rss/BootCompletedBroadcastReceiver.java similarity index 93% rename from src/de/shandschuh/sparserss/BootCompletedBroadcastReceiver.java rename to src/cn/eric/rss/BootCompletedBroadcastReceiver.java index a7cfc6e..dcb79c1 100644 --- a/src/de/shandschuh/sparserss/BootCompletedBroadcastReceiver.java +++ b/src/cn/eric/rss/BootCompletedBroadcastReceiver.java @@ -1,51 +1,52 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager.NameNotFoundException; -import android.preference.PreferenceManager; -import de.shandschuh.sparserss.service.RefreshService; - -public class BootCompletedBroadcastReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - try { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context.createPackageContext(Strings.PACKAGE, 0)); - - preferences.edit().putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0).commit(); - if (preferences.getBoolean(Strings.SETTINGS_REFRESHENABLED, false)) { - context.startService(new Intent(context, RefreshService.class)); - } - context.sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); - } catch (NameNotFoundException e) { - } - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager.NameNotFoundException; +import android.preference.PreferenceManager; +import cn.eric.rss.R; +import cn.eric.rss.service.RefreshService; + +public class BootCompletedBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + try { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context.createPackageContext(Strings.PACKAGE, 0)); + + preferences.edit().putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0).commit(); + if (preferences.getBoolean(Strings.SETTINGS_REFRESHENABLED, false)) { + context.startService(new Intent(context, RefreshService.class)); + } + context.sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); + } catch (NameNotFoundException e) { + } + } + +} diff --git a/src/de/shandschuh/sparserss/CompatibilityHelper.java b/src/cn/eric/rss/CompatibilityHelper.java similarity index 95% rename from src/de/shandschuh/sparserss/CompatibilityHelper.java rename to src/cn/eric/rss/CompatibilityHelper.java index f1df90e..dfd492a 100644 --- a/src/de/shandschuh/sparserss/CompatibilityHelper.java +++ b/src/cn/eric/rss/CompatibilityHelper.java @@ -1,71 +1,72 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * - * ============================================================================== - * This helper class is needed for older Android versions that verify all - * existing references on startup. - */ - -package de.shandschuh.sparserss; - -import android.app.Activity; -import android.graphics.drawable.Drawable; -import android.webkit.WebView; - -public class CompatibilityHelper { - private static final String METHOD_GETACTIONBAR = "getActionBar"; - - private static final String METHOD_SETICON = "setIcon"; - - private static final String METHOD_ONRESUME = "onResume"; - - private static final String METHOD_ONPAUSE = "onPause"; - - public static void setActionBarDrawable(Activity activity, Drawable drawable) { - try { - Object actionBar = Activity.class.getMethod(METHOD_GETACTIONBAR).invoke(activity); - - actionBar.getClass().getMethod(METHOD_SETICON, Drawable.class).invoke(actionBar, drawable); - } catch (Exception e) { - - } - - } - - public static void onResume(WebView webView) { - try { - WebView.class.getMethod(METHOD_ONRESUME).invoke(webView); - } catch (Exception e) { - - } - } - - public static void onPause(WebView webView) { - try { - WebView.class.getMethod(METHOD_ONPAUSE).invoke(webView); - } catch (Exception e) { - - } - } -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * ============================================================================== + * This helper class is needed for older Android versions that verify all + * existing references on startup. + */ + +package cn.eric.rss; + +import android.app.Activity; +import android.graphics.drawable.Drawable; +import android.webkit.WebView; +import cn.eric.rss.R; + +public class CompatibilityHelper { + private static final String METHOD_GETACTIONBAR = "getActionBar"; + + private static final String METHOD_SETICON = "setIcon"; + + private static final String METHOD_ONRESUME = "onResume"; + + private static final String METHOD_ONPAUSE = "onPause"; + + public static void setActionBarDrawable(Activity activity, Drawable drawable) { + try { + Object actionBar = Activity.class.getMethod(METHOD_GETACTIONBAR).invoke(activity); + + actionBar.getClass().getMethod(METHOD_SETICON, Drawable.class).invoke(actionBar, drawable); + } catch (Exception e) { + + } + + } + + public static void onResume(WebView webView) { + try { + WebView.class.getMethod(METHOD_ONRESUME).invoke(webView); + } catch (Exception e) { + + } + } + + public static void onPause(WebView webView) { + try { + WebView.class.getMethod(METHOD_ONPAUSE).invoke(webView); + } catch (Exception e) { + + } + } +} diff --git a/src/de/shandschuh/sparserss/EmptyActivity.java b/src/cn/eric/rss/EmptyActivity.java similarity index 94% rename from src/de/shandschuh/sparserss/EmptyActivity.java rename to src/cn/eric/rss/EmptyActivity.java index d6625e8..a60f615 100644 --- a/src/de/shandschuh/sparserss/EmptyActivity.java +++ b/src/cn/eric/rss/EmptyActivity.java @@ -1,32 +1,33 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.app.Activity; - -public class EmptyActivity extends Activity { - -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.app.Activity; +import cn.eric.rss.R; + +public class EmptyActivity extends Activity { + +} diff --git a/src/de/shandschuh/sparserss/EntriesListActivity.java b/src/cn/eric/rss/EntriesListActivity.java similarity index 96% rename from src/de/shandschuh/sparserss/EntriesListActivity.java rename to src/cn/eric/rss/EntriesListActivity.java index 9b7f31a..8b7b353 100644 --- a/src/de/shandschuh/sparserss/EntriesListActivity.java +++ b/src/cn/eric/rss/EntriesListActivity.java @@ -1,277 +1,278 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.app.AlertDialog; -import android.app.AlertDialog.Builder; -import android.app.ListActivity; -import android.content.ContentUris; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Typeface; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.os.Bundle; -import android.text.ClipboardManager; -import android.util.TypedValue; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnCreateContextMenuListener; -import android.view.Window; -import android.widget.AdapterView; -import android.widget.ListView; -import android.widget.TextView; -import de.shandschuh.sparserss.provider.FeedData; - -public class EntriesListActivity extends ListActivity { - private static final int CONTEXTMENU_MARKASREAD_ID = 6; - - private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; - - private static final int CONTEXTMENU_DELETE_ID = 8; - - private static final int CONTEXTMENU_COPYURL = 9; - - public static final String EXTRA_SHOWREAD = "show_read"; - - public static final String EXTRA_SHOWFEEDINFO = "show_feedinfo"; - - public static final String EXTRA_AUTORELOAD = "autoreload"; - - private static final String[] FEED_PROJECTION = {FeedData.FeedColumns.NAME, - FeedData.FeedColumns.URL, - FeedData.FeedColumns.ICON - }; - - private Uri uri; - - private EntriesListAdapter entriesListAdapter; - - private byte[] iconBytes; - - @Override - protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - - super.onCreate(savedInstanceState); - - String title = null; - - iconBytes = null; - - Intent intent = getIntent(); - - long feedId = intent.getLongExtra(FeedData.FeedColumns._ID, 0); - - if (feedId > 0) { - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), FEED_PROJECTION, null, null, null); - - if (cursor.moveToFirst()) { - title = cursor.isNull(0) ? cursor.getString(1) : cursor.getString(0); - iconBytes = cursor.getBlob(2); - } - cursor.close(); - } - - if (!MainTabActivity.POSTGINGERBREAD && iconBytes != null && iconBytes.length > 0) { // we cannot insert the icon here because it would be overwritten, but we have to reserve the icon here - if (!requestWindowFeature(Window.FEATURE_LEFT_ICON)) { - iconBytes = null; - } - } - - setContentView(R.layout.entries); - - uri = intent.getData(); - - entriesListAdapter = new EntriesListAdapter(this, uri, intent.getBooleanExtra(EXTRA_SHOWFEEDINFO, false), intent.getBooleanExtra(EXTRA_AUTORELOAD, false)); - setListAdapter(entriesListAdapter); - - if (title != null) { - setTitle(title); - } - if (iconBytes != null && iconBytes.length > 0) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - if (bitmap != null) { - if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); - } - - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); - } else { - setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); - } - } - } - if (RSSOverview.notificationManager != null) { - RSSOverview.notificationManager.cancel(0); - } - - getListView().setOnCreateContextMenuListener(new OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { - menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView.findViewById(android.R.id.text1)).getText()); - menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, R.string.contextmenu_markasread).setIcon(android.R.drawable.ic_menu_manage); - menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, R.string.contextmenu_markasunread).setIcon(android.R.drawable.ic_menu_manage); - menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, R.string.contextmenu_delete).setIcon(android.R.drawable.ic_menu_delete); - menu.add(0, CONTEXTMENU_COPYURL, Menu.NONE, R.string.contextmenu_copyurl).setIcon(android.R.drawable.ic_menu_share); - } - }); - } - - @Override - protected void onListItemClick(ListView listView, View view, int position, long id) { - TextView textView = (TextView) view.findViewById(android.R.id.text1); - - textView.setTypeface(Typeface.DEFAULT); - textView.setEnabled(false); - view.findViewById(android.R.id.text2).setEnabled(false); - entriesListAdapter.neutralizeReadState(); - startActivity(new Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(uri, id)).putExtra(EXTRA_SHOWREAD, entriesListAdapter.isShowRead()).putExtra(FeedData.FeedColumns.ICON, iconBytes)); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.entrylist, menu); - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menu.setGroupVisible(R.id.menu_group_0, entriesListAdapter.getCount() > 0); - return true; - } - - public boolean onMenuItemSelected(int featureId, MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_markasread: { - new Thread() { // the update process takes some time - public void run() { - getContentResolver().update(uri, RSSOverview.getReadContentValues(), null, null); - } - }.start(); - entriesListAdapter.markAsRead(); - break; - } - case R.id.menu_markasunread: { - new Thread() { // the update process takes some time - public void run() { - getContentResolver().update(uri, RSSOverview.getUnreadContentValues(), null, null); - } - }.start(); - entriesListAdapter.markAsUnread(); - break; - } - case R.id.menu_hideread: { - if (item.isChecked()) { - item.setChecked(false).setTitle(R.string.contextmenu_hideread).setIcon(android.R.drawable.ic_menu_close_clear_cancel); - entriesListAdapter.showRead(true); - } else { - item.setChecked(true).setTitle(R.string.contextmenu_showread).setIcon(android.R.drawable.ic_menu_view); - entriesListAdapter.showRead(false); - } - break; - } - case R.id.menu_deleteread: { - new Thread() { // the delete process takes some time - public void run() { - String selection = Strings.READDATE_GREATERZERO+Strings.DB_AND+" ("+Strings.DB_EXCUDEFAVORITE+")"; - - getContentResolver().delete(uri, selection, null); - FeedData.deletePicturesOfFeed(EntriesListActivity.this, uri, selection); - runOnUiThread(new Runnable() { - public void run() { - entriesListAdapter.getCursor().requery(); - } - }); - } - }.start(); - break; - } - case R.id.menu_deleteallentries: { - Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.contextmenu_deleteallentries); - builder.setMessage(R.string.question_areyousure); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - new Thread() { - public void run() { - getContentResolver().delete(uri, Strings.DB_EXCUDEFAVORITE, null); - runOnUiThread(new Runnable() { - public void run() { - entriesListAdapter.getCursor().requery(); - } - }); - } - }.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - builder.show(); - break; - } - case CONTEXTMENU_MARKASREAD_ID: { - long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; - - getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getReadContentValues(), null, null); - entriesListAdapter.markAsRead(id); - break; - } - case CONTEXTMENU_MARKASUNREAD_ID: { - long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; - - getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getUnreadContentValues(), null, null); - entriesListAdapter.markAsUnread(id); - break; - } - case CONTEXTMENU_DELETE_ID: { - long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; - - getContentResolver().delete(ContentUris.withAppendedId(uri, id), null, null); - FeedData.deletePicturesOfEntry(Long.toString(id)); - entriesListAdapter.getCursor().requery(); // he have no other choice - break; - } - case CONTEXTMENU_COPYURL: { - ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).targetView.getTag().toString()); - break; - } - - } - return true; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.ListActivity; +import android.content.ContentUris; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.text.ClipboardManager; +import android.util.TypedValue; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.TextView; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class EntriesListActivity extends ListActivity { + private static final int CONTEXTMENU_MARKASREAD_ID = 6; + + private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; + + private static final int CONTEXTMENU_DELETE_ID = 8; + + private static final int CONTEXTMENU_COPYURL = 9; + + public static final String EXTRA_SHOWREAD = "show_read"; + + public static final String EXTRA_SHOWFEEDINFO = "show_feedinfo"; + + public static final String EXTRA_AUTORELOAD = "autoreload"; + + private static final String[] FEED_PROJECTION = {FeedData.FeedColumns.NAME, + FeedData.FeedColumns.URL, + FeedData.FeedColumns.ICON + }; + + private Uri uri; + + private EntriesListAdapter entriesListAdapter; + + private byte[] iconBytes; + + @Override + protected void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + + super.onCreate(savedInstanceState); + + String title = null; + + iconBytes = null; + + Intent intent = getIntent(); + + long feedId = intent.getLongExtra(FeedData.FeedColumns._ID, 0); + + if (feedId > 0) { + Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), FEED_PROJECTION, null, null, null); + + if (cursor.moveToFirst()) { + title = cursor.isNull(0) ? cursor.getString(1) : cursor.getString(0); + iconBytes = cursor.getBlob(2); + } + cursor.close(); + } + + if (!MainTabActivity.POSTGINGERBREAD && iconBytes != null && iconBytes.length > 0) { // we cannot insert the icon here because it would be overwritten, but we have to reserve the icon here + if (!requestWindowFeature(Window.FEATURE_LEFT_ICON)) { + iconBytes = null; + } + } + + setContentView(R.layout.entries); + + uri = intent.getData(); + + entriesListAdapter = new EntriesListAdapter(this, uri, intent.getBooleanExtra(EXTRA_SHOWFEEDINFO, false), intent.getBooleanExtra(EXTRA_AUTORELOAD, false)); + setListAdapter(entriesListAdapter); + + if (title != null) { + setTitle(title); + } + if (iconBytes != null && iconBytes.length > 0) { + int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + if (bitmap != null) { + if (bitmap.getHeight() != bitmapSizeInDip) { + bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); + } + + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); + } else { + setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); + } + } + } + if (RSSOverview.notificationManager != null) { + RSSOverview.notificationManager.cancel(0); + } + + getListView().setOnCreateContextMenuListener(new OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { + menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView.findViewById(android.R.id.text1)).getText()); + menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, R.string.contextmenu_markasread).setIcon(android.R.drawable.ic_menu_manage); + menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, R.string.contextmenu_markasunread).setIcon(android.R.drawable.ic_menu_manage); + menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, R.string.contextmenu_delete).setIcon(android.R.drawable.ic_menu_delete); + menu.add(0, CONTEXTMENU_COPYURL, Menu.NONE, R.string.contextmenu_copyurl).setIcon(android.R.drawable.ic_menu_share); + } + }); + } + + @Override + protected void onListItemClick(ListView listView, View view, int position, long id) { + TextView textView = (TextView) view.findViewById(android.R.id.text1); + + textView.setTypeface(Typeface.DEFAULT); + textView.setEnabled(false); + view.findViewById(android.R.id.text2).setEnabled(false); + entriesListAdapter.neutralizeReadState(); + startActivity(new Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(uri, id)).putExtra(EXTRA_SHOWREAD, entriesListAdapter.isShowRead()).putExtra(FeedData.FeedColumns.ICON, iconBytes)); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.entrylist, menu); + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.setGroupVisible(R.id.menu_group_0, entriesListAdapter.getCount() > 0); + return true; + } + + public boolean onMenuItemSelected(int featureId, MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_markasread: { + new Thread() { // the update process takes some time + public void run() { + getContentResolver().update(uri, RSSOverview.getReadContentValues(), null, null); + } + }.start(); + entriesListAdapter.markAsRead(); + break; + } + case R.id.menu_markasunread: { + new Thread() { // the update process takes some time + public void run() { + getContentResolver().update(uri, RSSOverview.getUnreadContentValues(), null, null); + } + }.start(); + entriesListAdapter.markAsUnread(); + break; + } + case R.id.menu_hideread: { + if (item.isChecked()) { + item.setChecked(false).setTitle(R.string.contextmenu_hideread).setIcon(android.R.drawable.ic_menu_close_clear_cancel); + entriesListAdapter.showRead(true); + } else { + item.setChecked(true).setTitle(R.string.contextmenu_showread).setIcon(android.R.drawable.ic_menu_view); + entriesListAdapter.showRead(false); + } + break; + } + case R.id.menu_deleteread: { + new Thread() { // the delete process takes some time + public void run() { + String selection = Strings.READDATE_GREATERZERO+Strings.DB_AND+" ("+Strings.DB_EXCUDEFAVORITE+")"; + + getContentResolver().delete(uri, selection, null); + FeedData.deletePicturesOfFeed(EntriesListActivity.this, uri, selection); + runOnUiThread(new Runnable() { + public void run() { + entriesListAdapter.getCursor().requery(); + } + }); + } + }.start(); + break; + } + case R.id.menu_deleteallentries: { + Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.contextmenu_deleteallentries); + builder.setMessage(R.string.question_areyousure); + builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + new Thread() { + public void run() { + getContentResolver().delete(uri, Strings.DB_EXCUDEFAVORITE, null); + runOnUiThread(new Runnable() { + public void run() { + entriesListAdapter.getCursor().requery(); + } + }); + } + }.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + builder.show(); + break; + } + case CONTEXTMENU_MARKASREAD_ID: { + long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; + + getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getReadContentValues(), null, null); + entriesListAdapter.markAsRead(id); + break; + } + case CONTEXTMENU_MARKASUNREAD_ID: { + long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; + + getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getUnreadContentValues(), null, null); + entriesListAdapter.markAsUnread(id); + break; + } + case CONTEXTMENU_DELETE_ID: { + long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; + + getContentResolver().delete(ContentUris.withAppendedId(uri, id), null, null); + FeedData.deletePicturesOfEntry(Long.toString(id)); + entriesListAdapter.getCursor().requery(); // he have no other choice + break; + } + case CONTEXTMENU_COPYURL: { + ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).targetView.getTag().toString()); + break; + } + + } + return true; + } + +} diff --git a/src/de/shandschuh/sparserss/EntriesListAdapter.java b/src/cn/eric/rss/EntriesListAdapter.java similarity index 96% rename from src/de/shandschuh/sparserss/EntriesListAdapter.java rename to src/cn/eric/rss/EntriesListAdapter.java index af3da71..fa99d7e 100644 --- a/src/de/shandschuh/sparserss/EntriesListAdapter.java +++ b/src/cn/eric/rss/EntriesListAdapter.java @@ -1,255 +1,256 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import java.text.DateFormat; -import java.util.Date; -import java.util.Vector; - -import android.app.Activity; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Typeface; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.preference.PreferenceManager; -import android.util.TypedValue; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ImageView; -import android.widget.ResourceCursorAdapter; -import android.widget.TextView; -import de.shandschuh.sparserss.provider.FeedData; - -public class EntriesListAdapter extends ResourceCursorAdapter { - private static final int STATE_NEUTRAL = 0; - - private static final int STATE_ALLREAD = 1; - - private static final int STATE_ALLUNREAD = 2; - - private int titleColumnPosition; - - private int dateColumn; - - private int readDateColumn; - - private int favoriteColumn; - - private int idColumn; - - private int feedIconColumn; - - private int feedNameColumn; - - private int linkColumn; - - private static final String SQLREAD = "length(readdate) ASC, "; - - public static final String READDATEISNULL = "readdate is null"; - - private boolean showRead; - - private Activity context; - - private Uri uri; - - private boolean showFeedInfo; - - private int forcedState; - - private Vector markedAsRead; - - private Vector markedAsUnread; - - private Vector favorited; - - private Vector unfavorited; - - private DateFormat dateFormat; - - private DateFormat timeFormat; - - public EntriesListAdapter(Activity context, Uri uri, boolean showFeedInfo, boolean autoreload) { - super(context, R.layout.entrylistitem, createManagedCursor(context, uri, true), autoreload); - showRead = true; - this.context = context; - this.uri = uri; - - Cursor cursor = getCursor(); - - titleColumnPosition = cursor.getColumnIndex(FeedData.EntryColumns.TITLE); - dateColumn = cursor.getColumnIndex(FeedData.EntryColumns.DATE); - readDateColumn = cursor.getColumnIndex(FeedData.EntryColumns.READDATE); - favoriteColumn = cursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); - idColumn = cursor.getColumnIndex(FeedData.EntryColumns._ID); - linkColumn = cursor.getColumnIndex(FeedData.EntryColumns.LINK); - this.showFeedInfo = showFeedInfo; - if (showFeedInfo) { - feedIconColumn = cursor.getColumnIndex(FeedData.FeedColumns.ICON); - feedNameColumn = cursor.getColumnIndex(FeedData.FeedColumns.NAME); - } - forcedState = STATE_NEUTRAL; - markedAsRead = new Vector(); - markedAsUnread = new Vector(); - favorited = new Vector(); - unfavorited = new Vector(); - dateFormat = android.text.format.DateFormat.getDateFormat(context); - timeFormat = android.text.format.DateFormat.getTimeFormat(context); - } - - @Override - public void bindView(View view, final Context context, Cursor cursor) { - TextView textView = (TextView) view.findViewById(android.R.id.text1); - - textView.setText(cursor.getString(titleColumnPosition)); - - TextView dateTextView = (TextView) view.findViewById(android.R.id.text2); - - final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); - - final long id = cursor.getLong(idColumn); - - view.setTag(cursor.getString(linkColumn)); - - final boolean favorite = !unfavorited.contains(id) && (cursor.getInt(favoriteColumn) == 1 || favorited.contains(id)); - - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); - imageView.setTag(favorite ? Strings.TRUE : Strings.FALSE); - imageView.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - boolean newFavorite = !Strings.TRUE.equals(view.getTag()); - - if (newFavorite) { - view.setTag(Strings.TRUE); - imageView.setImageResource(android.R.drawable.star_on); - favorited.add(id); - unfavorited.remove(id); - } else { - view.setTag(Strings.FALSE); - imageView.setImageResource(android.R.drawable.star_off); - unfavorited.add(id); - favorited.remove(id); - } - - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.FAVORITE, newFavorite ? 1 : 0); - view.getContext().getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns._ID).append(Strings.DB_ARG).toString(), new String[] {Long.toString(id)}); - context.getContentResolver().notifyChange(FeedData.EntryColumns.FAVORITES_CONTENT_URI, null); - - } - }); - - Date date = new Date(cursor.getLong(dateColumn)); - - if (showFeedInfo && feedIconColumn > -1 && feedNameColumn > -1) { - byte[] iconBytes = cursor.getBlob(feedIconColumn); - - if (iconBytes != null && iconBytes.length > 0) { - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - - if (bitmap != null) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18f, context.getResources().getDisplayMetrics()); - if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); - } - dateTextView.setText(new StringBuilder().append(' ').append(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); // bad style - } else { - dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); - } - dateTextView.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(bitmap), null, null, null); - } else { - dateTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); - dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); - } - - } else { - textView.setText(cursor.getString(titleColumnPosition)); - dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date))); - } - - if (forcedState == STATE_ALLUNREAD && !markedAsRead.contains(id) || (forcedState != STATE_ALLREAD && cursor.isNull(readDateColumn) && !markedAsRead.contains(id)) || markedAsUnread.contains(id)) { - textView.setTypeface(Typeface.DEFAULT_BOLD); - textView.setEnabled(true); - dateTextView.setEnabled(true); - } else { - textView.setTypeface(Typeface.DEFAULT); - textView.setEnabled(false); - dateTextView.setEnabled(false); - } - } - - public void showRead(boolean showRead) { - if (showRead != this.showRead) { - context.stopManagingCursor(getCursor()); - changeCursor(createManagedCursor(context, uri, showRead)); - this.showRead = showRead; - } - } - - public boolean isShowRead() { - return showRead; - } - - private static Cursor createManagedCursor(Activity context, Uri uri, boolean showRead) { - return context.managedQuery(uri, null, showRead ? null : READDATEISNULL, null, new StringBuilder(PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_PRIORITIZE, false) ? SQLREAD : Strings.EMPTY).append(FeedData.EntryColumns.DATE).append(Strings.DB_DESC).toString()); - } - - public void markAsRead() { - forcedState = STATE_ALLREAD; - markedAsRead.clear(); - markedAsUnread.clear(); - notifyDataSetInvalidated(); - } - - public void markAsUnread() { - forcedState = STATE_ALLUNREAD; - markedAsRead.clear(); - markedAsUnread.clear(); - notifyDataSetInvalidated(); - } - - public void neutralizeReadState() { - forcedState = STATE_NEUTRAL; - } - - public void markAsRead(long id) { - markedAsRead.add(id); - markedAsUnread.remove(id); - notifyDataSetInvalidated(); - } - - public void markAsUnread(long id) { - markedAsUnread.add(id); - markedAsRead.remove(id); - notifyDataSetInvalidated(); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import java.text.DateFormat; +import java.util.Date; +import java.util.Vector; + +import android.app.Activity; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.preference.PreferenceManager; +import android.util.TypedValue; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; +import android.widget.ResourceCursorAdapter; +import android.widget.TextView; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class EntriesListAdapter extends ResourceCursorAdapter { + private static final int STATE_NEUTRAL = 0; + + private static final int STATE_ALLREAD = 1; + + private static final int STATE_ALLUNREAD = 2; + + private int titleColumnPosition; + + private int dateColumn; + + private int readDateColumn; + + private int favoriteColumn; + + private int idColumn; + + private int feedIconColumn; + + private int feedNameColumn; + + private int linkColumn; + + private static final String SQLREAD = "length(readdate) ASC, "; + + public static final String READDATEISNULL = "readdate is null"; + + private boolean showRead; + + private Activity context; + + private Uri uri; + + private boolean showFeedInfo; + + private int forcedState; + + private Vector markedAsRead; + + private Vector markedAsUnread; + + private Vector favorited; + + private Vector unfavorited; + + private DateFormat dateFormat; + + private DateFormat timeFormat; + + public EntriesListAdapter(Activity context, Uri uri, boolean showFeedInfo, boolean autoreload) { + super(context, R.layout.entrylistitem, createManagedCursor(context, uri, true), autoreload); + showRead = true; + this.context = context; + this.uri = uri; + + Cursor cursor = getCursor(); + + titleColumnPosition = cursor.getColumnIndex(FeedData.EntryColumns.TITLE); + dateColumn = cursor.getColumnIndex(FeedData.EntryColumns.DATE); + readDateColumn = cursor.getColumnIndex(FeedData.EntryColumns.READDATE); + favoriteColumn = cursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); + idColumn = cursor.getColumnIndex(FeedData.EntryColumns._ID); + linkColumn = cursor.getColumnIndex(FeedData.EntryColumns.LINK); + this.showFeedInfo = showFeedInfo; + if (showFeedInfo) { + feedIconColumn = cursor.getColumnIndex(FeedData.FeedColumns.ICON); + feedNameColumn = cursor.getColumnIndex(FeedData.FeedColumns.NAME); + } + forcedState = STATE_NEUTRAL; + markedAsRead = new Vector(); + markedAsUnread = new Vector(); + favorited = new Vector(); + unfavorited = new Vector(); + dateFormat = android.text.format.DateFormat.getDateFormat(context); + timeFormat = android.text.format.DateFormat.getTimeFormat(context); + } + + @Override + public void bindView(View view, final Context context, Cursor cursor) { + TextView textView = (TextView) view.findViewById(android.R.id.text1); + + textView.setText(cursor.getString(titleColumnPosition)); + + TextView dateTextView = (TextView) view.findViewById(android.R.id.text2); + + final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); + + final long id = cursor.getLong(idColumn); + + view.setTag(cursor.getString(linkColumn)); + + final boolean favorite = !unfavorited.contains(id) && (cursor.getInt(favoriteColumn) == 1 || favorited.contains(id)); + + imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); + imageView.setTag(favorite ? Strings.TRUE : Strings.FALSE); + imageView.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + boolean newFavorite = !Strings.TRUE.equals(view.getTag()); + + if (newFavorite) { + view.setTag(Strings.TRUE); + imageView.setImageResource(android.R.drawable.star_on); + favorited.add(id); + unfavorited.remove(id); + } else { + view.setTag(Strings.FALSE); + imageView.setImageResource(android.R.drawable.star_off); + unfavorited.add(id); + favorited.remove(id); + } + + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.FAVORITE, newFavorite ? 1 : 0); + view.getContext().getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns._ID).append(Strings.DB_ARG).toString(), new String[] {Long.toString(id)}); + context.getContentResolver().notifyChange(FeedData.EntryColumns.FAVORITES_CONTENT_URI, null); + + } + }); + + Date date = new Date(cursor.getLong(dateColumn)); + + if (showFeedInfo && feedIconColumn > -1 && feedNameColumn > -1) { + byte[] iconBytes = cursor.getBlob(feedIconColumn); + + if (iconBytes != null && iconBytes.length > 0) { + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + + if (bitmap != null) { + int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18f, context.getResources().getDisplayMetrics()); + if (bitmap.getHeight() != bitmapSizeInDip) { + bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); + } + dateTextView.setText(new StringBuilder().append(' ').append(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); // bad style + } else { + dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); + } + dateTextView.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(bitmap), null, null, null); + } else { + dateTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); + dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); + } + + } else { + textView.setText(cursor.getString(titleColumnPosition)); + dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date))); + } + + if (forcedState == STATE_ALLUNREAD && !markedAsRead.contains(id) || (forcedState != STATE_ALLREAD && cursor.isNull(readDateColumn) && !markedAsRead.contains(id)) || markedAsUnread.contains(id)) { + textView.setTypeface(Typeface.DEFAULT_BOLD); + textView.setEnabled(true); + dateTextView.setEnabled(true); + } else { + textView.setTypeface(Typeface.DEFAULT); + textView.setEnabled(false); + dateTextView.setEnabled(false); + } + } + + public void showRead(boolean showRead) { + if (showRead != this.showRead) { + context.stopManagingCursor(getCursor()); + changeCursor(createManagedCursor(context, uri, showRead)); + this.showRead = showRead; + } + } + + public boolean isShowRead() { + return showRead; + } + + private static Cursor createManagedCursor(Activity context, Uri uri, boolean showRead) { + return context.managedQuery(uri, null, showRead ? null : READDATEISNULL, null, new StringBuilder(PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_PRIORITIZE, false) ? SQLREAD : Strings.EMPTY).append(FeedData.EntryColumns.DATE).append(Strings.DB_DESC).toString()); + } + + public void markAsRead() { + forcedState = STATE_ALLREAD; + markedAsRead.clear(); + markedAsUnread.clear(); + notifyDataSetInvalidated(); + } + + public void markAsUnread() { + forcedState = STATE_ALLUNREAD; + markedAsRead.clear(); + markedAsUnread.clear(); + notifyDataSetInvalidated(); + } + + public void neutralizeReadState() { + forcedState = STATE_NEUTRAL; + } + + public void markAsRead(long id) { + markedAsRead.add(id); + markedAsUnread.remove(id); + notifyDataSetInvalidated(); + } + + public void markAsUnread(long id) { + markedAsUnread.add(id); + markedAsRead.remove(id); + notifyDataSetInvalidated(); + } + +} diff --git a/src/de/shandschuh/sparserss/EntryActivity.java b/src/cn/eric/rss/EntryActivity.java similarity index 96% rename from src/de/shandschuh/sparserss/EntryActivity.java rename to src/cn/eric/rss/EntryActivity.java index 16615e9..d674a40 100644 --- a/src/de/shandschuh/sparserss/EntryActivity.java +++ b/src/cn/eric/rss/EntryActivity.java @@ -1,806 +1,807 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import java.util.Date; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.AlertDialog.Builder; -import android.app.NotificationManager; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.ClipboardManager; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.util.TypedValue; -import android.view.GestureDetector; -import android.view.GestureDetector.OnGestureListener; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnKeyListener; -import android.view.View.OnTouchListener; -import android.view.ViewGroup.LayoutParams; -import android.view.Window; -import android.view.animation.Animation; -import android.webkit.WebView; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; -import android.widget.ViewFlipper; -import de.shandschuh.sparserss.provider.FeedData; - -public class EntryActivity extends Activity { - /* - private static final String NEWLINE = "\n"; - - private static final String BR = "
"; - */ - - private static final String TEXT_HTML = "text/html"; - - private static final String UTF8 = "utf-8"; - - private static final String OR_DATE = " or date "; - - private static final String DATE = "(date="; - - private static final String AND_ID = " and _id"; - - private static final String ASC = "date asc, _id desc limit 1"; - - private static final String DESC = "date desc, _id asc limit 1"; - - private static final String CSS = ""; - - private static final String FONT_START = CSS+""; - - private static final String FONT_FONTSIZE_START = CSS+""; - - private static final String FONTSIZE_END = ""; - - private static final String FONT_END = "



"; - - private static final String BODY_START = ""; - - private static final String BODY_END = "



"; - - private static final int BUTTON_ALPHA = 180; - - private static final String IMAGE_ENCLOSURE = "[@]image/"; - - private static final String TEXTPLAIN = "text/plain"; - - private static final String BRACKET = " ("; - - private int titlePosition; - - private int datePosition; - - private int abstractPosition; - - private int linkPosition; - - private int feedIdPosition; - - private int favoritePosition; - - private int readDatePosition; - - private int enclosurePosition; - - private int authorPosition; - - private String _id; - - private String _nextId; - - private String _previousId; - - private Uri uri; - - private Uri parentUri; - - private int feedId; - - boolean favorite; - - private boolean showRead; - - private boolean canShowIcon; - - private byte[] iconBytes; - - private WebView webView; - - private WebView webView0; // only needed for the animation - - private ViewFlipper viewFlipper; - - private ImageButton nextButton; - - private ImageButton urlButton; - - private ImageButton previousButton; - - private ImageButton playButton; - - int scrollX; - - int scrollY; - - private String link; - - private LayoutParams layoutParams; - - private View content; - - private SharedPreferences preferences; - - private boolean localPictures; - - private TextView titleTextView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - - super.onCreate(savedInstanceState); - - int titleId = -1; - - if (MainTabActivity.POSTGINGERBREAD) { - canShowIcon = true; - setContentView(R.layout.entry); - try { - /* This is a trick as com.android.internal.R.id.action_bar_title is not directly accessible */ - titleId = (Integer) Class.forName("com.android.internal.R$id").getField("action_bar_title").get(null); - } catch (Exception exception) { - - } - } else { - canShowIcon = requestWindowFeature(Window.FEATURE_LEFT_ICON); - setContentView(R.layout.entry); - titleId = android.R.id.title; - } - - try { - titleTextView = (TextView) findViewById(titleId); - titleTextView.setSingleLine(true); - titleTextView.setHorizontallyScrolling(true); - titleTextView.setMarqueeRepeatLimit(1); - titleTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); - titleTextView.setFocusable(true); - titleTextView.setFocusableInTouchMode(true); - } catch (Exception e) { - // just in case for non standard android, nullpointer etc - } - - uri = getIntent().getData(); - parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); - showRead = getIntent().getBooleanExtra(EntriesListActivity.EXTRA_SHOWREAD, true); - iconBytes = getIntent().getByteArrayExtra(FeedData.FeedColumns.ICON); - feedId = 0; - - Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); - - titlePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.TITLE); - datePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.DATE); - abstractPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ABSTRACT); - linkPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.LINK); - feedIdPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FEED_ID); - favoritePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); - readDatePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.READDATE); - enclosurePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ENCLOSURE); - authorPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.AUTHOR); - - entryCursor.close(); - if (RSSOverview.notificationManager == null) { - RSSOverview.notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - } - - nextButton = (ImageButton) findViewById(R.id.next_button); - urlButton = (ImageButton) findViewById(R.id.url_button); - urlButton.setAlpha(BUTTON_ALPHA+30); - previousButton = (ImageButton) findViewById(R.id.prev_button); - playButton = (ImageButton) findViewById(R.id.play_button); - playButton.setAlpha(BUTTON_ALPHA); - - viewFlipper = (ViewFlipper) findViewById(R.id.content_flipper); - - - - layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); - - webView = new WebView(this); - - viewFlipper.addView(webView, layoutParams); - - OnKeyListener onKeyEventListener = new OnKeyListener() { - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (keyCode == 92 || keyCode == 94) { - scrollUp(); - return true; - } else if (keyCode == 93 || keyCode == 95) { - scrollDown(); - return true; - } - } - return false; - } - }; - webView.setOnKeyListener(onKeyEventListener); - - content = findViewById(R.id.entry_content); - - webView0 = new WebView(this); - webView0.setOnKeyListener(onKeyEventListener); - - preferences = PreferenceManager.getDefaultSharedPreferences(this); - - final boolean gestures = preferences.getBoolean(Strings.SETTINGS_GESTURESENABLED, true); - - final GestureDetector gestureDetector = new GestureDetector(this, new OnGestureListener() { - public boolean onDown(MotionEvent e) { - return false; - } - - public boolean onFling(MotionEvent e1, MotionEvent e2, - float velocityX, float velocityY) { - if (gestures) { - if (Math.abs(velocityY) < Math.abs(velocityX)) { - if (velocityX > 800) { - if (previousButton.isEnabled()) { - previousEntry(true); - } - } else if (velocityX < -800) { - if (nextButton.isEnabled()) { - nextEntry(true); - } - } - } - } - return false; - } - - public void onLongPress(MotionEvent e) { - - } - - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - return false; - } - - public void onShowPress(MotionEvent e) { - - } - - public boolean onSingleTapUp(MotionEvent e) { - return false; - } - }); - - OnTouchListener onTouchListener = new OnTouchListener() { - public boolean onTouch(View v, MotionEvent event) { - return gestureDetector.onTouchEvent(event); - } - }; - - webView.setOnTouchListener(onTouchListener); - - content.setOnTouchListener(new OnTouchListener() { - public boolean onTouch(View v, MotionEvent event) { - gestureDetector.onTouchEvent(event); - return true; // different to the above one! - } - }); - - webView0.setOnTouchListener(onTouchListener); - - scrollX = 0; - scrollY = 0; - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) - { - super.onRestoreInstanceState(savedInstanceState); - webView.restoreState(savedInstanceState); - } - - @Override - protected void onResume() { - super.onResume(); - if (RSSOverview.notificationManager != null) { - RSSOverview.notificationManager.cancel(0); - } - uri = getIntent().getData(); - parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.onResume(webView); - } - reload(); - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - setIntent(intent); - } - - private void reload() { - if (_id != null && _id.equals(uri.getLastPathSegment())) { - return; - } - - _id = uri.getLastPathSegment(); - - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); - - Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); - - if (entryCursor.moveToFirst()) { - String abstractText = entryCursor.getString(abstractPosition); - - if (entryCursor.isNull(readDatePosition)) { - getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null); - } - if (abstractText == null) { - String link = entryCursor.getString(linkPosition); - - entryCursor.close(); - finish(); - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(link))); - } else { - setTitle(entryCursor.getString(titlePosition)); - if (titleTextView != null) { - titleTextView.requestFocus(); // restart ellipsize - } - - int _feedId = entryCursor.getInt(feedIdPosition); - - if (feedId != _feedId) { - if (feedId != 0) { - iconBytes = null; // triggers re-fetch of the icon - } - feedId = _feedId; - } - - if (canShowIcon) { - if (iconBytes == null || iconBytes.length == 0) { - Cursor iconCursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(Integer.toString(feedId)), new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.ICON}, null, null, null); - - if (iconCursor.moveToFirst()) { - iconBytes = iconCursor.getBlob(1); - } - iconCursor.close(); - } - - if (iconBytes != null && iconBytes.length > 0) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - if (bitmap != null) { - if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); - } - - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); - } else { - setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); - } - } - } - } - - long timestamp = entryCursor.getLong(datePosition); - - Date date = new Date(timestamp); - - StringBuilder dateStringBuilder = new StringBuilder(DateFormat.getDateFormat(this).format(date)).append(' ').append(DateFormat.getTimeFormat(this).format(date)); - - String author = entryCursor.getString(authorPosition); - - if (author != null) { - dateStringBuilder.append(BRACKET).append(author).append(')'); - } - - ((TextView) findViewById(R.id.entry_date)).setText(dateStringBuilder); - - final ImageView imageView = (ImageView) findViewById(android.R.id.icon); - - favorite = entryCursor.getInt(favoritePosition) == 1; - - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); - imageView.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - favorite = !favorite; - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.FAVORITE, favorite ? 1 : 0); - getContentResolver().update(uri, values, null, null); - } - }); - // loadData does not recognize the encoding without correct html-header - localPictures = abstractText.indexOf(Strings.IMAGEID_REPLACEMENT) > -1; - - abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, uri.getLastPathSegment()+Strings.IMAGEFILE_IDSEPARATOR); - - Pattern linkP = Pattern.compile("]*href=[^>]*>"); - Matcher linkM = linkP.matcher(abstractText); - if(!linkM.find()) { - abstractText = abstractText.replaceAll("(?i)(https?://[^ \n\r\t\\[\\]]+)", "$1"); - } - - Pattern brP = Pattern.compile("]*>"); - Matcher brM = brP.matcher(abstractText); - if(!brM.find()) { - abstractText = abstractText.replaceAll("\n", "
"); - } - - abstractText = abstractText.replaceAll("(?i)\\[(/?(b|u))\\]", "<$1>"); - abstractText = abstractText.replaceAll("(?i)\\[img\\](https?://[^ \n\r\t\\[\\]]+)\\[/img\\]", ""); - abstractText = abstractText.replaceAll("(?i)\\[/?(center|color|size|img|url|pre)[^\\]]*\\]", ""); - - final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); - - if (localPictures) { - abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, _id+Strings.IMAGEFILE_IDSEPARATOR); - } - - if (preferences.getBoolean(Strings.SETTINGS_DISABLEPICTURES, false)) { - abstractText = abstractText.replaceAll(Strings.HTML_IMG_REGEX, Strings.EMPTY); - webView.getSettings().setBlockNetworkImage(true); - } else { - if (webView.getSettings().getBlockNetworkImage()) { - /* - * setBlockNetwortImage(false) calls postSync, which takes time, - * so we clean up the html first and change the value afterwards - */ - webView.loadData(Strings.EMPTY, TEXT_HTML, UTF8); - webView.getSettings().setBlockNetworkImage(false); - } - } - - int fontsize = Integer.parseInt(preferences.getString(Strings.SETTINGS_FONTSIZE, Strings.ONE)); - - /* - if (abstractText.indexOf('<') > -1 && abstractText.indexOf('>') > -1) { - abstractText = abstractText.replace(NEWLINE, BR); - } - */ - - if (MainTabActivity.isLightTheme(this) || preferences.getBoolean(Strings.SETTINGS_BLACKTEXTONWHITE, false)) { - if (fontsize > 0) { - webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONTSIZE_END).toString(), TEXT_HTML, UTF8, null); - } else { - webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(BODY_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); - } - webView.setBackgroundColor(Color.WHITE); - content.setBackgroundColor(Color.WHITE); - } else { - if (fontsize > 0) { - webView.loadDataWithBaseURL(null, new StringBuilder(FONT_FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONT_END).toString(), TEXT_HTML, UTF8, null); - } else { - webView.loadDataWithBaseURL(null, new StringBuilder(FONT_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); - } - webView.setBackgroundColor(Color.BLACK); - content.setBackgroundColor(Color.BLACK); - } - - link = entryCursor.getString(linkPosition); - - if (link != null && link.length() > 0) { - urlButton.setEnabled(true); - urlButton.setAlpha(BUTTON_ALPHA+20); - urlButton.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - startActivityForResult(new Intent(Intent.ACTION_VIEW, Uri.parse(link)), 0); - } - }); - } else { - urlButton.setEnabled(false); - urlButton.setAlpha(80); - } - - final String enclosure = entryCursor.getString(enclosurePosition); - - if (enclosure != null && enclosure.length() > 6 && enclosure.indexOf(IMAGE_ENCLOSURE) == -1) { - playButton.setVisibility(View.VISIBLE); - playButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - final int position1 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR); - - final int position2 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR, position1+3); - - final Uri uri = Uri.parse(enclosure.substring(0, position1)); - - if (preferences.getBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, true)) { - Builder builder = new AlertDialog.Builder(EntryActivity.this); - - builder.setTitle(R.string.question_areyousure); - builder.setIcon(android.R.drawable.ic_dialog_alert); - if (position2+4 > enclosure.length()) { - builder.setMessage(getString(R.string.question_playenclosure, uri, position2+4 > enclosure.length() ? Strings.QUESTIONMARKS : enclosure.substring(position2+3))); - } else { - try { - builder.setMessage(getString(R.string.question_playenclosure, uri, (Integer.parseInt(enclosure.substring(position2+3)) / 1024f)+getString(R.string.kb))); - } catch (Exception e) { - builder.setMessage(getString(R.string.question_playenclosure, uri, enclosure.substring(position2+3))); - } - } - builder.setCancelable(true); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - showEnclosure(uri, enclosure, position1, position2); - } - }); - builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - preferences.edit().putBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, false).commit(); - showEnclosure(uri, enclosure, position1, position2); - } - }); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.show(); - } else { - showEnclosure(uri, enclosure, position1, position2); - } - } - }); - } else { - playButton.setVisibility(View.GONE); - } - entryCursor.close(); - setupButton(previousButton, false, timestamp); - setupButton(nextButton, true, timestamp); - webView.scrollTo(scrollX, scrollY); // resets the scrolling - } - } else { - entryCursor.close(); - } - - /* - new Thread() { - public void run() { - sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); // this is slow - } - }.start(); - */ - } - - private void showEnclosure(Uri uri, String enclosure, int position1, int position2) { - try { - startActivityForResult(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, enclosure.substring(position1+3, position2)), 0); - } catch (Exception e) { - try { - startActivityForResult(new Intent(Intent.ACTION_VIEW, uri), 0); // fallbackmode - let the browser handle this - } catch (Throwable t) { - Toast.makeText(EntryActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); - } - } - } - - private void setupButton(ImageButton button, final boolean successor, long date) { - StringBuilder queryString = new StringBuilder(DATE).append(date).append(AND_ID).append(successor ? '>' : '<').append(_id).append(')').append(OR_DATE).append(successor ? '<' : '>').append(date); - - if (!showRead) { - queryString.append(Strings.DB_AND).append(EntriesListAdapter.READDATEISNULL); - } - - Cursor cursor = getContentResolver().query(parentUri, new String[] {FeedData.EntryColumns._ID}, queryString.toString() , null, successor ? DESC : ASC); - - if (cursor.moveToFirst()) { - button.setEnabled(true); - button.setAlpha(BUTTON_ALPHA); - - final String id = cursor.getString(0); - - if (successor) { - _nextId = id; - } else { - _previousId = id; - } - button.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - if (successor) { - nextEntry(false); - } else { - previousEntry(false); - } - } - }); - } else { - button.setEnabled(false); - button.setAlpha(60); - } - cursor.close(); - } - - private void switchEntry(String id, boolean animate, Animation inAnimation, Animation outAnimation) { - uri = parentUri.buildUpon().appendPath(id).build(); - getIntent().setData(uri); - scrollX = 0; - scrollY = 0; - - if (animate) { - WebView dummy = webView; // switch reference - - webView = webView0; - webView0 = dummy; - } - - reload(); - - if (animate) { - viewFlipper.setInAnimation(inAnimation); - viewFlipper.setOutAnimation(outAnimation); - viewFlipper.addView(webView, layoutParams); - viewFlipper.showNext(); - viewFlipper.removeViewAt(0); - } - } - - private void nextEntry(boolean animate) { - switchEntry(_nextId, animate, Animations.SLIDE_IN_RIGHT, Animations.SLIDE_OUT_LEFT); - } - - private void previousEntry(boolean animate) { - switchEntry(_previousId, animate, Animations.SLIDE_IN_LEFT, Animations.SLIDE_OUT_RIGHT); - } - - @Override - protected void onPause() { - super.onPause(); - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.onPause(webView); - } - scrollX = webView.getScrollX(); - scrollY = webView.getScrollY(); - } - - @Override - protected void onSaveInstanceState(Bundle outState) - { - webView.saveState(outState); - super.onSaveInstanceState(outState); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.entry, menu); - return true; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_copytoclipboard: { - if (link != null) { - ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(link); - } - break; - } - case R.id.menu_delete: { - getContentResolver().delete(uri, null, null); - if (localPictures) { - FeedData.deletePicturesOfEntry(_id); - } - - if (nextButton.isEnabled()) { - nextButton.performClick(); - } else { - if (previousButton.isEnabled()) { - previousButton.performClick(); - } else { - finish(); - } - } - break; - } - case R.id.menu_share: { - if (link != null) { - startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND).putExtra(Intent.EXTRA_TEXT, link).setType(TEXTPLAIN), getString(R.string.menu_share))); - } - break; - } - } - return true; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (keyCode == 92 || keyCode == 94) { - scrollUp(); - return true; - } else if (keyCode == 93 || keyCode == 95) { - scrollDown(); - return true; - } - } - return super.onKeyDown(keyCode, event); - } - - private void scrollUp() { - if (webView != null) { - webView.pageUp(false); - } - } - - private void scrollDown() { - if (webView != null) { - webView.pageDown(false); - } - } - - /** - * Works around android issue 6191 - */ - @Override - public void unregisterReceiver(BroadcastReceiver receiver) { - try { - super.unregisterReceiver(receiver); - } catch (Exception e) { - // do nothing - } - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.text.ClipboardManager; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.util.TypedValue; +import android.view.GestureDetector; +import android.view.GestureDetector.OnGestureListener; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnKeyListener; +import android.view.View.OnTouchListener; +import android.view.ViewGroup.LayoutParams; +import android.view.Window; +import android.view.animation.Animation; +import android.webkit.WebView; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.ViewFlipper; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class EntryActivity extends Activity { + /* + private static final String NEWLINE = "\n"; + + private static final String BR = "
"; + */ + + private static final String TEXT_HTML = "text/html"; + + private static final String UTF8 = "utf-8"; + + private static final String OR_DATE = " or date "; + + private static final String DATE = "(date="; + + private static final String AND_ID = " and _id"; + + private static final String ASC = "date asc, _id desc limit 1"; + + private static final String DESC = "date desc, _id asc limit 1"; + + private static final String CSS = ""; + + private static final String FONT_START = CSS+""; + + private static final String FONT_FONTSIZE_START = CSS+""; + + private static final String FONTSIZE_END = ""; + + private static final String FONT_END = "



"; + + private static final String BODY_START = ""; + + private static final String BODY_END = "



"; + + private static final int BUTTON_ALPHA = 180; + + private static final String IMAGE_ENCLOSURE = "[@]image/"; + + private static final String TEXTPLAIN = "text/plain"; + + private static final String BRACKET = " ("; + + private int titlePosition; + + private int datePosition; + + private int abstractPosition; + + private int linkPosition; + + private int feedIdPosition; + + private int favoritePosition; + + private int readDatePosition; + + private int enclosurePosition; + + private int authorPosition; + + private String _id; + + private String _nextId; + + private String _previousId; + + private Uri uri; + + private Uri parentUri; + + private int feedId; + + boolean favorite; + + private boolean showRead; + + private boolean canShowIcon; + + private byte[] iconBytes; + + private WebView webView; + + private WebView webView0; // only needed for the animation + + private ViewFlipper viewFlipper; + + private ImageButton nextButton; + + private ImageButton urlButton; + + private ImageButton previousButton; + + private ImageButton playButton; + + int scrollX; + + int scrollY; + + private String link; + + private LayoutParams layoutParams; + + private View content; + + private SharedPreferences preferences; + + private boolean localPictures; + + private TextView titleTextView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + + super.onCreate(savedInstanceState); + + int titleId = -1; + + if (MainTabActivity.POSTGINGERBREAD) { + canShowIcon = true; + setContentView(R.layout.entry); + try { + /* This is a trick as com.android.internal.R.id.action_bar_title is not directly accessible */ + titleId = (Integer) Class.forName("com.android.internal.R$id").getField("action_bar_title").get(null); + } catch (Exception exception) { + + } + } else { + canShowIcon = requestWindowFeature(Window.FEATURE_LEFT_ICON); + setContentView(R.layout.entry); + titleId = android.R.id.title; + } + + try { + titleTextView = (TextView) findViewById(titleId); + titleTextView.setSingleLine(true); + titleTextView.setHorizontallyScrolling(true); + titleTextView.setMarqueeRepeatLimit(1); + titleTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); + titleTextView.setFocusable(true); + titleTextView.setFocusableInTouchMode(true); + } catch (Exception e) { + // just in case for non standard android, nullpointer etc + } + + uri = getIntent().getData(); + parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); + showRead = getIntent().getBooleanExtra(EntriesListActivity.EXTRA_SHOWREAD, true); + iconBytes = getIntent().getByteArrayExtra(FeedData.FeedColumns.ICON); + feedId = 0; + + Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); + + titlePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.TITLE); + datePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.DATE); + abstractPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ABSTRACT); + linkPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.LINK); + feedIdPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FEED_ID); + favoritePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); + readDatePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.READDATE); + enclosurePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ENCLOSURE); + authorPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.AUTHOR); + + entryCursor.close(); + if (RSSOverview.notificationManager == null) { + RSSOverview.notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + + nextButton = (ImageButton) findViewById(R.id.next_button); + urlButton = (ImageButton) findViewById(R.id.url_button); + urlButton.setAlpha(BUTTON_ALPHA+30); + previousButton = (ImageButton) findViewById(R.id.prev_button); + playButton = (ImageButton) findViewById(R.id.play_button); + playButton.setAlpha(BUTTON_ALPHA); + + viewFlipper = (ViewFlipper) findViewById(R.id.content_flipper); + + + + layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); + + webView = new WebView(this); + + viewFlipper.addView(webView, layoutParams); + + OnKeyListener onKeyEventListener = new OnKeyListener() { + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + if (keyCode == 92 || keyCode == 94) { + scrollUp(); + return true; + } else if (keyCode == 93 || keyCode == 95) { + scrollDown(); + return true; + } + } + return false; + } + }; + webView.setOnKeyListener(onKeyEventListener); + + content = findViewById(R.id.entry_content); + + webView0 = new WebView(this); + webView0.setOnKeyListener(onKeyEventListener); + + preferences = PreferenceManager.getDefaultSharedPreferences(this); + + final boolean gestures = preferences.getBoolean(Strings.SETTINGS_GESTURESENABLED, true); + + final GestureDetector gestureDetector = new GestureDetector(this, new OnGestureListener() { + public boolean onDown(MotionEvent e) { + return false; + } + + public boolean onFling(MotionEvent e1, MotionEvent e2, + float velocityX, float velocityY) { + if (gestures) { + if (Math.abs(velocityY) < Math.abs(velocityX)) { + if (velocityX > 800) { + if (previousButton.isEnabled()) { + previousEntry(true); + } + } else if (velocityX < -800) { + if (nextButton.isEnabled()) { + nextEntry(true); + } + } + } + } + return false; + } + + public void onLongPress(MotionEvent e) { + + } + + public boolean onScroll(MotionEvent e1, MotionEvent e2, + float distanceX, float distanceY) { + return false; + } + + public void onShowPress(MotionEvent e) { + + } + + public boolean onSingleTapUp(MotionEvent e) { + return false; + } + }); + + OnTouchListener onTouchListener = new OnTouchListener() { + public boolean onTouch(View v, MotionEvent event) { + return gestureDetector.onTouchEvent(event); + } + }; + + webView.setOnTouchListener(onTouchListener); + + content.setOnTouchListener(new OnTouchListener() { + public boolean onTouch(View v, MotionEvent event) { + gestureDetector.onTouchEvent(event); + return true; // different to the above one! + } + }); + + webView0.setOnTouchListener(onTouchListener); + + scrollX = 0; + scrollY = 0; + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) + { + super.onRestoreInstanceState(savedInstanceState); + webView.restoreState(savedInstanceState); + } + + @Override + protected void onResume() { + super.onResume(); + if (RSSOverview.notificationManager != null) { + RSSOverview.notificationManager.cancel(0); + } + uri = getIntent().getData(); + parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.onResume(webView); + } + reload(); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + } + + private void reload() { + if (_id != null && _id.equals(uri.getLastPathSegment())) { + return; + } + + _id = uri.getLastPathSegment(); + + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); + + Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); + + if (entryCursor.moveToFirst()) { + String abstractText = entryCursor.getString(abstractPosition); + + if (entryCursor.isNull(readDatePosition)) { + getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null); + } + if (abstractText == null) { + String link = entryCursor.getString(linkPosition); + + entryCursor.close(); + finish(); + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(link))); + } else { + setTitle(entryCursor.getString(titlePosition)); + if (titleTextView != null) { + titleTextView.requestFocus(); // restart ellipsize + } + + int _feedId = entryCursor.getInt(feedIdPosition); + + if (feedId != _feedId) { + if (feedId != 0) { + iconBytes = null; // triggers re-fetch of the icon + } + feedId = _feedId; + } + + if (canShowIcon) { + if (iconBytes == null || iconBytes.length == 0) { + Cursor iconCursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(Integer.toString(feedId)), new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.ICON}, null, null, null); + + if (iconCursor.moveToFirst()) { + iconBytes = iconCursor.getBlob(1); + } + iconCursor.close(); + } + + if (iconBytes != null && iconBytes.length > 0) { + int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + if (bitmap != null) { + if (bitmap.getHeight() != bitmapSizeInDip) { + bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); + } + + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); + } else { + setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); + } + } + } + } + + long timestamp = entryCursor.getLong(datePosition); + + Date date = new Date(timestamp); + + StringBuilder dateStringBuilder = new StringBuilder(DateFormat.getDateFormat(this).format(date)).append(' ').append(DateFormat.getTimeFormat(this).format(date)); + + String author = entryCursor.getString(authorPosition); + + if (author != null) { + dateStringBuilder.append(BRACKET).append(author).append(')'); + } + + ((TextView) findViewById(R.id.entry_date)).setText(dateStringBuilder); + + final ImageView imageView = (ImageView) findViewById(android.R.id.icon); + + favorite = entryCursor.getInt(favoritePosition) == 1; + + imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); + imageView.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + favorite = !favorite; + imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.FAVORITE, favorite ? 1 : 0); + getContentResolver().update(uri, values, null, null); + } + }); + // loadData does not recognize the encoding without correct html-header + localPictures = abstractText.indexOf(Strings.IMAGEID_REPLACEMENT) > -1; + + abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, uri.getLastPathSegment()+Strings.IMAGEFILE_IDSEPARATOR); + + Pattern linkP = Pattern.compile("]*href=[^>]*>"); + Matcher linkM = linkP.matcher(abstractText); + if(!linkM.find()) { + abstractText = abstractText.replaceAll("(?i)(https?://[^ \n\r\t\\[\\]]+)", "$1"); + } + + Pattern brP = Pattern.compile("]*>"); + Matcher brM = brP.matcher(abstractText); + if(!brM.find()) { + abstractText = abstractText.replaceAll("\n", "
"); + } + + abstractText = abstractText.replaceAll("(?i)\\[(/?(b|u))\\]", "<$1>"); + abstractText = abstractText.replaceAll("(?i)\\[img\\](https?://[^ \n\r\t\\[\\]]+)\\[/img\\]", ""); + abstractText = abstractText.replaceAll("(?i)\\[/?(center|color|size|img|url|pre)[^\\]]*\\]", ""); + + final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + + if (localPictures) { + abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, _id+Strings.IMAGEFILE_IDSEPARATOR); + } + + if (preferences.getBoolean(Strings.SETTINGS_DISABLEPICTURES, false)) { + abstractText = abstractText.replaceAll(Strings.HTML_IMG_REGEX, Strings.EMPTY); + webView.getSettings().setBlockNetworkImage(true); + } else { + if (webView.getSettings().getBlockNetworkImage()) { + /* + * setBlockNetwortImage(false) calls postSync, which takes time, + * so we clean up the html first and change the value afterwards + */ + webView.loadData(Strings.EMPTY, TEXT_HTML, UTF8); + webView.getSettings().setBlockNetworkImage(false); + } + } + + int fontsize = Integer.parseInt(preferences.getString(Strings.SETTINGS_FONTSIZE, Strings.ONE)); + + /* + if (abstractText.indexOf('<') > -1 && abstractText.indexOf('>') > -1) { + abstractText = abstractText.replace(NEWLINE, BR); + } + */ + + if (MainTabActivity.isLightTheme(this) || preferences.getBoolean(Strings.SETTINGS_BLACKTEXTONWHITE, false)) { + if (fontsize > 0) { + webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONTSIZE_END).toString(), TEXT_HTML, UTF8, null); + } else { + webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(BODY_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); + } + webView.setBackgroundColor(Color.WHITE); + content.setBackgroundColor(Color.WHITE); + } else { + if (fontsize > 0) { + webView.loadDataWithBaseURL(null, new StringBuilder(FONT_FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONT_END).toString(), TEXT_HTML, UTF8, null); + } else { + webView.loadDataWithBaseURL(null, new StringBuilder(FONT_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); + } + webView.setBackgroundColor(Color.BLACK); + content.setBackgroundColor(Color.BLACK); + } + + link = entryCursor.getString(linkPosition); + + if (link != null && link.length() > 0) { + urlButton.setEnabled(true); + urlButton.setAlpha(BUTTON_ALPHA+20); + urlButton.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + startActivityForResult(new Intent(Intent.ACTION_VIEW, Uri.parse(link)), 0); + } + }); + } else { + urlButton.setEnabled(false); + urlButton.setAlpha(80); + } + + final String enclosure = entryCursor.getString(enclosurePosition); + + if (enclosure != null && enclosure.length() > 6 && enclosure.indexOf(IMAGE_ENCLOSURE) == -1) { + playButton.setVisibility(View.VISIBLE); + playButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + final int position1 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR); + + final int position2 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR, position1+3); + + final Uri uri = Uri.parse(enclosure.substring(0, position1)); + + if (preferences.getBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, true)) { + Builder builder = new AlertDialog.Builder(EntryActivity.this); + + builder.setTitle(R.string.question_areyousure); + builder.setIcon(android.R.drawable.ic_dialog_alert); + if (position2+4 > enclosure.length()) { + builder.setMessage(getString(R.string.question_playenclosure, uri, position2+4 > enclosure.length() ? Strings.QUESTIONMARKS : enclosure.substring(position2+3))); + } else { + try { + builder.setMessage(getString(R.string.question_playenclosure, uri, (Integer.parseInt(enclosure.substring(position2+3)) / 1024f)+getString(R.string.kb))); + } catch (Exception e) { + builder.setMessage(getString(R.string.question_playenclosure, uri, enclosure.substring(position2+3))); + } + } + builder.setCancelable(true); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + showEnclosure(uri, enclosure, position1, position2); + } + }); + builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + preferences.edit().putBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, false).commit(); + showEnclosure(uri, enclosure, position1, position2); + } + }); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.show(); + } else { + showEnclosure(uri, enclosure, position1, position2); + } + } + }); + } else { + playButton.setVisibility(View.GONE); + } + entryCursor.close(); + setupButton(previousButton, false, timestamp); + setupButton(nextButton, true, timestamp); + webView.scrollTo(scrollX, scrollY); // resets the scrolling + } + } else { + entryCursor.close(); + } + + /* + new Thread() { + public void run() { + sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); // this is slow + } + }.start(); + */ + } + + private void showEnclosure(Uri uri, String enclosure, int position1, int position2) { + try { + startActivityForResult(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, enclosure.substring(position1+3, position2)), 0); + } catch (Exception e) { + try { + startActivityForResult(new Intent(Intent.ACTION_VIEW, uri), 0); // fallbackmode - let the browser handle this + } catch (Throwable t) { + Toast.makeText(EntryActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); + } + } + } + + private void setupButton(ImageButton button, final boolean successor, long date) { + StringBuilder queryString = new StringBuilder(DATE).append(date).append(AND_ID).append(successor ? '>' : '<').append(_id).append(')').append(OR_DATE).append(successor ? '<' : '>').append(date); + + if (!showRead) { + queryString.append(Strings.DB_AND).append(EntriesListAdapter.READDATEISNULL); + } + + Cursor cursor = getContentResolver().query(parentUri, new String[] {FeedData.EntryColumns._ID}, queryString.toString() , null, successor ? DESC : ASC); + + if (cursor.moveToFirst()) { + button.setEnabled(true); + button.setAlpha(BUTTON_ALPHA); + + final String id = cursor.getString(0); + + if (successor) { + _nextId = id; + } else { + _previousId = id; + } + button.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + if (successor) { + nextEntry(false); + } else { + previousEntry(false); + } + } + }); + } else { + button.setEnabled(false); + button.setAlpha(60); + } + cursor.close(); + } + + private void switchEntry(String id, boolean animate, Animation inAnimation, Animation outAnimation) { + uri = parentUri.buildUpon().appendPath(id).build(); + getIntent().setData(uri); + scrollX = 0; + scrollY = 0; + + if (animate) { + WebView dummy = webView; // switch reference + + webView = webView0; + webView0 = dummy; + } + + reload(); + + if (animate) { + viewFlipper.setInAnimation(inAnimation); + viewFlipper.setOutAnimation(outAnimation); + viewFlipper.addView(webView, layoutParams); + viewFlipper.showNext(); + viewFlipper.removeViewAt(0); + } + } + + private void nextEntry(boolean animate) { + switchEntry(_nextId, animate, Animations.SLIDE_IN_RIGHT, Animations.SLIDE_OUT_LEFT); + } + + private void previousEntry(boolean animate) { + switchEntry(_previousId, animate, Animations.SLIDE_IN_LEFT, Animations.SLIDE_OUT_RIGHT); + } + + @Override + protected void onPause() { + super.onPause(); + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.onPause(webView); + } + scrollX = webView.getScrollX(); + scrollY = webView.getScrollY(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) + { + webView.saveState(outState); + super.onSaveInstanceState(outState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.entry, menu); + return true; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_copytoclipboard: { + if (link != null) { + ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(link); + } + break; + } + case R.id.menu_delete: { + getContentResolver().delete(uri, null, null); + if (localPictures) { + FeedData.deletePicturesOfEntry(_id); + } + + if (nextButton.isEnabled()) { + nextButton.performClick(); + } else { + if (previousButton.isEnabled()) { + previousButton.performClick(); + } else { + finish(); + } + } + break; + } + case R.id.menu_share: { + if (link != null) { + startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND).putExtra(Intent.EXTRA_TEXT, link).setType(TEXTPLAIN), getString(R.string.menu_share))); + } + break; + } + } + return true; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + if (keyCode == 92 || keyCode == 94) { + scrollUp(); + return true; + } else if (keyCode == 93 || keyCode == 95) { + scrollDown(); + return true; + } + } + return super.onKeyDown(keyCode, event); + } + + private void scrollUp() { + if (webView != null) { + webView.pageUp(false); + } + } + + private void scrollDown() { + if (webView != null) { + webView.pageDown(false); + } + } + + /** + * Works around android issue 6191 + */ + @Override + public void unregisterReceiver(BroadcastReceiver receiver) { + try { + super.unregisterReceiver(receiver); + } catch (Exception e) { + // do nothing + } + } + +} diff --git a/src/de/shandschuh/sparserss/FeedConfigActivity.java b/src/cn/eric/rss/FeedConfigActivity.java similarity index 96% rename from src/de/shandschuh/sparserss/FeedConfigActivity.java rename to src/cn/eric/rss/FeedConfigActivity.java index 996dec3..a2c2e01 100644 --- a/src/de/shandschuh/sparserss/FeedConfigActivity.java +++ b/src/cn/eric/rss/FeedConfigActivity.java @@ -1,178 +1,179 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.app.Activity; -import android.content.ContentValues; -import android.content.Intent; -import android.database.Cursor; -import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Toast; -import de.shandschuh.sparserss.provider.FeedData; - -public class FeedConfigActivity extends Activity { - private static final String WASACTIVE = "wasactive"; - - private static final String[] PROJECTION = new String[] {FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, FeedData.FeedColumns.WIFIONLY}; - - private EditText nameEditText; - - private EditText urlEditText; - - private CheckBox refreshOnlyWifiCheckBox; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.feedsettings); - setResult(RESULT_CANCELED); - - Intent intent = getIntent(); - - nameEditText = (EditText) findViewById(R.id.feed_title); - urlEditText = (EditText) findViewById(R.id.feed_url); - refreshOnlyWifiCheckBox = (CheckBox) findViewById(R.id.wifionlycheckbox); - - if (intent.getAction().equals(Intent.ACTION_INSERT)) { - setTitle(R.string.newfeed_title); - restoreInstanceState(savedInstanceState); - ((Button) findViewById(R.id.button_ok)).setOnClickListener(new OnClickListener() { - public void onClick(View v) { - String url = urlEditText.getText().toString(); - - if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { - url = Strings.HTTP+url; - } - - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, null, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); - - if (cursor.moveToFirst()) { - cursor.close(); - Toast.makeText(FeedConfigActivity.this, R.string.error_feedurlexists, Toast.LENGTH_LONG).show(); - } else { - cursor.close(); - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked() ? 1 : 0); - values.put(FeedData.FeedColumns.URL, url); - values.put(FeedData.FeedColumns.ERROR, (String) null); - - String name = nameEditText.getText().toString(); - - if (name.trim().length() > 0) { - values.put(FeedData.FeedColumns.NAME, name); - } - getContentResolver().insert(FeedData.FeedColumns.CONTENT_URI, values); - setResult(RESULT_OK); - finish(); - } - } - }); - } else { - setTitle(R.string.editfeed_title); - - if (!restoreInstanceState(savedInstanceState)) { - Cursor cursor = getContentResolver().query(intent.getData(), PROJECTION, null, null, null); - - if (cursor.moveToNext()) { - nameEditText.setText(cursor.getString(0)); - urlEditText.setText(cursor.getString(1)); - refreshOnlyWifiCheckBox.setChecked(cursor.getInt(2) == 1); - cursor.close(); - } else { - cursor.close(); - Toast.makeText(FeedConfigActivity.this, R.string.error, Toast.LENGTH_LONG).show(); - finish(); - } - } - ((Button) findViewById(R.id.button_ok)).setOnClickListener(new OnClickListener() { - public void onClick(View v) { - String url = urlEditText.getText().toString(); - - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID}, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); - - if (cursor.moveToFirst() && !getIntent().getData().getLastPathSegment().equals(cursor.getString(0))) { - cursor.close(); - Toast.makeText(FeedConfigActivity.this, R.string.error_feedurlexists, Toast.LENGTH_LONG).show(); - } else { - cursor.close(); - ContentValues values = new ContentValues(); - - if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { - url = Strings.HTTP+url; - } - values.put(FeedData.FeedColumns.URL, url); - - String name = nameEditText.getText().toString(); - - values.put(FeedData.FeedColumns.NAME, name.trim().length() > 0 ? name : null); - values.put(FeedData.FeedColumns.FETCHMODE, 0); - values.put(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked() ? 1 : 0); - values.put(FeedData.FeedColumns.ERROR, (String) null); - getContentResolver().update(getIntent().getData(), values, null, null); - - setResult(RESULT_OK); - finish(); - } - } - - }); - - } - - ((Button) findViewById(R.id.button_cancel)).setOnClickListener(new OnClickListener() { - public void onClick(View v) { - finish(); - } - }); - } - - private boolean restoreInstanceState(Bundle savedInstanceState) { - if (savedInstanceState != null && savedInstanceState.getBoolean(WASACTIVE, false)) { - nameEditText.setText(savedInstanceState.getCharSequence(FeedData.FeedColumns.NAME)); - urlEditText.setText(savedInstanceState.getCharSequence(FeedData.FeedColumns.URL)); - refreshOnlyWifiCheckBox.setChecked(savedInstanceState.getBoolean(FeedData.FeedColumns.WIFIONLY)); - return true; - } else { - return false; - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - outState.putBoolean(WASACTIVE, true); - outState.putCharSequence(FeedData.FeedColumns.NAME, nameEditText.getText()); - outState.putCharSequence(FeedData.FeedColumns.URL, urlEditText.getText()); - outState.putBoolean(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked()); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.app.Activity; +import android.content.ContentValues; +import android.content.Intent; +import android.database.Cursor; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Toast; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class FeedConfigActivity extends Activity { + private static final String WASACTIVE = "wasactive"; + + private static final String[] PROJECTION = new String[] {FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, FeedData.FeedColumns.WIFIONLY}; + + private EditText nameEditText; + + private EditText urlEditText; + + private CheckBox refreshOnlyWifiCheckBox; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.feedsettings); + setResult(RESULT_CANCELED); + + Intent intent = getIntent(); + + nameEditText = (EditText) findViewById(R.id.feed_title); + urlEditText = (EditText) findViewById(R.id.feed_url); + refreshOnlyWifiCheckBox = (CheckBox) findViewById(R.id.wifionlycheckbox); + + if (intent.getAction().equals(Intent.ACTION_INSERT)) { + setTitle(R.string.newfeed_title); + restoreInstanceState(savedInstanceState); + ((Button) findViewById(R.id.button_ok)).setOnClickListener(new OnClickListener() { + public void onClick(View v) { + String url = urlEditText.getText().toString(); + + if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { + url = Strings.HTTP+url; + } + + Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, null, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); + + if (cursor.moveToFirst()) { + cursor.close(); + Toast.makeText(FeedConfigActivity.this, R.string.error_feedurlexists, Toast.LENGTH_LONG).show(); + } else { + cursor.close(); + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked() ? 1 : 0); + values.put(FeedData.FeedColumns.URL, url); + values.put(FeedData.FeedColumns.ERROR, (String) null); + + String name = nameEditText.getText().toString(); + + if (name.trim().length() > 0) { + values.put(FeedData.FeedColumns.NAME, name); + } + getContentResolver().insert(FeedData.FeedColumns.CONTENT_URI, values); + setResult(RESULT_OK); + finish(); + } + } + }); + } else { + setTitle(R.string.editfeed_title); + + if (!restoreInstanceState(savedInstanceState)) { + Cursor cursor = getContentResolver().query(intent.getData(), PROJECTION, null, null, null); + + if (cursor.moveToNext()) { + nameEditText.setText(cursor.getString(0)); + urlEditText.setText(cursor.getString(1)); + refreshOnlyWifiCheckBox.setChecked(cursor.getInt(2) == 1); + cursor.close(); + } else { + cursor.close(); + Toast.makeText(FeedConfigActivity.this, R.string.error, Toast.LENGTH_LONG).show(); + finish(); + } + } + ((Button) findViewById(R.id.button_ok)).setOnClickListener(new OnClickListener() { + public void onClick(View v) { + String url = urlEditText.getText().toString(); + + Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID}, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); + + if (cursor.moveToFirst() && !getIntent().getData().getLastPathSegment().equals(cursor.getString(0))) { + cursor.close(); + Toast.makeText(FeedConfigActivity.this, R.string.error_feedurlexists, Toast.LENGTH_LONG).show(); + } else { + cursor.close(); + ContentValues values = new ContentValues(); + + if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { + url = Strings.HTTP+url; + } + values.put(FeedData.FeedColumns.URL, url); + + String name = nameEditText.getText().toString(); + + values.put(FeedData.FeedColumns.NAME, name.trim().length() > 0 ? name : null); + values.put(FeedData.FeedColumns.FETCHMODE, 0); + values.put(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked() ? 1 : 0); + values.put(FeedData.FeedColumns.ERROR, (String) null); + getContentResolver().update(getIntent().getData(), values, null, null); + + setResult(RESULT_OK); + finish(); + } + } + + }); + + } + + ((Button) findViewById(R.id.button_cancel)).setOnClickListener(new OnClickListener() { + public void onClick(View v) { + finish(); + } + }); + } + + private boolean restoreInstanceState(Bundle savedInstanceState) { + if (savedInstanceState != null && savedInstanceState.getBoolean(WASACTIVE, false)) { + nameEditText.setText(savedInstanceState.getCharSequence(FeedData.FeedColumns.NAME)); + urlEditText.setText(savedInstanceState.getCharSequence(FeedData.FeedColumns.URL)); + refreshOnlyWifiCheckBox.setChecked(savedInstanceState.getBoolean(FeedData.FeedColumns.WIFIONLY)); + return true; + } else { + return false; + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + outState.putBoolean(WASACTIVE, true); + outState.putCharSequence(FeedData.FeedColumns.NAME, nameEditText.getText()); + outState.putCharSequence(FeedData.FeedColumns.URL, urlEditText.getText()); + outState.putBoolean(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked()); + } + +} diff --git a/src/de/shandschuh/sparserss/FeedPrefsActivity.java b/src/cn/eric/rss/FeedPrefsActivity.java similarity index 94% rename from src/de/shandschuh/sparserss/FeedPrefsActivity.java rename to src/cn/eric/rss/FeedPrefsActivity.java index 4b820cb..186977e 100644 --- a/src/de/shandschuh/sparserss/FeedPrefsActivity.java +++ b/src/cn/eric/rss/FeedPrefsActivity.java @@ -1,65 +1,66 @@ -package de.shandschuh.sparserss; - -import de.shandschuh.sparserss.provider.FeedData; -import android.content.ContentValues; -import android.database.Cursor; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.preference.Preference.OnPreferenceChangeListener; - -public class FeedPrefsActivity extends PreferenceActivity { - - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.feedsettings); - - final String feedId = getIntent().getStringExtra(FeedData.FeedColumns._ID); - - OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference pref, Object change) { - ContentValues values = new ContentValues(); - - if( pref.getKey().equals(Strings.FEED_SETTINGS_ALERT_RINGTONE)) { - values.put(FeedData.FeedColumns.ALERT_RINGTONE, change.toString()); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); - return true; - } else if(pref.getKey().equals(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE)) { - int val = change.equals(Boolean.TRUE) ? 1 : 0; - values.put(FeedData.FeedColumns.OTHER_ALERT_RINGTONE, val); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); - return true; - } else if(pref.getKey().equals(Strings.FEED_SETTINGS_SKIP_ALERT)) { - int val = change.equals(Boolean.TRUE) ? 1 : 0; - values.put(FeedData.FeedColumns.SKIP_ALERT, val); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); - return true; - } - return false; - } - }; - - CheckBoxPreference skipAlert = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_SKIP_ALERT); - CheckBoxPreference other_ringtone = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE); - Preference ringtone = findPreference(Strings.FEED_SETTINGS_ALERT_RINGTONE); - - skipAlert.setOnPreferenceChangeListener(listener); - ringtone.setOnPreferenceChangeListener(listener); - other_ringtone.setOnPreferenceChangeListener(listener); - - Cursor defaultValues = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), new String[] { - FeedData.FeedColumns.OTHER_ALERT_RINGTONE, - FeedData.FeedColumns.ALERT_RINGTONE, - FeedData.FeedColumns.SKIP_ALERT - }, null, null, null); - - defaultValues.moveToFirst(); - other_ringtone.setChecked(defaultValues.getInt(0) == 1); - ringtone.setDefaultValue(defaultValues.getString(1)); // XXX does not work - skipAlert.setChecked(defaultValues.getInt(2) == 1); - defaultValues.close(); - - } - -} +package cn.eric.rss; + +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; +import android.content.ContentValues; +import android.database.Cursor; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.preference.Preference.OnPreferenceChangeListener; + +public class FeedPrefsActivity extends PreferenceActivity { + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.feedsettings); + + final String feedId = getIntent().getStringExtra(FeedData.FeedColumns._ID); + + OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference pref, Object change) { + ContentValues values = new ContentValues(); + + if( pref.getKey().equals(Strings.FEED_SETTINGS_ALERT_RINGTONE)) { + values.put(FeedData.FeedColumns.ALERT_RINGTONE, change.toString()); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); + return true; + } else if(pref.getKey().equals(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE)) { + int val = change.equals(Boolean.TRUE) ? 1 : 0; + values.put(FeedData.FeedColumns.OTHER_ALERT_RINGTONE, val); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); + return true; + } else if(pref.getKey().equals(Strings.FEED_SETTINGS_SKIP_ALERT)) { + int val = change.equals(Boolean.TRUE) ? 1 : 0; + values.put(FeedData.FeedColumns.SKIP_ALERT, val); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); + return true; + } + return false; + } + }; + + CheckBoxPreference skipAlert = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_SKIP_ALERT); + CheckBoxPreference other_ringtone = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE); + Preference ringtone = findPreference(Strings.FEED_SETTINGS_ALERT_RINGTONE); + + skipAlert.setOnPreferenceChangeListener(listener); + ringtone.setOnPreferenceChangeListener(listener); + other_ringtone.setOnPreferenceChangeListener(listener); + + Cursor defaultValues = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), new String[] { + FeedData.FeedColumns.OTHER_ALERT_RINGTONE, + FeedData.FeedColumns.ALERT_RINGTONE, + FeedData.FeedColumns.SKIP_ALERT + }, null, null, null); + + defaultValues.moveToFirst(); + other_ringtone.setChecked(defaultValues.getInt(0) == 1); + ringtone.setDefaultValue(defaultValues.getString(1)); // XXX does not work + skipAlert.setChecked(defaultValues.getInt(2) == 1); + defaultValues.close(); + + } + +} diff --git a/src/de/shandschuh/sparserss/MainTabActivity.java b/src/cn/eric/rss/MainTabActivity.java similarity index 95% rename from src/de/shandschuh/sparserss/MainTabActivity.java rename to src/cn/eric/rss/MainTabActivity.java index 082aa21..3102b0f 100644 --- a/src/de/shandschuh/sparserss/MainTabActivity.java +++ b/src/cn/eric/rss/MainTabActivity.java @@ -1,293 +1,294 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.app.Activity; -import android.app.ActivityManager; -import android.app.ActivityManager.RunningServiceInfo; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.TabActivity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnKeyListener; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences.Editor; -import android.os.Build; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.Window; -import android.widget.ScrollView; -import android.widget.TabHost; -import android.widget.TabHost.OnTabChangeListener; -import android.widget.TextView; -import de.shandschuh.sparserss.provider.FeedData; -import de.shandschuh.sparserss.service.FetcherService; - -public class MainTabActivity extends TabActivity { - private static final int DIALOG_LICENSEAGREEMENT = 0; - - private boolean tabsAdded; - - private static final String TAG_NORMAL = "normal"; - - private static final String TAG_ALL = "all"; - - private static final String TAG_FAVORITE = "favorite"; - - public static MainTabActivity INSTANCE; - - public static final boolean POSTGINGERBREAD = !Build.VERSION.RELEASE.startsWith("1") && - !Build.VERSION.RELEASE.startsWith("2"); // this way around is future save - - - private static Boolean LIGHTTHEME; - - public static boolean isLightTheme(Context context) { - if (LIGHTTHEME == null) { - LIGHTTHEME = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_LIGHTTHEME, false); - } - return LIGHTTHEME; - } - - private Menu menu; - - private BroadcastReceiver refreshReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - setProgressBarIndeterminateVisibility(true); - } - }; - - private boolean hasContent; - - public void onCreate(Bundle savedInstanceState) { - if (isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - super.onCreate(savedInstanceState); - - //We need to display progress information - requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - - setContentView(R.layout.tabs); - INSTANCE = this; - hasContent = false; - if (getPreferences(MODE_PRIVATE).getBoolean(Strings.PREFERENCE_LICENSEACCEPTED, false)) { - setContent(); - } else { - /* Workaround for android issue 4499 on 1.5 devices */ - getTabHost().addTab(getTabHost().newTabSpec(Strings.EMPTY).setIndicator(Strings.EMPTY).setContent(new Intent(this, EmptyActivity.class))); - - showDialog(DIALOG_LICENSEAGREEMENT); - } - } - - @Override - protected void onResume() - { - super.onResume(); - setProgressBarIndeterminateVisibility(isCurrentlyRefreshing()); - registerReceiver(refreshReceiver, new IntentFilter("de.shandschuh.sparserss.REFRESH")); - } - - @Override - protected void onPause() - { - unregisterReceiver(refreshReceiver); - super.onPause(); - } - - @Override - protected Dialog onCreateDialog(int id) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.dialog_licenseagreement); - builder.setNegativeButton(R.string.button_decline, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - finish(); - } - }); - builder.setPositiveButton(R.string.button_accept, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - Editor editor = getPreferences(MODE_PRIVATE).edit(); - - editor.putBoolean(Strings.PREFERENCE_LICENSEACCEPTED, true); - editor.commit(); - - /* Part of workaround for android issue 4499 on 1.5 devices */ - getTabHost().clearAllTabs(); - - /* we only want to invoke actions if the license is accepted */ - setContent(); - } - }); - setupLicenseText(builder); - builder.setOnKeyListener(new OnKeyListener() { - public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - dialog.cancel(); - finish(); - } - return true; - } - }); - return builder.create(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - this.menu = menu; - - Activity activity = getCurrentActivity(); - - if (hasContent && activity != null) { - return activity.onCreateOptionsMenu(menu); - } else { - menu.add(Strings.EMPTY); // to let the menu be available - return true; - } - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - Activity activity = getCurrentActivity(); - - if (hasContent && activity != null) { - return activity.onMenuItemSelected(featureId, item); - } else { - return super.onMenuItemSelected(featureId, item); - } - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - Activity activity = getCurrentActivity(); - - if (hasContent && activity != null) { - return activity.onPrepareOptionsMenu(menu); - } else { - return super.onPrepareOptionsMenu(menu); - } - } - - private void setContent() { - TabHost tabHost = getTabHost(); - - tabHost.addTab(tabHost.newTabSpec(TAG_NORMAL).setIndicator(getString(R.string.overview)).setContent(new Intent().setClass(this, RSSOverview.class))); - hasContent = true; - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_SHOWTABS, false)) { - tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); - - tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true).putExtra(EntriesListActivity.EXTRA_AUTORELOAD, true))); - tabsAdded = true; - getTabWidget().setVisibility(View.VISIBLE); - } - if (POSTGINGERBREAD) { - /* Change the menu also on ICS when tab is changed */ - tabHost.setOnTabChangedListener(new OnTabChangeListener() { - public void onTabChanged(String tabId) { - if (menu != null) { - menu.clear(); - onCreateOptionsMenu(menu); - } - } - }); - if (menu != null) { - menu.clear(); - onCreateOptionsMenu(menu); - } - } - } - - public void setTabWidgetVisible(boolean visible) { - if (visible) { - if (!tabsAdded) { - TabHost tabHost = getTabHost(); - - tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); - tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); - tabsAdded = true; - } - getTabWidget().setVisibility(View.VISIBLE); - } else { - getTabWidget().setVisibility(View.GONE); - } - - } - - void setupLicenseText(AlertDialog.Builder builder) { - View view = getLayoutInflater().inflate(R.layout.license, null); - - final TextView textView = (TextView) view.findViewById(R.id.license_text); - - textView.setTextColor(textView.getTextColors().getDefaultColor()); // disables color change on selection - textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); - - final TextView contributorsTextView = (TextView) view.findViewById(R.id.contributors_togglebutton); - - contributorsTextView.setOnClickListener(new OnClickListener() { - boolean showingLicense = true; - - @Override - public void onClick(View view) { - if (showingLicense) { - textView.setText(R.string.contributors_list); - contributorsTextView.setText(R.string.license_word); - } else { - textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); - contributorsTextView.setText(R.string.contributors); - } - showingLicense = !showingLicense; - } - - }); - builder.setView(view); - } - - private boolean isCurrentlyRefreshing() - { - ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); - for (RunningServiceInfo service: manager.getRunningServices(Integer.MAX_VALUE)) { - if (FetcherService.class.getName().equals(service.service.getClassName())) { - return true; - } - } - return false; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningServiceInfo; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.TabActivity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnKeyListener; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences.Editor; +import android.os.Build; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.Window; +import android.widget.ScrollView; +import android.widget.TabHost; +import android.widget.TabHost.OnTabChangeListener; +import android.widget.TextView; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; +import cn.eric.rss.service.FetcherService; + +public class MainTabActivity extends TabActivity { + private static final int DIALOG_LICENSEAGREEMENT = 0; + + private boolean tabsAdded; + + private static final String TAG_NORMAL = "normal"; + + private static final String TAG_ALL = "all"; + + private static final String TAG_FAVORITE = "favorite"; + + public static MainTabActivity INSTANCE; + + public static final boolean POSTGINGERBREAD = !Build.VERSION.RELEASE.startsWith("1") && + !Build.VERSION.RELEASE.startsWith("2"); // this way around is future save + + + private static Boolean LIGHTTHEME; + + public static boolean isLightTheme(Context context) { + if (LIGHTTHEME == null) { + LIGHTTHEME = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_LIGHTTHEME, false); + } + return LIGHTTHEME; + } + + private Menu menu; + + private BroadcastReceiver refreshReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + setProgressBarIndeterminateVisibility(true); + } + }; + + private boolean hasContent; + + public void onCreate(Bundle savedInstanceState) { + if (isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + super.onCreate(savedInstanceState); + + //We need to display progress information + requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + + setContentView(R.layout.tabs); + INSTANCE = this; + hasContent = false; + if (getPreferences(MODE_PRIVATE).getBoolean(Strings.PREFERENCE_LICENSEACCEPTED, false)) { + setContent(); + } else { + /* Workaround for android issue 4499 on 1.5 devices */ + getTabHost().addTab(getTabHost().newTabSpec(Strings.EMPTY).setIndicator(Strings.EMPTY).setContent(new Intent(this, EmptyActivity.class))); + + showDialog(DIALOG_LICENSEAGREEMENT); + } + } + + @Override + protected void onResume() + { + super.onResume(); + setProgressBarIndeterminateVisibility(isCurrentlyRefreshing()); + registerReceiver(refreshReceiver, new IntentFilter("cn.eric.rss.REFRESH")); + } + + @Override + protected void onPause() + { + unregisterReceiver(refreshReceiver); + super.onPause(); + } + + @Override + protected Dialog onCreateDialog(int id) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.dialog_licenseagreement); + builder.setNegativeButton(R.string.button_decline, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + finish(); + } + }); + builder.setPositiveButton(R.string.button_accept, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + Editor editor = getPreferences(MODE_PRIVATE).edit(); + + editor.putBoolean(Strings.PREFERENCE_LICENSEACCEPTED, true); + editor.commit(); + + /* Part of workaround for android issue 4499 on 1.5 devices */ + getTabHost().clearAllTabs(); + + /* we only want to invoke actions if the license is accepted */ + setContent(); + } + }); + setupLicenseText(builder); + builder.setOnKeyListener(new OnKeyListener() { + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + dialog.cancel(); + finish(); + } + return true; + } + }); + return builder.create(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + this.menu = menu; + + Activity activity = getCurrentActivity(); + + if (hasContent && activity != null) { + return activity.onCreateOptionsMenu(menu); + } else { + menu.add(Strings.EMPTY); // to let the menu be available + return true; + } + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + Activity activity = getCurrentActivity(); + + if (hasContent && activity != null) { + return activity.onMenuItemSelected(featureId, item); + } else { + return super.onMenuItemSelected(featureId, item); + } + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + Activity activity = getCurrentActivity(); + + if (hasContent && activity != null) { + return activity.onPrepareOptionsMenu(menu); + } else { + return super.onPrepareOptionsMenu(menu); + } + } + + private void setContent() { + TabHost tabHost = getTabHost(); + + tabHost.addTab(tabHost.newTabSpec(TAG_NORMAL).setIndicator(getString(R.string.overview)).setContent(new Intent().setClass(this, RSSOverview.class))); + hasContent = true; + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_SHOWTABS, false)) { + tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); + + tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true).putExtra(EntriesListActivity.EXTRA_AUTORELOAD, true))); + tabsAdded = true; + getTabWidget().setVisibility(View.VISIBLE); + } + if (POSTGINGERBREAD) { + /* Change the menu also on ICS when tab is changed */ + tabHost.setOnTabChangedListener(new OnTabChangeListener() { + public void onTabChanged(String tabId) { + if (menu != null) { + menu.clear(); + onCreateOptionsMenu(menu); + } + } + }); + if (menu != null) { + menu.clear(); + onCreateOptionsMenu(menu); + } + } + } + + public void setTabWidgetVisible(boolean visible) { + if (visible) { + if (!tabsAdded) { + TabHost tabHost = getTabHost(); + + tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); + tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); + tabsAdded = true; + } + getTabWidget().setVisibility(View.VISIBLE); + } else { + getTabWidget().setVisibility(View.GONE); + } + + } + + void setupLicenseText(AlertDialog.Builder builder) { + View view = getLayoutInflater().inflate(R.layout.license, null); + + final TextView textView = (TextView) view.findViewById(R.id.license_text); + + textView.setTextColor(textView.getTextColors().getDefaultColor()); // disables color change on selection + textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); + + final TextView contributorsTextView = (TextView) view.findViewById(R.id.contributors_togglebutton); + + contributorsTextView.setOnClickListener(new OnClickListener() { + boolean showingLicense = true; + + @Override + public void onClick(View view) { + if (showingLicense) { + textView.setText(R.string.contributors_list); + contributorsTextView.setText(R.string.license_word); + } else { + textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); + contributorsTextView.setText(R.string.contributors); + } + showingLicense = !showingLicense; + } + + }); + builder.setView(view); + } + + private boolean isCurrentlyRefreshing() + { + ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); + for (RunningServiceInfo service: manager.getRunningServices(Integer.MAX_VALUE)) { + if (FetcherService.class.getName().equals(service.service.getClassName())) { + return true; + } + } + return false; + } + +} diff --git a/src/de/shandschuh/sparserss/RSSOverview.java b/src/cn/eric/rss/RSSOverview.java similarity index 96% rename from src/de/shandschuh/sparserss/RSSOverview.java rename to src/cn/eric/rss/RSSOverview.java index 1552245..e035ebe 100644 --- a/src/de/shandschuh/sparserss/RSSOverview.java +++ b/src/cn/eric/rss/RSSOverview.java @@ -1,608 +1,609 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import java.io.File; -import java.io.FilenameFilter; - -import android.app.AlertDialog; -import android.app.AlertDialog.Builder; -import android.app.Dialog; -import android.app.ListActivity; -import android.app.NotificationManager; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.Uri; -import android.os.Bundle; -import android.os.Environment; -import android.preference.PreferenceManager; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Gravity; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnCreateContextMenuListener; -import android.view.View.OnTouchListener; -import android.view.WindowManager; -import android.view.WindowManager.LayoutParams; -import android.widget.AdapterView; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; -import de.shandschuh.sparserss.provider.FeedData; -import de.shandschuh.sparserss.provider.OPML; -import de.shandschuh.sparserss.service.RefreshService; - -public class RSSOverview extends ListActivity { - private static final int DIALOG_ERROR_FEEDIMPORT = 3; - - private static final int DIALOG_ERROR_FEEDEXPORT = 4; - - private static final int DIALOG_ERROR_INVALIDIMPORTFILE = 5; - - private static final int DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE = 6; - - private static final int DIALOG_ABOUT = 7; - - private static final int CONTEXTMENU_EDIT_ID = 3; - - private static final int CONTEXTMENU_REFRESH_ID = 4; - - private static final int CONTEXTMENU_DELETE_ID = 5; - - private static final int CONTEXTMENU_MARKASREAD_ID = 6; - - private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; - - private static final int CONTEXTMENU_DELETEREAD_ID = 8; - - private static final int CONTEXTMENU_DELETEALLENTRIES_ID = 9; - - private static final int CONTEXTMENU_RESETUPDATEDATE_ID = 10; - - private static final int ACTIVITY_APPLICATIONPREFERENCES_ID = 1; - - private static final Uri CANGELOG_URI = Uri.parse("http://code.google.com/p/sparserss/wiki/Changelog"); - - private static final int CONTEXTMENU_SETTINGS_ID = 99; - - static NotificationManager notificationManager; // package scope - - boolean feedSort; - - private RSSOverviewListAdapter listAdapter; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - super.onCreate(savedInstanceState); - - if (notificationManager == null) { - notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - } - setContentView(R.layout.main); - listAdapter = new RSSOverviewListAdapter(this); - setListAdapter(listAdapter); - getListView().setOnCreateContextMenuListener(new OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { - menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView.findViewById(android.R.id.text1)).getText()); - menu.add(0, CONTEXTMENU_REFRESH_ID, Menu.NONE, R.string.contextmenu_refresh); - menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, R.string.contextmenu_markasread); - menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, R.string.contextmenu_markasunread); - menu.add(0, CONTEXTMENU_DELETEREAD_ID, Menu.NONE, R.string.contextmenu_deleteread); - menu.add(0, CONTEXTMENU_DELETEALLENTRIES_ID, Menu.NONE, R.string.contextmenu_deleteallentries); - menu.add(0, CONTEXTMENU_EDIT_ID, Menu.NONE, R.string.contextmenu_edit); - menu.add(0, CONTEXTMENU_RESETUPDATEDATE_ID, Menu.NONE, R.string.contextmenu_resetupdatedate); - menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, R.string.contextmenu_delete); - menu.add(0, CONTEXTMENU_SETTINGS_ID, Menu.NONE, R.string.contextmenu_settings); - } - }); - getListView().setOnTouchListener(new OnTouchListener() { - private int dragedItem = -1; - - private ImageView dragedView; - - private WindowManager windowManager = RSSOverview.this.getWindowManager(); - - private LayoutParams layoutParams; - - private int minY = 25; // is the header size --> needs to be changed - - private ListView listView = getListView(); - - public boolean onTouch(View v, MotionEvent event) { - if (feedSort) { - int action = event.getAction(); - - switch (action) { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_MOVE: { - // this is the drag action - if (dragedItem == -1) { - dragedItem = listView.pointToPosition((int) event.getX(), (int) event.getY()); - if (dragedItem > -1) { - dragedView = new ImageView(listView.getContext()); - - View item = listView.getChildAt(dragedItem - listView.getFirstVisiblePosition()); - - if (item != null) { - View sortView = item.findViewById(R.id.sortitem); - - if (sortView.getLeft() <= event.getX()) { - item.setDrawingCacheEnabled(true); - dragedView.setImageBitmap(Bitmap.createBitmap(item.getDrawingCache())); - - layoutParams = new LayoutParams(); - layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP; - layoutParams.y = (int) event.getY(); - windowManager.addView(dragedView, layoutParams); - } else { - dragedItem = -1; - return false; // do not comsume - } - - } else { - dragedItem = -1; - } - } - } else if (dragedView != null) { - layoutParams.y = Math.max(minY, Math.max(0, Math.min((int) event.getY(), listView.getHeight()-minY))); - windowManager.updateViewLayout(dragedView, layoutParams); - } - break; - } - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: { - // this is the drop action - if (dragedItem > -1) { - windowManager.removeView(dragedView); - - int newPosition = listView.pointToPosition((int) event.getX(), (int) event.getY()); - - if (newPosition == -1) { - newPosition = listView.getCount()-1; - } - if (newPosition != dragedItem) { - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.PRIORITY, newPosition); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(listView.getItemIdAtPosition(dragedItem)), values, null, null); - } - dragedItem = -1; - return true; - } else { - return false; - } - } - } - return true; - } else { - return false; - } - } - }); - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_REFRESHENABLED, false)) { - startService(new Intent(this, RefreshService.class)); // starts the service independent to this activity - } else { - stopService(new Intent(this, RefreshService.class)); - } - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_REFRESHONPENENABLED, false)) { - new Thread() { - public void run() { - sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS)); - } - }.start(); - } - } - - @Override - protected void onResume() { - super.onResume(); - if (RSSOverview.notificationManager != null) { - notificationManager.cancel(0); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.feedoverview, menu); - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menu.setGroupVisible(R.id.menu_group_0, !feedSort); - menu.setGroupVisible(R.id.menu_group_1, feedSort); - return true; - } - - @SuppressWarnings("deprecation") - @Override - public boolean onMenuItemSelected(int featureId, final MenuItem item) { - setFeedSortEnabled(false); - switch (item.getItemId()) { - case R.id.menu_addfeed: { - startActivity(new Intent(Intent.ACTION_INSERT).setData(FeedData.FeedColumns.CONTENT_URI)); - break; - } - case R.id.menu_refresh: { - new Thread() { - public void run() { - sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false))); - } - }.start(); - break; - } - case CONTEXTMENU_EDIT_ID: { - startActivity(new Intent(Intent.ACTION_EDIT).setData(FeedData.FeedColumns.CONTENT_URI(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); - break; - } - case CONTEXTMENU_REFRESH_ID: { - final String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - - final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); - - if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) { // since we have acquired the networkInfo, we use it for basic checks - final Intent intent = new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.FEEDID, id); - - final Thread thread = new Thread() { - public void run() { - sendBroadcast(intent); - } - }; - - if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI || PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false)) { - intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); - thread.start(); - } else { - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(id), new String[] {FeedData.FeedColumns.WIFIONLY}, null, null, null); - - cursor.moveToFirst(); - - if (cursor.isNull(0) || cursor.getInt(0) == 0) { - thread.start(); - } else { - Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.dialog_hint); - builder.setMessage(R.string.question_refreshwowifi); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); - thread.start(); - } - }); - builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).edit().putBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, true).commit(); - intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); - thread.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - builder.show(); - } - cursor.close(); - } - - } - break; - } - case CONTEXTMENU_DELETE_ID: { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(id), new String[] {FeedData.FeedColumns.NAME}, null, null, null); - - cursor.moveToFirst(); - - Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(cursor.getString(0)); - builder.setMessage(R.string.question_deletefeed); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - new Thread() { - public void run() { - getContentResolver().delete(FeedData.FeedColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id)), null, null); - sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); - } - }.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - cursor.close(); - builder.show(); - break; - } - case CONTEXTMENU_MARKASREAD_ID: { - new Thread() { - public void run() { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI(id), getReadContentValues(), new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null); - } - } - }.start(); - break; - } - case CONTEXTMENU_MARKASUNREAD_ID: { - new Thread() { - public void run() { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI(id), getUnreadContentValues(), null, null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null);; - } - } - }.start(); - break; - } - case CONTEXTMENU_SETTINGS_ID: { - startActivity(new Intent(this, FeedPrefsActivity.class).putExtra(FeedData.FeedColumns._ID, Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); - break; - } - case CONTEXTMENU_DELETEREAD_ID: { - new Thread() { - public void run() { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - Uri uri = FeedData.EntryColumns.CONTENT_URI(id); - - String selection = Strings.READDATE_GREATERZERO+Strings.DB_AND+" ("+Strings.DB_EXCUDEFAVORITE+")"; - - FeedData.deletePicturesOfFeed(RSSOverview.this, uri, selection); - if (getContentResolver().delete(uri, selection, null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null); - } - } - }.start(); - break; - } - case CONTEXTMENU_DELETEALLENTRIES_ID: { - showDeleteAllEntriesQuestion(this, FeedData.EntryColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); - break; - } - case CONTEXTMENU_RESETUPDATEDATE_ID: { - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.LASTUPDATE, 0); - values.put(FeedData.FeedColumns.REALLASTUPDATE, 0); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id)), values, null, null); - break; - } - - case R.id.menu_settings: { - startActivityForResult(new Intent(this, ApplicationPreferencesActivity.class), ACTIVITY_APPLICATIONPREFERENCES_ID); - break; - } - case R.id.menu_allread: { - new Thread() { - public void run() { - if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI, getReadContentValues(), new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI, null); - } - } - }.start(); - break; - } - case R.id.menu_about: { - showDialog(DIALOG_ABOUT); - break; - } - case R.id.menu_import: { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setTitle(R.string.select_file); - - try { - final String[] fileNames = Environment.getExternalStorageDirectory().list(new FilenameFilter() { - public boolean accept(File dir, String filename) { - return new File(dir, filename).isFile(); - } - }); - builder.setItems(fileNames, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - try { - OPML.importFromFile(new StringBuilder(Environment.getExternalStorageDirectory().toString()).append(File.separator).append(fileNames[which]).toString(), RSSOverview.this); - } catch (Exception e) { - showDialog(DIALOG_ERROR_FEEDIMPORT); - } - } - }); - builder.show(); - } catch (Exception e) { - showDialog(DIALOG_ERROR_FEEDIMPORT); - } - } else { - showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); - } - - break; - } - case R.id.menu_export: { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { - try { - String filename = new StringBuilder(Environment.getExternalStorageDirectory().toString()).append("/sparse_rss_").append(System.currentTimeMillis()).append(".opml").toString(); - - OPML.exportToFile(filename, this); - Toast.makeText(this, String.format(getString(R.string.message_exportedto), filename), Toast.LENGTH_LONG).show(); - } catch (Exception e) { - showDialog(DIALOG_ERROR_FEEDEXPORT); - } - } else { - showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); - } - break; - } - case R.id.menu_enablefeedsort: { - setFeedSortEnabled(true); - break; - } - case R.id.menu_deleteread: { - FeedData.deletePicturesOfFeedAsync(this, FeedData.EntryColumns.CONTENT_URI, Strings.READDATE_GREATERZERO); - getContentResolver().delete(FeedData.EntryColumns.CONTENT_URI, Strings.READDATE_GREATERZERO, null); - ((RSSOverviewListAdapter) getListAdapter()).notifyDataSetChanged(); - break; - } - case R.id.menu_deleteallentries: { - showDeleteAllEntriesQuestion(this, FeedData.EntryColumns.CONTENT_URI); - break; - } - case R.id.menu_disablefeedsort: { - // do nothing as the feed sort gets disabled anyway - break; - } - } - return true; - } - - public static final ContentValues getReadContentValues() { - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); - return values; - } - - public static final ContentValues getUnreadContentValues() { - ContentValues values = new ContentValues(); - - values.putNull(FeedData.EntryColumns.READDATE); - return values; - } - - @Override - protected void onListItemClick(ListView listView, View view, int position, long id) { - setFeedSortEnabled(false); - - Intent intent = new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI(Long.toString(id))); - - intent.putExtra(FeedData.FeedColumns._ID, id); - startActivity(intent); - } - - @Override - protected Dialog onCreateDialog(int id) { - Dialog dialog; - - switch (id) { - case DIALOG_ERROR_FEEDIMPORT: { - dialog = createErrorDialog(R.string.error_feedimport); - break; - } - case DIALOG_ERROR_FEEDEXPORT: { - dialog = createErrorDialog(R.string.error_feedexport); - break; - } - case DIALOG_ERROR_INVALIDIMPORTFILE: { - dialog = createErrorDialog(R.string.error_invalidimportfile); - break; - } - case DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE: { - dialog = createErrorDialog(R.string.error_externalstoragenotavailable); - break; - } - case DIALOG_ABOUT: { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_info); - builder.setTitle(R.string.menu_about); - MainTabActivity.INSTANCE.setupLicenseText(builder); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - builder.setNeutralButton(R.string.changelog, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - startActivity(new Intent(Intent.ACTION_VIEW, CANGELOG_URI)); - } - }); - return builder.create(); - } - default: dialog = null; - } - return dialog; - } - - private Dialog createErrorDialog(int messageId) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setMessage(messageId); - builder.setTitle(R.string.error); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setPositiveButton(android.R.string.ok, null); - return builder.create(); - } - - private static void showDeleteAllEntriesQuestion(final Context context, final Uri uri) { - Builder builder = new AlertDialog.Builder(context); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.contextmenu_deleteallentries); - builder.setMessage(R.string.question_areyousure); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - new Thread() { - public void run() { - FeedData.deletePicturesOfFeed(context, uri, Strings.DB_EXCUDEFAVORITE); - if (context.getContentResolver().delete(uri, Strings.DB_EXCUDEFAVORITE, null) > 0) { - context.getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI, null); - } - } - }.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - builder.show(); - } - - private void setFeedSortEnabled(boolean enabled) { - if (enabled != feedSort) { - listAdapter.setFeedSortEnabled(enabled); - feedSort = enabled; - } - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import java.io.File; +import java.io.FilenameFilter; + +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.Dialog; +import android.app.ListActivity; +import android.app.NotificationManager; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.view.View.OnTouchListener; +import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; +import cn.eric.rss.provider.OPML; +import cn.eric.rss.service.RefreshService; + +public class RSSOverview extends ListActivity { + private static final int DIALOG_ERROR_FEEDIMPORT = 3; + + private static final int DIALOG_ERROR_FEEDEXPORT = 4; + + private static final int DIALOG_ERROR_INVALIDIMPORTFILE = 5; + + private static final int DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE = 6; + + private static final int DIALOG_ABOUT = 7; + + private static final int CONTEXTMENU_EDIT_ID = 3; + + private static final int CONTEXTMENU_REFRESH_ID = 4; + + private static final int CONTEXTMENU_DELETE_ID = 5; + + private static final int CONTEXTMENU_MARKASREAD_ID = 6; + + private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; + + private static final int CONTEXTMENU_DELETEREAD_ID = 8; + + private static final int CONTEXTMENU_DELETEALLENTRIES_ID = 9; + + private static final int CONTEXTMENU_RESETUPDATEDATE_ID = 10; + + private static final int ACTIVITY_APPLICATIONPREFERENCES_ID = 1; + + private static final Uri CANGELOG_URI = Uri.parse("http://code.google.com/p/MiniRSS/wiki/Changelog"); + + private static final int CONTEXTMENU_SETTINGS_ID = 99; + + static NotificationManager notificationManager; // package scope + + boolean feedSort; + + private RSSOverviewListAdapter listAdapter; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + super.onCreate(savedInstanceState); + + if (notificationManager == null) { + notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + setContentView(R.layout.main); + listAdapter = new RSSOverviewListAdapter(this); + setListAdapter(listAdapter); + getListView().setOnCreateContextMenuListener(new OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { + menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView.findViewById(android.R.id.text1)).getText()); + menu.add(0, CONTEXTMENU_REFRESH_ID, Menu.NONE, R.string.contextmenu_refresh); + menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, R.string.contextmenu_markasread); + menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, R.string.contextmenu_markasunread); + menu.add(0, CONTEXTMENU_DELETEREAD_ID, Menu.NONE, R.string.contextmenu_deleteread); + menu.add(0, CONTEXTMENU_DELETEALLENTRIES_ID, Menu.NONE, R.string.contextmenu_deleteallentries); + menu.add(0, CONTEXTMENU_EDIT_ID, Menu.NONE, R.string.contextmenu_edit); + menu.add(0, CONTEXTMENU_RESETUPDATEDATE_ID, Menu.NONE, R.string.contextmenu_resetupdatedate); + menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, R.string.contextmenu_delete); + menu.add(0, CONTEXTMENU_SETTINGS_ID, Menu.NONE, R.string.contextmenu_settings); + } + }); + getListView().setOnTouchListener(new OnTouchListener() { + private int dragedItem = -1; + + private ImageView dragedView; + + private WindowManager windowManager = RSSOverview.this.getWindowManager(); + + private LayoutParams layoutParams; + + private int minY = 25; // is the header size --> needs to be changed + + private ListView listView = getListView(); + + public boolean onTouch(View v, MotionEvent event) { + if (feedSort) { + int action = event.getAction(); + + switch (action) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: { + // this is the drag action + if (dragedItem == -1) { + dragedItem = listView.pointToPosition((int) event.getX(), (int) event.getY()); + if (dragedItem > -1) { + dragedView = new ImageView(listView.getContext()); + + View item = listView.getChildAt(dragedItem - listView.getFirstVisiblePosition()); + + if (item != null) { + View sortView = item.findViewById(R.id.sortitem); + + if (sortView.getLeft() <= event.getX()) { + item.setDrawingCacheEnabled(true); + dragedView.setImageBitmap(Bitmap.createBitmap(item.getDrawingCache())); + + layoutParams = new LayoutParams(); + layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP; + layoutParams.y = (int) event.getY(); + windowManager.addView(dragedView, layoutParams); + } else { + dragedItem = -1; + return false; // do not comsume + } + + } else { + dragedItem = -1; + } + } + } else if (dragedView != null) { + layoutParams.y = Math.max(minY, Math.max(0, Math.min((int) event.getY(), listView.getHeight()-minY))); + windowManager.updateViewLayout(dragedView, layoutParams); + } + break; + } + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + // this is the drop action + if (dragedItem > -1) { + windowManager.removeView(dragedView); + + int newPosition = listView.pointToPosition((int) event.getX(), (int) event.getY()); + + if (newPosition == -1) { + newPosition = listView.getCount()-1; + } + if (newPosition != dragedItem) { + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.PRIORITY, newPosition); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(listView.getItemIdAtPosition(dragedItem)), values, null, null); + } + dragedItem = -1; + return true; + } else { + return false; + } + } + } + return true; + } else { + return false; + } + } + }); + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_REFRESHENABLED, false)) { + startService(new Intent(this, RefreshService.class)); // starts the service independent to this activity + } else { + stopService(new Intent(this, RefreshService.class)); + } + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_REFRESHONPENENABLED, false)) { + new Thread() { + public void run() { + sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS)); + } + }.start(); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (RSSOverview.notificationManager != null) { + notificationManager.cancel(0); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.feedoverview, menu); + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.setGroupVisible(R.id.menu_group_0, !feedSort); + menu.setGroupVisible(R.id.menu_group_1, feedSort); + return true; + } + + @SuppressWarnings("deprecation") + @Override + public boolean onMenuItemSelected(int featureId, final MenuItem item) { + setFeedSortEnabled(false); + switch (item.getItemId()) { + case R.id.menu_addfeed: { + startActivity(new Intent(Intent.ACTION_INSERT).setData(FeedData.FeedColumns.CONTENT_URI)); + break; + } + case R.id.menu_refresh: { + new Thread() { + public void run() { + sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false))); + } + }.start(); + break; + } + case CONTEXTMENU_EDIT_ID: { + startActivity(new Intent(Intent.ACTION_EDIT).setData(FeedData.FeedColumns.CONTENT_URI(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); + break; + } + case CONTEXTMENU_REFRESH_ID: { + final String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); + + ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + + final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); + + if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) { // since we have acquired the networkInfo, we use it for basic checks + final Intent intent = new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.FEEDID, id); + + final Thread thread = new Thread() { + public void run() { + sendBroadcast(intent); + } + }; + + if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI || PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false)) { + intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); + thread.start(); + } else { + Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(id), new String[] {FeedData.FeedColumns.WIFIONLY}, null, null, null); + + cursor.moveToFirst(); + + if (cursor.isNull(0) || cursor.getInt(0) == 0) { + thread.start(); + } else { + Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.dialog_hint); + builder.setMessage(R.string.question_refreshwowifi); + builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); + thread.start(); + } + }); + builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).edit().putBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, true).commit(); + intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); + thread.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + builder.show(); + } + cursor.close(); + } + + } + break; + } + case CONTEXTMENU_DELETE_ID: { + String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); + + Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(id), new String[] {FeedData.FeedColumns.NAME}, null, null, null); + + cursor.moveToFirst(); + + Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(cursor.getString(0)); + builder.setMessage(R.string.question_deletefeed); + builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + new Thread() { + public void run() { + getContentResolver().delete(FeedData.FeedColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id)), null, null); + sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); + } + }.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + cursor.close(); + builder.show(); + break; + } + case CONTEXTMENU_MARKASREAD_ID: { + new Thread() { + public void run() { + String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); + + if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI(id), getReadContentValues(), new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null) > 0) { + getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null); + } + } + }.start(); + break; + } + case CONTEXTMENU_MARKASUNREAD_ID: { + new Thread() { + public void run() { + String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); + + if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI(id), getUnreadContentValues(), null, null) > 0) { + getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null);; + } + } + }.start(); + break; + } + case CONTEXTMENU_SETTINGS_ID: { + startActivity(new Intent(this, FeedPrefsActivity.class).putExtra(FeedData.FeedColumns._ID, Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); + break; + } + case CONTEXTMENU_DELETEREAD_ID: { + new Thread() { + public void run() { + String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); + + Uri uri = FeedData.EntryColumns.CONTENT_URI(id); + + String selection = Strings.READDATE_GREATERZERO+Strings.DB_AND+" ("+Strings.DB_EXCUDEFAVORITE+")"; + + FeedData.deletePicturesOfFeed(RSSOverview.this, uri, selection); + if (getContentResolver().delete(uri, selection, null) > 0) { + getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null); + } + } + }.start(); + break; + } + case CONTEXTMENU_DELETEALLENTRIES_ID: { + showDeleteAllEntriesQuestion(this, FeedData.EntryColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); + break; + } + case CONTEXTMENU_RESETUPDATEDATE_ID: { + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.LASTUPDATE, 0); + values.put(FeedData.FeedColumns.REALLASTUPDATE, 0); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id)), values, null, null); + break; + } + + case R.id.menu_settings: { + startActivityForResult(new Intent(this, ApplicationPreferencesActivity.class), ACTIVITY_APPLICATIONPREFERENCES_ID); + break; + } + case R.id.menu_allread: { + new Thread() { + public void run() { + if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI, getReadContentValues(), new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null) > 0) { + getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI, null); + } + } + }.start(); + break; + } + case R.id.menu_about: { + showDialog(DIALOG_ABOUT); + break; + } + case R.id.menu_import: { + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setTitle(R.string.select_file); + + try { + final String[] fileNames = Environment.getExternalStorageDirectory().list(new FilenameFilter() { + public boolean accept(File dir, String filename) { + return new File(dir, filename).isFile(); + } + }); + builder.setItems(fileNames, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + try { + OPML.importFromFile(new StringBuilder(Environment.getExternalStorageDirectory().toString()).append(File.separator).append(fileNames[which]).toString(), RSSOverview.this); + } catch (Exception e) { + showDialog(DIALOG_ERROR_FEEDIMPORT); + } + } + }); + builder.show(); + } catch (Exception e) { + showDialog(DIALOG_ERROR_FEEDIMPORT); + } + } else { + showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); + } + + break; + } + case R.id.menu_export: { + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { + try { + String filename = new StringBuilder(Environment.getExternalStorageDirectory().toString()).append("/sparse_rss_").append(System.currentTimeMillis()).append(".opml").toString(); + + OPML.exportToFile(filename, this); + Toast.makeText(this, String.format(getString(R.string.message_exportedto), filename), Toast.LENGTH_LONG).show(); + } catch (Exception e) { + showDialog(DIALOG_ERROR_FEEDEXPORT); + } + } else { + showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); + } + break; + } + case R.id.menu_enablefeedsort: { + setFeedSortEnabled(true); + break; + } + case R.id.menu_deleteread: { + FeedData.deletePicturesOfFeedAsync(this, FeedData.EntryColumns.CONTENT_URI, Strings.READDATE_GREATERZERO); + getContentResolver().delete(FeedData.EntryColumns.CONTENT_URI, Strings.READDATE_GREATERZERO, null); + ((RSSOverviewListAdapter) getListAdapter()).notifyDataSetChanged(); + break; + } + case R.id.menu_deleteallentries: { + showDeleteAllEntriesQuestion(this, FeedData.EntryColumns.CONTENT_URI); + break; + } + case R.id.menu_disablefeedsort: { + // do nothing as the feed sort gets disabled anyway + break; + } + } + return true; + } + + public static final ContentValues getReadContentValues() { + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); + return values; + } + + public static final ContentValues getUnreadContentValues() { + ContentValues values = new ContentValues(); + + values.putNull(FeedData.EntryColumns.READDATE); + return values; + } + + @Override + protected void onListItemClick(ListView listView, View view, int position, long id) { + setFeedSortEnabled(false); + + Intent intent = new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI(Long.toString(id))); + + intent.putExtra(FeedData.FeedColumns._ID, id); + startActivity(intent); + } + + @Override + protected Dialog onCreateDialog(int id) { + Dialog dialog; + + switch (id) { + case DIALOG_ERROR_FEEDIMPORT: { + dialog = createErrorDialog(R.string.error_feedimport); + break; + } + case DIALOG_ERROR_FEEDEXPORT: { + dialog = createErrorDialog(R.string.error_feedexport); + break; + } + case DIALOG_ERROR_INVALIDIMPORTFILE: { + dialog = createErrorDialog(R.string.error_invalidimportfile); + break; + } + case DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE: { + dialog = createErrorDialog(R.string.error_externalstoragenotavailable); + break; + } + case DIALOG_ABOUT: { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_info); + builder.setTitle(R.string.menu_about); + MainTabActivity.INSTANCE.setupLicenseText(builder); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + builder.setNeutralButton(R.string.changelog, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + startActivity(new Intent(Intent.ACTION_VIEW, CANGELOG_URI)); + } + }); + return builder.create(); + } + default: dialog = null; + } + return dialog; + } + + private Dialog createErrorDialog(int messageId) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setMessage(messageId); + builder.setTitle(R.string.error); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setPositiveButton(android.R.string.ok, null); + return builder.create(); + } + + private static void showDeleteAllEntriesQuestion(final Context context, final Uri uri) { + Builder builder = new AlertDialog.Builder(context); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.contextmenu_deleteallentries); + builder.setMessage(R.string.question_areyousure); + builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + new Thread() { + public void run() { + FeedData.deletePicturesOfFeed(context, uri, Strings.DB_EXCUDEFAVORITE); + if (context.getContentResolver().delete(uri, Strings.DB_EXCUDEFAVORITE, null) > 0) { + context.getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI, null); + } + } + }.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + builder.show(); + } + + private void setFeedSortEnabled(boolean enabled) { + if (enabled != feedSort) { + listAdapter.setFeedSortEnabled(enabled); + feedSort = enabled; + } + } + +} diff --git a/src/de/shandschuh/sparserss/RSSOverviewListAdapter.java b/src/cn/eric/rss/RSSOverviewListAdapter.java similarity index 96% rename from src/de/shandschuh/sparserss/RSSOverviewListAdapter.java rename to src/cn/eric/rss/RSSOverviewListAdapter.java index 48bf773..f66d83f 100644 --- a/src/de/shandschuh/sparserss/RSSOverviewListAdapter.java +++ b/src/cn/eric/rss/RSSOverviewListAdapter.java @@ -1,204 +1,205 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import java.text.DateFormat; -import java.util.Date; -import java.util.Vector; - -import android.app.Activity; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Typeface; -import android.graphics.drawable.BitmapDrawable; -import android.os.Handler; -import android.util.TypedValue; -import android.view.View; -import android.widget.ResourceCursorAdapter; -import android.widget.TextView; -import de.shandschuh.sparserss.provider.FeedData; - -public class RSSOverviewListAdapter extends ResourceCursorAdapter { - private static final String COUNT_UNREAD = "COUNT(*) - COUNT(readdate)"; - - private static final String COUNT = "COUNT(*)"; - - private String COLON; - - private int nameColumnPosition; - - private int lastUpdateColumn; - - private int idPosition; - - private int linkPosition; - - private int errorPosition; - - private int iconPosition; - - private Handler handler; - - private SimpleTask updateTask; - - private boolean feedSort; - - private Vector sortViews; - - private DateFormat dateFormat; - - private DateFormat timeFormat; - - public RSSOverviewListAdapter(Activity activity) { - super(activity, R.layout.feedlistitem, activity.managedQuery(FeedData.FeedColumns.CONTENT_URI, null, null, null, null)); - nameColumnPosition = getCursor().getColumnIndex(FeedData.FeedColumns.NAME); - lastUpdateColumn = getCursor().getColumnIndex(FeedData.FeedColumns.LASTUPDATE); - idPosition = getCursor().getColumnIndex(FeedData.FeedColumns._ID); - linkPosition = getCursor().getColumnIndex(FeedData.FeedColumns.URL); - errorPosition = getCursor().getColumnIndex(FeedData.FeedColumns.ERROR); - iconPosition = getCursor().getColumnIndex(FeedData.FeedColumns.ICON); - COLON = activity.getString(R.string.colon); - handler = new Handler(); - updateTask = new SimpleTask() { - @Override - public void runControlled() { - RSSOverviewListAdapter.super.onContentChanged(); - cancel(); // cancel the task such that it does not run more than once without explicit intention - } - - @Override - public void postRun() { - if (getPostCount() > 1) { // enforce second run even if task is canceled - handler.postDelayed(updateTask, 1500); - } - } - }; - sortViews = new Vector(); - dateFormat = android.text.format.DateFormat.getDateFormat(activity); - timeFormat = android.text.format.DateFormat.getTimeFormat(activity); - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - TextView textView = ((TextView) view.findViewById(android.R.id.text1)); - - textView.setSingleLine(); - - Cursor countCursor = context.getContentResolver().query(FeedData.EntryColumns.CONTENT_URI(cursor.getString(idPosition)), new String[] {COUNT_UNREAD, COUNT}, null, null, null); - - countCursor.moveToFirst(); - - int unreadCount = countCursor.getInt(0); - - int count = countCursor.getInt(1); - - countCursor.close(); - - long timestamp = cursor.getLong(lastUpdateColumn); - - TextView updateTextView = ((TextView) view.findViewById(android.R.id.text2));; - - if (cursor.isNull(errorPosition)) { - Date date = new Date(timestamp); - - updateTextView.setText(new StringBuilder(context.getString(R.string.update)).append(COLON).append(timestamp == 0 ? context.getString(R.string.never) : new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(unreadCount).append('/').append(count).append(' ').append(context.getString(R.string.unread)))); - } else { - updateTextView.setText(new StringBuilder(context.getString(R.string.error)).append(COLON).append(cursor.getString(errorPosition))); - } - if (unreadCount > 0) { - textView.setTypeface(Typeface.DEFAULT_BOLD); - textView.setEnabled(true); - updateTextView.setEnabled(true); - } else { - textView.setTypeface(Typeface.DEFAULT); - textView.setEnabled(false); - updateTextView.setEnabled(false); - } - - byte[] iconBytes = cursor.getBlob(iconPosition); - - if (iconBytes != null && iconBytes.length > 0) { - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - - if (bitmap != null && bitmap.getHeight() > 0 && bitmap.getWidth() > 0) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18f, context.getResources().getDisplayMetrics()); - - if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); - } - textView.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(bitmap), null, null, null); - textView.setText(" " + (cursor.isNull(nameColumnPosition) ? cursor.getString(linkPosition) : cursor.getString(nameColumnPosition))); - } else { - textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); - textView.setText(cursor.isNull(nameColumnPosition) ? cursor.getString(linkPosition) : cursor.getString(nameColumnPosition)); - } - } else { - view.setTag(null); - textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); - textView.setText(cursor.isNull(nameColumnPosition) ? cursor.getString(linkPosition) : cursor.getString(nameColumnPosition)); - } - - View sortView = view.findViewById(R.id.sortitem); - - if (!sortViews.contains(sortView)) { // as we are reusing views, this is fine - sortViews.add(sortView); - } - sortView.setVisibility(feedSort ? View.VISIBLE : View.GONE); - } - - @Override - protected synchronized void onContentChanged() { - /* - * we delay the second(!) content change by 1.5 second such that it gets called at most once per 1.5 seconds - * to take stress away from the UI and avoid not needed updates - */ - if (!updateTask.isPosted()) { - super.onContentChanged(); - updateTask.post(2); // we post 2 tasks - handler.postDelayed(updateTask, 1500); // waits one second until the task gets unposted - updateTask.cancel(); // put the canceled task in the queue to enable it again optionally - } else { - if (updateTask.getPostCount() < 2) { - updateTask.post(); // enables the task and adds a new one - } else { - updateTask.enable(); - } - } - } - - public void setFeedSortEnabled(boolean enabled) { - feedSort = enabled; - - /* we do not want to call notifyDataSetChanged as this requeries the cursor*/ - int visibility = feedSort ? View.VISIBLE : View.GONE; - - for (View sortView : sortViews) { - sortView.setVisibility(visibility); - } - } -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import java.text.DateFormat; +import java.util.Date; +import java.util.Vector; + +import android.app.Activity; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.os.Handler; +import android.util.TypedValue; +import android.view.View; +import android.widget.ResourceCursorAdapter; +import android.widget.TextView; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class RSSOverviewListAdapter extends ResourceCursorAdapter { + private static final String COUNT_UNREAD = "COUNT(*) - COUNT(readdate)"; + + private static final String COUNT = "COUNT(*)"; + + private String COLON; + + private int nameColumnPosition; + + private int lastUpdateColumn; + + private int idPosition; + + private int linkPosition; + + private int errorPosition; + + private int iconPosition; + + private Handler handler; + + private SimpleTask updateTask; + + private boolean feedSort; + + private Vector sortViews; + + private DateFormat dateFormat; + + private DateFormat timeFormat; + + public RSSOverviewListAdapter(Activity activity) { + super(activity, R.layout.feedlistitem, activity.managedQuery(FeedData.FeedColumns.CONTENT_URI, null, null, null, null)); + nameColumnPosition = getCursor().getColumnIndex(FeedData.FeedColumns.NAME); + lastUpdateColumn = getCursor().getColumnIndex(FeedData.FeedColumns.LASTUPDATE); + idPosition = getCursor().getColumnIndex(FeedData.FeedColumns._ID); + linkPosition = getCursor().getColumnIndex(FeedData.FeedColumns.URL); + errorPosition = getCursor().getColumnIndex(FeedData.FeedColumns.ERROR); + iconPosition = getCursor().getColumnIndex(FeedData.FeedColumns.ICON); + COLON = activity.getString(R.string.colon); + handler = new Handler(); + updateTask = new SimpleTask() { + @Override + public void runControlled() { + RSSOverviewListAdapter.super.onContentChanged(); + cancel(); // cancel the task such that it does not run more than once without explicit intention + } + + @Override + public void postRun() { + if (getPostCount() > 1) { // enforce second run even if task is canceled + handler.postDelayed(updateTask, 1500); + } + } + }; + sortViews = new Vector(); + dateFormat = android.text.format.DateFormat.getDateFormat(activity); + timeFormat = android.text.format.DateFormat.getTimeFormat(activity); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + TextView textView = ((TextView) view.findViewById(android.R.id.text1)); + + textView.setSingleLine(); + + Cursor countCursor = context.getContentResolver().query(FeedData.EntryColumns.CONTENT_URI(cursor.getString(idPosition)), new String[] {COUNT_UNREAD, COUNT}, null, null, null); + + countCursor.moveToFirst(); + + int unreadCount = countCursor.getInt(0); + + int count = countCursor.getInt(1); + + countCursor.close(); + + long timestamp = cursor.getLong(lastUpdateColumn); + + TextView updateTextView = ((TextView) view.findViewById(android.R.id.text2));; + + if (cursor.isNull(errorPosition)) { + Date date = new Date(timestamp); + + updateTextView.setText(new StringBuilder(context.getString(R.string.update)).append(COLON).append(timestamp == 0 ? context.getString(R.string.never) : new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(unreadCount).append('/').append(count).append(' ').append(context.getString(R.string.unread)))); + } else { + updateTextView.setText(new StringBuilder(context.getString(R.string.error)).append(COLON).append(cursor.getString(errorPosition))); + } + if (unreadCount > 0) { + textView.setTypeface(Typeface.DEFAULT_BOLD); + textView.setEnabled(true); + updateTextView.setEnabled(true); + } else { + textView.setTypeface(Typeface.DEFAULT); + textView.setEnabled(false); + updateTextView.setEnabled(false); + } + + byte[] iconBytes = cursor.getBlob(iconPosition); + + if (iconBytes != null && iconBytes.length > 0) { + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + + if (bitmap != null && bitmap.getHeight() > 0 && bitmap.getWidth() > 0) { + int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18f, context.getResources().getDisplayMetrics()); + + if (bitmap.getHeight() != bitmapSizeInDip) { + bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); + } + textView.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(bitmap), null, null, null); + textView.setText(" " + (cursor.isNull(nameColumnPosition) ? cursor.getString(linkPosition) : cursor.getString(nameColumnPosition))); + } else { + textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); + textView.setText(cursor.isNull(nameColumnPosition) ? cursor.getString(linkPosition) : cursor.getString(nameColumnPosition)); + } + } else { + view.setTag(null); + textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); + textView.setText(cursor.isNull(nameColumnPosition) ? cursor.getString(linkPosition) : cursor.getString(nameColumnPosition)); + } + + View sortView = view.findViewById(R.id.sortitem); + + if (!sortViews.contains(sortView)) { // as we are reusing views, this is fine + sortViews.add(sortView); + } + sortView.setVisibility(feedSort ? View.VISIBLE : View.GONE); + } + + @Override + protected synchronized void onContentChanged() { + /* + * we delay the second(!) content change by 1.5 second such that it gets called at most once per 1.5 seconds + * to take stress away from the UI and avoid not needed updates + */ + if (!updateTask.isPosted()) { + super.onContentChanged(); + updateTask.post(2); // we post 2 tasks + handler.postDelayed(updateTask, 1500); // waits one second until the task gets unposted + updateTask.cancel(); // put the canceled task in the queue to enable it again optionally + } else { + if (updateTask.getPostCount() < 2) { + updateTask.post(); // enables the task and adds a new one + } else { + updateTask.enable(); + } + } + } + + public void setFeedSortEnabled(boolean enabled) { + feedSort = enabled; + + /* we do not want to call notifyDataSetChanged as this requeries the cursor*/ + int visibility = feedSort ? View.VISIBLE : View.GONE; + + for (View sortView : sortViews) { + sortView.setVisibility(visibility); + } + } +} diff --git a/src/de/shandschuh/sparserss/RefreshBroadcastReceiver.java b/src/cn/eric/rss/RefreshBroadcastReceiver.java similarity index 92% rename from src/de/shandschuh/sparserss/RefreshBroadcastReceiver.java rename to src/cn/eric/rss/RefreshBroadcastReceiver.java index 4eafe7c..3cdf0ec 100644 --- a/src/de/shandschuh/sparserss/RefreshBroadcastReceiver.java +++ b/src/cn/eric/rss/RefreshBroadcastReceiver.java @@ -1,39 +1,40 @@ -/** - * Sparse rss - * - * Copyright (c) 2010 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import de.shandschuh.sparserss.service.FetcherService; - -public class RefreshBroadcastReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - context.startService(new Intent(context, FetcherService.class).putExtras(intent)); // a thread would mark the process as inactive - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import cn.eric.rss.R; +import cn.eric.rss.service.FetcherService; + +public class RefreshBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + context.startService(new Intent(context, FetcherService.class).putExtras(intent)); // a thread would mark the process as inactive + } + +} diff --git a/src/de/shandschuh/sparserss/SimpleTask.java b/src/cn/eric/rss/SimpleTask.java similarity index 93% rename from src/de/shandschuh/sparserss/SimpleTask.java rename to src/cn/eric/rss/SimpleTask.java index 8ad3ade..1338b1f 100644 --- a/src/de/shandschuh/sparserss/SimpleTask.java +++ b/src/cn/eric/rss/SimpleTask.java @@ -1,80 +1,82 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - - -public abstract class SimpleTask implements Runnable { - private boolean canceled = false; - - private int postCount = 0; - - public abstract void runControlled(); - - public void cancel() { - canceled = true; - } - - public boolean isCanceled() { - return canceled; - } - - public void post() { - post(1); - } - - public synchronized void post(int count) { - postCount += count; - canceled = false; - } - - public boolean isPosted() { - return postCount > 0; - } - - public int getPostCount() { - return postCount; - } - - public final synchronized void run() { - if (!canceled) { - runControlled(); - } - postRun(); - postCount--; - } - - /** - * Override to use - */ - public void postRun() { - - } - - public void enable() { - canceled = false; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import cn.eric.rss.R; + + +public abstract class SimpleTask implements Runnable { + private boolean canceled = false; + + private int postCount = 0; + + public abstract void runControlled(); + + public void cancel() { + canceled = true; + } + + public boolean isCanceled() { + return canceled; + } + + public void post() { + post(1); + } + + public synchronized void post(int count) { + postCount += count; + canceled = false; + } + + public boolean isPosted() { + return postCount > 0; + } + + public int getPostCount() { + return postCount; + } + + public final synchronized void run() { + if (!canceled) { + runControlled(); + } + postRun(); + postCount--; + } + + /** + * Override to use + */ + public void postRun() { + + } + + public void enable() { + canceled = false; + } + +} diff --git a/src/de/shandschuh/sparserss/Strings.java b/src/cn/eric/rss/Strings.java similarity index 91% rename from src/de/shandschuh/sparserss/Strings.java rename to src/cn/eric/rss/Strings.java index c06d254..7d5f2b9 100644 --- a/src/de/shandschuh/sparserss/Strings.java +++ b/src/cn/eric/rss/Strings.java @@ -1,188 +1,189 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss; - -import de.shandschuh.sparserss.provider.FeedData; - -public final class Strings { - - public static final String FEED_SETTINGS_OTHER_ALERT_RINGTONE = "other_alertringtone"; - - public static final String FEED_SETTINGS_ALERT_RINGTONE = "alertringtone"; - - public static final String FEED_SETTINGS_SKIP_ALERT = "skipalert"; - - public static final String PACKAGE = "de.shandschuh.sparserss"; - - public static final String SETTINGS_REFRESHINTERVAL = "refresh.interval"; - - public static final String SETTINGS_NOTIFICATIONSENABLED = "notifications.enabled"; - - public static final String SETTINGS_REFRESHENABLED = "refresh.enabled"; - - public static final String SETTINGS_REFRESHONPENENABLED = "refreshonopen.enabled"; - - public static final String SETTINGS_NOTIFICATIONSRINGTONE = "notifications.ringtone"; - - public static final String SETTINGS_NOTIFICATIONSVIBRATE = "notifications.vibrate"; - - public static final String SETTINGS_PRIORITIZE = "contentpresentation.prioritize"; - - public static final String SETTINGS_SHOWTABS = "tabs.show"; - - public static final String SETTINGS_FETCHPICTURES = "pictures.fetch"; - - public static final String SETTINGS_PROXYENABLED = "proxy.enabled"; - - public static final String SETTINGS_PROXYPORT = "proxy.port"; - - public static final String SETTINGS_PROXYHOST = "proxy.host"; - - public static final String SETTINGS_PROXYWIFIONLY = "proxy.wifionly"; - - public static final String SETTINGS_PROXYTYPE = "proxy.type"; - - public static final String SETTINGS_KEEPTIME = "keeptime"; - - public static final String SETTINGS_BLACKTEXTONWHITE = "blacktextonwhite"; - - public static final String SETTINGS_LIGHTTHEME = "lighttheme"; - - public static final String SETTINGS_FONTSIZE = "fontsize"; - - public static final String SETTINGS_STANDARDUSERAGENT = "standarduseragent"; - - public static final String SETTINGS_DISABLEPICTURES = "pictures.disable"; - - public static final String SETTINGS_HTTPHTTPSREDIRECTS = "httphttpsredirects"; - - public static final String SETTINGS_OVERRIDEWIFIONLY = "overridewifionly"; - - public static final String SETTINGS_GESTURESENABLED = "gestures.enabled"; - - public static final String SETTINGS_ENCLOSUREWARNINGSENABLED = "enclosurewarnings.enabled"; - - public static final String SETTINGS_EFFICIENTFEEDPARSING = "efficientfeedparsing"; - - public static final String ACTION_REFRESHFEEDS = "de.shandschuh.sparserss.REFRESH"; - - public static final String ACTION_UPDATEWIDGET = "de.shandschuh.sparserss.FEEDUPDATED"; - - public static final String ACTION_RESTART = "de.shandschuh.sparserss.RESTART"; - - public static final String FEEDID = "feedid"; - - public static final String DB_ISNULL = " IS NULL"; - - public static final String DB_DESC = " DESC"; - - public static final String DB_ARG = "=?"; - - public static final String DB_AND = " AND "; - - public static final String DB_EXCUDEFAVORITE = new StringBuilder(FeedData.EntryColumns.FAVORITE).append(Strings.DB_ISNULL).append(" OR ").append(FeedData.EntryColumns.FAVORITE).append("=0").toString(); - - public static final String EMPTY = ""; - - public static final String HTTP = "http://"; - - public static final String HTTPS = "https://"; - - public static final String _HTTP = "http"; - - public static final String _HTTPS = "https"; - - public static final String PROTOCOL_SEPARATOR = "://"; - - public static final String FILE_FAVICON = "/favicon.ico"; - - public static final String SPACE = " "; - - public static final String TWOSPACE = " "; - - public static final String HTML_TAG_REGEX = "<(.|\n)*?>"; - - public static final String FILEURL = "file://"; - - public static final String IMAGEFILE_IDSEPARATOR = "__"; - - public static final String IMAGEID_REPLACEMENT = "##ID##"; - - public static final String DEFAULTPROXYPORT = "8080"; - - public static final String URL_SPACE = "%20"; - - public static final String HTML_SPAN_REGEX = "<[/]?[ ]?span(.|\n)*?>"; - - public static final String HTML_IMG_REGEX = "<[/]?[ ]?img(.|\n)*?>"; - - public static final String ONE = "1"; - - public static final Object THREENEWLINES = "\n\n\n"; - - public static final String PREFERENCE_LICENSEACCEPTED = "license.accepted"; - - public static final String PREFERENCE_LASTSCHEDULEDREFRESH = "lastscheduledrefresh"; - - public static final String HTML_LT = "<"; - - public static final String HTML_GT = ">"; - - public static final String LT = "<"; - - public static final String GT = ">"; - - protected static final String TRUE = "true"; - - protected static final String FALSE = "false"; - - public static final String READDATE_GREATERZERO = FeedData.EntryColumns.READDATE+">0"; - - public static final String COUNT = "count"; - - public static final String ENCLOSURE_SEPARATOR = "[@]"; // exactly three characters! - - public static final String QUESTIONMARKS = "'??'"; - - public static final String HTML_QUOT = """; - - public static final String QUOT = "\""; - - public static final String HTML_APOSTROPHE = "'"; - - public static final String APOSTROPHE = "'"; - - public static final String AMP = "&"; - - public static final String AMP_SG = "&"; - - public static final String SLASH = "/"; - - public static final String COMMASPACE = ", "; - - public static final String SCHEDULED = "scheduled"; - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public final class Strings { + + public static final String FEED_SETTINGS_OTHER_ALERT_RINGTONE = "other_alertringtone"; + + public static final String FEED_SETTINGS_ALERT_RINGTONE = "alertringtone"; + + public static final String FEED_SETTINGS_SKIP_ALERT = "skipalert"; + + public static final String PACKAGE = "cn.eric.rss"; + + public static final String SETTINGS_REFRESHINTERVAL = "refresh.interval"; + + public static final String SETTINGS_NOTIFICATIONSENABLED = "notifications.enabled"; + + public static final String SETTINGS_REFRESHENABLED = "refresh.enabled"; + + public static final String SETTINGS_REFRESHONPENENABLED = "refreshonopen.enabled"; + + public static final String SETTINGS_NOTIFICATIONSRINGTONE = "notifications.ringtone"; + + public static final String SETTINGS_NOTIFICATIONSVIBRATE = "notifications.vibrate"; + + public static final String SETTINGS_PRIORITIZE = "contentpresentation.prioritize"; + + public static final String SETTINGS_SHOWTABS = "tabs.show"; + + public static final String SETTINGS_FETCHPICTURES = "pictures.fetch"; + + public static final String SETTINGS_PROXYENABLED = "proxy.enabled"; + + public static final String SETTINGS_PROXYPORT = "proxy.port"; + + public static final String SETTINGS_PROXYHOST = "proxy.host"; + + public static final String SETTINGS_PROXYWIFIONLY = "proxy.wifionly"; + + public static final String SETTINGS_PROXYTYPE = "proxy.type"; + + public static final String SETTINGS_KEEPTIME = "keeptime"; + + public static final String SETTINGS_BLACKTEXTONWHITE = "blacktextonwhite"; + + public static final String SETTINGS_LIGHTTHEME = "lighttheme"; + + public static final String SETTINGS_FONTSIZE = "fontsize"; + + public static final String SETTINGS_STANDARDUSERAGENT = "standarduseragent"; + + public static final String SETTINGS_DISABLEPICTURES = "pictures.disable"; + + public static final String SETTINGS_HTTPHTTPSREDIRECTS = "httphttpsredirects"; + + public static final String SETTINGS_OVERRIDEWIFIONLY = "overridewifionly"; + + public static final String SETTINGS_GESTURESENABLED = "gestures.enabled"; + + public static final String SETTINGS_ENCLOSUREWARNINGSENABLED = "enclosurewarnings.enabled"; + + public static final String SETTINGS_EFFICIENTFEEDPARSING = "efficientfeedparsing"; + + public static final String ACTION_REFRESHFEEDS = "cn.eric.rss.REFRESH"; + + public static final String ACTION_UPDATEWIDGET = "cn.eric.rss.FEEDUPDATED"; + + public static final String ACTION_RESTART = "cn.eric.rss.RESTART"; + + public static final String FEEDID = "feedid"; + + public static final String DB_ISNULL = " IS NULL"; + + public static final String DB_DESC = " DESC"; + + public static final String DB_ARG = "=?"; + + public static final String DB_AND = " AND "; + + public static final String DB_EXCUDEFAVORITE = new StringBuilder(FeedData.EntryColumns.FAVORITE).append(Strings.DB_ISNULL).append(" OR ").append(FeedData.EntryColumns.FAVORITE).append("=0").toString(); + + public static final String EMPTY = ""; + + public static final String HTTP = "http://"; + + public static final String HTTPS = "https://"; + + public static final String _HTTP = "http"; + + public static final String _HTTPS = "https"; + + public static final String PROTOCOL_SEPARATOR = "://"; + + public static final String FILE_FAVICON = "/favicon.ico"; + + public static final String SPACE = " "; + + public static final String TWOSPACE = " "; + + public static final String HTML_TAG_REGEX = "<(.|\n)*?>"; + + public static final String FILEURL = "file://"; + + public static final String IMAGEFILE_IDSEPARATOR = "__"; + + public static final String IMAGEID_REPLACEMENT = "##ID##"; + + public static final String DEFAULTPROXYPORT = "8080"; + + public static final String URL_SPACE = "%20"; + + public static final String HTML_SPAN_REGEX = "<[/]?[ ]?span(.|\n)*?>"; + + public static final String HTML_IMG_REGEX = "<[/]?[ ]?img(.|\n)*?>"; + + public static final String ONE = "1"; + + public static final Object THREENEWLINES = "\n\n\n"; + + public static final String PREFERENCE_LICENSEACCEPTED = "license.accepted"; + + public static final String PREFERENCE_LASTSCHEDULEDREFRESH = "lastscheduledrefresh"; + + public static final String HTML_LT = "<"; + + public static final String HTML_GT = ">"; + + public static final String LT = "<"; + + public static final String GT = ">"; + + protected static final String TRUE = "true"; + + protected static final String FALSE = "false"; + + public static final String READDATE_GREATERZERO = FeedData.EntryColumns.READDATE+">0"; + + public static final String COUNT = "count"; + + public static final String ENCLOSURE_SEPARATOR = "[@]"; // exactly three characters! + + public static final String QUESTIONMARKS = "'??'"; + + public static final String HTML_QUOT = """; + + public static final String QUOT = "\""; + + public static final String HTML_APOSTROPHE = "'"; + + public static final String APOSTROPHE = "'"; + + public static final String AMP = "&"; + + public static final String AMP_SG = "&"; + + public static final String SLASH = "/"; + + public static final String COMMASPACE = ", "; + + public static final String SCHEDULED = "scheduled"; + +} diff --git a/src/de/shandschuh/sparserss/handler/PictureFilenameFilter.java b/src/cn/eric/rss/handler/PictureFilenameFilter.java similarity index 92% rename from src/de/shandschuh/sparserss/handler/PictureFilenameFilter.java rename to src/cn/eric/rss/handler/PictureFilenameFilter.java index 7314a64..7762641 100644 --- a/src/de/shandschuh/sparserss/handler/PictureFilenameFilter.java +++ b/src/cn/eric/rss/handler/PictureFilenameFilter.java @@ -1,59 +1,59 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.handler; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.regex.Pattern; - -import de.shandschuh.sparserss.provider.FeedDataContentProvider; - -public class PictureFilenameFilter implements FilenameFilter { - private static final String REGEX = "__[^\\.]*\\.[A-Za-z]*"; - - private Pattern pattern; - - public PictureFilenameFilter(String entryId) { - setEntryId(entryId); - } - - public PictureFilenameFilter() { - - } - - public void setEntryId(String entryId) { - pattern = Pattern.compile(entryId+REGEX); - } - - public boolean accept(File dir, String filename) { - if (dir != null && dir.equals(FeedDataContentProvider.IMAGEFOLDER_FILE)) { // this should be always true but lets check it anyway - return pattern.matcher(filename).find(); - } else { - return false; - } - } - -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.handler; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.regex.Pattern; + +import cn.eric.rss.provider.FeedDataContentProvider; + +public class PictureFilenameFilter implements FilenameFilter { + private static final String REGEX = "__[^\\.]*\\.[A-Za-z]*"; + + private Pattern pattern; + + public PictureFilenameFilter(String entryId) { + setEntryId(entryId); + } + + public PictureFilenameFilter() { + + } + + public void setEntryId(String entryId) { + pattern = Pattern.compile(entryId+REGEX); + } + + public boolean accept(File dir, String filename) { + if (dir != null && dir.equals(FeedDataContentProvider.IMAGEFOLDER_FILE)) { // this should be always true but lets check it anyway + return pattern.matcher(filename).find(); + } else { + return false; + } + } + +} diff --git a/src/de/shandschuh/sparserss/handler/RSSHandler.java b/src/cn/eric/rss/handler/RSSHandler.java similarity index 96% rename from src/de/shandschuh/sparserss/handler/RSSHandler.java rename to src/cn/eric/rss/handler/RSSHandler.java index f78a0dc..d265ea3 100644 --- a/src/de/shandschuh/sparserss/handler/RSSHandler.java +++ b/src/cn/eric/rss/handler/RSSHandler.java @@ -1,653 +1,653 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.handler; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.net.URL; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.Vector; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import android.content.ContentValues; -import android.content.Context; -import android.net.Uri; -import android.preference.PreferenceManager; -import android.text.Html; -import de.shandschuh.sparserss.Strings; -import de.shandschuh.sparserss.provider.FeedData; -import de.shandschuh.sparserss.provider.FeedDataContentProvider; -import de.shandschuh.sparserss.service.FetcherService; - -public class RSSHandler extends DefaultHandler { - private static final String ANDRHOMBUS = "&#"; - - private static final String TAG_RSS = "rss"; - - private static final String TAG_RDF = "rdf"; - - private static final String TAG_FEED = "feed"; - - private static final String TAG_ENTRY = "entry"; - - private static final String TAG_ITEM = "item"; - - private static final String TAG_UPDATED = "updated"; - - private static final String TAG_TITLE = "title"; - - private static final String TAG_LINK = "link"; - - private static final String TAG_DESCRIPTION = "description"; - - private static final String TAG_MEDIA_DESCRIPTION = "media:description"; - - private static final String TAG_CONTENT = "content"; - - private static final String TAG_MEDIA_CONTENT = "media:content"; - - private static final String TAG_ENCODEDCONTENT = "encoded"; - - private static final String TAG_SUMMARY = "summary"; - - private static final String TAG_PUBDATE = "pubDate"; - - private static final String TAG_DATE = "date"; - - private static final String TAG_LASTBUILDDATE = "lastBuildDate"; - - private static final String TAG_ENCLOSURE = "enclosure"; - - private static final String TAG_GUID = "guid"; - - private static final String TAG_AUTHOR = "author"; - - private static final String TAG_NAME = "name"; - - private static final String ATTRIBUTE_URL = "url"; - - private static final String ATTRIBUTE_HREF = "href"; - - private static final String ATTRIBUTE_TYPE = "type"; - - private static final String ATTRIBUTE_LENGTH = "length"; - - private static final String ATTRIBUTE_REL = "rel"; - - private static final String[] TIMEZONES = {"MEST", "EST", "PST"}; - - private static final String[] TIMEZONES_REPLACE = {"+0200", "-0500", "-0800"}; - - private static final int TIMEZONES_COUNT = 3; - - - private static long KEEP_TIME = 345600000l; // 4 days - - - private static final DateFormat[] PUBDATE_DATEFORMATS = { - new SimpleDateFormat("EEE', 'd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US), - new SimpleDateFormat("d' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US), - new SimpleDateFormat("EEE', 'd' 'MMM' 'yyyy' 'HH:mm:ss' 'z", Locale.US), - - }; - - private static final int PUBDATEFORMAT_COUNT = 3; - - private static final DateFormat[] UPDATE_DATEFORMATS = { - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"), - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.US), - - }; - - private static final int DATEFORMAT_COUNT = 2; - - private static final String Z = "Z"; - - private static final String GMT = "GMT"; - - private static final StringBuilder DB_FAVORITE = new StringBuilder(" AND (").append(Strings.DB_EXCUDEFAVORITE).append(')'); - - private static Pattern imgPattern = Pattern.compile("]*>"); // middle () is group 1; s* is important for non-whitespaces; ' also usable - - private Context context; - - private Date lastUpdateDate; - - String id; - - private boolean titleTagEntered; - - private boolean updatedTagEntered; - - private boolean linkTagEntered; - - private boolean descriptionTagEntered; - - private boolean pubDateTagEntered; - - private boolean dateTagEntered; - - private boolean lastUpdateDateTagEntered; - - private boolean guidTagEntered; - - private StringBuilder title; - - private StringBuilder dateStringBuilder; - - private Date entryDate; - - private StringBuilder entryLink; - - private StringBuilder description; - - private StringBuilder enclosure; - - private Uri feedEntiresUri; - - private int newCount; - - private boolean feedRefreshed; - - private String feedTitle; - - private String feedBaseUrl; - - private boolean done; - - private Date keepDateBorder; - - private InputStream inputStream; - - private Reader reader; - - private boolean fetchImages; - - private boolean cancelled; - - private Date lastBuildDate; - - private long realLastUpdate; - - private long now; - - private StringBuilder guid; - - private boolean efficientFeedParsing; - - private boolean authorTagEntered; - - private StringBuilder author; - - private boolean nameTagEntered; - - public RSSHandler(Context context) { - KEEP_TIME = Long.parseLong(PreferenceManager.getDefaultSharedPreferences(context).getString(Strings.SETTINGS_KEEPTIME, "4"))*86400000l; - this.context = context; - this.efficientFeedParsing = true; - } - - public void init(Date lastUpdateDate, final String id, String title, String url) { - final long keepDateBorderTime = KEEP_TIME > 0 ? System.currentTimeMillis()-KEEP_TIME : 0; - - keepDateBorder = new Date(keepDateBorderTime); - this.lastUpdateDate = lastUpdateDate; - this.id = id; - feedEntiresUri = FeedData.EntryColumns.CONTENT_URI(id); - - final String query = new StringBuilder(FeedData.EntryColumns.DATE).append('<').append(keepDateBorderTime).append(DB_FAVORITE).toString(); - - FeedData.deletePicturesOfFeed(context, feedEntiresUri, query); - - context.getContentResolver().delete(feedEntiresUri, query, null); - newCount = 0; - feedRefreshed = false; - feedTitle = title; - - int index = url.indexOf('/', 8); // this also covers https:// - - if (index > -1) { - feedBaseUrl = url.substring(0, index); - } else { - feedBaseUrl = null; - } - this.title = null; - this.dateStringBuilder = null; - this.entryLink = null; - this.description = null; - this.enclosure = null; - inputStream = null; - reader = null; - entryDate = null; - lastBuildDate = null; - realLastUpdate = lastUpdateDate.getTime(); - - done = false; - cancelled = false; - - titleTagEntered = false; - updatedTagEntered = false; - linkTagEntered = false; - descriptionTagEntered = false; - pubDateTagEntered = false; - dateTagEntered = false; - lastUpdateDateTagEntered = false; - now = System.currentTimeMillis(); - guid = null; - guidTagEntered = false; - authorTagEntered = false; - author = null; - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if (TAG_UPDATED.equals(localName)) { - updatedTagEntered = true; - dateStringBuilder = new StringBuilder(); - } else if (TAG_ENTRY.equals(localName) || TAG_ITEM.equals(localName)) { - description = null; - entryLink = null; - if (!feedRefreshed) { - ContentValues values = new ContentValues(); - - if (feedTitle == null && title != null && title.length() > 0) { - values.put(FeedData.FeedColumns.NAME, title.toString().trim()); - } - values.put(FeedData.FeedColumns.ERROR, (String) null); - values.put(FeedData.FeedColumns.LASTUPDATE, System.currentTimeMillis() - 1000); - if (lastBuildDate != null) { - realLastUpdate = Math.max(entryDate != null && entryDate.after(lastBuildDate) ? entryDate.getTime() : lastBuildDate.getTime(), realLastUpdate); - } else { - realLastUpdate = Math.max(entryDate != null ? entryDate.getTime() : System.currentTimeMillis() - 1000, realLastUpdate); - } - values.put(FeedData.FeedColumns.REALLASTUPDATE, realLastUpdate); - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - title = null; - feedRefreshed = true; - } - } else if (TAG_TITLE.equals(localName)) { - if (title == null) { - titleTagEntered = true; - title = new StringBuilder(); - } - } else if (TAG_LINK.equals(localName)) { - if (authorTagEntered) { - return; - } - if (TAG_ENCLOSURE.equals(attributes.getValue(Strings.EMPTY, ATTRIBUTE_REL))) { - startEnclosure(attributes, attributes.getValue(Strings.EMPTY, ATTRIBUTE_HREF)); - } else { - entryLink = new StringBuilder(); - - boolean foundLink = false; - - for (int n = 0, i = attributes.getLength(); n < i; n++) { - if (ATTRIBUTE_HREF.equals(attributes.getLocalName(n))) { - if (attributes.getValue(n) != null) { - entryLink.append(attributes.getValue(n)); - foundLink = true; - linkTagEntered = false; - } else { - linkTagEntered = true; - } - break; - } - } - if (!foundLink) { - linkTagEntered = true; - } - } - } else if ((TAG_DESCRIPTION.equals(localName) && !TAG_MEDIA_DESCRIPTION.equals(qName)) || (TAG_CONTENT.equals(localName) && !TAG_MEDIA_CONTENT.equals(qName))) { - descriptionTagEntered = true; - description = new StringBuilder(); - } else if (TAG_SUMMARY.equals(localName)) { - if (description == null) { - descriptionTagEntered = true; - description = new StringBuilder(); - } - } else if (TAG_PUBDATE.equals(localName)) { - pubDateTagEntered = true; - dateStringBuilder = new StringBuilder(); - } else if (TAG_DATE.equals(localName)) { - dateTagEntered = true; - dateStringBuilder = new StringBuilder(); - } else if (TAG_LASTBUILDDATE.equals(localName)) { - lastUpdateDateTagEntered = true; - dateStringBuilder = new StringBuilder(); - } else if (TAG_ENCODEDCONTENT.equals(localName)) { - descriptionTagEntered = true; - description = new StringBuilder(); - } else if (TAG_ENCLOSURE.equals(localName)) { - startEnclosure(attributes, attributes.getValue(Strings.EMPTY, ATTRIBUTE_URL)); - } else if (TAG_GUID.equals(localName)) { - guidTagEntered = true; - guid = new StringBuilder(); - } else if (TAG_AUTHOR.endsWith(localName)) { - authorTagEntered = true; - if (author == null) { - author = new StringBuilder(); - } else { - // this indicates multiple authors - author.append(Strings.COMMASPACE); - } - } else if (TAG_NAME.equals(localName)) { - nameTagEntered = true; - } - } - - private void startEnclosure(Attributes attributes, String url) { - if (enclosure == null) { // fetch the first enclosure only - enclosure = new StringBuilder(url); - enclosure.append(Strings.ENCLOSURE_SEPARATOR); - - String value = attributes.getValue(Strings.EMPTY, ATTRIBUTE_TYPE); - - if (value != null) { - enclosure.append(value); - } - enclosure.append(Strings.ENCLOSURE_SEPARATOR); - value = attributes.getValue(Strings.EMPTY, ATTRIBUTE_LENGTH); - if (value != null) { - enclosure.append(value); - } - } - } - - @Override - public void characters(char[] ch, int start, int length) throws SAXException { - if (titleTagEntered) { - title.append(ch, start, length); - } else if (updatedTagEntered) { - dateStringBuilder.append(ch, start, length); - } else if (linkTagEntered) { - entryLink.append(ch, start, length); - } else if (descriptionTagEntered) { - description.append(ch, start, length); - } else if (pubDateTagEntered) { - dateStringBuilder.append(ch, start, length); - } else if (dateTagEntered) { - dateStringBuilder.append(ch, start, length); - } else if (lastUpdateDateTagEntered) { - dateStringBuilder.append(ch, start, length); - } else if (guidTagEntered) { - guid.append(ch, start, length); - } else if (authorTagEntered && nameTagEntered) { - author.append(ch, start, length); - } - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - if (TAG_TITLE.equals(localName)) { - titleTagEntered = false; - } else if ((TAG_DESCRIPTION.equals(localName) && !TAG_MEDIA_DESCRIPTION.equals(qName)) || TAG_SUMMARY.equals(localName) || (TAG_CONTENT.equals(localName) && !TAG_MEDIA_CONTENT.equals(qName)) || TAG_ENCODEDCONTENT.equals(localName)) { - descriptionTagEntered = false; - } else if (TAG_LINK.equals(localName)) { - linkTagEntered = false; - } else if (TAG_UPDATED.equals(localName)) { - entryDate = parseUpdateDate(dateStringBuilder.toString()); - updatedTagEntered = false; - } else if (TAG_PUBDATE.equals(localName)) { - entryDate = parsePubdateDate(dateStringBuilder.toString().replace(Strings.TWOSPACE, Strings.SPACE)); - pubDateTagEntered = false; - } else if (TAG_LASTBUILDDATE.equals(localName)) { - lastBuildDate = parsePubdateDate(dateStringBuilder.toString().replace(Strings.TWOSPACE, Strings.SPACE)); - lastUpdateDateTagEntered = false; - } else if (TAG_DATE.equals(localName)) { - entryDate = parseUpdateDate(dateStringBuilder.toString()); - dateTagEntered = false; - } else if (TAG_ENTRY.equals(localName) || TAG_ITEM.equals(localName)) { - if (title != null && (entryDate == null || ((entryDate.after(lastUpdateDate) || !efficientFeedParsing) && entryDate.after(keepDateBorder)))) { - ContentValues values = new ContentValues(); - - if (entryDate != null && entryDate.getTime() > realLastUpdate) { - realLastUpdate = entryDate.getTime(); - - values.put(FeedData.FeedColumns.REALLASTUPDATE, realLastUpdate); - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - values.clear(); - } - - if (entryDate != null) { - values.put(FeedData.EntryColumns.DATE, entryDate.getTime()); - values.putNull(FeedData.EntryColumns.READDATE); - } - values.put(FeedData.EntryColumns.TITLE, unescapeTitle(title.toString().trim())); - - if (author != null) { - values.put(FeedData.EntryColumns.AUTHOR, author.toString()); - } - - Vector images = null; - - if (description != null) { - String descriptionString = description.toString().trim().replaceAll(Strings.HTML_SPAN_REGEX, Strings.EMPTY); - - if (descriptionString.length() > 0) { - if (fetchImages) { - images = new Vector(4); - - Matcher matcher = imgPattern.matcher(description); - - while (matcher.find()) { - String match = matcher.group(1).replace(Strings.SPACE, Strings.URL_SPACE); - - images.add(match); - descriptionString = descriptionString.replace(match, new StringBuilder(Strings.FILEURL).append(FeedDataContentProvider.IMAGEFOLDER).append(Strings.IMAGEID_REPLACEMENT).append(match.substring(match.lastIndexOf('/')+1)).toString()); - } - } - values.put(FeedData.EntryColumns.ABSTRACT, descriptionString); - } - } - - String enclosureString = null; - - StringBuilder existanceStringBuilder = new StringBuilder(FeedData.EntryColumns.LINK).append(Strings.DB_ARG); - - if (enclosure != null && enclosure.length() > 0) { - enclosureString = enclosure.toString(); - values.put(FeedData.EntryColumns.ENCLOSURE, enclosureString); - existanceStringBuilder.append(Strings.DB_AND).append(FeedData.EntryColumns.ENCLOSURE).append(Strings.DB_ARG); - } - - String guidString = null; - - if (guid != null && guid.length() > 0) { - guidString = guid.toString(); - values.put(FeedData.EntryColumns.GUID, guidString); - existanceStringBuilder.append(Strings.DB_AND).append(FeedData.EntryColumns.GUID).append(Strings.DB_ARG); - } - - String entryLinkString = Strings.EMPTY; // don't set this to null as we need *some* value - - if (entryLink != null && entryLink.length() > 0) { - entryLinkString = entryLink.toString().trim(); - if (feedBaseUrl != null && !entryLinkString.startsWith(Strings.HTTP) && !entryLinkString.startsWith(Strings.HTTPS)) { - entryLinkString = feedBaseUrl + (entryLinkString.startsWith(Strings.SLASH) ? entryLinkString : Strings.SLASH + entryLinkString); - } - } - - String[] existanceValues = enclosureString != null ? (guidString != null ? new String[] {entryLinkString, enclosureString, guidString}: new String[] {entryLinkString, enclosureString}) : (guidString != null ? new String[] {entryLinkString, guidString} : new String[] {entryLinkString}); - - boolean skip = false; - - if (!efficientFeedParsing) { - if (context.getContentResolver().update(feedEntiresUri, values, existanceStringBuilder.toString()+" AND "+FeedData.EntryColumns.DATE+"<"+entryDate.getTime(), existanceValues) == 1) { - newCount++; - skip = true; - } else { - values.remove(FeedData.EntryColumns.READDATE); - // continue with the standard procedure but don't reset the read-date - } - } - - if (!skip && ((entryLinkString.length() == 0 && guidString == null) || context.getContentResolver().update(feedEntiresUri, values, existanceStringBuilder.toString(), existanceValues) == 0)) { - values.put(FeedData.EntryColumns.LINK, entryLinkString); - if (entryDate == null) { - values.put(FeedData.EntryColumns.DATE, now--); - } - - String entryId = context.getContentResolver().insert(feedEntiresUri, values).getLastPathSegment(); - - if (fetchImages) { - FeedDataContentProvider.IMAGEFOLDER_FILE.mkdir(); // create images dir - for (int n = 0, i = images != null ? images.size() : 0; n < i; n++) { - try { - String match = images.get(n); - - byte[] data = FetcherService.getBytes(new URL(images.get(n)).openStream()); - - FileOutputStream fos = new FileOutputStream(new StringBuilder(FeedDataContentProvider.IMAGEFOLDER).append(entryId).append(Strings.IMAGEFILE_IDSEPARATOR).append(match.substring(match.lastIndexOf('/')+1)).toString()); - - fos.write(data); - fos.close(); - } catch (Exception e) { - - } - } - } - - newCount++; - } else if (entryDate == null && efficientFeedParsing) { - cancel(); - } - } else if (efficientFeedParsing) { - cancel(); - } - description = null; - title = null; - enclosure = null; - guid = null; - author = null; - } else if (TAG_RSS.equals(localName) || TAG_RDF.equals(localName) || TAG_FEED.equals(localName)) { - done = true; - } else if (TAG_GUID.equals(localName)) { - guidTagEntered = false; - } else if (TAG_NAME.equals(localName)) { - nameTagEntered = false; - } else if (TAG_AUTHOR.equals(localName)) { - authorTagEntered = false; - } - } - - public int getNewCount() { - return newCount; - } - - public String getId() { - return id; - } - - public boolean isDone() { - return done; - } - - public boolean isCancelled() { - return cancelled; - } - - public void setInputStream(InputStream inputStream) { - this.inputStream = inputStream; - reader = null; - } - - public void setReader(Reader reader) { - this.reader = reader; - inputStream = null; - } - - private void cancel() { - if (!cancelled) { - cancelled = true; - done = true; - if (inputStream != null) { - try { - inputStream.close(); // stops all parsing - } catch (IOException e) { - - } - } else if (reader != null) { - try { - reader.close(); // stops all parsing - } catch (IOException e) { - - } - } - } - } - - public void setFetchImages(boolean fetchImages) { - this.fetchImages = fetchImages; - } - - private static Date parseUpdateDate(String string) { - string = string.replace(Z, GMT); - for (int n = 0; n < DATEFORMAT_COUNT; n++) { - try { - return UPDATE_DATEFORMATS[n].parse(string); - } catch (ParseException e) { } // just do nothing - } - return null; - } - - private static Date parsePubdateDate(String string) { - for (int n = 0; n < TIMEZONES_COUNT; n++) { - string = string.replace(TIMEZONES[n], TIMEZONES_REPLACE[n]); - } - for (int n = 0; n < PUBDATEFORMAT_COUNT; n++) { - try { - return PUBDATE_DATEFORMATS[n].parse(string); - } catch (ParseException e) { } // just do nothing - } - return null; - } - - private static String unescapeTitle(String title) { - String result = title.replace(Strings.AMP_SG, Strings.AMP).replaceAll(Strings.HTML_TAG_REGEX, Strings.EMPTY).replace(Strings.HTML_LT, Strings.LT).replace(Strings.HTML_GT, Strings.GT).replace(Strings.HTML_QUOT, Strings.QUOT).replace(Strings.HTML_APOSTROPHE, Strings.APOSTROPHE); - - if (result.indexOf(ANDRHOMBUS) > -1) { - return Html.fromHtml(result, null, null).toString(); - } else { - return result; - } - } - - public void setEfficientFeedParsing(boolean efficientFeedParsing) { - this.efficientFeedParsing = efficientFeedParsing; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.handler; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.net.URL; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Vector; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import android.content.ContentValues; +import android.content.Context; +import android.net.Uri; +import android.preference.PreferenceManager; +import android.text.Html; +import cn.eric.rss.Strings; +import cn.eric.rss.provider.FeedData; +import cn.eric.rss.provider.FeedDataContentProvider; +import cn.eric.rss.service.FetcherService; + +public class RSSHandler extends DefaultHandler { + private static final String ANDRHOMBUS = "&#"; + + private static final String TAG_RSS = "rss"; + + private static final String TAG_RDF = "rdf"; + + private static final String TAG_FEED = "feed"; + + private static final String TAG_ENTRY = "entry"; + + private static final String TAG_ITEM = "item"; + + private static final String TAG_UPDATED = "updated"; + + private static final String TAG_TITLE = "title"; + + private static final String TAG_LINK = "link"; + + private static final String TAG_DESCRIPTION = "description"; + + private static final String TAG_MEDIA_DESCRIPTION = "media:description"; + + private static final String TAG_CONTENT = "content"; + + private static final String TAG_MEDIA_CONTENT = "media:content"; + + private static final String TAG_ENCODEDCONTENT = "encoded"; + + private static final String TAG_SUMMARY = "summary"; + + private static final String TAG_PUBDATE = "pubDate"; + + private static final String TAG_DATE = "date"; + + private static final String TAG_LASTBUILDDATE = "lastBuildDate"; + + private static final String TAG_ENCLOSURE = "enclosure"; + + private static final String TAG_GUID = "guid"; + + private static final String TAG_AUTHOR = "author"; + + private static final String TAG_NAME = "name"; + + private static final String ATTRIBUTE_URL = "url"; + + private static final String ATTRIBUTE_HREF = "href"; + + private static final String ATTRIBUTE_TYPE = "type"; + + private static final String ATTRIBUTE_LENGTH = "length"; + + private static final String ATTRIBUTE_REL = "rel"; + + private static final String[] TIMEZONES = {"MEST", "EST", "PST"}; + + private static final String[] TIMEZONES_REPLACE = {"+0200", "-0500", "-0800"}; + + private static final int TIMEZONES_COUNT = 3; + + + private static long KEEP_TIME = 345600000l; // 4 days + + + private static final DateFormat[] PUBDATE_DATEFORMATS = { + new SimpleDateFormat("EEE', 'd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US), + new SimpleDateFormat("d' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US), + new SimpleDateFormat("EEE', 'd' 'MMM' 'yyyy' 'HH:mm:ss' 'z", Locale.US), + + }; + + private static final int PUBDATEFORMAT_COUNT = 3; + + private static final DateFormat[] UPDATE_DATEFORMATS = { + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"), + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.US), + + }; + + private static final int DATEFORMAT_COUNT = 2; + + private static final String Z = "Z"; + + private static final String GMT = "GMT"; + + private static final StringBuilder DB_FAVORITE = new StringBuilder(" AND (").append(Strings.DB_EXCUDEFAVORITE).append(')'); + + private static Pattern imgPattern = Pattern.compile("]*>"); // middle () is group 1; s* is important for non-whitespaces; ' also usable + + private Context context; + + private Date lastUpdateDate; + + String id; + + private boolean titleTagEntered; + + private boolean updatedTagEntered; + + private boolean linkTagEntered; + + private boolean descriptionTagEntered; + + private boolean pubDateTagEntered; + + private boolean dateTagEntered; + + private boolean lastUpdateDateTagEntered; + + private boolean guidTagEntered; + + private StringBuilder title; + + private StringBuilder dateStringBuilder; + + private Date entryDate; + + private StringBuilder entryLink; + + private StringBuilder description; + + private StringBuilder enclosure; + + private Uri feedEntiresUri; + + private int newCount; + + private boolean feedRefreshed; + + private String feedTitle; + + private String feedBaseUrl; + + private boolean done; + + private Date keepDateBorder; + + private InputStream inputStream; + + private Reader reader; + + private boolean fetchImages; + + private boolean cancelled; + + private Date lastBuildDate; + + private long realLastUpdate; + + private long now; + + private StringBuilder guid; + + private boolean efficientFeedParsing; + + private boolean authorTagEntered; + + private StringBuilder author; + + private boolean nameTagEntered; + + public RSSHandler(Context context) { + KEEP_TIME = Long.parseLong(PreferenceManager.getDefaultSharedPreferences(context).getString(Strings.SETTINGS_KEEPTIME, "4"))*86400000l; + this.context = context; + this.efficientFeedParsing = true; + } + + public void init(Date lastUpdateDate, final String id, String title, String url) { + final long keepDateBorderTime = KEEP_TIME > 0 ? System.currentTimeMillis()-KEEP_TIME : 0; + + keepDateBorder = new Date(keepDateBorderTime); + this.lastUpdateDate = lastUpdateDate; + this.id = id; + feedEntiresUri = FeedData.EntryColumns.CONTENT_URI(id); + + final String query = new StringBuilder(FeedData.EntryColumns.DATE).append('<').append(keepDateBorderTime).append(DB_FAVORITE).toString(); + + FeedData.deletePicturesOfFeed(context, feedEntiresUri, query); + + context.getContentResolver().delete(feedEntiresUri, query, null); + newCount = 0; + feedRefreshed = false; + feedTitle = title; + + int index = url.indexOf('/', 8); // this also covers https:// + + if (index > -1) { + feedBaseUrl = url.substring(0, index); + } else { + feedBaseUrl = null; + } + this.title = null; + this.dateStringBuilder = null; + this.entryLink = null; + this.description = null; + this.enclosure = null; + inputStream = null; + reader = null; + entryDate = null; + lastBuildDate = null; + realLastUpdate = lastUpdateDate.getTime(); + + done = false; + cancelled = false; + + titleTagEntered = false; + updatedTagEntered = false; + linkTagEntered = false; + descriptionTagEntered = false; + pubDateTagEntered = false; + dateTagEntered = false; + lastUpdateDateTagEntered = false; + now = System.currentTimeMillis(); + guid = null; + guidTagEntered = false; + authorTagEntered = false; + author = null; + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (TAG_UPDATED.equals(localName)) { + updatedTagEntered = true; + dateStringBuilder = new StringBuilder(); + } else if (TAG_ENTRY.equals(localName) || TAG_ITEM.equals(localName)) { + description = null; + entryLink = null; + if (!feedRefreshed) { + ContentValues values = new ContentValues(); + + if (feedTitle == null && title != null && title.length() > 0) { + values.put(FeedData.FeedColumns.NAME, title.toString().trim()); + } + values.put(FeedData.FeedColumns.ERROR, (String) null); + values.put(FeedData.FeedColumns.LASTUPDATE, System.currentTimeMillis() - 1000); + if (lastBuildDate != null) { + realLastUpdate = Math.max(entryDate != null && entryDate.after(lastBuildDate) ? entryDate.getTime() : lastBuildDate.getTime(), realLastUpdate); + } else { + realLastUpdate = Math.max(entryDate != null ? entryDate.getTime() : System.currentTimeMillis() - 1000, realLastUpdate); + } + values.put(FeedData.FeedColumns.REALLASTUPDATE, realLastUpdate); + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + title = null; + feedRefreshed = true; + } + } else if (TAG_TITLE.equals(localName)) { + if (title == null) { + titleTagEntered = true; + title = new StringBuilder(); + } + } else if (TAG_LINK.equals(localName)) { + if (authorTagEntered) { + return; + } + if (TAG_ENCLOSURE.equals(attributes.getValue(Strings.EMPTY, ATTRIBUTE_REL))) { + startEnclosure(attributes, attributes.getValue(Strings.EMPTY, ATTRIBUTE_HREF)); + } else { + entryLink = new StringBuilder(); + + boolean foundLink = false; + + for (int n = 0, i = attributes.getLength(); n < i; n++) { + if (ATTRIBUTE_HREF.equals(attributes.getLocalName(n))) { + if (attributes.getValue(n) != null) { + entryLink.append(attributes.getValue(n)); + foundLink = true; + linkTagEntered = false; + } else { + linkTagEntered = true; + } + break; + } + } + if (!foundLink) { + linkTagEntered = true; + } + } + } else if ((TAG_DESCRIPTION.equals(localName) && !TAG_MEDIA_DESCRIPTION.equals(qName)) || (TAG_CONTENT.equals(localName) && !TAG_MEDIA_CONTENT.equals(qName))) { + descriptionTagEntered = true; + description = new StringBuilder(); + } else if (TAG_SUMMARY.equals(localName)) { + if (description == null) { + descriptionTagEntered = true; + description = new StringBuilder(); + } + } else if (TAG_PUBDATE.equals(localName)) { + pubDateTagEntered = true; + dateStringBuilder = new StringBuilder(); + } else if (TAG_DATE.equals(localName)) { + dateTagEntered = true; + dateStringBuilder = new StringBuilder(); + } else if (TAG_LASTBUILDDATE.equals(localName)) { + lastUpdateDateTagEntered = true; + dateStringBuilder = new StringBuilder(); + } else if (TAG_ENCODEDCONTENT.equals(localName)) { + descriptionTagEntered = true; + description = new StringBuilder(); + } else if (TAG_ENCLOSURE.equals(localName)) { + startEnclosure(attributes, attributes.getValue(Strings.EMPTY, ATTRIBUTE_URL)); + } else if (TAG_GUID.equals(localName)) { + guidTagEntered = true; + guid = new StringBuilder(); + } else if (TAG_AUTHOR.endsWith(localName)) { + authorTagEntered = true; + if (author == null) { + author = new StringBuilder(); + } else { + // this indicates multiple authors + author.append(Strings.COMMASPACE); + } + } else if (TAG_NAME.equals(localName)) { + nameTagEntered = true; + } + } + + private void startEnclosure(Attributes attributes, String url) { + if (enclosure == null) { // fetch the first enclosure only + enclosure = new StringBuilder(url); + enclosure.append(Strings.ENCLOSURE_SEPARATOR); + + String value = attributes.getValue(Strings.EMPTY, ATTRIBUTE_TYPE); + + if (value != null) { + enclosure.append(value); + } + enclosure.append(Strings.ENCLOSURE_SEPARATOR); + value = attributes.getValue(Strings.EMPTY, ATTRIBUTE_LENGTH); + if (value != null) { + enclosure.append(value); + } + } + } + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + if (titleTagEntered) { + title.append(ch, start, length); + } else if (updatedTagEntered) { + dateStringBuilder.append(ch, start, length); + } else if (linkTagEntered) { + entryLink.append(ch, start, length); + } else if (descriptionTagEntered) { + description.append(ch, start, length); + } else if (pubDateTagEntered) { + dateStringBuilder.append(ch, start, length); + } else if (dateTagEntered) { + dateStringBuilder.append(ch, start, length); + } else if (lastUpdateDateTagEntered) { + dateStringBuilder.append(ch, start, length); + } else if (guidTagEntered) { + guid.append(ch, start, length); + } else if (authorTagEntered && nameTagEntered) { + author.append(ch, start, length); + } + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (TAG_TITLE.equals(localName)) { + titleTagEntered = false; + } else if ((TAG_DESCRIPTION.equals(localName) && !TAG_MEDIA_DESCRIPTION.equals(qName)) || TAG_SUMMARY.equals(localName) || (TAG_CONTENT.equals(localName) && !TAG_MEDIA_CONTENT.equals(qName)) || TAG_ENCODEDCONTENT.equals(localName)) { + descriptionTagEntered = false; + } else if (TAG_LINK.equals(localName)) { + linkTagEntered = false; + } else if (TAG_UPDATED.equals(localName)) { + entryDate = parseUpdateDate(dateStringBuilder.toString()); + updatedTagEntered = false; + } else if (TAG_PUBDATE.equals(localName)) { + entryDate = parsePubdateDate(dateStringBuilder.toString().replace(Strings.TWOSPACE, Strings.SPACE)); + pubDateTagEntered = false; + } else if (TAG_LASTBUILDDATE.equals(localName)) { + lastBuildDate = parsePubdateDate(dateStringBuilder.toString().replace(Strings.TWOSPACE, Strings.SPACE)); + lastUpdateDateTagEntered = false; + } else if (TAG_DATE.equals(localName)) { + entryDate = parseUpdateDate(dateStringBuilder.toString()); + dateTagEntered = false; + } else if (TAG_ENTRY.equals(localName) || TAG_ITEM.equals(localName)) { + if (title != null && (entryDate == null || ((entryDate.after(lastUpdateDate) || !efficientFeedParsing) && entryDate.after(keepDateBorder)))) { + ContentValues values = new ContentValues(); + + if (entryDate != null && entryDate.getTime() > realLastUpdate) { + realLastUpdate = entryDate.getTime(); + + values.put(FeedData.FeedColumns.REALLASTUPDATE, realLastUpdate); + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + values.clear(); + } + + if (entryDate != null) { + values.put(FeedData.EntryColumns.DATE, entryDate.getTime()); + values.putNull(FeedData.EntryColumns.READDATE); + } + values.put(FeedData.EntryColumns.TITLE, unescapeTitle(title.toString().trim())); + + if (author != null) { + values.put(FeedData.EntryColumns.AUTHOR, author.toString()); + } + + Vector images = null; + + if (description != null) { + String descriptionString = description.toString().trim().replaceAll(Strings.HTML_SPAN_REGEX, Strings.EMPTY); + + if (descriptionString.length() > 0) { + if (fetchImages) { + images = new Vector(4); + + Matcher matcher = imgPattern.matcher(description); + + while (matcher.find()) { + String match = matcher.group(1).replace(Strings.SPACE, Strings.URL_SPACE); + + images.add(match); + descriptionString = descriptionString.replace(match, new StringBuilder(Strings.FILEURL).append(FeedDataContentProvider.IMAGEFOLDER).append(Strings.IMAGEID_REPLACEMENT).append(match.substring(match.lastIndexOf('/')+1)).toString()); + } + } + values.put(FeedData.EntryColumns.ABSTRACT, descriptionString); + } + } + + String enclosureString = null; + + StringBuilder existanceStringBuilder = new StringBuilder(FeedData.EntryColumns.LINK).append(Strings.DB_ARG); + + if (enclosure != null && enclosure.length() > 0) { + enclosureString = enclosure.toString(); + values.put(FeedData.EntryColumns.ENCLOSURE, enclosureString); + existanceStringBuilder.append(Strings.DB_AND).append(FeedData.EntryColumns.ENCLOSURE).append(Strings.DB_ARG); + } + + String guidString = null; + + if (guid != null && guid.length() > 0) { + guidString = guid.toString(); + values.put(FeedData.EntryColumns.GUID, guidString); + existanceStringBuilder.append(Strings.DB_AND).append(FeedData.EntryColumns.GUID).append(Strings.DB_ARG); + } + + String entryLinkString = Strings.EMPTY; // don't set this to null as we need *some* value + + if (entryLink != null && entryLink.length() > 0) { + entryLinkString = entryLink.toString().trim(); + if (feedBaseUrl != null && !entryLinkString.startsWith(Strings.HTTP) && !entryLinkString.startsWith(Strings.HTTPS)) { + entryLinkString = feedBaseUrl + (entryLinkString.startsWith(Strings.SLASH) ? entryLinkString : Strings.SLASH + entryLinkString); + } + } + + String[] existanceValues = enclosureString != null ? (guidString != null ? new String[] {entryLinkString, enclosureString, guidString}: new String[] {entryLinkString, enclosureString}) : (guidString != null ? new String[] {entryLinkString, guidString} : new String[] {entryLinkString}); + + boolean skip = false; + + if (!efficientFeedParsing) { + if (context.getContentResolver().update(feedEntiresUri, values, existanceStringBuilder.toString()+" AND "+FeedData.EntryColumns.DATE+"<"+entryDate.getTime(), existanceValues) == 1) { + newCount++; + skip = true; + } else { + values.remove(FeedData.EntryColumns.READDATE); + // continue with the standard procedure but don't reset the read-date + } + } + + if (!skip && ((entryLinkString.length() == 0 && guidString == null) || context.getContentResolver().update(feedEntiresUri, values, existanceStringBuilder.toString(), existanceValues) == 0)) { + values.put(FeedData.EntryColumns.LINK, entryLinkString); + if (entryDate == null) { + values.put(FeedData.EntryColumns.DATE, now--); + } + + String entryId = context.getContentResolver().insert(feedEntiresUri, values).getLastPathSegment(); + + if (fetchImages) { + FeedDataContentProvider.IMAGEFOLDER_FILE.mkdir(); // create images dir + for (int n = 0, i = images != null ? images.size() : 0; n < i; n++) { + try { + String match = images.get(n); + + byte[] data = FetcherService.getBytes(new URL(images.get(n)).openStream()); + + FileOutputStream fos = new FileOutputStream(new StringBuilder(FeedDataContentProvider.IMAGEFOLDER).append(entryId).append(Strings.IMAGEFILE_IDSEPARATOR).append(match.substring(match.lastIndexOf('/')+1)).toString()); + + fos.write(data); + fos.close(); + } catch (Exception e) { + + } + } + } + + newCount++; + } else if (entryDate == null && efficientFeedParsing) { + cancel(); + } + } else if (efficientFeedParsing) { + cancel(); + } + description = null; + title = null; + enclosure = null; + guid = null; + author = null; + } else if (TAG_RSS.equals(localName) || TAG_RDF.equals(localName) || TAG_FEED.equals(localName)) { + done = true; + } else if (TAG_GUID.equals(localName)) { + guidTagEntered = false; + } else if (TAG_NAME.equals(localName)) { + nameTagEntered = false; + } else if (TAG_AUTHOR.equals(localName)) { + authorTagEntered = false; + } + } + + public int getNewCount() { + return newCount; + } + + public String getId() { + return id; + } + + public boolean isDone() { + return done; + } + + public boolean isCancelled() { + return cancelled; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + reader = null; + } + + public void setReader(Reader reader) { + this.reader = reader; + inputStream = null; + } + + private void cancel() { + if (!cancelled) { + cancelled = true; + done = true; + if (inputStream != null) { + try { + inputStream.close(); // stops all parsing + } catch (IOException e) { + + } + } else if (reader != null) { + try { + reader.close(); // stops all parsing + } catch (IOException e) { + + } + } + } + } + + public void setFetchImages(boolean fetchImages) { + this.fetchImages = fetchImages; + } + + private static Date parseUpdateDate(String string) { + string = string.replace(Z, GMT); + for (int n = 0; n < DATEFORMAT_COUNT; n++) { + try { + return UPDATE_DATEFORMATS[n].parse(string); + } catch (ParseException e) { } // just do nothing + } + return null; + } + + private static Date parsePubdateDate(String string) { + for (int n = 0; n < TIMEZONES_COUNT; n++) { + string = string.replace(TIMEZONES[n], TIMEZONES_REPLACE[n]); + } + for (int n = 0; n < PUBDATEFORMAT_COUNT; n++) { + try { + return PUBDATE_DATEFORMATS[n].parse(string); + } catch (ParseException e) { } // just do nothing + } + return null; + } + + private static String unescapeTitle(String title) { + String result = title.replace(Strings.AMP_SG, Strings.AMP).replaceAll(Strings.HTML_TAG_REGEX, Strings.EMPTY).replace(Strings.HTML_LT, Strings.LT).replace(Strings.HTML_GT, Strings.GT).replace(Strings.HTML_QUOT, Strings.QUOT).replace(Strings.HTML_APOSTROPHE, Strings.APOSTROPHE); + + if (result.indexOf(ANDRHOMBUS) > -1) { + return Html.fromHtml(result, null, null).toString(); + } else { + return result; + } + } + + public void setEfficientFeedParsing(boolean efficientFeedParsing) { + this.efficientFeedParsing = efficientFeedParsing; + } + +} diff --git a/src/de/shandschuh/sparserss/provider/FeedData.java b/src/cn/eric/rss/provider/FeedData.java similarity index 95% rename from src/de/shandschuh/sparserss/provider/FeedData.java rename to src/cn/eric/rss/provider/FeedData.java index 54066d7..607cd11 100644 --- a/src/de/shandschuh/sparserss/provider/FeedData.java +++ b/src/cn/eric/rss/provider/FeedData.java @@ -1,181 +1,181 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.provider; - -import java.io.File; - -import de.shandschuh.sparserss.handler.PictureFilenameFilter; - -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.provider.BaseColumns; - -public class FeedData { - public static final String CONTENT = "content://"; - - public static final String AUTHORITY = "de.shandschuh.sparserss.provider.FeedData"; - - private static final String TYPE_PRIMARY_KEY = "INTEGER PRIMARY KEY AUTOINCREMENT"; - - protected static final String TYPE_TEXT = "TEXT"; - - protected static final String TYPE_DATETIME = "DATETIME"; - - protected static final String TYPE_INT = "INT"; - - protected static final String TYPE_BOOLEAN = "INTEGER(1)"; - - public static final String FEED_DEFAULTSORTORDER = FeedColumns.PRIORITY; - - public static class FeedColumns implements BaseColumns { - public static final Uri CONTENT_URI = Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds").toString()); - - public static final String URL = "url"; - - public static final String NAME = "name"; - - public static final String OTHER_ALERT_RINGTONE = "other_alertringtone"; - - public static final String ALERT_RINGTONE = "alertringtone"; - - public static final String SKIP_ALERT = "skipalert"; - - public static final String LASTUPDATE = "lastupdate"; - - public static final String ICON = "icon"; - - public static final String ERROR = "error"; - - public static final String PRIORITY = "priority"; - - public static final String FETCHMODE = "fetchmode"; - - public static final String REALLASTUPDATE = "reallastupdate"; - - public static final String WIFIONLY = "wifionly"; - - public static final String[] COLUMNS = new String[] {_ID, URL, NAME, LASTUPDATE, ICON, ERROR, PRIORITY, FETCHMODE, REALLASTUPDATE, ALERT_RINGTONE, OTHER_ALERT_RINGTONE, SKIP_ALERT, WIFIONLY}; - - public static final String[] TYPES = new String[] {TYPE_PRIMARY_KEY, "TEXT UNIQUE", TYPE_TEXT, TYPE_DATETIME, "BLOB", TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_DATETIME, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_BOOLEAN}; - - public static final Uri CONTENT_URI(String feedId) { - return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds/").append(feedId).toString()); - } - - public static final Uri CONTENT_URI(long feedId) { - return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds/").append(feedId).toString()); - } - } - - public static class EntryColumns implements BaseColumns { - public static final String FEED_ID = "feedid"; - - public static final String TITLE = "title"; - - public static final String ABSTRACT = "abstract"; - - public static final String DATE = "date"; - - public static final String READDATE = "readdate"; - - public static final String LINK = "link"; - - public static final String FAVORITE = "favorite"; - - public static final String ENCLOSURE = "enclosure"; - - public static final String GUID = "guid"; - - public static final String AUTHOR = "author"; - - public static final String[] COLUMNS = new String[] {_ID, FEED_ID, TITLE, ABSTRACT, DATE, READDATE, LINK, FAVORITE, ENCLOSURE, GUID, AUTHOR}; - - public static final String[] TYPES = new String[] {TYPE_PRIMARY_KEY, "INTEGER(7)", TYPE_TEXT, TYPE_TEXT, TYPE_DATETIME, TYPE_DATETIME, TYPE_TEXT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; - - public static Uri CONTENT_URI = Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/entries").toString()); - - public static Uri FAVORITES_CONTENT_URI = Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/favorites").toString()); - - public static Uri CONTENT_URI(String feedId) { - return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds/").append(feedId).append("/entries").toString()); - } - - public static Uri ENTRY_CONTENT_URI(String entryId) { - return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/entries/").append(entryId).toString()); - } - - public static Uri PARENT_URI(String path) { - return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append(path.substring(0, path.lastIndexOf('/'))).toString()); - } - - } - - private static String[] IDPROJECTION = new String[] {FeedData.EntryColumns._ID}; - - public static void deletePicturesOfFeedAsync(final Context context, final Uri entriesUri, final String selection) { - if (FeedDataContentProvider.IMAGEFOLDER_FILE.exists()) { - new Thread() { - public void run() { - deletePicturesOfFeed(context, entriesUri, selection); - } - }.start(); - } - } - - public static synchronized void deletePicturesOfFeed(Context context, Uri entriesUri, String selection) { - if (FeedDataContentProvider.IMAGEFOLDER_FILE.exists()) { - PictureFilenameFilter filenameFilter = new PictureFilenameFilter(); - - Cursor cursor = context.getContentResolver().query(entriesUri, IDPROJECTION, selection, null, null); - - while (cursor.moveToNext()) { - filenameFilter.setEntryId(cursor.getString(0)); - - File[] files = FeedDataContentProvider.IMAGEFOLDER_FILE.listFiles(filenameFilter); - - for (int n = 0, i = files != null ? files.length : 0; n < i; n++) { - files[n].delete(); - } - } - cursor.close(); - } - } - - public static synchronized void deletePicturesOfEntry(String entryId) { - if (FeedDataContentProvider.IMAGEFOLDER_FILE.exists()) { - PictureFilenameFilter filenameFilter = new PictureFilenameFilter(entryId); - - File[] files = FeedDataContentProvider.IMAGEFOLDER_FILE.listFiles(filenameFilter); - - for (int n = 0, i = files != null ? files.length : 0; n < i; n++) { - files[n].delete(); - } - } - } - - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.provider; + +import java.io.File; + +import cn.eric.rss.handler.PictureFilenameFilter; + +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.BaseColumns; + +public class FeedData { + public static final String CONTENT = "content://"; + + public static final String AUTHORITY = "cn.eric.rss.provider.FeedData"; + + private static final String TYPE_PRIMARY_KEY = "INTEGER PRIMARY KEY AUTOINCREMENT"; + + protected static final String TYPE_TEXT = "TEXT"; + + protected static final String TYPE_DATETIME = "DATETIME"; + + protected static final String TYPE_INT = "INT"; + + protected static final String TYPE_BOOLEAN = "INTEGER(1)"; + + public static final String FEED_DEFAULTSORTORDER = FeedColumns.PRIORITY; + + public static class FeedColumns implements BaseColumns { + public static final Uri CONTENT_URI = Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds").toString()); + + public static final String URL = "url"; + + public static final String NAME = "name"; + + public static final String OTHER_ALERT_RINGTONE = "other_alertringtone"; + + public static final String ALERT_RINGTONE = "alertringtone"; + + public static final String SKIP_ALERT = "skipalert"; + + public static final String LASTUPDATE = "lastupdate"; + + public static final String ICON = "icon"; + + public static final String ERROR = "error"; + + public static final String PRIORITY = "priority"; + + public static final String FETCHMODE = "fetchmode"; + + public static final String REALLASTUPDATE = "reallastupdate"; + + public static final String WIFIONLY = "wifionly"; + + public static final String[] COLUMNS = new String[] {_ID, URL, NAME, LASTUPDATE, ICON, ERROR, PRIORITY, FETCHMODE, REALLASTUPDATE, ALERT_RINGTONE, OTHER_ALERT_RINGTONE, SKIP_ALERT, WIFIONLY}; + + public static final String[] TYPES = new String[] {TYPE_PRIMARY_KEY, "TEXT UNIQUE", TYPE_TEXT, TYPE_DATETIME, "BLOB", TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_DATETIME, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_BOOLEAN}; + + public static final Uri CONTENT_URI(String feedId) { + return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds/").append(feedId).toString()); + } + + public static final Uri CONTENT_URI(long feedId) { + return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds/").append(feedId).toString()); + } + } + + public static class EntryColumns implements BaseColumns { + public static final String FEED_ID = "feedid"; + + public static final String TITLE = "title"; + + public static final String ABSTRACT = "abstract"; + + public static final String DATE = "date"; + + public static final String READDATE = "readdate"; + + public static final String LINK = "link"; + + public static final String FAVORITE = "favorite"; + + public static final String ENCLOSURE = "enclosure"; + + public static final String GUID = "guid"; + + public static final String AUTHOR = "author"; + + public static final String[] COLUMNS = new String[] {_ID, FEED_ID, TITLE, ABSTRACT, DATE, READDATE, LINK, FAVORITE, ENCLOSURE, GUID, AUTHOR}; + + public static final String[] TYPES = new String[] {TYPE_PRIMARY_KEY, "INTEGER(7)", TYPE_TEXT, TYPE_TEXT, TYPE_DATETIME, TYPE_DATETIME, TYPE_TEXT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT}; + + public static Uri CONTENT_URI = Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/entries").toString()); + + public static Uri FAVORITES_CONTENT_URI = Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/favorites").toString()); + + public static Uri CONTENT_URI(String feedId) { + return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/feeds/").append(feedId).append("/entries").toString()); + } + + public static Uri ENTRY_CONTENT_URI(String entryId) { + return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append("/entries/").append(entryId).toString()); + } + + public static Uri PARENT_URI(String path) { + return Uri.parse(new StringBuilder(CONTENT).append(AUTHORITY).append(path.substring(0, path.lastIndexOf('/'))).toString()); + } + + } + + private static String[] IDPROJECTION = new String[] {FeedData.EntryColumns._ID}; + + public static void deletePicturesOfFeedAsync(final Context context, final Uri entriesUri, final String selection) { + if (FeedDataContentProvider.IMAGEFOLDER_FILE.exists()) { + new Thread() { + public void run() { + deletePicturesOfFeed(context, entriesUri, selection); + } + }.start(); + } + } + + public static synchronized void deletePicturesOfFeed(Context context, Uri entriesUri, String selection) { + if (FeedDataContentProvider.IMAGEFOLDER_FILE.exists()) { + PictureFilenameFilter filenameFilter = new PictureFilenameFilter(); + + Cursor cursor = context.getContentResolver().query(entriesUri, IDPROJECTION, selection, null, null); + + while (cursor.moveToNext()) { + filenameFilter.setEntryId(cursor.getString(0)); + + File[] files = FeedDataContentProvider.IMAGEFOLDER_FILE.listFiles(filenameFilter); + + for (int n = 0, i = files != null ? files.length : 0; n < i; n++) { + files[n].delete(); + } + } + cursor.close(); + } + } + + public static synchronized void deletePicturesOfEntry(String entryId) { + if (FeedDataContentProvider.IMAGEFOLDER_FILE.exists()) { + PictureFilenameFilter filenameFilter = new PictureFilenameFilter(entryId); + + File[] files = FeedDataContentProvider.IMAGEFOLDER_FILE.listFiles(filenameFilter); + + for (int n = 0, i = files != null ? files.length : 0; n < i; n++) { + files[n].delete(); + } + } + } + + +} diff --git a/src/de/shandschuh/sparserss/provider/FeedDataContentProvider.java b/src/cn/eric/rss/provider/FeedDataContentProvider.java similarity index 95% rename from src/de/shandschuh/sparserss/provider/FeedDataContentProvider.java rename to src/cn/eric/rss/provider/FeedDataContentProvider.java index 0b525c2..9fec753 100644 --- a/src/de/shandschuh/sparserss/provider/FeedDataContentProvider.java +++ b/src/cn/eric/rss/provider/FeedDataContentProvider.java @@ -1,575 +1,575 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.provider; - -import java.io.File; - -import android.content.ContentProvider; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.SQLException; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteQueryBuilder; -import android.net.Uri; -import android.os.Environment; -import android.text.TextUtils; -import de.shandschuh.sparserss.Strings; - -public class FeedDataContentProvider extends ContentProvider { - private static final String FOLDER = Environment.getExternalStorageDirectory()+"/sparserss/"; - - private static final String DATABASE_NAME = "sparserss.db"; - - private static final int DATABASE_VERSION = 15; - - private static final int URI_FEEDS = 1; - - private static final int URI_FEED = 2; - - private static final int URI_ENTRIES = 3; - - private static final int URI_ENTRY= 4; - - private static final int URI_ALLENTRIES = 5; - - private static final int URI_ALLENTRIES_ENTRY = 6; - - private static final int URI_FAVORITES = 7; - - private static final int URI_FAVORITES_ENTRY = 8; - - protected static final String TABLE_FEEDS = "feeds"; - - private static final String TABLE_ENTRIES = "entries"; - - private static final String ALTER_TABLE = "ALTER TABLE "; - - private static final String ADD = " ADD "; - - private static final String EQUALS_ONE = "=1"; - - public static final String IMAGEFOLDER = Environment.getExternalStorageDirectory()+"/sparserss/images/"; // faster than FOLDER+"images/" - - public static final File IMAGEFOLDER_FILE = new File(IMAGEFOLDER); - - private static final String BACKUPOPML = Environment.getExternalStorageDirectory()+"/sparserss/backup.opml"; - - private static UriMatcher URI_MATCHER; - - private static final String[] PROJECTION_PRIORITY = new String[] {FeedData.FeedColumns.PRIORITY}; - - static { - URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); - URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds", URI_FEEDS); - URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds/#", URI_FEED); - URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds/#/entries", URI_ENTRIES); - URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds/#/entries/#", URI_ENTRY); - URI_MATCHER.addURI(FeedData.AUTHORITY, "entries", URI_ALLENTRIES); - URI_MATCHER.addURI(FeedData.AUTHORITY, "entries/#", URI_ALLENTRIES_ENTRY); - URI_MATCHER.addURI(FeedData.AUTHORITY, "favorites", URI_FAVORITES); - URI_MATCHER.addURI(FeedData.AUTHORITY, "favorites/#", URI_FAVORITES_ENTRY); - } - - private static class DatabaseHelper extends SQLiteOpenHelper { - public DatabaseHelper(Context context, String name, int version) { - super(context, name, null, version); - context.sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); - } - - @Override - public void onCreate(SQLiteDatabase database) { - database.execSQL(createTable(TABLE_FEEDS, FeedData.FeedColumns.COLUMNS, FeedData.FeedColumns.TYPES)); - database.execSQL(createTable(TABLE_ENTRIES, FeedData.EntryColumns.COLUMNS, FeedData.EntryColumns.TYPES)); - - File backupFile = new File(BACKUPOPML); - - if (backupFile.exists()) { - /** Perform an automated import of the backup */ - OPML.importFromFile(backupFile, database); - } - } - - private String createTable(String tableName, String[] columns, String[] types) { - if (tableName == null || columns == null || types == null || types.length != columns.length || types.length == 0) { - throw new IllegalArgumentException("Invalid parameters for creating table "+tableName); - } else { - StringBuilder stringBuilder = new StringBuilder("CREATE TABLE "); - - stringBuilder.append(tableName); - stringBuilder.append(" ("); - for (int n = 0, i = columns.length; n < i; n++) { - if (n > 0) { - stringBuilder.append(", "); - } - stringBuilder.append(columns[n]).append(' ').append(types[n]); - } - return stringBuilder.append(");").toString(); - } - } - - @Override - public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { - if (oldVersion < 2) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.PRIORITY).append(' ').append(FeedData.TYPE_INT).toString()); - } - if (oldVersion < 3) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.FAVORITE).append(' ').append(FeedData.TYPE_BOOLEAN).toString()); - } - if (oldVersion < 4) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.FETCHMODE).append(' ').append(FeedData.TYPE_INT).toString()); - } - if (oldVersion < 5) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.REALLASTUPDATE).append(' ').append(FeedData.TYPE_DATETIME).toString()); - } - if (oldVersion < 6) { - database.execSQL(new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.ALERT_RINGTONE).append(' ').append(FeedData.TYPE_TEXT).toString()); - } - if (oldVersion < 7) { - database.execSQL(new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.OTHER_ALERT_RINGTONE).append(' ').append(FeedData.TYPE_INT).toString()); - } - if (oldVersion < 8) { - database.execSQL(new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.SKIP_ALERT).append(' ').append(FeedData.TYPE_INT).toString()); - } - if (oldVersion < 9) { - Cursor cursor = database.query(TABLE_FEEDS, new String[] {FeedData.FeedColumns._ID}, null, null, null, null, FeedData.FeedColumns._ID); - - int count = 0; - - while (cursor.moveToNext()) { - executeCatchedSQL(database, new StringBuilder("UPDATE ").append(TABLE_FEEDS).append(" SET ").append(FeedData.FeedColumns.PRIORITY).append('=').append(count++).append(" WHERE _ID=").append(cursor.getLong(0)).toString()); - } - cursor.close(); - } - if (oldVersion < 10) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.WIFIONLY).append(' ').append(FeedData.TYPE_BOOLEAN).toString()); - } - // we simply leave the "encoded" column untouched - if (oldVersion < 12) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.ENCLOSURE).append(' ').append(FeedData.TYPE_TEXT).toString()); - } - if (oldVersion < 14) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.GUID).append(' ').append(FeedData.TYPE_TEXT).toString()); - } - if (oldVersion < 15) { - executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.AUTHOR).append(' ').append(FeedData.TYPE_TEXT).toString()); - } - } - - private void executeCatchedSQL(SQLiteDatabase database, String query) { - try { - database.execSQL(query); - } catch (Exception e) { - } - } - - @Override - public synchronized SQLiteDatabase getWritableDatabase() { - File oldDatabaseFile = new File(Environment.getExternalStorageDirectory()+"/sparserss/sparserss.db"); - - if (oldDatabaseFile.exists()) { // get rid of the old structure - SQLiteDatabase newDatabase = super.getWritableDatabase(); - - try { - SQLiteDatabase oldDatabase = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()+"/sparserss/sparserss.db", null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY); - - Cursor cursor = oldDatabase.query(TABLE_ENTRIES, null, null, null, null, null, null); - - newDatabase.beginTransaction(); - - String[] columnNames = cursor.getColumnNames(); - - int i = columnNames.length; - - int[] columnIndices = new int[i]; - - for (int n = 0; n < i; n++) { - columnIndices[n] = cursor.getColumnIndex(columnNames[n]); - } - - - - while (cursor.moveToNext()) { - ContentValues values = new ContentValues(); - - for (int n = 0; n < i; n++) { - if (!cursor.isNull(columnIndices[n])) { - values.put(columnNames[n], cursor.getString(columnIndices[n])); - } - } - - newDatabase.insert(TABLE_ENTRIES, null, values); - } - cursor.close(); - cursor = oldDatabase.query(TABLE_FEEDS, null, null, null, null, null, FeedData.FeedColumns._ID); - columnNames = cursor.getColumnNames(); - i = columnNames.length; - columnIndices = new int[i]; - - for (int n = 0; n < i; n++) { - columnIndices[n] = cursor.getColumnIndex(columnNames[n]); - } - - int count = 0; - - while (cursor.moveToNext()) { - ContentValues values = new ContentValues(); - - for (int n = 0; n < i; n++) { - if (!cursor.isNull(columnIndices[n])) { - if (FeedData.FeedColumns.ICON.equals(columnNames[n])) { - values.put(FeedData.FeedColumns.ICON, cursor.getBlob(columnIndices[n])); - } else { - values.put(columnNames[n], cursor.getString(columnIndices[n])); - } - } - } - values.put(FeedData.FeedColumns.PRIORITY, count++); - newDatabase.insert(TABLE_FEEDS, null, values); - } - cursor.close(); - oldDatabase.close(); - oldDatabaseFile.delete(); - newDatabase.setTransactionSuccessful(); - newDatabase.endTransaction(); - OPML.exportToFile(BACKUPOPML, newDatabase); - } catch (Exception e) { - - } - return newDatabase; - } else { - return super.getWritableDatabase(); - } - } - } - - private DatabaseHelper databaseHelper; - - private String[] MAXPRIORITY = new String[] {"MAX("+FeedData.FeedColumns.PRIORITY+")"}; - - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - int option = URI_MATCHER.match(uri); - - String table = null; - - StringBuilder where = new StringBuilder(); - - SQLiteDatabase database = databaseHelper.getWritableDatabase(); - - switch(option) { - case URI_FEED : { - table = TABLE_FEEDS; - - final String feedId = uri.getPathSegments().get(1); - - new Thread() { - public void run() { - delete(FeedData.EntryColumns.CONTENT_URI(feedId), null, null); - } - }.start(); - - where.append(FeedData.FeedColumns._ID).append('=').append(feedId); - - /** Update the priorities */ - Cursor priorityCursor = database.query(TABLE_FEEDS, PROJECTION_PRIORITY, FeedData.FeedColumns._ID+"="+feedId, null, null, null, null); - - if (priorityCursor.moveToNext()) { - database.execSQL("UPDATE "+TABLE_FEEDS+" SET "+FeedData.FeedColumns.PRIORITY+" = "+FeedData.FeedColumns.PRIORITY+"-1 WHERE "+FeedData.FeedColumns.PRIORITY+" > "+priorityCursor.getInt(0)); - priorityCursor.close(); - } else { - priorityCursor.close(); - } - break; - } - case URI_FEEDS : { - table = TABLE_FEEDS; - break; - } - case URI_ENTRY : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(3)); - break; - } - case URI_ENTRIES : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns.FEED_ID).append('=').append(uri.getPathSegments().get(1)); - break; - } - case URI_ALLENTRIES : { - table = TABLE_ENTRIES; - break; - } - case URI_FAVORITES_ENTRY : - case URI_ALLENTRIES_ENTRY : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(1)); - break; - } - case URI_FAVORITES : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns.FAVORITE).append(EQUALS_ONE); - break; - } - } - - if (!TextUtils.isEmpty(selection)) { - if (where.length() > 0) { - where.append(Strings.DB_AND); - } - where.append(selection); - } - - int count = database.delete(table, where.toString(), selectionArgs); - - if (table == TABLE_FEEDS) { // == is ok here - OPML.exportToFile(BACKUPOPML, database); - } - if (count > 0) { - getContext().getContentResolver().notifyChange(uri, null); - } - return count; - } - - @Override - public String getType(Uri uri) { - int option = URI_MATCHER.match(uri); - - switch(option) { - case URI_FEEDS : return "vnd.android.cursor.dir/vnd.feeddata.feed"; - case URI_FEED : return "vnd.android.cursor.item/vnd.feeddata.feed"; - case URI_FAVORITES : - case URI_ALLENTRIES : - case URI_ENTRIES : return "vnd.android.cursor.dir/vnd.feeddata.entry"; - case URI_FAVORITES_ENTRY : - case URI_ALLENTRIES_ENTRY : - case URI_ENTRY : return "vnd.android.cursor.item/vnd.feeddata.entry"; - default : throw new IllegalArgumentException("Unknown URI: "+uri); - } - } - - @Override - public Uri insert(Uri uri, ContentValues values) { - long newId = -1; - - int option = URI_MATCHER.match(uri); - - SQLiteDatabase database = databaseHelper.getWritableDatabase(); - - switch (option) { - case URI_FEEDS : { - Cursor cursor = database.query(TABLE_FEEDS, MAXPRIORITY, null, null, null, null, null, null); - - if (cursor.moveToNext()) { - values.put(FeedData.FeedColumns.PRIORITY, cursor.getInt(0)+1); - } else { - values.put(FeedData.FeedColumns.PRIORITY, 1); - } - cursor.close(); - newId = database.insert(TABLE_FEEDS, null, values); - OPML.exportToFile(BACKUPOPML, database); - break; - } - case URI_ENTRIES : { - values.put(FeedData.EntryColumns.FEED_ID, uri.getPathSegments().get(1)); - newId = database.insert(TABLE_ENTRIES, null, values); - break; - } - case URI_ALLENTRIES : { - newId = database.insert(TABLE_ENTRIES, null, values); - break; - } - default : throw new IllegalArgumentException("Illegal insert"); - } - if (newId > -1) { - getContext().getContentResolver().notifyChange(uri, null); - return ContentUris.withAppendedId(uri, newId); - } else { - throw new SQLException("Could not insert row into "+uri); - } - } - - @Override - public boolean onCreate() { - try { - File folder = new File(FOLDER); - - folder.mkdir(); // maybe we use the boolean return value later - } catch (Exception e) { - - } - databaseHelper = new DatabaseHelper(getContext(), DATABASE_NAME, DATABASE_VERSION); - return true; - } - - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); - - int option = URI_MATCHER.match(uri); - - if ((option == URI_FEED || option == URI_FEEDS) && sortOrder == null) { - sortOrder = FeedData.FEED_DEFAULTSORTORDER; - } - - switch(option) { - case URI_FEED : { - queryBuilder.setTables(TABLE_FEEDS); - queryBuilder.appendWhere(new StringBuilder(FeedData.FeedColumns._ID).append('=').append(uri.getPathSegments().get(1))); - break; - } - case URI_FEEDS : { - queryBuilder.setTables(TABLE_FEEDS); - break; - } - case URI_ENTRY : { - queryBuilder.setTables(TABLE_ENTRIES); - queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(3))); - break; - } - case URI_ENTRIES : { - queryBuilder.setTables(TABLE_ENTRIES); - queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns.FEED_ID).append('=').append(uri.getPathSegments().get(1))); - break; - } - case URI_ALLENTRIES : { - queryBuilder.setTables("entries join (select name, icon, _id as feed_id from feeds) as F on (entries.feedid = F.feed_id)"); - break; - } - case URI_FAVORITES_ENTRY : - case URI_ALLENTRIES_ENTRY : { - queryBuilder.setTables(TABLE_ENTRIES); - queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(1))); - break; - } - case URI_FAVORITES : { - queryBuilder.setTables("entries join (select name, icon, _id as feed_id from feeds) as F on (entries.feedid = F.feed_id)"); - queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns.FAVORITE).append(EQUALS_ONE)); - break; - } - } - - SQLiteDatabase database = databaseHelper.getReadableDatabase(); - - Cursor cursor = queryBuilder.query(database, projection, selection, selectionArgs, null, null, sortOrder); - - cursor.setNotificationUri(getContext().getContentResolver(), uri); - return cursor; - } - - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - int option = URI_MATCHER.match(uri); - - String table = null; - - StringBuilder where = new StringBuilder(); - - SQLiteDatabase database = databaseHelper.getWritableDatabase(); - - switch(option) { - case URI_FEED : { - table = TABLE_FEEDS; - - long feedId = Long.parseLong(uri.getPathSegments().get(1)); - - where.append(FeedData.FeedColumns._ID).append('=').append(feedId); - if (values != null && values.containsKey(FeedData.FeedColumns.PRIORITY)) { - int newPriority = values.getAsInteger(FeedData.FeedColumns.PRIORITY); - - Cursor priorityCursor = database.query(TABLE_FEEDS, PROJECTION_PRIORITY, FeedData.FeedColumns._ID+"="+feedId, null, null, null, null); - - if (priorityCursor.moveToNext()) { - int oldPriority = priorityCursor.getInt(0); - - priorityCursor.close(); - if (newPriority > oldPriority) { - database.execSQL("UPDATE "+TABLE_FEEDS+" SET "+FeedData.FeedColumns.PRIORITY+" = "+FeedData.FeedColumns.PRIORITY+"-1 WHERE "+FeedData.FeedColumns.PRIORITY+" BETWEEN "+(oldPriority+1)+" AND "+newPriority); - } else if (newPriority < oldPriority) { - database.execSQL("UPDATE "+TABLE_FEEDS+" SET "+FeedData.FeedColumns.PRIORITY+" = "+FeedData.FeedColumns.PRIORITY+"+1 WHERE "+FeedData.FeedColumns.PRIORITY+" BETWEEN "+newPriority+" AND "+(oldPriority-1)); - } - } else { - priorityCursor.close(); - } - } - break; - } - case URI_FEEDS : { - table = TABLE_FEEDS; - // maybe this should be disabled - break; - } - case URI_ENTRY : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(3)); - break; - } - case URI_ENTRIES : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns.FEED_ID).append('=').append(uri.getPathSegments().get(1)); - break; - } - case URI_ALLENTRIES: { - table = TABLE_ENTRIES; - break; - } - case URI_FAVORITES_ENTRY : - case URI_ALLENTRIES_ENTRY : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(1)); - break; - } - case URI_FAVORITES : { - table = TABLE_ENTRIES; - where.append(FeedData.EntryColumns.FAVORITE).append(EQUALS_ONE); - break; - } - } - - if (!TextUtils.isEmpty(selection)) { - if (where.length() > 0) { - where.append(Strings.DB_AND).append(selection); - } else { - where.append(selection); - } - } - - int count = database.update(table, values, where.toString(), selectionArgs); - - if (table == TABLE_FEEDS && (values.containsKey(FeedData.FeedColumns.NAME) || values.containsKey(FeedData.FeedColumns.URL) || values.containsKey(FeedData.FeedColumns.PRIORITY))) { // == is ok here - OPML.exportToFile(BACKUPOPML, database); - } - if (count > 0) { - getContext().getContentResolver().notifyChange(uri, null); - } - return count; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.provider; + +import java.io.File; + +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.SQLException; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteQueryBuilder; +import android.net.Uri; +import android.os.Environment; +import android.text.TextUtils; +import cn.eric.rss.Strings; + +public class FeedDataContentProvider extends ContentProvider { + private static final String FOLDER = Environment.getExternalStorageDirectory()+"/MiniRSS/"; + + private static final String DATABASE_NAME = "MiniRSS.db"; + + private static final int DATABASE_VERSION = 15; + + private static final int URI_FEEDS = 1; + + private static final int URI_FEED = 2; + + private static final int URI_ENTRIES = 3; + + private static final int URI_ENTRY= 4; + + private static final int URI_ALLENTRIES = 5; + + private static final int URI_ALLENTRIES_ENTRY = 6; + + private static final int URI_FAVORITES = 7; + + private static final int URI_FAVORITES_ENTRY = 8; + + protected static final String TABLE_FEEDS = "feeds"; + + private static final String TABLE_ENTRIES = "entries"; + + private static final String ALTER_TABLE = "ALTER TABLE "; + + private static final String ADD = " ADD "; + + private static final String EQUALS_ONE = "=1"; + + public static final String IMAGEFOLDER = Environment.getExternalStorageDirectory()+"/MiniRSS/images/"; // faster than FOLDER+"images/" + + public static final File IMAGEFOLDER_FILE = new File(IMAGEFOLDER); + + private static final String BACKUPOPML = Environment.getExternalStorageDirectory()+"/MiniRSS/backup.opml"; + + private static UriMatcher URI_MATCHER; + + private static final String[] PROJECTION_PRIORITY = new String[] {FeedData.FeedColumns.PRIORITY}; + + static { + URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); + URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds", URI_FEEDS); + URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds/#", URI_FEED); + URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds/#/entries", URI_ENTRIES); + URI_MATCHER.addURI(FeedData.AUTHORITY, "feeds/#/entries/#", URI_ENTRY); + URI_MATCHER.addURI(FeedData.AUTHORITY, "entries", URI_ALLENTRIES); + URI_MATCHER.addURI(FeedData.AUTHORITY, "entries/#", URI_ALLENTRIES_ENTRY); + URI_MATCHER.addURI(FeedData.AUTHORITY, "favorites", URI_FAVORITES); + URI_MATCHER.addURI(FeedData.AUTHORITY, "favorites/#", URI_FAVORITES_ENTRY); + } + + private static class DatabaseHelper extends SQLiteOpenHelper { + public DatabaseHelper(Context context, String name, int version) { + super(context, name, null, version); + context.sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); + } + + @Override + public void onCreate(SQLiteDatabase database) { + database.execSQL(createTable(TABLE_FEEDS, FeedData.FeedColumns.COLUMNS, FeedData.FeedColumns.TYPES)); + database.execSQL(createTable(TABLE_ENTRIES, FeedData.EntryColumns.COLUMNS, FeedData.EntryColumns.TYPES)); + + File backupFile = new File(BACKUPOPML); + + if (backupFile.exists()) { + /** Perform an automated import of the backup */ + OPML.importFromFile(backupFile, database); + } + } + + private String createTable(String tableName, String[] columns, String[] types) { + if (tableName == null || columns == null || types == null || types.length != columns.length || types.length == 0) { + throw new IllegalArgumentException("Invalid parameters for creating table "+tableName); + } else { + StringBuilder stringBuilder = new StringBuilder("CREATE TABLE "); + + stringBuilder.append(tableName); + stringBuilder.append(" ("); + for (int n = 0, i = columns.length; n < i; n++) { + if (n > 0) { + stringBuilder.append(", "); + } + stringBuilder.append(columns[n]).append(' ').append(types[n]); + } + return stringBuilder.append(");").toString(); + } + } + + @Override + public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { + if (oldVersion < 2) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.PRIORITY).append(' ').append(FeedData.TYPE_INT).toString()); + } + if (oldVersion < 3) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.FAVORITE).append(' ').append(FeedData.TYPE_BOOLEAN).toString()); + } + if (oldVersion < 4) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.FETCHMODE).append(' ').append(FeedData.TYPE_INT).toString()); + } + if (oldVersion < 5) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.REALLASTUPDATE).append(' ').append(FeedData.TYPE_DATETIME).toString()); + } + if (oldVersion < 6) { + database.execSQL(new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.ALERT_RINGTONE).append(' ').append(FeedData.TYPE_TEXT).toString()); + } + if (oldVersion < 7) { + database.execSQL(new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.OTHER_ALERT_RINGTONE).append(' ').append(FeedData.TYPE_INT).toString()); + } + if (oldVersion < 8) { + database.execSQL(new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.SKIP_ALERT).append(' ').append(FeedData.TYPE_INT).toString()); + } + if (oldVersion < 9) { + Cursor cursor = database.query(TABLE_FEEDS, new String[] {FeedData.FeedColumns._ID}, null, null, null, null, FeedData.FeedColumns._ID); + + int count = 0; + + while (cursor.moveToNext()) { + executeCatchedSQL(database, new StringBuilder("UPDATE ").append(TABLE_FEEDS).append(" SET ").append(FeedData.FeedColumns.PRIORITY).append('=').append(count++).append(" WHERE _ID=").append(cursor.getLong(0)).toString()); + } + cursor.close(); + } + if (oldVersion < 10) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_FEEDS).append(ADD).append(FeedData.FeedColumns.WIFIONLY).append(' ').append(FeedData.TYPE_BOOLEAN).toString()); + } + // we simply leave the "encoded" column untouched + if (oldVersion < 12) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.ENCLOSURE).append(' ').append(FeedData.TYPE_TEXT).toString()); + } + if (oldVersion < 14) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.GUID).append(' ').append(FeedData.TYPE_TEXT).toString()); + } + if (oldVersion < 15) { + executeCatchedSQL(database, new StringBuilder(ALTER_TABLE).append(TABLE_ENTRIES).append(ADD).append(FeedData.EntryColumns.AUTHOR).append(' ').append(FeedData.TYPE_TEXT).toString()); + } + } + + private void executeCatchedSQL(SQLiteDatabase database, String query) { + try { + database.execSQL(query); + } catch (Exception e) { + } + } + + @Override + public synchronized SQLiteDatabase getWritableDatabase() { + File oldDatabaseFile = new File(Environment.getExternalStorageDirectory()+"/MiniRSS/MiniRSS.db"); + + if (oldDatabaseFile.exists()) { // get rid of the old structure + SQLiteDatabase newDatabase = super.getWritableDatabase(); + + try { + SQLiteDatabase oldDatabase = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()+"/MiniRSS/MiniRSS.db", null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY); + + Cursor cursor = oldDatabase.query(TABLE_ENTRIES, null, null, null, null, null, null); + + newDatabase.beginTransaction(); + + String[] columnNames = cursor.getColumnNames(); + + int i = columnNames.length; + + int[] columnIndices = new int[i]; + + for (int n = 0; n < i; n++) { + columnIndices[n] = cursor.getColumnIndex(columnNames[n]); + } + + + + while (cursor.moveToNext()) { + ContentValues values = new ContentValues(); + + for (int n = 0; n < i; n++) { + if (!cursor.isNull(columnIndices[n])) { + values.put(columnNames[n], cursor.getString(columnIndices[n])); + } + } + + newDatabase.insert(TABLE_ENTRIES, null, values); + } + cursor.close(); + cursor = oldDatabase.query(TABLE_FEEDS, null, null, null, null, null, FeedData.FeedColumns._ID); + columnNames = cursor.getColumnNames(); + i = columnNames.length; + columnIndices = new int[i]; + + for (int n = 0; n < i; n++) { + columnIndices[n] = cursor.getColumnIndex(columnNames[n]); + } + + int count = 0; + + while (cursor.moveToNext()) { + ContentValues values = new ContentValues(); + + for (int n = 0; n < i; n++) { + if (!cursor.isNull(columnIndices[n])) { + if (FeedData.FeedColumns.ICON.equals(columnNames[n])) { + values.put(FeedData.FeedColumns.ICON, cursor.getBlob(columnIndices[n])); + } else { + values.put(columnNames[n], cursor.getString(columnIndices[n])); + } + } + } + values.put(FeedData.FeedColumns.PRIORITY, count++); + newDatabase.insert(TABLE_FEEDS, null, values); + } + cursor.close(); + oldDatabase.close(); + oldDatabaseFile.delete(); + newDatabase.setTransactionSuccessful(); + newDatabase.endTransaction(); + OPML.exportToFile(BACKUPOPML, newDatabase); + } catch (Exception e) { + + } + return newDatabase; + } else { + return super.getWritableDatabase(); + } + } + } + + private DatabaseHelper databaseHelper; + + private String[] MAXPRIORITY = new String[] {"MAX("+FeedData.FeedColumns.PRIORITY+")"}; + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + int option = URI_MATCHER.match(uri); + + String table = null; + + StringBuilder where = new StringBuilder(); + + SQLiteDatabase database = databaseHelper.getWritableDatabase(); + + switch(option) { + case URI_FEED : { + table = TABLE_FEEDS; + + final String feedId = uri.getPathSegments().get(1); + + new Thread() { + public void run() { + delete(FeedData.EntryColumns.CONTENT_URI(feedId), null, null); + } + }.start(); + + where.append(FeedData.FeedColumns._ID).append('=').append(feedId); + + /** Update the priorities */ + Cursor priorityCursor = database.query(TABLE_FEEDS, PROJECTION_PRIORITY, FeedData.FeedColumns._ID+"="+feedId, null, null, null, null); + + if (priorityCursor.moveToNext()) { + database.execSQL("UPDATE "+TABLE_FEEDS+" SET "+FeedData.FeedColumns.PRIORITY+" = "+FeedData.FeedColumns.PRIORITY+"-1 WHERE "+FeedData.FeedColumns.PRIORITY+" > "+priorityCursor.getInt(0)); + priorityCursor.close(); + } else { + priorityCursor.close(); + } + break; + } + case URI_FEEDS : { + table = TABLE_FEEDS; + break; + } + case URI_ENTRY : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(3)); + break; + } + case URI_ENTRIES : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns.FEED_ID).append('=').append(uri.getPathSegments().get(1)); + break; + } + case URI_ALLENTRIES : { + table = TABLE_ENTRIES; + break; + } + case URI_FAVORITES_ENTRY : + case URI_ALLENTRIES_ENTRY : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(1)); + break; + } + case URI_FAVORITES : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns.FAVORITE).append(EQUALS_ONE); + break; + } + } + + if (!TextUtils.isEmpty(selection)) { + if (where.length() > 0) { + where.append(Strings.DB_AND); + } + where.append(selection); + } + + int count = database.delete(table, where.toString(), selectionArgs); + + if (table == TABLE_FEEDS) { // == is ok here + OPML.exportToFile(BACKUPOPML, database); + } + if (count > 0) { + getContext().getContentResolver().notifyChange(uri, null); + } + return count; + } + + @Override + public String getType(Uri uri) { + int option = URI_MATCHER.match(uri); + + switch(option) { + case URI_FEEDS : return "vnd.android.cursor.dir/vnd.feeddata.feed"; + case URI_FEED : return "vnd.android.cursor.item/vnd.feeddata.feed"; + case URI_FAVORITES : + case URI_ALLENTRIES : + case URI_ENTRIES : return "vnd.android.cursor.dir/vnd.feeddata.entry"; + case URI_FAVORITES_ENTRY : + case URI_ALLENTRIES_ENTRY : + case URI_ENTRY : return "vnd.android.cursor.item/vnd.feeddata.entry"; + default : throw new IllegalArgumentException("Unknown URI: "+uri); + } + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + long newId = -1; + + int option = URI_MATCHER.match(uri); + + SQLiteDatabase database = databaseHelper.getWritableDatabase(); + + switch (option) { + case URI_FEEDS : { + Cursor cursor = database.query(TABLE_FEEDS, MAXPRIORITY, null, null, null, null, null, null); + + if (cursor.moveToNext()) { + values.put(FeedData.FeedColumns.PRIORITY, cursor.getInt(0)+1); + } else { + values.put(FeedData.FeedColumns.PRIORITY, 1); + } + cursor.close(); + newId = database.insert(TABLE_FEEDS, null, values); + OPML.exportToFile(BACKUPOPML, database); + break; + } + case URI_ENTRIES : { + values.put(FeedData.EntryColumns.FEED_ID, uri.getPathSegments().get(1)); + newId = database.insert(TABLE_ENTRIES, null, values); + break; + } + case URI_ALLENTRIES : { + newId = database.insert(TABLE_ENTRIES, null, values); + break; + } + default : throw new IllegalArgumentException("Illegal insert"); + } + if (newId > -1) { + getContext().getContentResolver().notifyChange(uri, null); + return ContentUris.withAppendedId(uri, newId); + } else { + throw new SQLException("Could not insert row into "+uri); + } + } + + @Override + public boolean onCreate() { + try { + File folder = new File(FOLDER); + + folder.mkdir(); // maybe we use the boolean return value later + } catch (Exception e) { + + } + databaseHelper = new DatabaseHelper(getContext(), DATABASE_NAME, DATABASE_VERSION); + return true; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); + + int option = URI_MATCHER.match(uri); + + if ((option == URI_FEED || option == URI_FEEDS) && sortOrder == null) { + sortOrder = FeedData.FEED_DEFAULTSORTORDER; + } + + switch(option) { + case URI_FEED : { + queryBuilder.setTables(TABLE_FEEDS); + queryBuilder.appendWhere(new StringBuilder(FeedData.FeedColumns._ID).append('=').append(uri.getPathSegments().get(1))); + break; + } + case URI_FEEDS : { + queryBuilder.setTables(TABLE_FEEDS); + break; + } + case URI_ENTRY : { + queryBuilder.setTables(TABLE_ENTRIES); + queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(3))); + break; + } + case URI_ENTRIES : { + queryBuilder.setTables(TABLE_ENTRIES); + queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns.FEED_ID).append('=').append(uri.getPathSegments().get(1))); + break; + } + case URI_ALLENTRIES : { + queryBuilder.setTables("entries join (select name, icon, _id as feed_id from feeds) as F on (entries.feedid = F.feed_id)"); + break; + } + case URI_FAVORITES_ENTRY : + case URI_ALLENTRIES_ENTRY : { + queryBuilder.setTables(TABLE_ENTRIES); + queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(1))); + break; + } + case URI_FAVORITES : { + queryBuilder.setTables("entries join (select name, icon, _id as feed_id from feeds) as F on (entries.feedid = F.feed_id)"); + queryBuilder.appendWhere(new StringBuilder(FeedData.EntryColumns.FAVORITE).append(EQUALS_ONE)); + break; + } + } + + SQLiteDatabase database = databaseHelper.getReadableDatabase(); + + Cursor cursor = queryBuilder.query(database, projection, selection, selectionArgs, null, null, sortOrder); + + cursor.setNotificationUri(getContext().getContentResolver(), uri); + return cursor; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + int option = URI_MATCHER.match(uri); + + String table = null; + + StringBuilder where = new StringBuilder(); + + SQLiteDatabase database = databaseHelper.getWritableDatabase(); + + switch(option) { + case URI_FEED : { + table = TABLE_FEEDS; + + long feedId = Long.parseLong(uri.getPathSegments().get(1)); + + where.append(FeedData.FeedColumns._ID).append('=').append(feedId); + if (values != null && values.containsKey(FeedData.FeedColumns.PRIORITY)) { + int newPriority = values.getAsInteger(FeedData.FeedColumns.PRIORITY); + + Cursor priorityCursor = database.query(TABLE_FEEDS, PROJECTION_PRIORITY, FeedData.FeedColumns._ID+"="+feedId, null, null, null, null); + + if (priorityCursor.moveToNext()) { + int oldPriority = priorityCursor.getInt(0); + + priorityCursor.close(); + if (newPriority > oldPriority) { + database.execSQL("UPDATE "+TABLE_FEEDS+" SET "+FeedData.FeedColumns.PRIORITY+" = "+FeedData.FeedColumns.PRIORITY+"-1 WHERE "+FeedData.FeedColumns.PRIORITY+" BETWEEN "+(oldPriority+1)+" AND "+newPriority); + } else if (newPriority < oldPriority) { + database.execSQL("UPDATE "+TABLE_FEEDS+" SET "+FeedData.FeedColumns.PRIORITY+" = "+FeedData.FeedColumns.PRIORITY+"+1 WHERE "+FeedData.FeedColumns.PRIORITY+" BETWEEN "+newPriority+" AND "+(oldPriority-1)); + } + } else { + priorityCursor.close(); + } + } + break; + } + case URI_FEEDS : { + table = TABLE_FEEDS; + // maybe this should be disabled + break; + } + case URI_ENTRY : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(3)); + break; + } + case URI_ENTRIES : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns.FEED_ID).append('=').append(uri.getPathSegments().get(1)); + break; + } + case URI_ALLENTRIES: { + table = TABLE_ENTRIES; + break; + } + case URI_FAVORITES_ENTRY : + case URI_ALLENTRIES_ENTRY : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns._ID).append('=').append(uri.getPathSegments().get(1)); + break; + } + case URI_FAVORITES : { + table = TABLE_ENTRIES; + where.append(FeedData.EntryColumns.FAVORITE).append(EQUALS_ONE); + break; + } + } + + if (!TextUtils.isEmpty(selection)) { + if (where.length() > 0) { + where.append(Strings.DB_AND).append(selection); + } else { + where.append(selection); + } + } + + int count = database.update(table, values, where.toString(), selectionArgs); + + if (table == TABLE_FEEDS && (values.containsKey(FeedData.FeedColumns.NAME) || values.containsKey(FeedData.FeedColumns.URL) || values.containsKey(FeedData.FeedColumns.PRIORITY))) { // == is ok here + OPML.exportToFile(BACKUPOPML, database); + } + if (count > 0) { + getContext().getContentResolver().notifyChange(uri, null); + } + return count; + } + +} diff --git a/src/de/shandschuh/sparserss/provider/OPML.java b/src/cn/eric/rss/provider/OPML.java similarity index 96% rename from src/de/shandschuh/sparserss/provider/OPML.java rename to src/cn/eric/rss/provider/OPML.java index c40decb..1b8200b 100644 --- a/src/de/shandschuh/sparserss/provider/OPML.java +++ b/src/cn/eric/rss/provider/OPML.java @@ -1,216 +1,216 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.provider; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.text.TextUtils; -import android.util.Xml; -import de.shandschuh.sparserss.Strings; - -public class OPML { - private static final String START = "Sparse RSS export"; - - private static final String AFTERDATE = ""; - - private static final String OUTLINE_TITLE = ""; - - private static final String CLOSING = "\n"; - - private static OPMLParser parser = new OPMLParser(); - - public static void importFromFile(String filename, Context context) throws FileNotFoundException, IOException, SAXException { - parser.context = context; - parser.database = null; - Xml.parse(new InputStreamReader(new FileInputStream(filename)), parser); - } - - protected static void importFromInputStream(InputStream inputStream, SQLiteDatabase database) { - parser.context = null; - parser.database = database; - try { - database.beginTransaction(); - Xml.parse(new InputStreamReader(inputStream), parser); - - /** This is ok since the database is empty */ - database.execSQL(new StringBuilder("UPDATE ").append(FeedDataContentProvider.TABLE_FEEDS).append(" SET ").append(FeedData.FeedColumns.PRIORITY).append('=').append(FeedData.FeedColumns._ID).append("-1").toString()); - database.setTransactionSuccessful(); - } catch (Exception e) { - - } finally { - database.endTransaction(); - } - } - - protected static void importFromFile(File file, SQLiteDatabase database) { - try { - importFromInputStream(new FileInputStream(file), database); - } catch (FileNotFoundException e) { - // do nothing - } - } - - public static void exportToFile(String filename, Context context) throws IOException { - Cursor cursor = context.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, FeedData.FeedColumns.WIFIONLY}, null, null, null); - - try { - writeData(filename, cursor); - } finally { - cursor.close(); - } - } - - protected static void exportToFile(String filename, SQLiteDatabase database) { - Cursor cursor = database.query(FeedDataContentProvider.TABLE_FEEDS, new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, FeedData.FeedColumns.WIFIONLY}, null, null, null, null, FeedData.FEED_DEFAULTSORTORDER); - - try { - writeData(filename, cursor); - } catch (Exception e) { - - } - cursor.close(); - } - - private static void writeData(String filename, Cursor cursor) throws IOException { - StringBuilder builder = new StringBuilder(START); - - builder.append(System.currentTimeMillis()); - builder.append(AFTERDATE); - - while(cursor.moveToNext()) { - builder.append(OUTLINE_TITLE); - builder.append(cursor.isNull(1) ? Strings.EMPTY : TextUtils.htmlEncode(cursor.getString(1))); - builder.append(OUTLINE_XMLURL); - builder.append(TextUtils.htmlEncode(cursor.getString(2))); - if (cursor.getInt(3) == 1) { - builder.append(OUTLINE_CATEGORY); - builder.append(ATTRIBUTE_CATEGORY_VALUE); - } - builder.append(OUTLINE_CLOSING); - } - builder.append(CLOSING); - - BufferedWriter writer = new BufferedWriter(new FileWriter(filename)); - - writer.write(builder.toString()); - writer.close(); - } - - private static class OPMLParser extends DefaultHandler { - private static final String TAG_BODY = "body"; - - private static final String TAG_OUTLINE = "outline"; - - private static final String ATTRIBUTE_TITLE = "title"; - - private static final String ATTRIBUTE_XMLURL = "xmlUrl"; - - private static final String ATTRIBUTE_CATEGORY = "category"; - - private boolean bodyTagEntered; - - private boolean probablyValidElement = false; - - private Context context; - - private SQLiteDatabase database; - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if (!bodyTagEntered) { - if (TAG_BODY.equals(localName)) { - bodyTagEntered = true; - probablyValidElement = true; - } - } else if (TAG_OUTLINE.equals(localName)) { - String url = attributes.getValue(Strings.EMPTY, ATTRIBUTE_XMLURL); - - if (url != null) { - String title = attributes.getValue(Strings.EMPTY, ATTRIBUTE_TITLE); - - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.URL, url); - values.put(FeedData.FeedColumns.NAME, title != null && title.length() > 0 ? title : null); - values.put(FeedData.FeedColumns.WIFIONLY, ATTRIBUTE_CATEGORY_VALUE.equals(attributes.getValue(Strings.EMPTY, ATTRIBUTE_CATEGORY)) ? 1 : 0); - - if (context != null) { - Cursor cursor = context.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, null, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); - - if (!cursor.moveToFirst()) { - context.getContentResolver().insert(FeedData.FeedColumns.CONTENT_URI, values); - } - cursor.close(); - } else { // this happens only, if the db is new and therefore empty - database.insert(FeedDataContentProvider.TABLE_FEEDS, null, values); - } - } - } - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - if (bodyTagEntered && TAG_BODY.equals(localName)) { - bodyTagEntered = false; - } - } - - @Override - public void endDocument() throws SAXException { - if (!probablyValidElement) { - throw new SAXException(); - } else { - super.endDocument(); - } - } - - - - } -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.provider; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.text.TextUtils; +import android.util.Xml; +import cn.eric.rss.Strings; + +public class OPML { + private static final String START = "Sparse RSS export"; + + private static final String AFTERDATE = ""; + + private static final String OUTLINE_TITLE = ""; + + private static final String CLOSING = "\n"; + + private static OPMLParser parser = new OPMLParser(); + + public static void importFromFile(String filename, Context context) throws FileNotFoundException, IOException, SAXException { + parser.context = context; + parser.database = null; + Xml.parse(new InputStreamReader(new FileInputStream(filename)), parser); + } + + protected static void importFromInputStream(InputStream inputStream, SQLiteDatabase database) { + parser.context = null; + parser.database = database; + try { + database.beginTransaction(); + Xml.parse(new InputStreamReader(inputStream), parser); + + /** This is ok since the database is empty */ + database.execSQL(new StringBuilder("UPDATE ").append(FeedDataContentProvider.TABLE_FEEDS).append(" SET ").append(FeedData.FeedColumns.PRIORITY).append('=').append(FeedData.FeedColumns._ID).append("-1").toString()); + database.setTransactionSuccessful(); + } catch (Exception e) { + + } finally { + database.endTransaction(); + } + } + + protected static void importFromFile(File file, SQLiteDatabase database) { + try { + importFromInputStream(new FileInputStream(file), database); + } catch (FileNotFoundException e) { + // do nothing + } + } + + public static void exportToFile(String filename, Context context) throws IOException { + Cursor cursor = context.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, FeedData.FeedColumns.WIFIONLY}, null, null, null); + + try { + writeData(filename, cursor); + } finally { + cursor.close(); + } + } + + protected static void exportToFile(String filename, SQLiteDatabase database) { + Cursor cursor = database.query(FeedDataContentProvider.TABLE_FEEDS, new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, FeedData.FeedColumns.WIFIONLY}, null, null, null, null, FeedData.FEED_DEFAULTSORTORDER); + + try { + writeData(filename, cursor); + } catch (Exception e) { + + } + cursor.close(); + } + + private static void writeData(String filename, Cursor cursor) throws IOException { + StringBuilder builder = new StringBuilder(START); + + builder.append(System.currentTimeMillis()); + builder.append(AFTERDATE); + + while(cursor.moveToNext()) { + builder.append(OUTLINE_TITLE); + builder.append(cursor.isNull(1) ? Strings.EMPTY : TextUtils.htmlEncode(cursor.getString(1))); + builder.append(OUTLINE_XMLURL); + builder.append(TextUtils.htmlEncode(cursor.getString(2))); + if (cursor.getInt(3) == 1) { + builder.append(OUTLINE_CATEGORY); + builder.append(ATTRIBUTE_CATEGORY_VALUE); + } + builder.append(OUTLINE_CLOSING); + } + builder.append(CLOSING); + + BufferedWriter writer = new BufferedWriter(new FileWriter(filename)); + + writer.write(builder.toString()); + writer.close(); + } + + private static class OPMLParser extends DefaultHandler { + private static final String TAG_BODY = "body"; + + private static final String TAG_OUTLINE = "outline"; + + private static final String ATTRIBUTE_TITLE = "title"; + + private static final String ATTRIBUTE_XMLURL = "xmlUrl"; + + private static final String ATTRIBUTE_CATEGORY = "category"; + + private boolean bodyTagEntered; + + private boolean probablyValidElement = false; + + private Context context; + + private SQLiteDatabase database; + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (!bodyTagEntered) { + if (TAG_BODY.equals(localName)) { + bodyTagEntered = true; + probablyValidElement = true; + } + } else if (TAG_OUTLINE.equals(localName)) { + String url = attributes.getValue(Strings.EMPTY, ATTRIBUTE_XMLURL); + + if (url != null) { + String title = attributes.getValue(Strings.EMPTY, ATTRIBUTE_TITLE); + + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.URL, url); + values.put(FeedData.FeedColumns.NAME, title != null && title.length() > 0 ? title : null); + values.put(FeedData.FeedColumns.WIFIONLY, ATTRIBUTE_CATEGORY_VALUE.equals(attributes.getValue(Strings.EMPTY, ATTRIBUTE_CATEGORY)) ? 1 : 0); + + if (context != null) { + Cursor cursor = context.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, null, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); + + if (!cursor.moveToFirst()) { + context.getContentResolver().insert(FeedData.FeedColumns.CONTENT_URI, values); + } + cursor.close(); + } else { // this happens only, if the db is new and therefore empty + database.insert(FeedDataContentProvider.TABLE_FEEDS, null, values); + } + } + } + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + if (bodyTagEntered && TAG_BODY.equals(localName)) { + bodyTagEntered = false; + } + } + + @Override + public void endDocument() throws SAXException { + if (!probablyValidElement) { + throw new SAXException(); + } else { + super.endDocument(); + } + } + + + + } +} diff --git a/src/de/shandschuh/sparserss/service/FetcherService.java b/src/cn/eric/rss/service/FetcherService.java similarity index 96% rename from src/de/shandschuh/sparserss/service/FetcherService.java rename to src/cn/eric/rss/service/FetcherService.java index 096fd6f..f984596 100644 --- a/src/de/shandschuh/sparserss/service/FetcherService.java +++ b/src/cn/eric/rss/service/FetcherService.java @@ -1,590 +1,590 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.service; -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.URL; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Date; -import java.util.zip.GZIPInputStream; - -import android.app.IntentService; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager.NameNotFoundException; -import android.database.Cursor; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.Uri; -import android.os.IBinder; -import android.os.SystemClock; -import android.preference.PreferenceManager; -import android.util.Xml; -import de.shandschuh.sparserss.BASE64; -import de.shandschuh.sparserss.MainTabActivity; -import de.shandschuh.sparserss.R; -import de.shandschuh.sparserss.Strings; -import de.shandschuh.sparserss.handler.RSSHandler; -import de.shandschuh.sparserss.provider.FeedData; - -public class FetcherService extends IntentService { - private static final int FETCHMODE_DIRECT = 1; - - private static final int FETCHMODE_REENCODE = 2; - - private static final String KEY_USERAGENT = "User-agent"; - - private static final String VALUE_USERAGENT = "Mozilla/5.0"; - - private static final String CHARSET = "charset="; - - private static final String COUNT = "COUNT(*)"; - - private static final String CONTENT_TYPE_TEXT_HTML = "text/html"; - - private static final String LINK_RSS = " feedIds; - public FetchResult(int count, ArrayList feedIds) { - this.count = count; - this.feedIds = feedIds; - } - } - - public FetcherService() { - super(SERVICENAME); - HttpURLConnection.setFollowRedirects(true); - } - - @Override - public void onHandleIntent(Intent intent) { - if (preferences == null) { - try { - preferences = PreferenceManager.getDefaultSharedPreferences(createPackageContext(Strings.PACKAGE, 0)); - } catch (NameNotFoundException e) { - preferences = PreferenceManager.getDefaultSharedPreferences(FetcherService.this); - } - } - - if (intent.getBooleanExtra(Strings.SCHEDULED, false)) { - SharedPreferences.Editor editor = preferences.edit(); - editor.putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, SystemClock.elapsedRealtime()); - editor.commit(); - } - - ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - - final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); - - if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED && intent != null) { - if (preferences.getBoolean(Strings.SETTINGS_PROXYENABLED, false) && (networkInfo.getType() == ConnectivityManager.TYPE_WIFI || !preferences.getBoolean(Strings.SETTINGS_PROXYWIFIONLY, false))) { - try { - proxy = new Proxy(ZERO.equals(preferences.getString(Strings.SETTINGS_PROXYTYPE, ZERO)) ? Proxy.Type.HTTP : Proxy.Type.SOCKS, new InetSocketAddress(preferences.getString(Strings.SETTINGS_PROXYHOST, Strings.EMPTY), Integer.parseInt(preferences.getString(Strings.SETTINGS_PROXYPORT, Strings.DEFAULTPROXYPORT)))); - } catch (Exception e) { - proxy = null; - } - } else { - proxy = null; - } - - FetchResult updates = FetcherService.refreshFeedsStatic(FetcherService.this, intent.getStringExtra(Strings.FEEDID), networkInfo, intent.getBooleanExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, false) || preferences.getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false)); - - if (updates.count > 0) { - if (preferences.getBoolean(Strings.SETTINGS_NOTIFICATIONSENABLED, false)) { - Cursor cursor = getContentResolver().query(FeedData.EntryColumns.CONTENT_URI, new String[] {COUNT}, new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null, null); - - cursor.moveToFirst(); - int newCount = cursor.getInt(0); - cursor.close(); - - String text = new StringBuilder().append(newCount).append(' ').append(getString(R.string.newentries)).toString(); - - Notification notification = new Notification(R.drawable.ic_statusbar_rss, text, System.currentTimeMillis()); - - Intent notificationIntent = new Intent(FetcherService.this, MainTabActivity.class); - - PendingIntent contentIntent = PendingIntent.getActivity(FetcherService.this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - if (preferences.getBoolean(Strings.SETTINGS_NOTIFICATIONSVIBRATE, false)) { - notification.defaults = Notification.DEFAULT_VIBRATE; - } - notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; - notification.ledARGB = 0xffffffff; - notification.ledOnMS = 300; - notification.ledOffMS = 1000; - - StringBuilder ids = new StringBuilder(); - for( String id : updates.feedIds ) { - ids.append(",").append(id); - } - String idList = ids.toString().substring(1); - - // get the ringtone of the feed - // returns an empty cursor, if feed does not override the global one or is silent - Cursor ringCursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, - new String[] {FeedData.FeedColumns.ALERT_RINGTONE}, - FeedData.FeedColumns.OTHER_ALERT_RINGTONE+" = 1" - + " and "+FeedData.FeedColumns._ID+" IN("+idList+")", - null, null); - - String ringtone = null; - while( (ringtone == null || ringtone.length() == 0) && ringCursor.moveToNext() ) { // this one has set custom ringtone to silence, check next - ringtone = ringCursor.getString(0); - } - - if( (ringtone == null || ringtone.length() == 0) && updates.feedIds.size() != ringCursor.getCount()) { // at least one not overridden but the others were all silence - ringtone = preferences.getString(Strings.SETTINGS_NOTIFICATIONSRINGTONE, null); - } - ringCursor.close(); - - if (ringtone != null && ringtone.length() > 0) { - notification.sound = Uri.parse(ringtone); - } - notification.setLatestEventInfo(FetcherService.this, getString(R.string.rss_feeds), text, contentIntent); - notificationManager.notify(0, notification); - } else { - notificationManager.cancel(0); - } - } - } - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - @Override - public void onCreate() { - super.onCreate(); - notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - } - - @Override - public void onDestroy() { - if (MainTabActivity.INSTANCE != null) - MainTabActivity.INSTANCE.setProgressBarIndeterminateVisibility(false); - super.onDestroy(); - } - - private static FetchResult refreshFeedsStatic(Context context, String feedId, NetworkInfo networkInfo, boolean overrideWifiOnly) { - String selection = null; - - if (!overrideWifiOnly && networkInfo.getType() != ConnectivityManager.TYPE_WIFI) { - selection = new StringBuilder(FeedData.FeedColumns.WIFIONLY).append("=0 or ").append(FeedData.FeedColumns.WIFIONLY).append(" IS NULL").toString(); // "IS NOT 1" does not work on 2.1 - } - - Cursor cursor = context.getContentResolver().query(feedId == null ? FeedData.FeedColumns.CONTENT_URI : FeedData.FeedColumns.CONTENT_URI(feedId), null, selection, null, null); // no managed query here - - int urlPosition = cursor.getColumnIndex(FeedData.FeedColumns.URL); - - int idPosition = cursor.getColumnIndex(FeedData.FeedColumns._ID); - - int lastUpdatePosition = cursor.getColumnIndex(FeedData.FeedColumns.REALLASTUPDATE); - - int titlePosition = cursor.getColumnIndex(FeedData.FeedColumns.NAME); - - int fetchmodePosition = cursor.getColumnIndex(FeedData.FeedColumns.FETCHMODE); - - int iconPosition = cursor.getColumnIndex(FeedData.FeedColumns.ICON); - - boolean imposeUserAgent = !preferences.getBoolean(Strings.SETTINGS_STANDARDUSERAGENT, false); - - int skipAlertPosition = cursor.getColumnIndex(FeedData.FeedColumns.SKIP_ALERT); - - boolean followHttpHttpsRedirects = preferences.getBoolean(Strings.SETTINGS_HTTPHTTPSREDIRECTS, false); - - int result = 0; - ArrayList ids = new ArrayList(); - boolean updateWidget = false; - - RSSHandler handler = new RSSHandler(context); - - handler.setEfficientFeedParsing(preferences.getBoolean(Strings.SETTINGS_EFFICIENTFEEDPARSING, true)); - handler.setFetchImages(preferences.getBoolean(Strings.SETTINGS_FETCHPICTURES, false)); - - while(cursor.moveToNext()) { - String id = cursor.getString(idPosition); - - HttpURLConnection connection = null; - - try { - String feedUrl = cursor.getString(urlPosition); - - connection = setupConnection(feedUrl, imposeUserAgent, followHttpHttpsRedirects); - - String contentType = connection.getContentType(); - - int fetchMode = cursor.getInt(fetchmodePosition); - - handler.init(new Date(cursor.getLong(lastUpdatePosition)), id, cursor.getString(titlePosition), feedUrl); - if (fetchMode == 0) { - if (contentType != null && contentType.startsWith(CONTENT_TYPE_TEXT_HTML)) { - BufferedReader reader = new BufferedReader(new InputStreamReader(getConnectionInputStream(connection))); - - String line = null; - - int pos = -1, posStart = -1; - - while ((line = reader.readLine()) != null) { - if (line.indexOf(HTML_BODY) > -1) { - break; - } else { - pos = line.indexOf(LINK_RSS); - - if (pos == -1) { - pos = line.indexOf(LINK_RSS_SLOPPY); - } - if (pos > -1) { - posStart = line.indexOf(HREF, pos); - - if (posStart > -1) { - String url = line.substring(posStart+6, line.indexOf('"', posStart+10)).replace(Strings.AMP_SG, Strings.AMP); - - ContentValues values = new ContentValues(); - - if (url.startsWith(Strings.SLASH)) { - int index = feedUrl.indexOf('/', 8); - - if (index > -1) { - url = feedUrl.substring(0, index)+url; - } else { - url = feedUrl+url; - } - } else if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { - url = new StringBuilder(feedUrl).append('/').append(url).toString(); - } - values.put(FeedData.FeedColumns.URL, url); - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - connection.disconnect(); - connection = setupConnection(url, imposeUserAgent, followHttpHttpsRedirects); - contentType = connection.getContentType(); - break; - } - } - } - } - if (posStart == -1) { // this indicates a badly configured feed - connection.disconnect(); - connection = setupConnection(feedUrl, imposeUserAgent, followHttpHttpsRedirects); - contentType = connection.getContentType(); - } - - } - - if (contentType != null) { - int index = contentType.indexOf(CHARSET); - - if (index > -1) { - int index2 = contentType.indexOf(';', index); - - try { - Xml.findEncodingByName(index2 > -1 ?contentType.substring(index+8, index2) : contentType.substring(index+8)); - fetchMode = FETCHMODE_DIRECT; - } catch (UnsupportedEncodingException usee) { - fetchMode = FETCHMODE_REENCODE; - } - } else { - fetchMode = FETCHMODE_REENCODE; - } - - } else { - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getConnectionInputStream(connection))); - - char[] chars = new char[20]; - - int length = bufferedReader.read(chars); - - String xmlDescription = new String(chars, 0, length); - - connection.disconnect(); - connection = setupConnection(connection.getURL(), imposeUserAgent, followHttpHttpsRedirects); - - int start = xmlDescription != null ? xmlDescription.indexOf(ENCODING) : -1; - - if (start > -1) { - try { - Xml.findEncodingByName(xmlDescription.substring(start+10, xmlDescription.indexOf('"', start+11))); - fetchMode = FETCHMODE_DIRECT; - } catch (UnsupportedEncodingException usee) { - fetchMode = FETCHMODE_REENCODE; - } - } else { - fetchMode = FETCHMODE_DIRECT; // absolutely no encoding information found - } - } - - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.FETCHMODE, fetchMode); - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - } - - /* check and optionally find favicon */ - byte[] iconBytes = cursor.getBlob(iconPosition); - - if (iconBytes == null) { - HttpURLConnection iconURLConnection = setupConnection(new URL(new StringBuilder(connection.getURL().getProtocol()).append(Strings.PROTOCOL_SEPARATOR).append(connection.getURL().getHost()).append(Strings.FILE_FAVICON).toString()), imposeUserAgent, followHttpHttpsRedirects); - - try { - iconBytes = getBytes(getConnectionInputStream(iconURLConnection)); - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.ICON, iconBytes); - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - } catch (Exception e) { - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.ICON, new byte[0]); // no icon found or error - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - } finally { - iconURLConnection.disconnect(); - } - - } - switch (fetchMode) { - default: - case FETCHMODE_DIRECT: { - if (contentType != null) { - int index = contentType.indexOf(CHARSET); - - int index2 = contentType.indexOf(';', index); - - InputStream inputStream = getConnectionInputStream(connection); - - handler.setInputStream(inputStream); - Xml.parse(inputStream, Xml.findEncodingByName(index2 > -1 ?contentType.substring(index+8, index2) : contentType.substring(index+8)), handler); - } else { - InputStreamReader reader = new InputStreamReader(getConnectionInputStream(connection)); - - handler.setReader(reader); - Xml.parse(reader, handler); - } - break; - } - case FETCHMODE_REENCODE: { - ByteArrayOutputStream ouputStream = new ByteArrayOutputStream(); - - InputStream inputStream = getConnectionInputStream(connection); - - byte[] byteBuffer = new byte[4096]; - - int n; - - while ( (n = inputStream.read(byteBuffer)) > 0 ) { - ouputStream.write(byteBuffer, 0, n); - } - - String xmlText = ouputStream.toString(); - - int start = xmlText != null ? xmlText.indexOf(ENCODING) : -1; - - if (start > -1) { - Xml.parse(new StringReader(new String(ouputStream.toByteArray(), xmlText.substring(start+10, xmlText.indexOf('"', start+11)))), handler); - } else { - // use content type - if (contentType != null) { - - int index = contentType.indexOf(CHARSET); - - if (index > -1) { - int index2 = contentType.indexOf(';', index); - - try { - StringReader reader = new StringReader(new String(ouputStream.toByteArray(), index2 > -1 ?contentType.substring(index+8, index2) : contentType.substring(index+8))); - - handler.setReader(reader); - Xml.parse(reader, handler); - } catch (Exception e) { - - } - } else { - StringReader reader = new StringReader(new String(ouputStream.toByteArray())); - - handler.setReader(reader); - Xml.parse(reader, handler); - - } - } - } - break; - } - } - connection.disconnect(); - } catch (FileNotFoundException e) { - if (!handler.isDone() && !handler.isCancelled()) { - ContentValues values = new ContentValues(); - values.put(FeedData.FeedColumns.FETCHMODE, 0); // resets the fetchmode to determine it again later - values.put(FeedData.FeedColumns.ERROR, context.getString(R.string.error_feederror)); - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - } - } catch (Throwable e) { - if (!handler.isDone() && !handler.isCancelled()) { - ContentValues values = new ContentValues(); - values.put(FeedData.FeedColumns.FETCHMODE, 0); // resets the fetchmode to determine it again later - values.put(FeedData.FeedColumns.ERROR, e.getMessage()); - context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); - } - } finally { - if (connection != null) { - connection.disconnect(); - } - } - if( cursor.getInt(skipAlertPosition) != 1 ) { - result += handler.getNewCount(); - if( handler.getNewCount() > 0 ) { - ids.add(handler.getId()); - } - } - - if(!updateWidget && handler.getNewCount() > 0) { - updateWidget = true; - } - } - cursor.close(); - - if (updateWidget) { - context.sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); - } - return new FetchResult(result, ids); - } - - private static final HttpURLConnection setupConnection(String url, boolean imposeUseragent, boolean followHttpHttpsRedirects) throws IOException, NoSuchAlgorithmException, KeyManagementException { - return setupConnection(new URL(url), imposeUseragent, followHttpHttpsRedirects); - } - - private static final HttpURLConnection setupConnection(URL url, boolean imposeUseragent, boolean followHttpHttpsRedirects) throws IOException, NoSuchAlgorithmException, KeyManagementException { - return setupConnection(url, imposeUseragent, followHttpHttpsRedirects, 0); - } - - private static final HttpURLConnection setupConnection(URL url, boolean imposeUseragent, boolean followHttpHttpsRedirects, int cycle) throws IOException, NoSuchAlgorithmException, KeyManagementException { - HttpURLConnection connection = proxy == null ? (HttpURLConnection) url.openConnection() : (HttpURLConnection) url.openConnection(proxy); - - connection.setDoInput(true); - connection.setDoOutput(false); - if (imposeUseragent) { - connection.setRequestProperty(KEY_USERAGENT, VALUE_USERAGENT); // some feeds need this to work properly - } - connection.setConnectTimeout(30000); - connection.setReadTimeout(30000); - connection.setUseCaches(false); - - if (url.getUserInfo() != null) { - connection.setRequestProperty("Authorization", "Basic "+BASE64.encode(url.getUserInfo().getBytes())); - } - connection.setRequestProperty("connection", "close"); // Workaround for android issue 7786 - connection.setRequestProperty("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); - connection.connect(); - - String location = connection.getHeaderField("Location"); - - if (location != null && (url.getProtocol().equals(Strings._HTTP) && location.startsWith(Strings.HTTPS) || url.getProtocol().equals(Strings._HTTPS) && location.startsWith(Strings.HTTP))) { - // if location != null, the system-automatic redirect has failed which indicates a protocol change - if (followHttpHttpsRedirects) { - connection.disconnect(); - - if (cycle < 5) { - return setupConnection(new URL(location), imposeUseragent, followHttpHttpsRedirects, cycle+1); - } else { - throw new IOException("Too many redirects."); - } - } else { - throw new IOException("https<->http redirect - enable in settings"); - } - } - return connection; - } - - public static byte[] getBytes(InputStream inputStream) throws IOException { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - - byte[] buffer = new byte[4096]; - - int n; - - while ((n = inputStream.read(buffer)) > 0) { - output.write(buffer, 0, n); - } - - byte[] result = output.toByteArray(); - - output.close(); - inputStream.close(); - return result; - } - - /** - * This is a small wrapper for getting the properly encoded inputstream if is is gzip compressed - * and not properly recognized. - */ - private static InputStream getConnectionInputStream(HttpURLConnection connection) throws IOException { - InputStream inputStream = connection.getInputStream(); - - if (GZIP.equals(connection.getContentEncoding()) && !(inputStream instanceof GZIPInputStream)) { - return new GZIPInputStream(inputStream); - } else { - return inputStream; - } - } -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.service; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringReader; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Date; +import java.util.zip.GZIPInputStream; + +import android.app.IntentService; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager.NameNotFoundException; +import android.database.Cursor; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.IBinder; +import android.os.SystemClock; +import android.preference.PreferenceManager; +import android.util.Xml; +import cn.eric.rss.BASE64; +import cn.eric.rss.MainTabActivity; +import cn.eric.rss.R; +import cn.eric.rss.Strings; +import cn.eric.rss.handler.RSSHandler; +import cn.eric.rss.provider.FeedData; + +public class FetcherService extends IntentService { + private static final int FETCHMODE_DIRECT = 1; + + private static final int FETCHMODE_REENCODE = 2; + + private static final String KEY_USERAGENT = "User-agent"; + + private static final String VALUE_USERAGENT = "Mozilla/5.0"; + + private static final String CHARSET = "charset="; + + private static final String COUNT = "COUNT(*)"; + + private static final String CONTENT_TYPE_TEXT_HTML = "text/html"; + + private static final String LINK_RSS = " feedIds; + public FetchResult(int count, ArrayList feedIds) { + this.count = count; + this.feedIds = feedIds; + } + } + + public FetcherService() { + super(SERVICENAME); + HttpURLConnection.setFollowRedirects(true); + } + + @Override + public void onHandleIntent(Intent intent) { + if (preferences == null) { + try { + preferences = PreferenceManager.getDefaultSharedPreferences(createPackageContext(Strings.PACKAGE, 0)); + } catch (NameNotFoundException e) { + preferences = PreferenceManager.getDefaultSharedPreferences(FetcherService.this); + } + } + + if (intent.getBooleanExtra(Strings.SCHEDULED, false)) { + SharedPreferences.Editor editor = preferences.edit(); + editor.putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, SystemClock.elapsedRealtime()); + editor.commit(); + } + + ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + + final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); + + if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED && intent != null) { + if (preferences.getBoolean(Strings.SETTINGS_PROXYENABLED, false) && (networkInfo.getType() == ConnectivityManager.TYPE_WIFI || !preferences.getBoolean(Strings.SETTINGS_PROXYWIFIONLY, false))) { + try { + proxy = new Proxy(ZERO.equals(preferences.getString(Strings.SETTINGS_PROXYTYPE, ZERO)) ? Proxy.Type.HTTP : Proxy.Type.SOCKS, new InetSocketAddress(preferences.getString(Strings.SETTINGS_PROXYHOST, Strings.EMPTY), Integer.parseInt(preferences.getString(Strings.SETTINGS_PROXYPORT, Strings.DEFAULTPROXYPORT)))); + } catch (Exception e) { + proxy = null; + } + } else { + proxy = null; + } + + FetchResult updates = FetcherService.refreshFeedsStatic(FetcherService.this, intent.getStringExtra(Strings.FEEDID), networkInfo, intent.getBooleanExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, false) || preferences.getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false)); + + if (updates.count > 0) { + if (preferences.getBoolean(Strings.SETTINGS_NOTIFICATIONSENABLED, false)) { + Cursor cursor = getContentResolver().query(FeedData.EntryColumns.CONTENT_URI, new String[] {COUNT}, new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null, null); + + cursor.moveToFirst(); + int newCount = cursor.getInt(0); + cursor.close(); + + String text = new StringBuilder().append(newCount).append(' ').append(getString(R.string.newentries)).toString(); + + Notification notification = new Notification(R.drawable.ic_statusbar_rss, text, System.currentTimeMillis()); + + Intent notificationIntent = new Intent(FetcherService.this, MainTabActivity.class); + + PendingIntent contentIntent = PendingIntent.getActivity(FetcherService.this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + if (preferences.getBoolean(Strings.SETTINGS_NOTIFICATIONSVIBRATE, false)) { + notification.defaults = Notification.DEFAULT_VIBRATE; + } + notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS; + notification.ledARGB = 0xffffffff; + notification.ledOnMS = 300; + notification.ledOffMS = 1000; + + StringBuilder ids = new StringBuilder(); + for( String id : updates.feedIds ) { + ids.append(",").append(id); + } + String idList = ids.toString().substring(1); + + // get the ringtone of the feed + // returns an empty cursor, if feed does not override the global one or is silent + Cursor ringCursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, + new String[] {FeedData.FeedColumns.ALERT_RINGTONE}, + FeedData.FeedColumns.OTHER_ALERT_RINGTONE+" = 1" + + " and "+FeedData.FeedColumns._ID+" IN("+idList+")", + null, null); + + String ringtone = null; + while( (ringtone == null || ringtone.length() == 0) && ringCursor.moveToNext() ) { // this one has set custom ringtone to silence, check next + ringtone = ringCursor.getString(0); + } + + if( (ringtone == null || ringtone.length() == 0) && updates.feedIds.size() != ringCursor.getCount()) { // at least one not overridden but the others were all silence + ringtone = preferences.getString(Strings.SETTINGS_NOTIFICATIONSRINGTONE, null); + } + ringCursor.close(); + + if (ringtone != null && ringtone.length() > 0) { + notification.sound = Uri.parse(ringtone); + } + notification.setLatestEventInfo(FetcherService.this, getString(R.string.rss_feeds), text, contentIntent); + notificationManager.notify(0, notification); + } else { + notificationManager.cancel(0); + } + } + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + + @Override + public void onDestroy() { + if (MainTabActivity.INSTANCE != null) + MainTabActivity.INSTANCE.setProgressBarIndeterminateVisibility(false); + super.onDestroy(); + } + + private static FetchResult refreshFeedsStatic(Context context, String feedId, NetworkInfo networkInfo, boolean overrideWifiOnly) { + String selection = null; + + if (!overrideWifiOnly && networkInfo.getType() != ConnectivityManager.TYPE_WIFI) { + selection = new StringBuilder(FeedData.FeedColumns.WIFIONLY).append("=0 or ").append(FeedData.FeedColumns.WIFIONLY).append(" IS NULL").toString(); // "IS NOT 1" does not work on 2.1 + } + + Cursor cursor = context.getContentResolver().query(feedId == null ? FeedData.FeedColumns.CONTENT_URI : FeedData.FeedColumns.CONTENT_URI(feedId), null, selection, null, null); // no managed query here + + int urlPosition = cursor.getColumnIndex(FeedData.FeedColumns.URL); + + int idPosition = cursor.getColumnIndex(FeedData.FeedColumns._ID); + + int lastUpdatePosition = cursor.getColumnIndex(FeedData.FeedColumns.REALLASTUPDATE); + + int titlePosition = cursor.getColumnIndex(FeedData.FeedColumns.NAME); + + int fetchmodePosition = cursor.getColumnIndex(FeedData.FeedColumns.FETCHMODE); + + int iconPosition = cursor.getColumnIndex(FeedData.FeedColumns.ICON); + + boolean imposeUserAgent = !preferences.getBoolean(Strings.SETTINGS_STANDARDUSERAGENT, false); + + int skipAlertPosition = cursor.getColumnIndex(FeedData.FeedColumns.SKIP_ALERT); + + boolean followHttpHttpsRedirects = preferences.getBoolean(Strings.SETTINGS_HTTPHTTPSREDIRECTS, false); + + int result = 0; + ArrayList ids = new ArrayList(); + boolean updateWidget = false; + + RSSHandler handler = new RSSHandler(context); + + handler.setEfficientFeedParsing(preferences.getBoolean(Strings.SETTINGS_EFFICIENTFEEDPARSING, true)); + handler.setFetchImages(preferences.getBoolean(Strings.SETTINGS_FETCHPICTURES, false)); + + while(cursor.moveToNext()) { + String id = cursor.getString(idPosition); + + HttpURLConnection connection = null; + + try { + String feedUrl = cursor.getString(urlPosition); + + connection = setupConnection(feedUrl, imposeUserAgent, followHttpHttpsRedirects); + + String contentType = connection.getContentType(); + + int fetchMode = cursor.getInt(fetchmodePosition); + + handler.init(new Date(cursor.getLong(lastUpdatePosition)), id, cursor.getString(titlePosition), feedUrl); + if (fetchMode == 0) { + if (contentType != null && contentType.startsWith(CONTENT_TYPE_TEXT_HTML)) { + BufferedReader reader = new BufferedReader(new InputStreamReader(getConnectionInputStream(connection))); + + String line = null; + + int pos = -1, posStart = -1; + + while ((line = reader.readLine()) != null) { + if (line.indexOf(HTML_BODY) > -1) { + break; + } else { + pos = line.indexOf(LINK_RSS); + + if (pos == -1) { + pos = line.indexOf(LINK_RSS_SLOPPY); + } + if (pos > -1) { + posStart = line.indexOf(HREF, pos); + + if (posStart > -1) { + String url = line.substring(posStart+6, line.indexOf('"', posStart+10)).replace(Strings.AMP_SG, Strings.AMP); + + ContentValues values = new ContentValues(); + + if (url.startsWith(Strings.SLASH)) { + int index = feedUrl.indexOf('/', 8); + + if (index > -1) { + url = feedUrl.substring(0, index)+url; + } else { + url = feedUrl+url; + } + } else if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { + url = new StringBuilder(feedUrl).append('/').append(url).toString(); + } + values.put(FeedData.FeedColumns.URL, url); + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + connection.disconnect(); + connection = setupConnection(url, imposeUserAgent, followHttpHttpsRedirects); + contentType = connection.getContentType(); + break; + } + } + } + } + if (posStart == -1) { // this indicates a badly configured feed + connection.disconnect(); + connection = setupConnection(feedUrl, imposeUserAgent, followHttpHttpsRedirects); + contentType = connection.getContentType(); + } + + } + + if (contentType != null) { + int index = contentType.indexOf(CHARSET); + + if (index > -1) { + int index2 = contentType.indexOf(';', index); + + try { + Xml.findEncodingByName(index2 > -1 ?contentType.substring(index+8, index2) : contentType.substring(index+8)); + fetchMode = FETCHMODE_DIRECT; + } catch (UnsupportedEncodingException usee) { + fetchMode = FETCHMODE_REENCODE; + } + } else { + fetchMode = FETCHMODE_REENCODE; + } + + } else { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getConnectionInputStream(connection))); + + char[] chars = new char[20]; + + int length = bufferedReader.read(chars); + + String xmlDescription = new String(chars, 0, length); + + connection.disconnect(); + connection = setupConnection(connection.getURL(), imposeUserAgent, followHttpHttpsRedirects); + + int start = xmlDescription != null ? xmlDescription.indexOf(ENCODING) : -1; + + if (start > -1) { + try { + Xml.findEncodingByName(xmlDescription.substring(start+10, xmlDescription.indexOf('"', start+11))); + fetchMode = FETCHMODE_DIRECT; + } catch (UnsupportedEncodingException usee) { + fetchMode = FETCHMODE_REENCODE; + } + } else { + fetchMode = FETCHMODE_DIRECT; // absolutely no encoding information found + } + } + + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.FETCHMODE, fetchMode); + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + } + + /* check and optionally find favicon */ + byte[] iconBytes = cursor.getBlob(iconPosition); + + if (iconBytes == null) { + HttpURLConnection iconURLConnection = setupConnection(new URL(new StringBuilder(connection.getURL().getProtocol()).append(Strings.PROTOCOL_SEPARATOR).append(connection.getURL().getHost()).append(Strings.FILE_FAVICON).toString()), imposeUserAgent, followHttpHttpsRedirects); + + try { + iconBytes = getBytes(getConnectionInputStream(iconURLConnection)); + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.ICON, iconBytes); + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + } catch (Exception e) { + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.ICON, new byte[0]); // no icon found or error + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + } finally { + iconURLConnection.disconnect(); + } + + } + switch (fetchMode) { + default: + case FETCHMODE_DIRECT: { + if (contentType != null) { + int index = contentType.indexOf(CHARSET); + + int index2 = contentType.indexOf(';', index); + + InputStream inputStream = getConnectionInputStream(connection); + + handler.setInputStream(inputStream); + Xml.parse(inputStream, Xml.findEncodingByName(index2 > -1 ?contentType.substring(index+8, index2) : contentType.substring(index+8)), handler); + } else { + InputStreamReader reader = new InputStreamReader(getConnectionInputStream(connection)); + + handler.setReader(reader); + Xml.parse(reader, handler); + } + break; + } + case FETCHMODE_REENCODE: { + ByteArrayOutputStream ouputStream = new ByteArrayOutputStream(); + + InputStream inputStream = getConnectionInputStream(connection); + + byte[] byteBuffer = new byte[4096]; + + int n; + + while ( (n = inputStream.read(byteBuffer)) > 0 ) { + ouputStream.write(byteBuffer, 0, n); + } + + String xmlText = ouputStream.toString(); + + int start = xmlText != null ? xmlText.indexOf(ENCODING) : -1; + + if (start > -1) { + Xml.parse(new StringReader(new String(ouputStream.toByteArray(), xmlText.substring(start+10, xmlText.indexOf('"', start+11)))), handler); + } else { + // use content type + if (contentType != null) { + + int index = contentType.indexOf(CHARSET); + + if (index > -1) { + int index2 = contentType.indexOf(';', index); + + try { + StringReader reader = new StringReader(new String(ouputStream.toByteArray(), index2 > -1 ?contentType.substring(index+8, index2) : contentType.substring(index+8))); + + handler.setReader(reader); + Xml.parse(reader, handler); + } catch (Exception e) { + + } + } else { + StringReader reader = new StringReader(new String(ouputStream.toByteArray())); + + handler.setReader(reader); + Xml.parse(reader, handler); + + } + } + } + break; + } + } + connection.disconnect(); + } catch (FileNotFoundException e) { + if (!handler.isDone() && !handler.isCancelled()) { + ContentValues values = new ContentValues(); + values.put(FeedData.FeedColumns.FETCHMODE, 0); // resets the fetchmode to determine it again later + values.put(FeedData.FeedColumns.ERROR, context.getString(R.string.error_feederror)); + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + } + } catch (Throwable e) { + if (!handler.isDone() && !handler.isCancelled()) { + ContentValues values = new ContentValues(); + values.put(FeedData.FeedColumns.FETCHMODE, 0); // resets the fetchmode to determine it again later + values.put(FeedData.FeedColumns.ERROR, e.getMessage()); + context.getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(id), values, null, null); + } + } finally { + if (connection != null) { + connection.disconnect(); + } + } + if( cursor.getInt(skipAlertPosition) != 1 ) { + result += handler.getNewCount(); + if( handler.getNewCount() > 0 ) { + ids.add(handler.getId()); + } + } + + if(!updateWidget && handler.getNewCount() > 0) { + updateWidget = true; + } + } + cursor.close(); + + if (updateWidget) { + context.sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); + } + return new FetchResult(result, ids); + } + + private static final HttpURLConnection setupConnection(String url, boolean imposeUseragent, boolean followHttpHttpsRedirects) throws IOException, NoSuchAlgorithmException, KeyManagementException { + return setupConnection(new URL(url), imposeUseragent, followHttpHttpsRedirects); + } + + private static final HttpURLConnection setupConnection(URL url, boolean imposeUseragent, boolean followHttpHttpsRedirects) throws IOException, NoSuchAlgorithmException, KeyManagementException { + return setupConnection(url, imposeUseragent, followHttpHttpsRedirects, 0); + } + + private static final HttpURLConnection setupConnection(URL url, boolean imposeUseragent, boolean followHttpHttpsRedirects, int cycle) throws IOException, NoSuchAlgorithmException, KeyManagementException { + HttpURLConnection connection = proxy == null ? (HttpURLConnection) url.openConnection() : (HttpURLConnection) url.openConnection(proxy); + + connection.setDoInput(true); + connection.setDoOutput(false); + if (imposeUseragent) { + connection.setRequestProperty(KEY_USERAGENT, VALUE_USERAGENT); // some feeds need this to work properly + } + connection.setConnectTimeout(30000); + connection.setReadTimeout(30000); + connection.setUseCaches(false); + + if (url.getUserInfo() != null) { + connection.setRequestProperty("Authorization", "Basic "+BASE64.encode(url.getUserInfo().getBytes())); + } + connection.setRequestProperty("connection", "close"); // Workaround for android issue 7786 + connection.setRequestProperty("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); + connection.connect(); + + String location = connection.getHeaderField("Location"); + + if (location != null && (url.getProtocol().equals(Strings._HTTP) && location.startsWith(Strings.HTTPS) || url.getProtocol().equals(Strings._HTTPS) && location.startsWith(Strings.HTTP))) { + // if location != null, the system-automatic redirect has failed which indicates a protocol change + if (followHttpHttpsRedirects) { + connection.disconnect(); + + if (cycle < 5) { + return setupConnection(new URL(location), imposeUseragent, followHttpHttpsRedirects, cycle+1); + } else { + throw new IOException("Too many redirects."); + } + } else { + throw new IOException("https<->http redirect - enable in settings"); + } + } + return connection; + } + + public static byte[] getBytes(InputStream inputStream) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + + byte[] buffer = new byte[4096]; + + int n; + + while ((n = inputStream.read(buffer)) > 0) { + output.write(buffer, 0, n); + } + + byte[] result = output.toByteArray(); + + output.close(); + inputStream.close(); + return result; + } + + /** + * This is a small wrapper for getting the properly encoded inputstream if is is gzip compressed + * and not properly recognized. + */ + private static InputStream getConnectionInputStream(HttpURLConnection connection) throws IOException { + InputStream inputStream = connection.getInputStream(); + + if (GZIP.equals(connection.getContentEncoding()) && !(inputStream instanceof GZIPInputStream)) { + return new GZIPInputStream(inputStream); + } else { + return inputStream; + } + } +} diff --git a/src/de/shandschuh/sparserss/service/RefreshService.java b/src/cn/eric/rss/service/RefreshService.java similarity index 95% rename from src/de/shandschuh/sparserss/service/RefreshService.java rename to src/cn/eric/rss/service/RefreshService.java index 2cca32e..ba93bda 100644 --- a/src/de/shandschuh/sparserss/service/RefreshService.java +++ b/src/cn/eric/rss/service/RefreshService.java @@ -1,129 +1,129 @@ -/** - * Sparse rss - * - * Copyright (c) 2010 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.service; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.IBinder; -import android.os.SystemClock; -import android.preference.PreferenceManager; -import de.shandschuh.sparserss.Strings; - -public class RefreshService extends Service { - private static final String SIXTYMINUTES = "3600000"; - - private OnSharedPreferenceChangeListener listener = new OnSharedPreferenceChangeListener() { - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (Strings.SETTINGS_REFRESHINTERVAL.equals(key)) { - restartTimer(false); - } - } - }; - - private Intent refreshBroadcastIntent; - - private AlarmManager alarmManager; - - private PendingIntent timerIntent; - - - - private SharedPreferences preferences = null; - - @Override - public IBinder onBind(Intent intent) { - onRebind(intent); - return null; - } - - @Override - public void onRebind(Intent intent) { - super.onRebind(intent); - } - - @Override - public boolean onUnbind(Intent intent) { - return true; // we want to use rebind - } - - @Override - public void onCreate() { - super.onCreate(); - try { - preferences = PreferenceManager.getDefaultSharedPreferences(createPackageContext(Strings.PACKAGE, 0)); - } catch (NameNotFoundException e) { - preferences = PreferenceManager.getDefaultSharedPreferences(this); - } - - refreshBroadcastIntent = new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.SCHEDULED, true); - alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); - preferences.registerOnSharedPreferenceChangeListener(listener); - restartTimer(true); - } - - private void restartTimer(boolean created) { - if (timerIntent == null) { - timerIntent = PendingIntent.getBroadcast(this, 0, refreshBroadcastIntent, 0); - } else { - alarmManager.cancel(timerIntent); - } - - int time = 3600000; - - try { - time = Math.max(60000, Integer.parseInt(preferences.getString(Strings.SETTINGS_REFRESHINTERVAL, SIXTYMINUTES))); - } catch (Exception exception) { - - } - - long initialRefreshTime = SystemClock.elapsedRealtime() + 10000; - - if (created) { - long lastRefresh = preferences.getLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0); - - if (lastRefresh > 0) { - // this indicates a service restart by the system - initialRefreshTime = Math.max(SystemClock.elapsedRealtime() + 10000, lastRefresh+time); - } - } - - alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, initialRefreshTime, time, timerIntent); - } - - @Override - public void onDestroy() { - if (timerIntent != null) { - alarmManager.cancel(timerIntent); - } - preferences.unregisterOnSharedPreferenceChangeListener(listener); - super.onDestroy(); - } -} +/** + * Sparse rss + * + * Copyright (c) 2010 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.service; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.IBinder; +import android.os.SystemClock; +import android.preference.PreferenceManager; +import cn.eric.rss.Strings; + +public class RefreshService extends Service { + private static final String SIXTYMINUTES = "3600000"; + + private OnSharedPreferenceChangeListener listener = new OnSharedPreferenceChangeListener() { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (Strings.SETTINGS_REFRESHINTERVAL.equals(key)) { + restartTimer(false); + } + } + }; + + private Intent refreshBroadcastIntent; + + private AlarmManager alarmManager; + + private PendingIntent timerIntent; + + + + private SharedPreferences preferences = null; + + @Override + public IBinder onBind(Intent intent) { + onRebind(intent); + return null; + } + + @Override + public void onRebind(Intent intent) { + super.onRebind(intent); + } + + @Override + public boolean onUnbind(Intent intent) { + return true; // we want to use rebind + } + + @Override + public void onCreate() { + super.onCreate(); + try { + preferences = PreferenceManager.getDefaultSharedPreferences(createPackageContext(Strings.PACKAGE, 0)); + } catch (NameNotFoundException e) { + preferences = PreferenceManager.getDefaultSharedPreferences(this); + } + + refreshBroadcastIntent = new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.SCHEDULED, true); + alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); + preferences.registerOnSharedPreferenceChangeListener(listener); + restartTimer(true); + } + + private void restartTimer(boolean created) { + if (timerIntent == null) { + timerIntent = PendingIntent.getBroadcast(this, 0, refreshBroadcastIntent, 0); + } else { + alarmManager.cancel(timerIntent); + } + + int time = 3600000; + + try { + time = Math.max(60000, Integer.parseInt(preferences.getString(Strings.SETTINGS_REFRESHINTERVAL, SIXTYMINUTES))); + } catch (Exception exception) { + + } + + long initialRefreshTime = SystemClock.elapsedRealtime() + 10000; + + if (created) { + long lastRefresh = preferences.getLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0); + + if (lastRefresh > 0) { + // this indicates a service restart by the system + initialRefreshTime = Math.max(SystemClock.elapsedRealtime() + 10000, lastRefresh+time); + } + } + + alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, initialRefreshTime, time, timerIntent); + } + + @Override + public void onDestroy() { + if (timerIntent != null) { + alarmManager.cancel(timerIntent); + } + preferences.unregisterOnSharedPreferenceChangeListener(listener); + super.onDestroy(); + } +} diff --git a/src/de/shandschuh/sparserss/widget/ColorPickerDialogPreference.java b/src/cn/eric/rss/widget/ColorPickerDialogPreference.java similarity index 94% rename from src/de/shandschuh/sparserss/widget/ColorPickerDialogPreference.java rename to src/cn/eric/rss/widget/ColorPickerDialogPreference.java index 4b899e8..d323fc4 100644 --- a/src/de/shandschuh/sparserss/widget/ColorPickerDialogPreference.java +++ b/src/cn/eric/rss/widget/ColorPickerDialogPreference.java @@ -1,112 +1,112 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.widget; - -import android.content.Context; -import android.preference.DialogPreference; -import android.util.AttributeSet; -import android.view.View; -import android.widget.SeekBar; -import android.widget.SeekBar.OnSeekBarChangeListener; -import de.shandschuh.sparserss.R; - -public class ColorPickerDialogPreference extends DialogPreference { - private SeekBar redSeekBar; - - private SeekBar greenSeekBar; - - private SeekBar blueSeekBar; - - private SeekBar transparencySeekBar; - - int color; - - public ColorPickerDialogPreference(Context context, AttributeSet attrs) { - super(context, attrs); - color = SparseRSSAppWidgetProvider.STANDARD_BACKGROUND; - } - - @Override - protected View onCreateDialogView() { - final View view = super.onCreateDialogView(); - - view.setBackgroundColor(color); - - redSeekBar = (SeekBar) view.findViewById(R.id.seekbar_red); - greenSeekBar = (SeekBar) view.findViewById(R.id.seekbar_green); - blueSeekBar = (SeekBar) view.findViewById(R.id.seekbar_blue); - transparencySeekBar = (SeekBar) view.findViewById(R.id.seekbar_transparency); - - int _color = color; - - transparencySeekBar.setProgress(((_color / 0x01000000)*100)/255); - _color %= 0x01000000; - redSeekBar.setProgress(((_color / 0x00010000)*100)/255); - _color %= 0x00010000; - greenSeekBar.setProgress(((_color / 0x00000100)*100)/255); - _color %= 0x00000100; - blueSeekBar.setProgress((_color*100)/255); - - OnSeekBarChangeListener onSeekBarChangeListener = new OnSeekBarChangeListener() { - - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - int red = (redSeekBar.getProgress()*255) / 100; - - int green = (greenSeekBar.getProgress()*255) / 100; - - int blue = (blueSeekBar.getProgress()*255) / 100; - - int transparency = (transparencySeekBar.getProgress()*255) / 100; - - color = transparency*0x01000000 + red*0x00010000 + green*0x00000100 + blue; - view.setBackgroundColor(color); - } - - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - public void onStopTrackingTouch(SeekBar seekBar) { - - } - }; - - redSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); - greenSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); - blueSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); - transparencySeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); - return view; - } - - @Override - protected void onDialogClosed(boolean positiveResult) { - if (positiveResult) { - persistInt(color); - } - super.onDialogClosed(positiveResult); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.widget; + +import android.content.Context; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.view.View; +import android.widget.SeekBar; +import android.widget.SeekBar.OnSeekBarChangeListener; +import cn.eric.rss.R; + +public class ColorPickerDialogPreference extends DialogPreference { + private SeekBar redSeekBar; + + private SeekBar greenSeekBar; + + private SeekBar blueSeekBar; + + private SeekBar transparencySeekBar; + + int color; + + public ColorPickerDialogPreference(Context context, AttributeSet attrs) { + super(context, attrs); + color = MiniRSSAppWidgetProvider.STANDARD_BACKGROUND; + } + + @Override + protected View onCreateDialogView() { + final View view = super.onCreateDialogView(); + + view.setBackgroundColor(color); + + redSeekBar = (SeekBar) view.findViewById(R.id.seekbar_red); + greenSeekBar = (SeekBar) view.findViewById(R.id.seekbar_green); + blueSeekBar = (SeekBar) view.findViewById(R.id.seekbar_blue); + transparencySeekBar = (SeekBar) view.findViewById(R.id.seekbar_transparency); + + int _color = color; + + transparencySeekBar.setProgress(((_color / 0x01000000)*100)/255); + _color %= 0x01000000; + redSeekBar.setProgress(((_color / 0x00010000)*100)/255); + _color %= 0x00010000; + greenSeekBar.setProgress(((_color / 0x00000100)*100)/255); + _color %= 0x00000100; + blueSeekBar.setProgress((_color*100)/255); + + OnSeekBarChangeListener onSeekBarChangeListener = new OnSeekBarChangeListener() { + + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + int red = (redSeekBar.getProgress()*255) / 100; + + int green = (greenSeekBar.getProgress()*255) / 100; + + int blue = (blueSeekBar.getProgress()*255) / 100; + + int transparency = (transparencySeekBar.getProgress()*255) / 100; + + color = transparency*0x01000000 + red*0x00010000 + green*0x00000100 + blue; + view.setBackgroundColor(color); + } + + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }; + + redSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); + greenSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); + blueSeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); + transparencySeekBar.setOnSeekBarChangeListener(onSeekBarChangeListener); + return view; + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + if (positiveResult) { + persistInt(color); + } + super.onDialogClosed(positiveResult); + } + +} diff --git a/src/de/shandschuh/sparserss/widget/SparseRSSAppWidgetProvider.java b/src/cn/eric/rss/widget/MiniRSSAppWidgetProvider.java similarity index 91% rename from src/de/shandschuh/sparserss/widget/SparseRSSAppWidgetProvider.java rename to src/cn/eric/rss/widget/MiniRSSAppWidgetProvider.java index 9c43379..339da0c 100644 --- a/src/de/shandschuh/sparserss/widget/SparseRSSAppWidgetProvider.java +++ b/src/cn/eric/rss/widget/MiniRSSAppWidgetProvider.java @@ -1,136 +1,136 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.widget; - -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.view.View; -import android.widget.RemoteViews; -import de.shandschuh.sparserss.MainTabActivity; -import de.shandschuh.sparserss.R; -import de.shandschuh.sparserss.Strings; -import de.shandschuh.sparserss.provider.FeedData; - -public class SparseRSSAppWidgetProvider extends AppWidgetProvider { - private static final String LIMIT = " limit "; - - private static final int[] IDS = {R.id.news_1, R.id.news_2, R.id.news_3, R.id.news_4, R.id.news_5, R.id.news_6, R.id.news_7, R.id.news_8, R.id.news_9, R.id.news_10}; - - private static final int[] ICON_IDS = {R.id.news_icon_1, R.id.news_icon_2, R.id.news_icon_3, R.id.news_icon_4, R.id.news_icon_5, R.id.news_icon_6, R.id.news_icon_7, R.id.news_icon_8, R.id.news_icon_9, R.id.news_icon_10}; - - public static final int STANDARD_BACKGROUND = 0x7c000000; - - @Override - public void onReceive(Context context, Intent intent) { - AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - - onUpdate(context, appWidgetManager, appWidgetManager.getAppWidgetIds(new ComponentName(context, SparseRSSAppWidgetProvider.class))); - } - - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - SharedPreferences preferences = context.getSharedPreferences(SparseRSSAppWidgetProvider.class.getName(), 0); - - for (int n = 0, i = appWidgetIds.length; n < i; n++) { - updateAppWidget(context, appWidgetManager, appWidgetIds[n], preferences.getBoolean(appWidgetIds[n]+".hideread", false), preferences.getString(appWidgetIds[n]+".entrycount", "10"), preferences.getString(appWidgetIds[n]+".feeds", Strings.EMPTY), preferences.getInt(appWidgetIds[n]+".background", STANDARD_BACKGROUND)); - } - } - - static void updateAppWidget(Context context, int appWidgetId, boolean hideRead, String entryCount, String feedIds, int backgroundColor) { - updateAppWidget(context, AppWidgetManager.getInstance(context), appWidgetId, hideRead, entryCount, feedIds, backgroundColor); - } - - private static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean hideRead, String entryCount, String feedIds, int backgroundColor) { - StringBuilder selection = new StringBuilder(); - - if (hideRead) { - selection.append(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL); - } - - if (feedIds.length() > 0) { - if (selection.length() > 0) { - selection.append(Strings.DB_AND); - } - selection.append(FeedData.EntryColumns.FEED_ID).append(" IN ("+feedIds).append(')'); - } - - Cursor cursor = context.getContentResolver().query(FeedData.EntryColumns.CONTENT_URI, new String[] {FeedData.EntryColumns.TITLE, FeedData.EntryColumns._ID, FeedData.FeedColumns.ICON}, selection.toString(), null, new StringBuilder(FeedData.EntryColumns.DATE).append(Strings.DB_DESC).append(LIMIT).append(entryCount).toString()); - - RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.homescreenwidget); - - views.setOnClickPendingIntent(R.id.feed_icon, PendingIntent.getActivity(context, 0, new Intent(context, MainTabActivity.class), 0)); - - int k = 0; - - while (cursor.moveToNext() && k < IDS.length) { - views.setViewVisibility(IDS[k], View.VISIBLE); - if (!cursor.isNull(2)) { - try { - byte[] iconBytes = cursor.getBlob(2); - - if (iconBytes != null && iconBytes.length > 0) { - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - - if (bitmap != null) { - views.setBitmap(ICON_IDS[k], "setImageBitmap", bitmap); - views.setViewVisibility(ICON_IDS[k], View.VISIBLE); - views.setTextViewText(IDS[k], " "+cursor.getString(0)); // bad style - } else { - views.setViewVisibility(ICON_IDS[k], View.GONE); - views.setTextViewText(IDS[k], cursor.getString(0)); - } - } else { - views.setViewVisibility(ICON_IDS[k], View.GONE); - views.setTextViewText(IDS[k], cursor.getString(0)); - } - } catch (Throwable e) { - views.setViewVisibility(ICON_IDS[k], View.GONE); - views.setTextViewText(IDS[k], cursor.getString(0)); - } - } else { - views.setViewVisibility(ICON_IDS[k], View.GONE); - views.setTextViewText(IDS[k], cursor.getString(0)); - } - views.setOnClickPendingIntent(IDS[k++], PendingIntent.getActivity(context, 0, new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.ENTRY_CONTENT_URI(cursor.getString(1))), PendingIntent.FLAG_CANCEL_CURRENT)); - } - cursor.close(); - for (; k < IDS.length; k++) { - views.setViewVisibility(ICON_IDS[k], View.GONE); - views.setViewVisibility(IDS[k], View.GONE); - views.setTextViewText(IDS[k], Strings.EMPTY); - } - views.setInt(R.id.widgetlayout, "setBackgroundColor", backgroundColor); - appWidgetManager.updateAppWidget(appWidgetId, views); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.widget; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.view.View; +import android.widget.RemoteViews; +import cn.eric.rss.MainTabActivity; +import cn.eric.rss.R; +import cn.eric.rss.Strings; +import cn.eric.rss.provider.FeedData; + +public class MiniRSSAppWidgetProvider extends AppWidgetProvider { + private static final String LIMIT = " limit "; + + private static final int[] IDS = {R.id.news_1, R.id.news_2, R.id.news_3, R.id.news_4, R.id.news_5, R.id.news_6, R.id.news_7, R.id.news_8, R.id.news_9, R.id.news_10}; + + private static final int[] ICON_IDS = {R.id.news_icon_1, R.id.news_icon_2, R.id.news_icon_3, R.id.news_icon_4, R.id.news_icon_5, R.id.news_icon_6, R.id.news_icon_7, R.id.news_icon_8, R.id.news_icon_9, R.id.news_icon_10}; + + public static final int STANDARD_BACKGROUND = 0x7c000000; + + @Override + public void onReceive(Context context, Intent intent) { + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); + + onUpdate(context, appWidgetManager, appWidgetManager.getAppWidgetIds(new ComponentName(context, MiniRSSAppWidgetProvider.class))); + } + + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + SharedPreferences preferences = context.getSharedPreferences(MiniRSSAppWidgetProvider.class.getName(), 0); + + for (int n = 0, i = appWidgetIds.length; n < i; n++) { + updateAppWidget(context, appWidgetManager, appWidgetIds[n], preferences.getBoolean(appWidgetIds[n]+".hideread", false), preferences.getString(appWidgetIds[n]+".entrycount", "10"), preferences.getString(appWidgetIds[n]+".feeds", Strings.EMPTY), preferences.getInt(appWidgetIds[n]+".background", STANDARD_BACKGROUND)); + } + } + + static void updateAppWidget(Context context, int appWidgetId, boolean hideRead, String entryCount, String feedIds, int backgroundColor) { + updateAppWidget(context, AppWidgetManager.getInstance(context), appWidgetId, hideRead, entryCount, feedIds, backgroundColor); + } + + private static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean hideRead, String entryCount, String feedIds, int backgroundColor) { + StringBuilder selection = new StringBuilder(); + + if (hideRead) { + selection.append(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL); + } + + if (feedIds.length() > 0) { + if (selection.length() > 0) { + selection.append(Strings.DB_AND); + } + selection.append(FeedData.EntryColumns.FEED_ID).append(" IN ("+feedIds).append(')'); + } + + Cursor cursor = context.getContentResolver().query(FeedData.EntryColumns.CONTENT_URI, new String[] {FeedData.EntryColumns.TITLE, FeedData.EntryColumns._ID, FeedData.FeedColumns.ICON}, selection.toString(), null, new StringBuilder(FeedData.EntryColumns.DATE).append(Strings.DB_DESC).append(LIMIT).append(entryCount).toString()); + + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.homescreenwidget); + + views.setOnClickPendingIntent(R.id.feed_icon, PendingIntent.getActivity(context, 0, new Intent(context, MainTabActivity.class), 0)); + + int k = 0; + + while (cursor.moveToNext() && k < IDS.length) { + views.setViewVisibility(IDS[k], View.VISIBLE); + if (!cursor.isNull(2)) { + try { + byte[] iconBytes = cursor.getBlob(2); + + if (iconBytes != null && iconBytes.length > 0) { + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + + if (bitmap != null) { + views.setBitmap(ICON_IDS[k], "setImageBitmap", bitmap); + views.setViewVisibility(ICON_IDS[k], View.VISIBLE); + views.setTextViewText(IDS[k], " "+cursor.getString(0)); // bad style + } else { + views.setViewVisibility(ICON_IDS[k], View.GONE); + views.setTextViewText(IDS[k], cursor.getString(0)); + } + } else { + views.setViewVisibility(ICON_IDS[k], View.GONE); + views.setTextViewText(IDS[k], cursor.getString(0)); + } + } catch (Throwable e) { + views.setViewVisibility(ICON_IDS[k], View.GONE); + views.setTextViewText(IDS[k], cursor.getString(0)); + } + } else { + views.setViewVisibility(ICON_IDS[k], View.GONE); + views.setTextViewText(IDS[k], cursor.getString(0)); + } + views.setOnClickPendingIntent(IDS[k++], PendingIntent.getActivity(context, 0, new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.ENTRY_CONTENT_URI(cursor.getString(1))), PendingIntent.FLAG_CANCEL_CURRENT)); + } + cursor.close(); + for (; k < IDS.length; k++) { + views.setViewVisibility(ICON_IDS[k], View.GONE); + views.setViewVisibility(IDS[k], View.GONE); + views.setTextViewText(IDS[k], Strings.EMPTY); + } + views.setInt(R.id.widgetlayout, "setBackgroundColor", backgroundColor); + appWidgetManager.updateAppWidget(appWidgetId, views); + } + +} diff --git a/src/de/shandschuh/sparserss/widget/WidgetConfigActivity.java b/src/cn/eric/rss/widget/WidgetConfigActivity.java similarity index 91% rename from src/de/shandschuh/sparserss/widget/WidgetConfigActivity.java rename to src/cn/eric/rss/widget/WidgetConfigActivity.java index 2c405de..670e674 100644 --- a/src/de/shandschuh/sparserss/widget/WidgetConfigActivity.java +++ b/src/cn/eric/rss/widget/WidgetConfigActivity.java @@ -1,142 +1,142 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package de.shandschuh.sparserss.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.view.View; -import android.view.View.OnClickListener; -import de.shandschuh.sparserss.R; -import de.shandschuh.sparserss.provider.FeedData; - -public class WidgetConfigActivity extends PreferenceActivity { - private int widgetId; - - private static final String NAMECOLUMN = new StringBuilder("ifnull(").append(FeedData.FeedColumns.NAME).append(',').append(FeedData.FeedColumns.URL).append(") as title").toString(); - - public static final String ZERO = "0"; - - @Override - protected void onCreate(Bundle bundle) { - super.onCreate(bundle); - setResult(RESULT_CANCELED); - - Bundle extras = getIntent().getExtras(); - - if (extras != null) { - widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - } - if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { - finish(); - } - addPreferencesFromResource(R.layout.widgetpreferences); - setContentView(R.layout.widgetconfig); - - final ListPreference entryCountPreference = (ListPreference) findPreference("widget.entrycount"); - - final PreferenceCategory feedsPreferenceCategory = (PreferenceCategory) findPreference("widget.visiblefeeds"); - - - Cursor cursor = this.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID, NAMECOLUMN}, null, null, null); - - if (cursor.moveToFirst()) { - int[] ids = new int[cursor.getCount()+1]; - - CheckBoxPreference checkboxPreference = new CheckBoxPreference(this); - - checkboxPreference.setTitle(R.string.all_feeds); - feedsPreferenceCategory.addPreference(checkboxPreference); - checkboxPreference.setKey(ZERO); - checkboxPreference.setDisableDependentsState(true); - ids[0] = 0; - for (int n = 1; !cursor.isAfterLast(); cursor.moveToNext(), n++) { - checkboxPreference = new CheckBoxPreference(this); - checkboxPreference.setTitle(cursor.getString(1)); - ids[n] = cursor.getInt(0); - checkboxPreference.setKey(Integer.toString(ids[n])); - feedsPreferenceCategory.addPreference(checkboxPreference); - checkboxPreference.setDependency(ZERO); - } - cursor.close(); - - findViewById(R.id.save_button).setOnClickListener(new OnClickListener() { - public void onClick(View view) { - SharedPreferences.Editor preferences = getSharedPreferences(SparseRSSAppWidgetProvider.class.getName(), 0).edit(); - - boolean hideRead = false;//((CheckBoxPreference) getPreferenceManager().findPreference("widget.hideread")).isChecked(); - - preferences.putBoolean(widgetId+".hideread", hideRead); - - StringBuilder builder = new StringBuilder(); - - for (int n = 0, i = feedsPreferenceCategory.getPreferenceCount(); n < i; n++) { - CheckBoxPreference preference = (CheckBoxPreference) feedsPreferenceCategory.getPreference(n); - - if (preference.isChecked()) { - if (n == 0) { - break; - } else { - if (builder.length() > 0) { - builder.append(','); - } - builder.append(preference.getKey()); - } - } - } - - String feedIds = builder.toString(); - - String entryCount = entryCountPreference.getValue(); - - preferences.putString(widgetId+".feeds", feedIds); - preferences.putString(widgetId+".entrycount", entryCount); - - int color = getPreferenceManager().getSharedPreferences().getInt("widget.background", SparseRSSAppWidgetProvider.STANDARD_BACKGROUND); - - preferences.putInt(widgetId+".background", color); - preferences.commit(); - - SparseRSSAppWidgetProvider.updateAppWidget(WidgetConfigActivity.this, widgetId, hideRead, entryCount, feedIds, color); - setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); - finish(); - } - }); - } else { - // no feeds found --> use all feeds, no dialog needed - cursor.close(); - setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); - } - } - - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceCategory; +import android.view.View; +import android.view.View.OnClickListener; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class WidgetConfigActivity extends PreferenceActivity { + private int widgetId; + + private static final String NAMECOLUMN = new StringBuilder("ifnull(").append(FeedData.FeedColumns.NAME).append(',').append(FeedData.FeedColumns.URL).append(") as title").toString(); + + public static final String ZERO = "0"; + + @Override + protected void onCreate(Bundle bundle) { + super.onCreate(bundle); + setResult(RESULT_CANCELED); + + Bundle extras = getIntent().getExtras(); + + if (extras != null) { + widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + } + if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { + finish(); + } + addPreferencesFromResource(R.layout.widgetpreferences); + setContentView(R.layout.widgetconfig); + + final ListPreference entryCountPreference = (ListPreference) findPreference("widget.entrycount"); + + final PreferenceCategory feedsPreferenceCategory = (PreferenceCategory) findPreference("widget.visiblefeeds"); + + + Cursor cursor = this.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID, NAMECOLUMN}, null, null, null); + + if (cursor.moveToFirst()) { + int[] ids = new int[cursor.getCount()+1]; + + CheckBoxPreference checkboxPreference = new CheckBoxPreference(this); + + checkboxPreference.setTitle(R.string.all_feeds); + feedsPreferenceCategory.addPreference(checkboxPreference); + checkboxPreference.setKey(ZERO); + checkboxPreference.setDisableDependentsState(true); + ids[0] = 0; + for (int n = 1; !cursor.isAfterLast(); cursor.moveToNext(), n++) { + checkboxPreference = new CheckBoxPreference(this); + checkboxPreference.setTitle(cursor.getString(1)); + ids[n] = cursor.getInt(0); + checkboxPreference.setKey(Integer.toString(ids[n])); + feedsPreferenceCategory.addPreference(checkboxPreference); + checkboxPreference.setDependency(ZERO); + } + cursor.close(); + + findViewById(R.id.save_button).setOnClickListener(new OnClickListener() { + public void onClick(View view) { + SharedPreferences.Editor preferences = getSharedPreferences(MiniRSSAppWidgetProvider.class.getName(), 0).edit(); + + boolean hideRead = false;//((CheckBoxPreference) getPreferenceManager().findPreference("widget.hideread")).isChecked(); + + preferences.putBoolean(widgetId+".hideread", hideRead); + + StringBuilder builder = new StringBuilder(); + + for (int n = 0, i = feedsPreferenceCategory.getPreferenceCount(); n < i; n++) { + CheckBoxPreference preference = (CheckBoxPreference) feedsPreferenceCategory.getPreference(n); + + if (preference.isChecked()) { + if (n == 0) { + break; + } else { + if (builder.length() > 0) { + builder.append(','); + } + builder.append(preference.getKey()); + } + } + } + + String feedIds = builder.toString(); + + String entryCount = entryCountPreference.getValue(); + + preferences.putString(widgetId+".feeds", feedIds); + preferences.putString(widgetId+".entrycount", entryCount); + + int color = getPreferenceManager().getSharedPreferences().getInt("widget.background", MiniRSSAppWidgetProvider.STANDARD_BACKGROUND); + + preferences.putInt(widgetId+".background", color); + preferences.commit(); + + MiniRSSAppWidgetProvider.updateAppWidget(WidgetConfigActivity.this, widgetId, hideRead, entryCount, feedIds, color); + setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); + finish(); + } + }); + } else { + // no feeds found --> use all feeds, no dialog needed + cursor.close(); + setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); + } + } + + +} From fb705a9d9d7a60ea7fa0275bba9dcf71605385f1 Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Wed, 13 Mar 2013 14:47:34 +0800 Subject: [PATCH 02/19] change project name --- res/values-zh/strings.xml | 508 +++++----- res/values/strings.xml | 508 +++++----- src/cn/eric/rss/MainTabActivity.java | 588 +++++------ src/cn/eric/rss/RSSOverview.java | 1401 +++++++++++++++----------- 4 files changed, 1594 insertions(+), 1411 deletions(-) diff --git a/res/values-zh/strings.xml b/res/values-zh/strings.xml index e717310..6cfc903 100644 --- a/res/values-zh/strings.xml +++ b/res/values-zh/strings.xml @@ -1,254 +1,254 @@ - - - - Sparse RSS订阅 - 添加订阅 - 没有订阅 - 没有新鲜事 - 刷新 - 删除 - 收藏 - - 编辑订阅 - 新建订阅 - 编辑 - 刷新 - 设置 - 标记为已读 - 标记为未读 - 隐藏已读条目 - 显示已读条目 - 将链接复制到剪贴板 - 删除已读条目 - 删除所有条目 - 重置更新日期 - 全部标记为已读 - 从OPML文件导入设置 - 将设置导出到OPML文件 - 关于 - 启用新鲜事排序 - 禁用新鲜事排序 - 分享 - - - Copyright © 2010-2012 Stefan Handschuh (handschuh.stefan@googlemail.com)\n\n - Translators\n - - Dutch: Eelko Berkenpies\n - - Spanish: Sergio Martín\n - - Russian: Igor Nedoboy\n - - Swedish: Lars m - \n\nPermission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - \n\n - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - \n\n - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - Additional contributors (other translations and code):\n\n - a very nice person that wants to be unnamed (French and Turkish translations)\n - - another nice unnamed person (Japanese translation)\n - - Joel Low (several patches [refresh spinner, UI adjustments and more]); see commit log for details - This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/MiniRSS - Additional contributors >> - << License - - 自动刷新 - 启用 - 控制所有新鲜事的自动刷新 - 刷新间隔 - 两次自动刷新之间的间隔时间 - - 提示 - 新鲜事有更新时的提示效果 - 铃声 - 选择新鲜事有更新时的铃声 - 震动 - 新鲜事有更新时是否要震动 - - 内容展示 - 未读内容优先 - 将未读内容显示在已读内容的上方 - 新鲜事的保存时间 - 比规定时间更旧的新鲜事将被删除 - 禁用图片 - 不加载或显示任何图片 - 下载图片 - 下载所有图片并保存到本地 - 清新主题 - 使用淡色调的主题(程序将自动重启) - 白底黑字 - 将新鲜事以白底黑字的风格来显示 - 字体大小 - 单条新鲜事的字体大小 - 手势 - 使用手势来切换新鲜事 - - 启动时刷新 - 打开软件时自动刷新新鲜事 - - 覆盖 \"仅在wifi下刷新\" - 允许手动刷新 \"仅在wifi下刷新\" 的新鲜事 - - 附件下载警告 - 打开过下载附件时显示警告 - - 隐藏已读新鲜事 - 隐藏已读新鲜事 - 新鲜事设置 - 可见的新鲜事 - 新鲜事数量 - 显示的新鲜事数量 - 背景 - 背景的颜色和透明度 - 显示标签 - \"收藏 \"和 \"所有 \"标签 - - 网络 - 标准用户代理 - 使用标准的用户代理名称 - 采用 http <-> https 重定向 - 自动采用http到https(反之亦然)的重定向 - 高效新鲜事解析 - 自动停止对过于陈旧的新鲜事进行解析 - 仅wifi - 只对wifi应用代理 - 主机 - 端口 - 类型 - - 从不 - 更新 - :\u00A0 - 未读 - 新的新鲜事 - RSS订阅 - 错误 - 优先级 - 选择订阅 - 所有订阅 - 全部 - 概观 - kb - - 订阅的网址无法被访问. - 网址已存在. - 选中的文件不能被导入. - 导出失败,请确保您已加载了可写入的SD卡. - 选中的文件无效,无法被导入. - SD卡不可用. - - 网址 - (可选) - (网站或订阅) - 标题 - 选择文件 (SD-root) - 仅在wifi下刷新 - 变更日志 - - - 绿 - - 透明度 - - 其他设置 - 自定义订阅铃声 - 启用: 使用下面定义的铃声 - 禁用: 使用设置中定义的铃声 - 选择铃声 - 略过提醒 - 启用: 有新鲜事时不提示 - 禁用: 有新鲜事时提示 - - Do you really want to delete this feed and all of its entries? - Do you really want to refresh this feed while not being on wifi? - Are you sure? - Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! - - Disabling this option causes more traffic. - - Accept - Decline - Always ok for all - - Exported into %s. - - License - Hint - - - 1 minute - 5 minutes - 15 minutes - 30 minutes - 1 hour - 2 hours - 6 hours - 12 hours - 1 day - - - - 1 day - 2 days - 4 days - 1 week - 2 weeks - 1 month - 2 months - 3 months - Forever - - - - Standard - +1 - +2 - +3 - - - - HTTP - SOCKS - - - Read feed data - Allows the application to read Sparse RSS feeds and entries. - Write feed data - Allows the application to write Sparse RSS feeds and entries. - + + + + RSS极速阅读器 + 添加订阅 + 没有订阅 + 没有新鲜事 + 刷新 + 删除 + 收藏 + + 编辑订阅 + 新建订阅 + 编辑 + 刷新 + 设置 + 标记为已读 + 标记为未读 + 隐藏已读条目 + 显示已读条目 + 将链接复制到剪贴板 + 删除已读条目 + 删除所有条目 + 重置更新日期 + 全部标记为已读 + 从OPML文件导入设置 + 将设置导出到OPML文件 + 关于 + 启用新鲜事排序 + 禁用新鲜事排序 + 分享 + + + Copyright © 2010-2012 Stefan Handschuh (handschuh.stefan@googlemail.com)\n\n + Translators\n + - Dutch: Eelko Berkenpies\n + - Spanish: Sergio Martín\n + - Russian: Igor Nedoboy\n + - Swedish: Lars m + \n\nPermission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + \n\n + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + \n\n + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Additional contributors (other translations and code):\n\n - a very nice person that wants to be unnamed (French and Turkish translations)\n + - another nice unnamed person (Japanese translation)\n + - Joel Low (several patches [refresh spinner, UI adjustments and more]); see commit log for details + This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/MiniRSS + Additional contributors >> + << License + + 自动刷新 + 启用 + 控制所有新鲜事的自动刷新 + 刷新间隔 + 两次自动刷新之间的间隔时间 + + 提示 + 新鲜事有更新时的提示效果 + 铃声 + 选择新鲜事有更新时的铃声 + 震动 + 新鲜事有更新时是否要震动 + + 内容展示 + 未读内容优先 + 将未读内容显示在已读内容的上方 + 新鲜事的保存时间 + 比规定时间更旧的新鲜事将被删除 + 禁用图片 + 不加载或显示任何图片 + 下载图片 + 下载所有图片并保存到本地 + 清新主题 + 使用淡色调的主题(程序将自动重启) + 白底黑字 + 将新鲜事以白底黑字的风格来显示 + 字体大小 + 单条新鲜事的字体大小 + 手势 + 使用手势来切换新鲜事 + + 启动时刷新 + 打开软件时自动刷新新鲜事 + + 覆盖 \"仅在wifi下刷新\" + 允许手动刷新 \"仅在wifi下刷新\" 的新鲜事 + + 附件下载警告 + 打开过下载附件时显示警告 + + 隐藏已读新鲜事 + 隐藏已读新鲜事 + 新鲜事设置 + 可见的新鲜事 + 新鲜事数量 + 显示的新鲜事数量 + 背景 + 背景的颜色和透明度 + 显示标签 + \"收藏 \"和 \"所有 \"标签 + + 网络 + 标准用户代理 + 使用标准的用户代理名称 + 采用 http <-> https 重定向 + 自动采用http到https(反之亦然)的重定向 + 高效新鲜事解析 + 自动停止对过于陈旧的新鲜事进行解析 + 仅wifi + 只对wifi应用代理 + 主机 + 端口 + 类型 + + 从不 + 更新 + :\u00A0 + 未读 + 新的新鲜事 + RSS订阅 + 错误 + 优先级 + 选择订阅 + 所有订阅 + 全部 + 概观 + kb + + 订阅的网址无法被访问. + 网址已存在. + 选中的文件不能被导入. + 导出失败,请确保您已加载了可写入的SD卡. + 选中的文件无效,无法被导入. + SD卡不可用. + + 网址 + (可选) + (网站或订阅) + 标题 + 选择文件 (SD-root) + 仅在wifi下刷新 + 变更日志 + + + 绿 + + 透明度 + + 其他设置 + 自定义订阅铃声 + 启用: 使用下面定义的铃声 + 禁用: 使用设置中定义的铃声 + 选择铃声 + 略过提醒 + 启用: 有新鲜事时不提示 + 禁用: 有新鲜事时提示 + + Do you really want to delete this feed and all of its entries? + Do you really want to refresh this feed while not being on wifi? + Are you sure? + Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! + + Disabling this option causes more traffic. + + Accept + Decline + Always ok for all + + Exported into %s. + + License + Hint + + + 1 minute + 5 minutes + 15 minutes + 30 minutes + 1 hour + 2 hours + 6 hours + 12 hours + 1 day + + + + 1 day + 2 days + 4 days + 1 week + 2 weeks + 1 month + 2 months + 3 months + Forever + + + + Standard + +1 + +2 + +3 + + + + HTTP + SOCKS + + + Read feed data + Allows the application to read Sparse RSS feeds and entries. + Write feed data + Allows the application to write Sparse RSS feeds and entries. + diff --git a/res/values/strings.xml b/res/values/strings.xml index 5d4a821..d613ffd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,254 +1,254 @@ - - - - Sparse rss - Add feed - No RSS feeds - No entries - Refresh - Delete - Favorites - - Edit feed - New feed - Edit - Refresh - Settings - Mark as read - Mark as unread - Hide read entries - Show read entries - Copy link into clipboard - Delete read entries - Delete all entries - Reset update-date - Mark all as read - Import from OPML - Export to OPML - About - Enable feed sort - Disable feed sort - Share - - - Copyright © 2010-2012 Stefan Handschuh (handschuh.stefan@googlemail.com)\n\n - Translators\n - - Dutch: Eelko Berkenpies\n - - Spanish: Sergio Martín\n - - Russian: Igor Nedoboy\n - - Swedish: Lars m - \n\nPermission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - \n\n - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - \n\n - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - Additional contributors (other translations and code):\n\n - a very nice person that wants to be unnamed (French and Turkish translations)\n - - another nice unnamed person (Japanese translation)\n - - Joel Low (several patches [refresh spinner, UI adjustments and more]); see commit log for details - This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/MiniRSS - Additional contributors >> - << License - - Automated refresh - Enabled - This setting controls the automatic refresh of all feeds - Refresh interval - Interval between two automated refreshes - - Notifications - Controls the appearance of notifications in case of new feed content - Ringtone - Select a ringtone that will be played on new feed content - Vibrate - Controls if there will be vibration on new feed content - - Content presentation - Prioritize unread content - Show unread feed entries above read entries - Time that the entries will be kept - The entries that are older than the given date will be deleted - Disable pictures - Do not show and load any pictures - Download pictures - Download all pictures and store them locally - Light theme - Use the light theme (application will be restarted) - Black text on white background - Present rss entries in black text on white background - Font size - Font size for single entries - Gestures - Use gestures to switch entries - - Refresh feeds on open - Refreshes all feeds after opening the application - - Override \"refresh on wifi only\" - Allow manual refreshing of single \"wifi-only\" feeds - - Enclosure download warning - Show warning before opening opening/downloading attached files - - Hide read entries - Hide entries from the widget if they have been read - Entry settings - Visible feeds - Entry count - Number of entries that are shown in the widget - Background - Color and transparency of the widget background - Show tabs - Additional tabs for favorite and all feed-entries - - Network - Standard user-agent - Use the standard user-agent name - Follow http <-> https redirects - Automatically follow http to https and vice versa redirects - Efficient feed parsing - Parsing the feed will be stopped automatically on existing or too old articles - Wifi only - Use Proxy only for wifi - Host - Port - Type - - never - Update - :\u00A0 - unread - new entries - RSS feeds - Error - Priority - Select feeds - All feeds (incl. future) - All - Overview - kb - - The Feed URL could not accessed. - The URL already exists. - The selected file could not be imported. - The export has failed. Make sure you have a writable SD-card mounted. - The selected file is not valid for import. - The external storage (e.g. SD-card) is not available. - - URL - (optional) - (website or feed) - Title - Select file (SD-root) - Refresh only over Wifi - Changelog - - Red - Green - Blue - Transparency - - Additional settings - Custom feed ringtone - Enabled: Use ringtone defined below - Disabled: Use ringtone defined in settings - Choose ringtone - Skip alerts - Enabled: Do NOT notify on updates - Disabled: Notify on updates - - Do you really want to delete this feed and all of its entries? - Do you really want to refresh this feed while not being on wifi? - Are you sure? - Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! - - Disabling this option causes more traffic. - - Accept - Decline - Always ok for all - - Exported into %s. - - License - Hint - - - 1 minute - 5 minutes - 15 minutes - 30 minutes - 1 hour - 2 hours - 6 hours - 12 hours - 1 day - - - - 1 day - 2 days - 4 days - 1 week - 2 weeks - 1 month - 2 months - 3 months - Forever - - - - Standard - +1 - +2 - +3 - - - - HTTP - SOCKS - - - Read feed data - Allows the application to read Sparse RSS feeds and entries. - Write feed data - Allows the application to write Sparse RSS feeds and entries. - + + + + RSS Quick Reader + Add feed + No RSS feeds + No entries + Refresh + Delete + Favorites + + Edit feed + New feed + Edit + Refresh + Settings + Mark as read + Mark as unread + Hide read entries + Show read entries + Copy link into clipboard + Delete read entries + Delete all entries + Reset update-date + Mark all as read + Import from OPML + Export to OPML + About + Enable feed sort + Disable feed sort + Share + + + Copyright © 2010-2012 Stefan Handschuh (handschuh.stefan@googlemail.com)\n\n + Translators\n + - Dutch: Eelko Berkenpies\n + - Spanish: Sergio Martín\n + - Russian: Igor Nedoboy\n + - Swedish: Lars m + \n\nPermission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + \n\n + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + \n\n + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Additional contributors (other translations and code):\n\n - a very nice person that wants to be unnamed (French and Turkish translations)\n + - another nice unnamed person (Japanese translation)\n + - Joel Low (several patches [refresh spinner, UI adjustments and more]); see commit log for details + This software is distributed under the MIT open source license and its source code is available under http://code.google.com/p/MiniRSS + Additional contributors >> + << License + + Automated refresh + Enabled + This setting controls the automatic refresh of all feeds + Refresh interval + Interval between two automated refreshes + + Notifications + Controls the appearance of notifications in case of new feed content + Ringtone + Select a ringtone that will be played on new feed content + Vibrate + Controls if there will be vibration on new feed content + + Content presentation + Prioritize unread content + Show unread feed entries above read entries + Time that the entries will be kept + The entries that are older than the given date will be deleted + Disable pictures + Do not show and load any pictures + Download pictures + Download all pictures and store them locally + Light theme + Use the light theme (application will be restarted) + Black text on white background + Present rss entries in black text on white background + Font size + Font size for single entries + Gestures + Use gestures to switch entries + + Refresh feeds on open + Refreshes all feeds after opening the application + + Override \"refresh on wifi only\" + Allow manual refreshing of single \"wifi-only\" feeds + + Enclosure download warning + Show warning before opening opening/downloading attached files + + Hide read entries + Hide entries from the widget if they have been read + Entry settings + Visible feeds + Entry count + Number of entries that are shown in the widget + Background + Color and transparency of the widget background + Show tabs + Additional tabs for favorite and all feed-entries + + Network + Standard user-agent + Use the standard user-agent name + Follow http <-> https redirects + Automatically follow http to https and vice versa redirects + Efficient feed parsing + Parsing the feed will be stopped automatically on existing or too old articles + Wifi only + Use Proxy only for wifi + Host + Port + Type + + never + Update + :\u00A0 + unread + new entries + RSS feeds + Error + Priority + Select feeds + All feeds (incl. future) + All + Overview + kb + + The Feed URL could not accessed. + The URL already exists. + The selected file could not be imported. + The export has failed. Make sure you have a writable SD-card mounted. + The selected file is not valid for import. + The external storage (e.g. SD-card) is not available. + + URL + (optional) + (website or feed) + Title + Select file (SD-root) + Refresh only over Wifi + Changelog + + Red + Green + Blue + Transparency + + Additional settings + Custom feed ringtone + Enabled: Use ringtone defined below + Disabled: Use ringtone defined in settings + Choose ringtone + Skip alerts + Enabled: Do NOT notify on updates + Disabled: Notify on updates + + Do you really want to delete this feed and all of its entries? + Do you really want to refresh this feed while not being on wifi? + Are you sure? + Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! + + Disabling this option causes more traffic. + + Accept + Decline + Always ok for all + + Exported into %s. + + License + Hint + + + 1 minute + 5 minutes + 15 minutes + 30 minutes + 1 hour + 2 hours + 6 hours + 12 hours + 1 day + + + + 1 day + 2 days + 4 days + 1 week + 2 weeks + 1 month + 2 months + 3 months + Forever + + + + Standard + +1 + +2 + +3 + + + + HTTP + SOCKS + + + Read feed data + Allows the application to read Sparse RSS feeds and entries. + Write feed data + Allows the application to write Sparse RSS feeds and entries. + diff --git a/src/cn/eric/rss/MainTabActivity.java b/src/cn/eric/rss/MainTabActivity.java index 3102b0f..95fdf07 100644 --- a/src/cn/eric/rss/MainTabActivity.java +++ b/src/cn/eric/rss/MainTabActivity.java @@ -1,294 +1,294 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import android.app.Activity; -import android.app.ActivityManager; -import android.app.ActivityManager.RunningServiceInfo; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.TabActivity; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnKeyListener; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences.Editor; -import android.os.Build; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.Window; -import android.widget.ScrollView; -import android.widget.TabHost; -import android.widget.TabHost.OnTabChangeListener; -import android.widget.TextView; -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; -import cn.eric.rss.service.FetcherService; - -public class MainTabActivity extends TabActivity { - private static final int DIALOG_LICENSEAGREEMENT = 0; - - private boolean tabsAdded; - - private static final String TAG_NORMAL = "normal"; - - private static final String TAG_ALL = "all"; - - private static final String TAG_FAVORITE = "favorite"; - - public static MainTabActivity INSTANCE; - - public static final boolean POSTGINGERBREAD = !Build.VERSION.RELEASE.startsWith("1") && - !Build.VERSION.RELEASE.startsWith("2"); // this way around is future save - - - private static Boolean LIGHTTHEME; - - public static boolean isLightTheme(Context context) { - if (LIGHTTHEME == null) { - LIGHTTHEME = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_LIGHTTHEME, false); - } - return LIGHTTHEME; - } - - private Menu menu; - - private BroadcastReceiver refreshReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - setProgressBarIndeterminateVisibility(true); - } - }; - - private boolean hasContent; - - public void onCreate(Bundle savedInstanceState) { - if (isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - super.onCreate(savedInstanceState); - - //We need to display progress information - requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - - setContentView(R.layout.tabs); - INSTANCE = this; - hasContent = false; - if (getPreferences(MODE_PRIVATE).getBoolean(Strings.PREFERENCE_LICENSEACCEPTED, false)) { - setContent(); - } else { - /* Workaround for android issue 4499 on 1.5 devices */ - getTabHost().addTab(getTabHost().newTabSpec(Strings.EMPTY).setIndicator(Strings.EMPTY).setContent(new Intent(this, EmptyActivity.class))); - - showDialog(DIALOG_LICENSEAGREEMENT); - } - } - - @Override - protected void onResume() - { - super.onResume(); - setProgressBarIndeterminateVisibility(isCurrentlyRefreshing()); - registerReceiver(refreshReceiver, new IntentFilter("cn.eric.rss.REFRESH")); - } - - @Override - protected void onPause() - { - unregisterReceiver(refreshReceiver); - super.onPause(); - } - - @Override - protected Dialog onCreateDialog(int id) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.dialog_licenseagreement); - builder.setNegativeButton(R.string.button_decline, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - finish(); - } - }); - builder.setPositiveButton(R.string.button_accept, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - Editor editor = getPreferences(MODE_PRIVATE).edit(); - - editor.putBoolean(Strings.PREFERENCE_LICENSEACCEPTED, true); - editor.commit(); - - /* Part of workaround for android issue 4499 on 1.5 devices */ - getTabHost().clearAllTabs(); - - /* we only want to invoke actions if the license is accepted */ - setContent(); - } - }); - setupLicenseText(builder); - builder.setOnKeyListener(new OnKeyListener() { - public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - dialog.cancel(); - finish(); - } - return true; - } - }); - return builder.create(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - this.menu = menu; - - Activity activity = getCurrentActivity(); - - if (hasContent && activity != null) { - return activity.onCreateOptionsMenu(menu); - } else { - menu.add(Strings.EMPTY); // to let the menu be available - return true; - } - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - Activity activity = getCurrentActivity(); - - if (hasContent && activity != null) { - return activity.onMenuItemSelected(featureId, item); - } else { - return super.onMenuItemSelected(featureId, item); - } - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - Activity activity = getCurrentActivity(); - - if (hasContent && activity != null) { - return activity.onPrepareOptionsMenu(menu); - } else { - return super.onPrepareOptionsMenu(menu); - } - } - - private void setContent() { - TabHost tabHost = getTabHost(); - - tabHost.addTab(tabHost.newTabSpec(TAG_NORMAL).setIndicator(getString(R.string.overview)).setContent(new Intent().setClass(this, RSSOverview.class))); - hasContent = true; - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_SHOWTABS, false)) { - tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); - - tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true).putExtra(EntriesListActivity.EXTRA_AUTORELOAD, true))); - tabsAdded = true; - getTabWidget().setVisibility(View.VISIBLE); - } - if (POSTGINGERBREAD) { - /* Change the menu also on ICS when tab is changed */ - tabHost.setOnTabChangedListener(new OnTabChangeListener() { - public void onTabChanged(String tabId) { - if (menu != null) { - menu.clear(); - onCreateOptionsMenu(menu); - } - } - }); - if (menu != null) { - menu.clear(); - onCreateOptionsMenu(menu); - } - } - } - - public void setTabWidgetVisible(boolean visible) { - if (visible) { - if (!tabsAdded) { - TabHost tabHost = getTabHost(); - - tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); - tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); - tabsAdded = true; - } - getTabWidget().setVisibility(View.VISIBLE); - } else { - getTabWidget().setVisibility(View.GONE); - } - - } - - void setupLicenseText(AlertDialog.Builder builder) { - View view = getLayoutInflater().inflate(R.layout.license, null); - - final TextView textView = (TextView) view.findViewById(R.id.license_text); - - textView.setTextColor(textView.getTextColors().getDefaultColor()); // disables color change on selection - textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); - - final TextView contributorsTextView = (TextView) view.findViewById(R.id.contributors_togglebutton); - - contributorsTextView.setOnClickListener(new OnClickListener() { - boolean showingLicense = true; - - @Override - public void onClick(View view) { - if (showingLicense) { - textView.setText(R.string.contributors_list); - contributorsTextView.setText(R.string.license_word); - } else { - textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); - contributorsTextView.setText(R.string.contributors); - } - showingLicense = !showingLicense; - } - - }); - builder.setView(view); - } - - private boolean isCurrentlyRefreshing() - { - ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); - for (RunningServiceInfo service: manager.getRunningServices(Integer.MAX_VALUE)) { - if (FetcherService.class.getName().equals(service.service.getClassName())) { - return true; - } - } - return false; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningServiceInfo; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.TabActivity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnKeyListener; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences.Editor; +import android.os.Build; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.Window; +import android.widget.ScrollView; +import android.widget.TabHost; +import android.widget.TabHost.OnTabChangeListener; +import android.widget.TextView; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; +import cn.eric.rss.service.FetcherService; + +public class MainTabActivity extends TabActivity { + private static final int DIALOG_LICENSEAGREEMENT = 0; + + private boolean tabsAdded; + + private static final String TAG_NORMAL = "normal"; + + private static final String TAG_ALL = "all"; + + private static final String TAG_FAVORITE = "favorite"; + + public static MainTabActivity INSTANCE; + + public static final boolean POSTGINGERBREAD = !Build.VERSION.RELEASE.startsWith("1") && + !Build.VERSION.RELEASE.startsWith("2"); // this way around is future save + + + private static Boolean LIGHTTHEME; + + public static boolean isLightTheme(Context context) { + if (LIGHTTHEME == null) { + LIGHTTHEME = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_LIGHTTHEME, true); + } + return LIGHTTHEME; + } + + private Menu menu; + + private BroadcastReceiver refreshReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + setProgressBarIndeterminateVisibility(true); + } + }; + + private boolean hasContent; + + public void onCreate(Bundle savedInstanceState) { + if (isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + super.onCreate(savedInstanceState); + + //We need to display progress information + requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + + setContentView(R.layout.tabs); + INSTANCE = this; + hasContent = false; + if (getPreferences(MODE_PRIVATE).getBoolean(Strings.PREFERENCE_LICENSEACCEPTED, false)) { + setContent(); + } else { + /* Workaround for android issue 4499 on 1.5 devices */ + getTabHost().addTab(getTabHost().newTabSpec(Strings.EMPTY).setIndicator(Strings.EMPTY).setContent(new Intent(this, EmptyActivity.class))); + + showDialog(DIALOG_LICENSEAGREEMENT); + } + } + + @Override + protected void onResume() + { + super.onResume(); + setProgressBarIndeterminateVisibility(isCurrentlyRefreshing()); + registerReceiver(refreshReceiver, new IntentFilter("cn.eric.rss.REFRESH")); + } + + @Override + protected void onPause() + { + unregisterReceiver(refreshReceiver); + super.onPause(); + } + + @Override + protected Dialog onCreateDialog(int id) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.dialog_licenseagreement); + builder.setNegativeButton(R.string.button_decline, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + finish(); + } + }); + builder.setPositiveButton(R.string.button_accept, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + Editor editor = getPreferences(MODE_PRIVATE).edit(); + + editor.putBoolean(Strings.PREFERENCE_LICENSEACCEPTED, true); + editor.commit(); + + /* Part of workaround for android issue 4499 on 1.5 devices */ + getTabHost().clearAllTabs(); + + /* we only want to invoke actions if the license is accepted */ + setContent(); + } + }); + setupLicenseText(builder); + builder.setOnKeyListener(new OnKeyListener() { + public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + dialog.cancel(); + finish(); + } + return true; + } + }); + return builder.create(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + this.menu = menu; + + Activity activity = getCurrentActivity(); + + if (hasContent && activity != null) { + return activity.onCreateOptionsMenu(menu); + } else { + menu.add(Strings.EMPTY); // to let the menu be available + return true; + } + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + Activity activity = getCurrentActivity(); + + if (hasContent && activity != null) { + return activity.onMenuItemSelected(featureId, item); + } else { + return super.onMenuItemSelected(featureId, item); + } + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + Activity activity = getCurrentActivity(); + + if (hasContent && activity != null) { + return activity.onPrepareOptionsMenu(menu); + } else { + return super.onPrepareOptionsMenu(menu); + } + } + + private void setContent() { + TabHost tabHost = getTabHost(); + + tabHost.addTab(tabHost.newTabSpec(TAG_NORMAL).setIndicator(getString(R.string.overview)).setContent(new Intent().setClass(this, RSSOverview.class))); + hasContent = true; + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_SHOWTABS, false)) { + tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); + + tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true).putExtra(EntriesListActivity.EXTRA_AUTORELOAD, true))); + tabsAdded = true; + getTabWidget().setVisibility(View.VISIBLE); + } + if (POSTGINGERBREAD) { + /* Change the menu also on ICS when tab is changed */ + tabHost.setOnTabChangedListener(new OnTabChangeListener() { + public void onTabChanged(String tabId) { + if (menu != null) { + menu.clear(); + onCreateOptionsMenu(menu); + } + } + }); + if (menu != null) { + menu.clear(); + onCreateOptionsMenu(menu); + } + } + } + + public void setTabWidgetVisible(boolean visible) { + if (visible) { + if (!tabsAdded) { + TabHost tabHost = getTabHost(); + + tabHost.addTab(tabHost.newTabSpec(TAG_ALL).setIndicator(getString(R.string.all)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); + tabHost.addTab(tabHost.newTabSpec(TAG_FAVORITE).setIndicator(getString(R.string.favorites), getResources().getDrawable(android.R.drawable.star_big_on)).setContent(new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.FAVORITES_CONTENT_URI).putExtra(EntriesListActivity.EXTRA_SHOWFEEDINFO, true))); + tabsAdded = true; + } + getTabWidget().setVisibility(View.VISIBLE); + } else { + getTabWidget().setVisibility(View.GONE); + } + + } + + void setupLicenseText(AlertDialog.Builder builder) { + View view = getLayoutInflater().inflate(R.layout.license, null); + + final TextView textView = (TextView) view.findViewById(R.id.license_text); + + textView.setTextColor(textView.getTextColors().getDefaultColor()); // disables color change on selection + textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); + + final TextView contributorsTextView = (TextView) view.findViewById(R.id.contributors_togglebutton); + + contributorsTextView.setOnClickListener(new OnClickListener() { + boolean showingLicense = true; + + @Override + public void onClick(View view) { + if (showingLicense) { + textView.setText(R.string.contributors_list); + contributorsTextView.setText(R.string.license_word); + } else { + textView.setText(new StringBuilder(getString(R.string.license_intro)).append(Strings.THREENEWLINES).append(getString(R.string.license))); + contributorsTextView.setText(R.string.contributors); + } + showingLicense = !showingLicense; + } + + }); + builder.setView(view); + } + + private boolean isCurrentlyRefreshing() + { + ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); + for (RunningServiceInfo service: manager.getRunningServices(Integer.MAX_VALUE)) { + if (FetcherService.class.getName().equals(service.service.getClassName())) { + return true; + } + } + return false; + } + +} diff --git a/src/cn/eric/rss/RSSOverview.java b/src/cn/eric/rss/RSSOverview.java index e035ebe..0a369ab 100644 --- a/src/cn/eric/rss/RSSOverview.java +++ b/src/cn/eric/rss/RSSOverview.java @@ -1,609 +1,792 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import java.io.File; -import java.io.FilenameFilter; - -import android.app.AlertDialog; -import android.app.AlertDialog.Builder; -import android.app.Dialog; -import android.app.ListActivity; -import android.app.NotificationManager; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.Uri; -import android.os.Bundle; -import android.os.Environment; -import android.preference.PreferenceManager; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Gravity; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnCreateContextMenuListener; -import android.view.View.OnTouchListener; -import android.view.WindowManager; -import android.view.WindowManager.LayoutParams; -import android.widget.AdapterView; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; -import cn.eric.rss.provider.OPML; -import cn.eric.rss.service.RefreshService; - -public class RSSOverview extends ListActivity { - private static final int DIALOG_ERROR_FEEDIMPORT = 3; - - private static final int DIALOG_ERROR_FEEDEXPORT = 4; - - private static final int DIALOG_ERROR_INVALIDIMPORTFILE = 5; - - private static final int DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE = 6; - - private static final int DIALOG_ABOUT = 7; - - private static final int CONTEXTMENU_EDIT_ID = 3; - - private static final int CONTEXTMENU_REFRESH_ID = 4; - - private static final int CONTEXTMENU_DELETE_ID = 5; - - private static final int CONTEXTMENU_MARKASREAD_ID = 6; - - private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; - - private static final int CONTEXTMENU_DELETEREAD_ID = 8; - - private static final int CONTEXTMENU_DELETEALLENTRIES_ID = 9; - - private static final int CONTEXTMENU_RESETUPDATEDATE_ID = 10; - - private static final int ACTIVITY_APPLICATIONPREFERENCES_ID = 1; - - private static final Uri CANGELOG_URI = Uri.parse("http://code.google.com/p/MiniRSS/wiki/Changelog"); - - private static final int CONTEXTMENU_SETTINGS_ID = 99; - - static NotificationManager notificationManager; // package scope - - boolean feedSort; - - private RSSOverviewListAdapter listAdapter; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - super.onCreate(savedInstanceState); - - if (notificationManager == null) { - notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - } - setContentView(R.layout.main); - listAdapter = new RSSOverviewListAdapter(this); - setListAdapter(listAdapter); - getListView().setOnCreateContextMenuListener(new OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { - menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView.findViewById(android.R.id.text1)).getText()); - menu.add(0, CONTEXTMENU_REFRESH_ID, Menu.NONE, R.string.contextmenu_refresh); - menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, R.string.contextmenu_markasread); - menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, R.string.contextmenu_markasunread); - menu.add(0, CONTEXTMENU_DELETEREAD_ID, Menu.NONE, R.string.contextmenu_deleteread); - menu.add(0, CONTEXTMENU_DELETEALLENTRIES_ID, Menu.NONE, R.string.contextmenu_deleteallentries); - menu.add(0, CONTEXTMENU_EDIT_ID, Menu.NONE, R.string.contextmenu_edit); - menu.add(0, CONTEXTMENU_RESETUPDATEDATE_ID, Menu.NONE, R.string.contextmenu_resetupdatedate); - menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, R.string.contextmenu_delete); - menu.add(0, CONTEXTMENU_SETTINGS_ID, Menu.NONE, R.string.contextmenu_settings); - } - }); - getListView().setOnTouchListener(new OnTouchListener() { - private int dragedItem = -1; - - private ImageView dragedView; - - private WindowManager windowManager = RSSOverview.this.getWindowManager(); - - private LayoutParams layoutParams; - - private int minY = 25; // is the header size --> needs to be changed - - private ListView listView = getListView(); - - public boolean onTouch(View v, MotionEvent event) { - if (feedSort) { - int action = event.getAction(); - - switch (action) { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_MOVE: { - // this is the drag action - if (dragedItem == -1) { - dragedItem = listView.pointToPosition((int) event.getX(), (int) event.getY()); - if (dragedItem > -1) { - dragedView = new ImageView(listView.getContext()); - - View item = listView.getChildAt(dragedItem - listView.getFirstVisiblePosition()); - - if (item != null) { - View sortView = item.findViewById(R.id.sortitem); - - if (sortView.getLeft() <= event.getX()) { - item.setDrawingCacheEnabled(true); - dragedView.setImageBitmap(Bitmap.createBitmap(item.getDrawingCache())); - - layoutParams = new LayoutParams(); - layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP; - layoutParams.y = (int) event.getY(); - windowManager.addView(dragedView, layoutParams); - } else { - dragedItem = -1; - return false; // do not comsume - } - - } else { - dragedItem = -1; - } - } - } else if (dragedView != null) { - layoutParams.y = Math.max(minY, Math.max(0, Math.min((int) event.getY(), listView.getHeight()-minY))); - windowManager.updateViewLayout(dragedView, layoutParams); - } - break; - } - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: { - // this is the drop action - if (dragedItem > -1) { - windowManager.removeView(dragedView); - - int newPosition = listView.pointToPosition((int) event.getX(), (int) event.getY()); - - if (newPosition == -1) { - newPosition = listView.getCount()-1; - } - if (newPosition != dragedItem) { - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.PRIORITY, newPosition); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(listView.getItemIdAtPosition(dragedItem)), values, null, null); - } - dragedItem = -1; - return true; - } else { - return false; - } - } - } - return true; - } else { - return false; - } - } - }); - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_REFRESHENABLED, false)) { - startService(new Intent(this, RefreshService.class)); // starts the service independent to this activity - } else { - stopService(new Intent(this, RefreshService.class)); - } - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Strings.SETTINGS_REFRESHONPENENABLED, false)) { - new Thread() { - public void run() { - sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS)); - } - }.start(); - } - } - - @Override - protected void onResume() { - super.onResume(); - if (RSSOverview.notificationManager != null) { - notificationManager.cancel(0); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.feedoverview, menu); - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menu.setGroupVisible(R.id.menu_group_0, !feedSort); - menu.setGroupVisible(R.id.menu_group_1, feedSort); - return true; - } - - @SuppressWarnings("deprecation") - @Override - public boolean onMenuItemSelected(int featureId, final MenuItem item) { - setFeedSortEnabled(false); - switch (item.getItemId()) { - case R.id.menu_addfeed: { - startActivity(new Intent(Intent.ACTION_INSERT).setData(FeedData.FeedColumns.CONTENT_URI)); - break; - } - case R.id.menu_refresh: { - new Thread() { - public void run() { - sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false))); - } - }.start(); - break; - } - case CONTEXTMENU_EDIT_ID: { - startActivity(new Intent(Intent.ACTION_EDIT).setData(FeedData.FeedColumns.CONTENT_URI(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); - break; - } - case CONTEXTMENU_REFRESH_ID: { - final String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - - final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); - - if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) { // since we have acquired the networkInfo, we use it for basic checks - final Intent intent = new Intent(Strings.ACTION_REFRESHFEEDS).putExtra(Strings.FEEDID, id); - - final Thread thread = new Thread() { - public void run() { - sendBroadcast(intent); - } - }; - - if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI || PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).getBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, false)) { - intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); - thread.start(); - } else { - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(id), new String[] {FeedData.FeedColumns.WIFIONLY}, null, null, null); - - cursor.moveToFirst(); - - if (cursor.isNull(0) || cursor.getInt(0) == 0) { - thread.start(); - } else { - Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.dialog_hint); - builder.setMessage(R.string.question_refreshwowifi); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); - thread.start(); - } - }); - builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - PreferenceManager.getDefaultSharedPreferences(RSSOverview.this).edit().putBoolean(Strings.SETTINGS_OVERRIDEWIFIONLY, true).commit(); - intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); - thread.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - builder.show(); - } - cursor.close(); - } - - } - break; - } - case CONTEXTMENU_DELETE_ID: { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(id), new String[] {FeedData.FeedColumns.NAME}, null, null, null); - - cursor.moveToFirst(); - - Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(cursor.getString(0)); - builder.setMessage(R.string.question_deletefeed); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - new Thread() { - public void run() { - getContentResolver().delete(FeedData.FeedColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id)), null, null); - sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); - } - }.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - cursor.close(); - builder.show(); - break; - } - case CONTEXTMENU_MARKASREAD_ID: { - new Thread() { - public void run() { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI(id), getReadContentValues(), new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null); - } - } - }.start(); - break; - } - case CONTEXTMENU_MARKASUNREAD_ID: { - new Thread() { - public void run() { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI(id), getUnreadContentValues(), null, null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null);; - } - } - }.start(); - break; - } - case CONTEXTMENU_SETTINGS_ID: { - startActivity(new Intent(this, FeedPrefsActivity.class).putExtra(FeedData.FeedColumns._ID, Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); - break; - } - case CONTEXTMENU_DELETEREAD_ID: { - new Thread() { - public void run() { - String id = Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id); - - Uri uri = FeedData.EntryColumns.CONTENT_URI(id); - - String selection = Strings.READDATE_GREATERZERO+Strings.DB_AND+" ("+Strings.DB_EXCUDEFAVORITE+")"; - - FeedData.deletePicturesOfFeed(RSSOverview.this, uri, selection); - if (getContentResolver().delete(uri, selection, null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI(id), null); - } - } - }.start(); - break; - } - case CONTEXTMENU_DELETEALLENTRIES_ID: { - showDeleteAllEntriesQuestion(this, FeedData.EntryColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id))); - break; - } - case CONTEXTMENU_RESETUPDATEDATE_ID: { - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.LASTUPDATE, 0); - values.put(FeedData.FeedColumns.REALLASTUPDATE, 0); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(Long.toString(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id)), values, null, null); - break; - } - - case R.id.menu_settings: { - startActivityForResult(new Intent(this, ApplicationPreferencesActivity.class), ACTIVITY_APPLICATIONPREFERENCES_ID); - break; - } - case R.id.menu_allread: { - new Thread() { - public void run() { - if (getContentResolver().update(FeedData.EntryColumns.CONTENT_URI, getReadContentValues(), new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null) > 0) { - getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI, null); - } - } - }.start(); - break; - } - case R.id.menu_about: { - showDialog(DIALOG_ABOUT); - break; - } - case R.id.menu_import: { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setTitle(R.string.select_file); - - try { - final String[] fileNames = Environment.getExternalStorageDirectory().list(new FilenameFilter() { - public boolean accept(File dir, String filename) { - return new File(dir, filename).isFile(); - } - }); - builder.setItems(fileNames, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - try { - OPML.importFromFile(new StringBuilder(Environment.getExternalStorageDirectory().toString()).append(File.separator).append(fileNames[which]).toString(), RSSOverview.this); - } catch (Exception e) { - showDialog(DIALOG_ERROR_FEEDIMPORT); - } - } - }); - builder.show(); - } catch (Exception e) { - showDialog(DIALOG_ERROR_FEEDIMPORT); - } - } else { - showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); - } - - break; - } - case R.id.menu_export: { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { - try { - String filename = new StringBuilder(Environment.getExternalStorageDirectory().toString()).append("/sparse_rss_").append(System.currentTimeMillis()).append(".opml").toString(); - - OPML.exportToFile(filename, this); - Toast.makeText(this, String.format(getString(R.string.message_exportedto), filename), Toast.LENGTH_LONG).show(); - } catch (Exception e) { - showDialog(DIALOG_ERROR_FEEDEXPORT); - } - } else { - showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); - } - break; - } - case R.id.menu_enablefeedsort: { - setFeedSortEnabled(true); - break; - } - case R.id.menu_deleteread: { - FeedData.deletePicturesOfFeedAsync(this, FeedData.EntryColumns.CONTENT_URI, Strings.READDATE_GREATERZERO); - getContentResolver().delete(FeedData.EntryColumns.CONTENT_URI, Strings.READDATE_GREATERZERO, null); - ((RSSOverviewListAdapter) getListAdapter()).notifyDataSetChanged(); - break; - } - case R.id.menu_deleteallentries: { - showDeleteAllEntriesQuestion(this, FeedData.EntryColumns.CONTENT_URI); - break; - } - case R.id.menu_disablefeedsort: { - // do nothing as the feed sort gets disabled anyway - break; - } - } - return true; - } - - public static final ContentValues getReadContentValues() { - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); - return values; - } - - public static final ContentValues getUnreadContentValues() { - ContentValues values = new ContentValues(); - - values.putNull(FeedData.EntryColumns.READDATE); - return values; - } - - @Override - protected void onListItemClick(ListView listView, View view, int position, long id) { - setFeedSortEnabled(false); - - Intent intent = new Intent(Intent.ACTION_VIEW, FeedData.EntryColumns.CONTENT_URI(Long.toString(id))); - - intent.putExtra(FeedData.FeedColumns._ID, id); - startActivity(intent); - } - - @Override - protected Dialog onCreateDialog(int id) { - Dialog dialog; - - switch (id) { - case DIALOG_ERROR_FEEDIMPORT: { - dialog = createErrorDialog(R.string.error_feedimport); - break; - } - case DIALOG_ERROR_FEEDEXPORT: { - dialog = createErrorDialog(R.string.error_feedexport); - break; - } - case DIALOG_ERROR_INVALIDIMPORTFILE: { - dialog = createErrorDialog(R.string.error_invalidimportfile); - break; - } - case DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE: { - dialog = createErrorDialog(R.string.error_externalstoragenotavailable); - break; - } - case DIALOG_ABOUT: { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_info); - builder.setTitle(R.string.menu_about); - MainTabActivity.INSTANCE.setupLicenseText(builder); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - builder.setNeutralButton(R.string.changelog, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - startActivity(new Intent(Intent.ACTION_VIEW, CANGELOG_URI)); - } - }); - return builder.create(); - } - default: dialog = null; - } - return dialog; - } - - private Dialog createErrorDialog(int messageId) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setMessage(messageId); - builder.setTitle(R.string.error); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setPositiveButton(android.R.string.ok, null); - return builder.create(); - } - - private static void showDeleteAllEntriesQuestion(final Context context, final Uri uri) { - Builder builder = new AlertDialog.Builder(context); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.contextmenu_deleteallentries); - builder.setMessage(R.string.question_areyousure); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - new Thread() { - public void run() { - FeedData.deletePicturesOfFeed(context, uri, Strings.DB_EXCUDEFAVORITE); - if (context.getContentResolver().delete(uri, Strings.DB_EXCUDEFAVORITE, null) > 0) { - context.getContentResolver().notifyChange(FeedData.FeedColumns.CONTENT_URI, null); - } - } - }.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - builder.show(); - } - - private void setFeedSortEnabled(boolean enabled) { - if (enabled != feedSort) { - listAdapter.setFeedSortEnabled(enabled); - feedSort = enabled; - } - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import java.io.File; +import java.io.FilenameFilter; + +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.Dialog; +import android.app.ListActivity; +import android.app.NotificationManager; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.view.View.OnTouchListener; +import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; +import cn.eric.rss.provider.OPML; +import cn.eric.rss.service.RefreshService; + +public class RSSOverview extends ListActivity { + private static final int DIALOG_ERROR_FEEDIMPORT = 3; + + private static final int DIALOG_ERROR_FEEDEXPORT = 4; + + private static final int DIALOG_ERROR_INVALIDIMPORTFILE = 5; + + private static final int DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE = 6; + + private static final int DIALOG_ABOUT = 7; + + private static final int CONTEXTMENU_EDIT_ID = 3; + + private static final int CONTEXTMENU_REFRESH_ID = 4; + + private static final int CONTEXTMENU_DELETE_ID = 5; + + private static final int CONTEXTMENU_MARKASREAD_ID = 6; + + private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; + + private static final int CONTEXTMENU_DELETEREAD_ID = 8; + + private static final int CONTEXTMENU_DELETEALLENTRIES_ID = 9; + + private static final int CONTEXTMENU_RESETUPDATEDATE_ID = 10; + + private static final int ACTIVITY_APPLICATIONPREFERENCES_ID = 1; + + private static final Uri CANGELOG_URI = Uri + .parse("http://code.google.com/p/MiniRSS/wiki/Changelog"); + + private static final int CONTEXTMENU_SETTINGS_ID = 99; + + static NotificationManager notificationManager; // package scope + + boolean feedSort; + + private RSSOverviewListAdapter listAdapter; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + super.onCreate(savedInstanceState); + + if (notificationManager == null) { + notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + setContentView(R.layout.main); + listAdapter = new RSSOverviewListAdapter(this); + setListAdapter(listAdapter); + getListView().setOnCreateContextMenuListener( + new OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, + View view, ContextMenuInfo menuInfo) { + menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView + .findViewById(android.R.id.text1)).getText()); + menu.add(0, CONTEXTMENU_REFRESH_ID, Menu.NONE, + R.string.contextmenu_refresh); + menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, + R.string.contextmenu_markasread); + menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, + R.string.contextmenu_markasunread); + menu.add(0, CONTEXTMENU_DELETEREAD_ID, Menu.NONE, + R.string.contextmenu_deleteread); + menu.add(0, CONTEXTMENU_DELETEALLENTRIES_ID, Menu.NONE, + R.string.contextmenu_deleteallentries); + menu.add(0, CONTEXTMENU_EDIT_ID, Menu.NONE, + R.string.contextmenu_edit); + menu.add(0, CONTEXTMENU_RESETUPDATEDATE_ID, Menu.NONE, + R.string.contextmenu_resetupdatedate); + menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, + R.string.contextmenu_delete); + menu.add(0, CONTEXTMENU_SETTINGS_ID, Menu.NONE, + R.string.contextmenu_settings); + } + }); + getListView().setOnTouchListener(new OnTouchListener() { + private int dragedItem = -1; + + private ImageView dragedView; + + private WindowManager windowManager = RSSOverview.this + .getWindowManager(); + + private LayoutParams layoutParams; + + private int minY = 25; // is the header size --> needs to be changed + + private ListView listView = getListView(); + + public boolean onTouch(View v, MotionEvent event) { + if (feedSort) { + int action = event.getAction(); + + switch (action) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: { + // this is the drag action + if (dragedItem == -1) { + dragedItem = listView.pointToPosition( + (int) event.getX(), (int) event.getY()); + if (dragedItem > -1) { + dragedView = new ImageView(listView + .getContext()); + + View item = listView.getChildAt(dragedItem + - listView.getFirstVisiblePosition()); + + if (item != null) { + View sortView = item + .findViewById(R.id.sortitem); + + if (sortView.getLeft() <= event.getX()) { + item.setDrawingCacheEnabled(true); + dragedView.setImageBitmap(Bitmap + .createBitmap(item + .getDrawingCache())); + + layoutParams = new LayoutParams(); + layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.TOP; + layoutParams.y = (int) event.getY(); + windowManager.addView(dragedView, + layoutParams); + } else { + dragedItem = -1; + return false; // do not comsume + } + + } else { + dragedItem = -1; + } + } + } else if (dragedView != null) { + layoutParams.y = Math.max(minY, Math.max( + 0, + Math.min((int) event.getY(), + listView.getHeight() - minY))); + windowManager.updateViewLayout(dragedView, + layoutParams); + } + break; + } + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + // this is the drop action + if (dragedItem > -1) { + windowManager.removeView(dragedView); + + int newPosition = listView.pointToPosition( + (int) event.getX(), (int) event.getY()); + + if (newPosition == -1) { + newPosition = listView.getCount() - 1; + } + if (newPosition != dragedItem) { + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.PRIORITY, + newPosition); + getContentResolver() + .update(FeedData.FeedColumns + .CONTENT_URI(listView + .getItemIdAtPosition(dragedItem)), + values, null, null); + } + dragedItem = -1; + return true; + } else { + return false; + } + } + } + return true; + } else { + return false; + } + } + }); + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean( + Strings.SETTINGS_REFRESHENABLED, false)) { + startService(new Intent(this, RefreshService.class)); // starts the + // service + // independent + // to this + // activity + } else { + stopService(new Intent(this, RefreshService.class)); + } + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean( + Strings.SETTINGS_REFRESHONPENENABLED, false)) { + new Thread() { + public void run() { + sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS)); + } + }.start(); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (RSSOverview.notificationManager != null) { + notificationManager.cancel(0); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.feedoverview, menu); + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.setGroupVisible(R.id.menu_group_0, !feedSort); + menu.setGroupVisible(R.id.menu_group_1, feedSort); + return true; + } + + @SuppressWarnings("deprecation") + @Override + public boolean onMenuItemSelected(int featureId, final MenuItem item) { + setFeedSortEnabled(false); + switch (item.getItemId()) { + case R.id.menu_addfeed: { + startActivity(new Intent(Intent.ACTION_INSERT) + .setData(FeedData.FeedColumns.CONTENT_URI)); + break; + } + case R.id.menu_refresh: { + new Thread() { + public void run() { + sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS) + .putExtra( + Strings.SETTINGS_OVERRIDEWIFIONLY, + PreferenceManager + .getDefaultSharedPreferences( + RSSOverview.this) + .getBoolean( + Strings.SETTINGS_OVERRIDEWIFIONLY, + false))); + } + }.start(); + break; + } + case CONTEXTMENU_EDIT_ID: { + startActivity(new Intent(Intent.ACTION_EDIT) + .setData(FeedData.FeedColumns + .CONTENT_URI(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id))); + break; + } + case CONTEXTMENU_REFRESH_ID: { + final String id = Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id); + + ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + + final NetworkInfo networkInfo = connectivityManager + .getActiveNetworkInfo(); + + if (networkInfo != null + && networkInfo.getState() == NetworkInfo.State.CONNECTED) { // since + // we + // have + // acquired + // the + // networkInfo, + // we + // use + // it + // for + // basic + // checks + final Intent intent = new Intent(Strings.ACTION_REFRESHFEEDS) + .putExtra(Strings.FEEDID, id); + + final Thread thread = new Thread() { + public void run() { + sendBroadcast(intent); + } + }; + + if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI + || PreferenceManager.getDefaultSharedPreferences( + RSSOverview.this).getBoolean( + Strings.SETTINGS_OVERRIDEWIFIONLY, false)) { + intent.putExtra(Strings.SETTINGS_OVERRIDEWIFIONLY, true); + thread.start(); + } else { + Cursor cursor = getContentResolver().query( + FeedData.FeedColumns.CONTENT_URI(id), + new String[] { FeedData.FeedColumns.WIFIONLY }, + null, null, null); + + cursor.moveToFirst(); + + if (cursor.isNull(0) || cursor.getInt(0) == 0) { + thread.start(); + } else { + Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.dialog_hint); + builder.setMessage(R.string.question_refreshwowifi); + builder.setPositiveButton(android.R.string.yes, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, + int which) { + intent.putExtra( + Strings.SETTINGS_OVERRIDEWIFIONLY, + true); + thread.start(); + } + }); + builder.setNeutralButton( + R.string.button_alwaysokforall, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, + int which) { + PreferenceManager + .getDefaultSharedPreferences( + RSSOverview.this) + .edit() + .putBoolean( + Strings.SETTINGS_OVERRIDEWIFIONLY, + true).commit(); + intent.putExtra( + Strings.SETTINGS_OVERRIDEWIFIONLY, + true); + thread.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + builder.show(); + } + cursor.close(); + } + + } + break; + } + case CONTEXTMENU_DELETE_ID: { + String id = Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id); + + Cursor cursor = getContentResolver().query( + FeedData.FeedColumns.CONTENT_URI(id), + new String[] { FeedData.FeedColumns.NAME }, null, null, + null); + + cursor.moveToFirst(); + + Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(cursor.getString(0)); + builder.setMessage(R.string.question_deletefeed); + builder.setPositiveButton(android.R.string.yes, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + new Thread() { + public void run() { + getContentResolver() + .delete(FeedData.FeedColumns + .CONTENT_URI(Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id)), + null, null); + sendBroadcast(new Intent( + Strings.ACTION_UPDATEWIDGET)); + } + }.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + cursor.close(); + builder.show(); + break; + } + case CONTEXTMENU_MARKASREAD_ID: { + new Thread() { + public void run() { + String id = Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id); + + if (getContentResolver() + .update(FeedData.EntryColumns.CONTENT_URI(id), + getReadContentValues(), + new StringBuilder( + FeedData.EntryColumns.READDATE) + .append(Strings.DB_ISNULL) + .toString(), null) > 0) { + getContentResolver().notifyChange( + FeedData.FeedColumns.CONTENT_URI(id), null); + } + } + }.start(); + break; + } + case CONTEXTMENU_MARKASUNREAD_ID: { + new Thread() { + public void run() { + String id = Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id); + + if (getContentResolver().update( + FeedData.EntryColumns.CONTENT_URI(id), + getUnreadContentValues(), null, null) > 0) { + getContentResolver().notifyChange( + FeedData.FeedColumns.CONTENT_URI(id), null); + ; + } + } + }.start(); + break; + } + case CONTEXTMENU_SETTINGS_ID: { + startActivity(new Intent(this, FeedPrefsActivity.class).putExtra( + FeedData.FeedColumns._ID, + Long.toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id))); + break; + } + case CONTEXTMENU_DELETEREAD_ID: { + new Thread() { + public void run() { + String id = Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id); + + Uri uri = FeedData.EntryColumns.CONTENT_URI(id); + + String selection = Strings.READDATE_GREATERZERO + + Strings.DB_AND + " (" + Strings.DB_EXCUDEFAVORITE + + ")"; + + FeedData.deletePicturesOfFeed(RSSOverview.this, uri, + selection); + if (getContentResolver().delete(uri, selection, null) > 0) { + getContentResolver().notifyChange( + FeedData.FeedColumns.CONTENT_URI(id), null); + } + } + }.start(); + break; + } + case CONTEXTMENU_DELETEALLENTRIES_ID: { + showDeleteAllEntriesQuestion( + this, + FeedData.EntryColumns.CONTENT_URI(Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id))); + break; + } + case CONTEXTMENU_RESETUPDATEDATE_ID: { + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.LASTUPDATE, 0); + values.put(FeedData.FeedColumns.REALLASTUPDATE, 0); + getContentResolver() + .update(FeedData.FeedColumns.CONTENT_URI(Long + .toString(((AdapterView.AdapterContextMenuInfo) item + .getMenuInfo()).id)), values, null, null); + break; + } + + case R.id.menu_settings: { + startActivityForResult(new Intent(this, + ApplicationPreferencesActivity.class), + ACTIVITY_APPLICATIONPREFERENCES_ID); + break; + } + case R.id.menu_allread: { + new Thread() { + public void run() { + if (getContentResolver() + .update(FeedData.EntryColumns.CONTENT_URI, + getReadContentValues(), + new StringBuilder( + FeedData.EntryColumns.READDATE) + .append(Strings.DB_ISNULL) + .toString(), null) > 0) { + getContentResolver().notifyChange( + FeedData.FeedColumns.CONTENT_URI, null); + } + } + }.start(); + break; + } + case R.id.menu_about: { + showDialog(DIALOG_ABOUT); + break; + } + case R.id.menu_import: { + if (Environment.getExternalStorageState().equals( + Environment.MEDIA_MOUNTED) + || Environment.getExternalStorageState().equals( + Environment.MEDIA_MOUNTED_READ_ONLY)) { + final AlertDialog.Builder builder = new AlertDialog.Builder( + this); + + builder.setTitle(R.string.select_file); + + try { + final String[] fileNames = Environment + .getExternalStorageDirectory().list( + new FilenameFilter() { + public boolean accept(File dir, + String filename) { + return new File(dir, filename) + .isFile(); + } + }); + builder.setItems(fileNames, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, + int which) { + try { + OPML.importFromFile( + new StringBuilder( + Environment + .getExternalStorageDirectory() + .toString()) + .append(File.separator) + .append(fileNames[which]) + .toString(), + RSSOverview.this); + } catch (Exception e) { + showDialog(DIALOG_ERROR_FEEDIMPORT); + } + } + }); + builder.show(); + } catch (Exception e) { + showDialog(DIALOG_ERROR_FEEDIMPORT); + } + } else { + showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); + } + + break; + } + case R.id.menu_export: { + if (Environment.getExternalStorageState().equals( + Environment.MEDIA_MOUNTED) + || Environment.getExternalStorageState().equals( + Environment.MEDIA_MOUNTED_READ_ONLY)) { + try { + String filename = new StringBuilder(Environment + .getExternalStorageDirectory().toString()) + .append("/sparse_rss_") + .append(System.currentTimeMillis()).append(".opml") + .toString(); + + OPML.exportToFile(filename, this); + Toast.makeText( + this, + String.format( + getString(R.string.message_exportedto), + filename), Toast.LENGTH_LONG).show(); + } catch (Exception e) { + showDialog(DIALOG_ERROR_FEEDEXPORT); + } + } else { + showDialog(DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE); + } + break; + } + case R.id.menu_enablefeedsort: { + setFeedSortEnabled(true); + break; + } + case R.id.menu_deleteread: { + FeedData.deletePicturesOfFeedAsync(this, + FeedData.EntryColumns.CONTENT_URI, + Strings.READDATE_GREATERZERO); + getContentResolver().delete(FeedData.EntryColumns.CONTENT_URI, + Strings.READDATE_GREATERZERO, null); + ((RSSOverviewListAdapter) getListAdapter()).notifyDataSetChanged(); + break; + } + case R.id.menu_deleteallentries: { + showDeleteAllEntriesQuestion(this, + FeedData.EntryColumns.CONTENT_URI); + break; + } + case R.id.menu_disablefeedsort: { + // do nothing as the feed sort gets disabled anyway + break; + } + } + return true; + } + + public static final ContentValues getReadContentValues() { + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); + return values; + } + + public static final ContentValues getUnreadContentValues() { + ContentValues values = new ContentValues(); + + values.putNull(FeedData.EntryColumns.READDATE); + return values; + } + + @Override + protected void onListItemClick(ListView listView, View view, int position, + long id) { + setFeedSortEnabled(false); + + Intent intent = new Intent(Intent.ACTION_VIEW, + FeedData.EntryColumns.CONTENT_URI(Long.toString(id))); + + intent.putExtra(FeedData.FeedColumns._ID, id); + startActivity(intent); + } + + @Override + protected Dialog onCreateDialog(int id) { + Dialog dialog; + + switch (id) { + case DIALOG_ERROR_FEEDIMPORT: { + dialog = createErrorDialog(R.string.error_feedimport); + break; + } + case DIALOG_ERROR_FEEDEXPORT: { + dialog = createErrorDialog(R.string.error_feedexport); + break; + } + case DIALOG_ERROR_INVALIDIMPORTFILE: { + dialog = createErrorDialog(R.string.error_invalidimportfile); + break; + } + case DIALOG_ERROR_EXTERNALSTORAGENOTAVAILABLE: { + dialog = createErrorDialog(R.string.error_externalstoragenotavailable); + break; + } + case DIALOG_ABOUT: { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_info); + builder.setTitle(R.string.menu_about); + MainTabActivity.INSTANCE.setupLicenseText(builder); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + builder.setNeutralButton(R.string.changelog, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + startActivity(new Intent(Intent.ACTION_VIEW, + CANGELOG_URI)); + } + }); + return builder.create(); + } + default: + dialog = null; + } + return dialog; + } + + private Dialog createErrorDialog(int messageId) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setMessage(messageId); + builder.setTitle(R.string.error); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setPositiveButton(android.R.string.ok, null); + return builder.create(); + } + + private static void showDeleteAllEntriesQuestion(final Context context, + final Uri uri) { + Builder builder = new AlertDialog.Builder(context); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.contextmenu_deleteallentries); + builder.setMessage(R.string.question_areyousure); + builder.setPositiveButton(android.R.string.yes, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + new Thread() { + public void run() { + FeedData.deletePicturesOfFeed(context, uri, + Strings.DB_EXCUDEFAVORITE); + if (context.getContentResolver().delete(uri, + Strings.DB_EXCUDEFAVORITE, null) > 0) { + context.getContentResolver().notifyChange( + FeedData.FeedColumns.CONTENT_URI, + null); + } + } + }.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + builder.show(); + } + + private void setFeedSortEnabled(boolean enabled) { + if (enabled != feedSort) { + listAdapter.setFeedSortEnabled(enabled); + feedSort = enabled; + } + } + +} From e3722ae7846cd70e5b507e80d2cb7d38a8a2992b Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Wed, 13 Mar 2013 20:59:44 +0800 Subject: [PATCH 03/19] add Umeng SDK; add 5 initial feeds for users --- .project | 66 +- AndroidManifest.xml | 246 ++- LICENSE | 1 + README | 1 + libs/umeng_sdk.jar | Bin 0 -> 436764 bytes proguard.cfg | 55 + res/anim/umeng_xp_fade_in.xml | 10 + res/anim/umeng_xp_fade_out.xml | 10 + res/anim/umeng_xp_large_gallery_in.xml | 10 + res/anim/umeng_xp_progressbar.xml | 4 + res/anim/umeng_xp_push_down_out.xml | 25 + res/anim/umeng_xp_push_up_in.xml | 9 + res/anim/umeng_xp_push_up_out.xml | 9 + res/anim/umeng_xp_slide_in_from_bottom.xml | 6 + res/anim/umeng_xp_slide_in_from_left.xml | 6 + res/anim/umeng_xp_slide_in_from_right.xml | 6 + res/anim/umeng_xp_slide_in_from_top.xml | 6 + res/anim/umeng_xp_slide_out_from_bottom.xml | 6 + res/anim/umeng_xp_slide_out_from_left.xml | 6 + res/anim/umeng_xp_slide_out_from_right.xml | 6 + res/anim/umeng_xp_slide_out_from_top.xml | 6 + res/anim/umeng_xp_zoom_in.xml | 34 + res/anim/umeng_xp_zoom_out.xml | 41 + res/drawable-hdpi/umeng_xp_ad_action_bg.9.png | Bin 0 -> 712 bytes .../umeng_xp_ad_action_bg_clicked.9.png | Bin 0 -> 716 bytes .../umeng_xp_ad_action_bg_selector.xml | 8 + .../umeng_xp_ad_action_browse.png | Bin 0 -> 2711 bytes .../umeng_xp_ad_action_browse_clicked.png | Bin 0 -> 2774 bytes .../umeng_xp_ad_action_browse_selector.xml | 5 + .../umeng_xp_ad_action_download.png | Bin 0 -> 2981 bytes .../umeng_xp_ad_action_download_clicked.png | Bin 0 -> 2995 bytes .../umeng_xp_ad_action_download_selector.xml | 5 + res/drawable-hdpi/umeng_xp_ad_action_open.png | Bin 0 -> 2731 bytes .../umeng_xp_ad_action_open_clicked.png | Bin 0 -> 2692 bytes .../umeng_xp_ad_action_open_selector.xml | 5 + .../umeng_xp_ad_action_phone.png | Bin 0 -> 2663 bytes .../umeng_xp_ad_action_phone_clicked.png | Bin 0 -> 2640 bytes .../umeng_xp_ad_action_phone_selector.xml | 8 + res/drawable-hdpi/umeng_xp_back.png | Bin 0 -> 1538 bytes res/drawable-hdpi/umeng_xp_back_button.xml | 8 + .../umeng_xp_back_button_normal.png | Bin 0 -> 2333 bytes .../umeng_xp_back_button_selected.png | Bin 0 -> 2411 bytes res/drawable-hdpi/umeng_xp_back_click.png | Bin 0 -> 1600 bytes res/drawable-hdpi/umeng_xp_banner_grey.xml | 3 + .../umeng_xp_btn_gradient_dark_grey.xml | 4 + .../umeng_xp_btn_gradient_grey.xml | 4 + .../umeng_xp_button_cancel.9.png | Bin 0 -> 2215 bytes .../umeng_xp_button_cancel_click.9.png | Bin 0 -> 2231 bytes .../umeng_xp_button_cancel_selector.xml | 4 + .../umeng_xp_button_download.9.png | Bin 0 -> 819 bytes .../umeng_xp_button_download_click.9.png | Bin 0 -> 788 bytes .../umeng_xp_button_download_selector.xml | 4 + ...p_container_banner_background_selector.xml | 4 + res/drawable-hdpi/umeng_xp_darkbg.png | Bin 0 -> 3921 bytes res/drawable-hdpi/umeng_xp_detail.png | Bin 0 -> 4747 bytes res/drawable-hdpi/umeng_xp_detail365.png | Bin 0 -> 989 bytes res/drawable-hdpi/umeng_xp_detail_bg.png | Bin 0 -> 369 bytes .../umeng_xp_download_dialog_bg.png | Bin 0 -> 6850 bytes .../umeng_xp_download_dialog_close.png | Bin 0 -> 2138 bytes ...umeng_xp_download_dialog_close_clicked.png | Bin 0 -> 2171 bytes ...meng_xp_download_dialog_close_selector.xml | 5 + .../umeng_xp_download_gradient_grey.xml | 4 + res/drawable-hdpi/umeng_xp_gradient_grey.xml | 4 + res/drawable-hdpi/umeng_xp_gradient_grey1.xml | 3 + res/drawable-hdpi/umeng_xp_gradient_grey2.xml | 4 + .../umeng_xp_greenbg_selector.xml | 5 + res/drawable-hdpi/umeng_xp_handler_rc.png | Bin 0 -> 3664 bytes ...p_highlight_banner_background_selector.xml | 5 + .../umeng_xp_highlight_banner_bg.9.png | Bin 0 -> 2148 bytes ...meng_xp_highlight_footview_dashed_line.xml | 3 + .../umeng_xp_highlight_footview_loading.png | Bin 0 -> 775 bytes .../umeng_xp_highlight_item_bg.9.png | Bin 0 -> 1682 bytes .../umeng_xp_highlight_item_bg_clicked.9.png | Bin 0 -> 1658 bytes .../umeng_xp_highlight_item_bg_selector.xml | 5 + .../umeng_xp_horizontal_divider.xml | 3 + .../umeng_xp_icon_background.png | Bin 0 -> 461 bytes .../umeng_xp_icon_background_clicked.png | Bin 0 -> 488 bytes .../umeng_xp_icon_background_selector.xml | 5 + res/drawable-hdpi/umeng_xp_kaijuan_bg.xml | 3 + .../umeng_xp_large_gallery_failed.jpg | Bin 0 -> 4068 bytes .../umeng_xp_large_gallery_item_bg.xml | 5 + .../umeng_xp_link_radius_shape.xml | 5 + .../umeng_xp_list_item_text_selector.xml | 5 + res/drawable-hdpi/umeng_xp_loading.png | Bin 0 -> 4683 bytes res/drawable-hdpi/umeng_xp_loading_seek.xml | 6 + res/drawable-hdpi/umeng_xp_more_bottom.9.png | Bin 0 -> 219 bytes res/drawable-hdpi/umeng_xp_more_top.9.png | Bin 0 -> 222 bytes res/drawable-hdpi/umeng_xp_new_tip.png | Bin 0 -> 2312 bytes res/drawable-hdpi/umeng_xp_new_tip_bg.png | Bin 0 -> 2562 bytes res/drawable-hdpi/umeng_xp_new_tip_button.png | Bin 0 -> 2312 bytes ...g_xp_normal_banner_background_selector.xml | 5 + res/drawable-hdpi/umeng_xp_point_normal.png | Bin 0 -> 251 bytes res/drawable-hdpi/umeng_xp_point_selected.png | Bin 0 -> 261 bytes res/drawable-hdpi/umeng_xp_progressbar.xml | 1 + res/drawable-hdpi/umeng_xp_radius_shape.xml | 5 + .../umeng_xp_recommend_titile_bg.png | Bin 0 -> 3642 bytes res/drawable-hdpi/umeng_xp_recoright.png | Bin 0 -> 2808 bytes res/drawable-hdpi/umeng_xp_seek.png | Bin 0 -> 414 bytes res/drawable-hdpi/umeng_xp_seek_bg.png | Bin 0 -> 699 bytes res/drawable-hdpi/umeng_xp_selector_back.xml | 4 + .../umeng_xp_selector_cancel.xml | 4 + .../umeng_xp_selector_download.xml | 4 + res/drawable-hdpi/umeng_xp_shadow_bg.9.png | Bin 0 -> 1643 bytes .../umeng_xp_shape_conner_blackish_green.xml | 14 + .../umeng_xp_shape_conner_green.xml | 12 + .../umeng_xp_shape_gradient_blue.xml | 5 + ...umeng_xp_shape_gradient_blue_container.xml | 5 + .../umeng_xp_shape_gradient_blue_v2.xml | 4 + .../umeng_xp_shape_gradient_gray_stroke.xml | 6 + .../umeng_xp_shape_gradient_grey_0.xml | 6 + .../umeng_xp_shape_gradient_grey_1.xml | 6 + .../umeng_xp_shape_gradient_grey_2.xml | 5 + .../umeng_xp_shape_gradient_grey_3.xml | 5 + .../umeng_xp_shape_gradient_grey_4.xml | 5 + .../umeng_xp_shape_gradient_grey_5.xml | 12 + .../umeng_xp_shape_gradient_grey_7.xml | 6 + .../umeng_xp_shape_gradient_grey_list.xml | 16 + res/drawable-hdpi/umeng_xp_shape_grey.xml | 5 + .../umeng_xp_standalone_bg.9.png | Bin 0 -> 369 bytes res/drawable-hdpi/umeng_xp_strock_bg_1.xml | 6 + .../umeng_xp_vertical_divider.xml | 3 + res/drawable-hdpi/umeng_xp_x_button.png | Bin 0 -> 1254 bytes .../umeng_xp_x_button_clicked.png | Bin 0 -> 1139 bytes .../umeng_xp_x_button_selector.xml | 8 + res/drawable-hdpi/umeng_xp_zhanwei.png | Bin 0 -> 3960 bytes res/drawable/umeng_common_gradient_green.xml | 7 + res/drawable/umeng_common_gradient_orange.xml | 7 + res/drawable/umeng_common_gradient_red.xml | 7 + res/drawable/umeng_fb_bar_bg.9.png | Bin 0 -> 229 bytes res/drawable/umeng_fb_blank_selector.xml | 3 + res/drawable/umeng_fb_bottom_banner.xml | 6 + res/drawable/umeng_fb_dev_bubble.9.png | Bin 0 -> 576 bytes res/drawable/umeng_fb_gradient_green.xml | 7 + res/drawable/umeng_fb_gradient_orange.xml | 7 + res/drawable/umeng_fb_gray_frame.xml | 9 + res/drawable/umeng_fb_list_item.9.png | Bin 0 -> 322 bytes res/drawable/umeng_fb_list_item_pressed.9.png | Bin 0 -> 328 bytes res/drawable/umeng_fb_list_item_selector.xml | 7 + res/drawable/umeng_fb_point_new.xml | 8 + res/drawable/umeng_fb_point_normal.xml | 8 + res/drawable/umeng_fb_see_list_normal.png | Bin 0 -> 949 bytes res/drawable/umeng_fb_see_list_pressed.png | Bin 0 -> 1059 bytes res/drawable/umeng_fb_see_list_selector.xml | 5 + res/drawable/umeng_fb_statusbar_icon.png | Bin 0 -> 3776 bytes res/drawable/umeng_fb_submit_selector.xml | 5 + res/drawable/umeng_fb_top_banner.xml | 6 + res/drawable/umeng_fb_user_bubble.9.png | Bin 0 -> 620 bytes res/drawable/umeng_fb_write_normal.png | Bin 0 -> 840 bytes res/drawable/umeng_fb_write_pressed.png | Bin 0 -> 986 bytes res/drawable/umeng_fb_write_selector.xml | 5 + res/layout/preferences.xml | 2 +- .../umeng_common_download_notification.xml | 125 ++ res/layout/umeng_fb_atom.xml | 25 + res/layout/umeng_fb_conversation.xml | 38 + res/layout/umeng_fb_conversation_item.xml | 27 + res/layout/umeng_fb_conversations.xml | 24 + res/layout/umeng_fb_conversations_item.xml | 34 + res/layout/umeng_fb_list_item.xml | 31 + .../umeng_fb_new_reply_alert_dialog.xml | 42 + res/layout/umeng_fb_send_feedback.xml | 97 + res/layout/umeng_xp_banner.xml | 92 + res/layout/umeng_xp_clould_dialog.xml | 74 + res/layout/umeng_xp_component_back_bottom.xml | 8 + res/layout/umeng_xp_component_back_top.xml | 8 + .../umeng_xp_component_flipper_content.xml | 51 + .../umeng_xp_component_focus_banner.xml | 18 + .../umeng_xp_component_foucused_app.xml | 85 + res/layout/umeng_xp_container_banner.xml | 79 + res/layout/umeng_xp_container_banner_more.xml | 42 + res/layout/umeng_xp_download_dialog.xml | 124 ++ .../umeng_xp_download_dialog_landscape.xml | 151 ++ res/layout/umeng_xp_fimageview_landscape.xml | 60 + res/layout/umeng_xp_fimageview_portrait.xml | 60 + res/layout/umeng_xp_floatdialog_content.xml | 32 + res/layout/umeng_xp_full_screen_focus.xml | 16 + res/layout/umeng_xp_full_screen_list.xml | 59 + .../umeng_xp_full_screen_list_layout.xml | 20 + res/layout/umeng_xp_handler_gallery.xml | 20 + res/layout/umeng_xp_handler_grid_item.xml | 60 + res/layout/umeng_xp_handler_template.xml | 82 + res/layout/umeng_xp_highlight_banner.xml | 152 ++ res/layout/umeng_xp_highlight_banner_more.xml | 13 + res/layout/umeng_xp_large_gallery.xml | 57 + res/layout/umeng_xp_large_gallery_item.xml | 19 + res/layout/umeng_xp_normal_banner.xml | 16 + res/layout/umeng_xp_partners_banner.xml | 16 + .../umeng_xp_partners_banner_grid_item.xml | 9 + res/layout/umeng_xp_recom_header.xml | 11 + res/layout/umeng_xp_scroll_view_list.xml | 7 + res/layout/umeng_xp_webview_landing_page.xml | 81 + res/values-se/strings.xml | 2 +- res/values-zh/strings.xml | 70 +- res/values-zh/umeng_common_strings.xml | 11 + res/values-zh/umeng_fb_strings.xml | 49 + res/values-zh/umeng_update_string.xml | 12 + res/values-zh/umeng_xp_strings.xml | 22 + res/values/strings.xml | 2 +- res/values/umeng_common_strings.xml | 12 + res/values/umeng_fb_strings.xml | 51 + res/values/umeng_update_string.xml | 14 + res/values/umeng_xp_strings.xml | 22 + res/values/umeng_xp_style.xml | 97 + .../rss/ApplicationPreferencesActivity.java | 268 +-- src/cn/eric/rss/EntriesListActivity.java | 571 +++--- src/cn/eric/rss/EntryActivity.java | 1618 +++++++++-------- src/cn/eric/rss/FeedConfigActivity.java | 467 +++-- src/cn/eric/rss/FeedPrefsActivity.java | 146 +- src/cn/eric/rss/MainTabActivity.java | 7 +- src/cn/eric/rss/RSSOverview.java | 14 +- .../eric/rss/widget/WidgetConfigActivity.java | 297 +-- 210 files changed, 4897 insertions(+), 1772 deletions(-) create mode 100644 libs/umeng_sdk.jar create mode 100644 proguard.cfg create mode 100644 res/anim/umeng_xp_fade_in.xml create mode 100644 res/anim/umeng_xp_fade_out.xml create mode 100644 res/anim/umeng_xp_large_gallery_in.xml create mode 100644 res/anim/umeng_xp_progressbar.xml create mode 100644 res/anim/umeng_xp_push_down_out.xml create mode 100644 res/anim/umeng_xp_push_up_in.xml create mode 100644 res/anim/umeng_xp_push_up_out.xml create mode 100644 res/anim/umeng_xp_slide_in_from_bottom.xml create mode 100644 res/anim/umeng_xp_slide_in_from_left.xml create mode 100644 res/anim/umeng_xp_slide_in_from_right.xml create mode 100644 res/anim/umeng_xp_slide_in_from_top.xml create mode 100644 res/anim/umeng_xp_slide_out_from_bottom.xml create mode 100644 res/anim/umeng_xp_slide_out_from_left.xml create mode 100644 res/anim/umeng_xp_slide_out_from_right.xml create mode 100644 res/anim/umeng_xp_slide_out_from_top.xml create mode 100644 res/anim/umeng_xp_zoom_in.xml create mode 100644 res/anim/umeng_xp_zoom_out.xml create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_bg.9.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_bg_clicked.9.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_bg_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_browse.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_browse_clicked.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_browse_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_download.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_download_clicked.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_download_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_open.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_open_clicked.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_open_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_phone.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_phone_clicked.png create mode 100644 res/drawable-hdpi/umeng_xp_ad_action_phone_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_back.png create mode 100644 res/drawable-hdpi/umeng_xp_back_button.xml create mode 100644 res/drawable-hdpi/umeng_xp_back_button_normal.png create mode 100644 res/drawable-hdpi/umeng_xp_back_button_selected.png create mode 100644 res/drawable-hdpi/umeng_xp_back_click.png create mode 100644 res/drawable-hdpi/umeng_xp_banner_grey.xml create mode 100644 res/drawable-hdpi/umeng_xp_btn_gradient_dark_grey.xml create mode 100644 res/drawable-hdpi/umeng_xp_btn_gradient_grey.xml create mode 100644 res/drawable-hdpi/umeng_xp_button_cancel.9.png create mode 100644 res/drawable-hdpi/umeng_xp_button_cancel_click.9.png create mode 100644 res/drawable-hdpi/umeng_xp_button_cancel_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_button_download.9.png create mode 100644 res/drawable-hdpi/umeng_xp_button_download_click.9.png create mode 100644 res/drawable-hdpi/umeng_xp_button_download_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_container_banner_background_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_darkbg.png create mode 100644 res/drawable-hdpi/umeng_xp_detail.png create mode 100644 res/drawable-hdpi/umeng_xp_detail365.png create mode 100644 res/drawable-hdpi/umeng_xp_detail_bg.png create mode 100644 res/drawable-hdpi/umeng_xp_download_dialog_bg.png create mode 100644 res/drawable-hdpi/umeng_xp_download_dialog_close.png create mode 100644 res/drawable-hdpi/umeng_xp_download_dialog_close_clicked.png create mode 100644 res/drawable-hdpi/umeng_xp_download_dialog_close_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_download_gradient_grey.xml create mode 100644 res/drawable-hdpi/umeng_xp_gradient_grey.xml create mode 100644 res/drawable-hdpi/umeng_xp_gradient_grey1.xml create mode 100644 res/drawable-hdpi/umeng_xp_gradient_grey2.xml create mode 100644 res/drawable-hdpi/umeng_xp_greenbg_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_handler_rc.png create mode 100644 res/drawable-hdpi/umeng_xp_highlight_banner_background_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_highlight_banner_bg.9.png create mode 100644 res/drawable-hdpi/umeng_xp_highlight_footview_dashed_line.xml create mode 100644 res/drawable-hdpi/umeng_xp_highlight_footview_loading.png create mode 100644 res/drawable-hdpi/umeng_xp_highlight_item_bg.9.png create mode 100644 res/drawable-hdpi/umeng_xp_highlight_item_bg_clicked.9.png create mode 100644 res/drawable-hdpi/umeng_xp_highlight_item_bg_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_horizontal_divider.xml create mode 100644 res/drawable-hdpi/umeng_xp_icon_background.png create mode 100644 res/drawable-hdpi/umeng_xp_icon_background_clicked.png create mode 100644 res/drawable-hdpi/umeng_xp_icon_background_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_kaijuan_bg.xml create mode 100644 res/drawable-hdpi/umeng_xp_large_gallery_failed.jpg create mode 100644 res/drawable-hdpi/umeng_xp_large_gallery_item_bg.xml create mode 100644 res/drawable-hdpi/umeng_xp_link_radius_shape.xml create mode 100644 res/drawable-hdpi/umeng_xp_list_item_text_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_loading.png create mode 100644 res/drawable-hdpi/umeng_xp_loading_seek.xml create mode 100644 res/drawable-hdpi/umeng_xp_more_bottom.9.png create mode 100644 res/drawable-hdpi/umeng_xp_more_top.9.png create mode 100644 res/drawable-hdpi/umeng_xp_new_tip.png create mode 100644 res/drawable-hdpi/umeng_xp_new_tip_bg.png create mode 100644 res/drawable-hdpi/umeng_xp_new_tip_button.png create mode 100644 res/drawable-hdpi/umeng_xp_normal_banner_background_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_point_normal.png create mode 100644 res/drawable-hdpi/umeng_xp_point_selected.png create mode 100644 res/drawable-hdpi/umeng_xp_progressbar.xml create mode 100644 res/drawable-hdpi/umeng_xp_radius_shape.xml create mode 100644 res/drawable-hdpi/umeng_xp_recommend_titile_bg.png create mode 100644 res/drawable-hdpi/umeng_xp_recoright.png create mode 100644 res/drawable-hdpi/umeng_xp_seek.png create mode 100644 res/drawable-hdpi/umeng_xp_seek_bg.png create mode 100644 res/drawable-hdpi/umeng_xp_selector_back.xml create mode 100644 res/drawable-hdpi/umeng_xp_selector_cancel.xml create mode 100644 res/drawable-hdpi/umeng_xp_selector_download.xml create mode 100644 res/drawable-hdpi/umeng_xp_shadow_bg.9.png create mode 100644 res/drawable-hdpi/umeng_xp_shape_conner_blackish_green.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_conner_green.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_blue.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_blue_container.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_blue_v2.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_gray_stroke.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_0.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_1.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_2.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_3.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_4.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_5.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_7.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_gradient_grey_list.xml create mode 100644 res/drawable-hdpi/umeng_xp_shape_grey.xml create mode 100644 res/drawable-hdpi/umeng_xp_standalone_bg.9.png create mode 100644 res/drawable-hdpi/umeng_xp_strock_bg_1.xml create mode 100644 res/drawable-hdpi/umeng_xp_vertical_divider.xml create mode 100644 res/drawable-hdpi/umeng_xp_x_button.png create mode 100644 res/drawable-hdpi/umeng_xp_x_button_clicked.png create mode 100644 res/drawable-hdpi/umeng_xp_x_button_selector.xml create mode 100644 res/drawable-hdpi/umeng_xp_zhanwei.png create mode 100644 res/drawable/umeng_common_gradient_green.xml create mode 100644 res/drawable/umeng_common_gradient_orange.xml create mode 100644 res/drawable/umeng_common_gradient_red.xml create mode 100644 res/drawable/umeng_fb_bar_bg.9.png create mode 100644 res/drawable/umeng_fb_blank_selector.xml create mode 100644 res/drawable/umeng_fb_bottom_banner.xml create mode 100644 res/drawable/umeng_fb_dev_bubble.9.png create mode 100644 res/drawable/umeng_fb_gradient_green.xml create mode 100644 res/drawable/umeng_fb_gradient_orange.xml create mode 100644 res/drawable/umeng_fb_gray_frame.xml create mode 100644 res/drawable/umeng_fb_list_item.9.png create mode 100644 res/drawable/umeng_fb_list_item_pressed.9.png create mode 100644 res/drawable/umeng_fb_list_item_selector.xml create mode 100644 res/drawable/umeng_fb_point_new.xml create mode 100644 res/drawable/umeng_fb_point_normal.xml create mode 100644 res/drawable/umeng_fb_see_list_normal.png create mode 100644 res/drawable/umeng_fb_see_list_pressed.png create mode 100644 res/drawable/umeng_fb_see_list_selector.xml create mode 100644 res/drawable/umeng_fb_statusbar_icon.png create mode 100644 res/drawable/umeng_fb_submit_selector.xml create mode 100644 res/drawable/umeng_fb_top_banner.xml create mode 100644 res/drawable/umeng_fb_user_bubble.9.png create mode 100644 res/drawable/umeng_fb_write_normal.png create mode 100644 res/drawable/umeng_fb_write_pressed.png create mode 100644 res/drawable/umeng_fb_write_selector.xml create mode 100644 res/layout/umeng_common_download_notification.xml create mode 100644 res/layout/umeng_fb_atom.xml create mode 100644 res/layout/umeng_fb_conversation.xml create mode 100644 res/layout/umeng_fb_conversation_item.xml create mode 100644 res/layout/umeng_fb_conversations.xml create mode 100644 res/layout/umeng_fb_conversations_item.xml create mode 100644 res/layout/umeng_fb_list_item.xml create mode 100644 res/layout/umeng_fb_new_reply_alert_dialog.xml create mode 100644 res/layout/umeng_fb_send_feedback.xml create mode 100644 res/layout/umeng_xp_banner.xml create mode 100644 res/layout/umeng_xp_clould_dialog.xml create mode 100644 res/layout/umeng_xp_component_back_bottom.xml create mode 100644 res/layout/umeng_xp_component_back_top.xml create mode 100644 res/layout/umeng_xp_component_flipper_content.xml create mode 100644 res/layout/umeng_xp_component_focus_banner.xml create mode 100644 res/layout/umeng_xp_component_foucused_app.xml create mode 100644 res/layout/umeng_xp_container_banner.xml create mode 100644 res/layout/umeng_xp_container_banner_more.xml create mode 100644 res/layout/umeng_xp_download_dialog.xml create mode 100644 res/layout/umeng_xp_download_dialog_landscape.xml create mode 100644 res/layout/umeng_xp_fimageview_landscape.xml create mode 100644 res/layout/umeng_xp_fimageview_portrait.xml create mode 100644 res/layout/umeng_xp_floatdialog_content.xml create mode 100644 res/layout/umeng_xp_full_screen_focus.xml create mode 100644 res/layout/umeng_xp_full_screen_list.xml create mode 100644 res/layout/umeng_xp_full_screen_list_layout.xml create mode 100644 res/layout/umeng_xp_handler_gallery.xml create mode 100644 res/layout/umeng_xp_handler_grid_item.xml create mode 100644 res/layout/umeng_xp_handler_template.xml create mode 100644 res/layout/umeng_xp_highlight_banner.xml create mode 100644 res/layout/umeng_xp_highlight_banner_more.xml create mode 100644 res/layout/umeng_xp_large_gallery.xml create mode 100644 res/layout/umeng_xp_large_gallery_item.xml create mode 100644 res/layout/umeng_xp_normal_banner.xml create mode 100644 res/layout/umeng_xp_partners_banner.xml create mode 100644 res/layout/umeng_xp_partners_banner_grid_item.xml create mode 100644 res/layout/umeng_xp_recom_header.xml create mode 100644 res/layout/umeng_xp_scroll_view_list.xml create mode 100644 res/layout/umeng_xp_webview_landing_page.xml create mode 100644 res/values-zh/umeng_common_strings.xml create mode 100644 res/values-zh/umeng_fb_strings.xml create mode 100644 res/values-zh/umeng_update_string.xml create mode 100644 res/values-zh/umeng_xp_strings.xml create mode 100644 res/values/umeng_common_strings.xml create mode 100644 res/values/umeng_fb_strings.xml create mode 100644 res/values/umeng_update_string.xml create mode 100644 res/values/umeng_xp_strings.xml create mode 100644 res/values/umeng_xp_style.xml diff --git a/.project b/.project index 6a9e9b8..4c749e7 100644 --- a/.project +++ b/.project @@ -1,33 +1,33 @@ - - - Mini RSS Reader - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - + + + RSS Quick Reader + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 0c85203..dcd3846 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,100 +1,146 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE index 19838d9..45c819a 100644 --- a/LICENSE +++ b/LICENSE @@ -11,6 +11,7 @@ Translators Code-Contributors - Joel Low + - Ruobin Wang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README b/README index a5a4c97..7e840a0 100644 --- a/README +++ b/README @@ -11,6 +11,7 @@ Translators Code-Contributors - Joel Low + - Ruobin Wang The file "LICENSE" contains the license information for the program. diff --git a/libs/umeng_sdk.jar b/libs/umeng_sdk.jar new file mode 100644 index 0000000000000000000000000000000000000000..19c8d276184f266079cef727415518bb3bdff0c3 GIT binary patch literal 436764 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 z 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 z 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%0Av{hP!b7)&H&!3) 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

KDaMEiJBS0PyIgBuTicW|gNf6Ey(1|Vt11XRl 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 +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +-dontwarn android.support.** + +-dontwarn com.markupartist.** + +-keep public class com.umeng.example.R$*{ + public static final int *; +} + +-keepclassmembers class * { + public (org.json.JSONObject); +} + +-keep public class com.umeng.fb.ui.ThreadView { +} diff --git a/res/anim/umeng_xp_fade_in.xml b/res/anim/umeng_xp_fade_in.xml new file mode 100644 index 0000000..6ef335d --- /dev/null +++ b/res/anim/umeng_xp_fade_in.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_fade_out.xml b/res/anim/umeng_xp_fade_out.xml new file mode 100644 index 0000000..d05bb1a --- /dev/null +++ b/res/anim/umeng_xp_fade_out.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_large_gallery_in.xml b/res/anim/umeng_xp_large_gallery_in.xml new file mode 100644 index 0000000..96078e9 --- /dev/null +++ b/res/anim/umeng_xp_large_gallery_in.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_progressbar.xml b/res/anim/umeng_xp_progressbar.xml new file mode 100644 index 0000000..e20c04c --- /dev/null +++ b/res/anim/umeng_xp_progressbar.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_push_down_out.xml b/res/anim/umeng_xp_push_down_out.xml new file mode 100644 index 0000000..ae7f464 --- /dev/null +++ b/res/anim/umeng_xp_push_down_out.xml @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_push_up_in.xml b/res/anim/umeng_xp_push_up_in.xml new file mode 100644 index 0000000..84d8cb0 --- /dev/null +++ b/res/anim/umeng_xp_push_up_in.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_push_up_out.xml b/res/anim/umeng_xp_push_up_out.xml new file mode 100644 index 0000000..f05194a --- /dev/null +++ b/res/anim/umeng_xp_push_up_out.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_slide_in_from_bottom.xml b/res/anim/umeng_xp_slide_in_from_bottom.xml new file mode 100644 index 0000000..8537c4b --- /dev/null +++ b/res/anim/umeng_xp_slide_in_from_bottom.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_slide_in_from_left.xml b/res/anim/umeng_xp_slide_in_from_left.xml new file mode 100644 index 0000000..7402226 --- /dev/null +++ b/res/anim/umeng_xp_slide_in_from_left.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_slide_in_from_right.xml b/res/anim/umeng_xp_slide_in_from_right.xml new file mode 100644 index 0000000..334ae20 --- /dev/null +++ b/res/anim/umeng_xp_slide_in_from_right.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_slide_in_from_top.xml b/res/anim/umeng_xp_slide_in_from_top.xml new file mode 100644 index 0000000..8e3dcb8 --- /dev/null +++ b/res/anim/umeng_xp_slide_in_from_top.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_slide_out_from_bottom.xml b/res/anim/umeng_xp_slide_out_from_bottom.xml new file mode 100644 index 0000000..61b84a6 --- /dev/null +++ b/res/anim/umeng_xp_slide_out_from_bottom.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_slide_out_from_left.xml b/res/anim/umeng_xp_slide_out_from_left.xml new file mode 100644 index 0000000..e9ab077 --- /dev/null +++ b/res/anim/umeng_xp_slide_out_from_left.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_slide_out_from_right.xml b/res/anim/umeng_xp_slide_out_from_right.xml new file mode 100644 index 0000000..9c31fb3 --- /dev/null +++ b/res/anim/umeng_xp_slide_out_from_right.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_slide_out_from_top.xml b/res/anim/umeng_xp_slide_out_from_top.xml new file mode 100644 index 0000000..aec327f --- /dev/null +++ b/res/anim/umeng_xp_slide_out_from_top.xml @@ -0,0 +1,6 @@ + + diff --git a/res/anim/umeng_xp_zoom_in.xml b/res/anim/umeng_xp_zoom_in.xml new file mode 100644 index 0000000..7718be3 --- /dev/null +++ b/res/anim/umeng_xp_zoom_in.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/res/anim/umeng_xp_zoom_out.xml b/res/anim/umeng_xp_zoom_out.xml new file mode 100644 index 0000000..a509d98 --- /dev/null +++ b/res/anim/umeng_xp_zoom_out.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_ad_action_bg.9.png b/res/drawable-hdpi/umeng_xp_ad_action_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1287e355eef78ffcbb31769f55102743f7ec8a57 GIT binary patch literal 712 zcmV;(0yq7MP)5xnU*OG0eYHHGqJ%&(8e=q~hExOvE4I*<(mPNrm(to& zdS~0M<PHyVKC{?*R?GLuK^cP#OHjy9U36 zz$vzAoaX;78WuV`>|t<;5=2V}kgEJph)D;(;xvyFb^j)|jQXy(V5sQRG%rP+BZhAub=*C0yEv*0I2z@!YvLI_*pp~Deja))h+_%^E$#MXJ} zbVixn<%p2^{2utXYFui04^O5NOny2QC!QRExs56p&%Q1*`T2B` zxYu^UliTCs#Y~FHFFgX8T-}A~b;8A~Ig!adb1CA=?f{*Dhd15~li$vZ#Gb8yb7hB% zUSF2U8efK3zgNJHtMkwoSY>kGw=5YKx51LBa51pB&g6mM3NfW+7{dv87+lIRc`&p_ z3@I6moMJ>8-S%=ehwdaS>AT0Vzdx^u6qwb$ZFS`+!&Ouh;y(0h$-R=9m%{SfOeBj^7- uDCq=^$Q7gsxr$snzBV1lFC5qX|M&?m23wrDWpft*0000mm@=q#V{#3QCGObkm$tmRqe>u0^F7=Ep42 z#NIH`iR2_iG!YlBav>rS(JnkYZ_G}tL-3|S(cXN`a#>a!kYx==0QbNI6GJBhTCuEh+M6lhpAW|OgIt^+&&ADYg87P zT+hQSj!wfpm6gb~8asT9?Bdl6RMco3M1DB%1wKS_pvSAzP&=?dHw?RAFtmdWcByzg;vsV5s0aFkJ1`W^QPD8Q5Scgb1+{nJ(uRnRkNo5KrQ^E)U%vr4h1fFOd<>KT0000 + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_ad_action_browse.png b/res/drawable-hdpi/umeng_xp_ad_action_browse.png new file mode 100644 index 0000000000000000000000000000000000000000..17c2378af39ea844fca2d0f4dd938c500c039d4a GIT binary patch literal 2711 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 + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_ad_action_download.png b/res/drawable-hdpi/umeng_xp_ad_action_download.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd0c79c04021cb9599e260107ea4449802ee03d GIT binary patch literal 2981 zcmaJ@3pkVeA18|3%PRL~h{X18<~CNDk&QWX$)zMSFBZ174I8IZEJ94KO*l@dQ1~l{ zqNtP#-CS}hR8pzre(8cUopjFs`JeNDpXYtQzu)iqd_LdH@B2L8H<9eTOI}7zModgh zp5TCY6@<`x5Q2uwV{{i9sMDBO~FFCU6ET2!XV;v|QFep^QZcV>XY@p>U1qY@HPa zJjkZ9XiN@`L5D6YQv4a=94t%}>7OZtF@MO?+26|~Dj0%GVIq)lU^%4~Ac^$!P22H21#By>m z;A2tUdWe1RLc`hBIAmemOV?T%6=K0V%Yv_N4{vww7fNA=Y2N%#GNrZe3q^tCbdJs>Gk%;k*ukQT55UoPlK#2 zj-AvI@)NnyOBE>#!6hR{h7LR$O?=rNZx0a3Nm@gT-PELCVQoCQ8|!e>s__PR7j?(y z)V-T;_H?RSEdk^64^+dGhf9uS%c^8MZ1#T2**jK2I>ezUpx+xB>B~Mfel)Bu8Pss> zYV>KyaV`9jTPhH3L33Tibm)?};Myx`295IzMn^wBvjtGV z2URaPzc3@n%W=M=EdzDpsH%Z~UiGT_TI&Q)xOL=G&Wob;n&T-@{#IOX`{F@J8w71d zVzORozrITLE*n0r47F>68R`9p+P_ICHLH+(HJJOWvIQVzr5-s=_nC5emHgO$UMP7c z)2lUXb!-uC6FZ@0^|SU~{>WE{!Jg?}@4ipW6W6Doc-GDh_RZ+MnszA(Z0EncdT#Aw zB^kh29(nuv==;W`!TfeV)iC3Q!yQZ~9 zNwM~&?Y{lZvP;hf)gi!wy2n^7%(3%#-?K`miiNdgf{C$a4Yg=XyFd^>TI*8Ku`9P= zT-nKey=`i>d1#XpCE=g&D`7CdB===^1^hFK-KuktPKAO z8=O%KkReQF6YBOxLA4C7e1yOzB~#9OPz)o7C8|drX05rTr&ea?vH2V-e@07lo{>%6 z_^=d{J}#B~-XA-IAg7@9`d7tLSGgZN6)*Su2aWDeY1BO$UXpsd+YYWd zds`9cI$Q2)d-B}upfp4!?ZH-9Zd>_#LxuQ{@qT@s0ymXjafzlVwM&qJEXKIco%@#% zK?67tN%oVxAy!WlNOVa74toR>+s)u*(>-tdlk*i@qXnZ|wkb5D`W*#S7kNKYzOqp& z1&QBxnRb~Ew(gbHswsV-+G=)#81cvn0t(N@f5=>zOX6G39av1Q%Lyuve16>_7N@uO z_W8yf?Cyg=)|{7nBQVfKaaq_3TzwF7l5n{QcYzq-CMruMUy?F6d@;o^}0PZ z{0Z$Lhbq<=@z-xVGIq&1@{RDZ%J%+8>kew}Qt&yH)+N2;dJjKH)~)Ddb&%xI-g3i* zn$-2WpP3N3Yc3YToNCsv(aD>*H=kryZA(fh4^FRdSa5n8;@?wj)-j08FuDcgvK}5< z8fYyj?AmsLn;kMR>7Nm|9ZOHyZ&A9axdzh~--?A?bZmPQ!`#5{^`x78Y05~$9go9dqp!=N%cw4QSv>Wf9o1=WraspB zUuIGpt!B|gWwm32TWcl7+k6@*%sqsV*=f^{AKwZ3yLvS0ky__tjR=ks{@!;>c*&_{ z5^oky?Qm{NKWPnZb3=_~GWn|l6`W0JSyCm7>_J*xP{*5eaDOqZBh~EfX+=_j`;P2XBtxfsbP-FF@> zCEwBQL&L3oEX`VyVa$#EaXIPZ`AJcTW3ojm-J{|B6a6A91xs= zt5Xq6KYtFdY$@>_ipa{`0$#Hzj2_k1v<9ZG>3Z+%DZ^BnI#Z75kovpmAvrrRrl zdV@^gwDEy;B@#>S?l<<(Xj{siINbWe&q75Zp8sD)ePx_}pQ_8|+5f`$FPi_Hx_^Ud f$eCYUk_Nij&5#B#uuQ~80(^r6Cl}zd#B{iX8^{ykBzVMEU7UP9e~d)Hze2+g8~r?AL7Ou#}?St5S0kRiV~w(-0x0nSOtqKo-LZ$3Y8p^6lLzL+oa=L_IY zThVYbox$PF@4w>7WE_bn64QAM7Kw;Q$Q7(P945}$2J2{xL9MfMaBxJSoaJR&hjnst zbU>q>F)mnJ+XXI>&j{wSc;W>v^KUNtr`-8g;0olPi7X)}gvE3b^11M@DdRXlkHzMv zdf&OspT}bRQ!Y{-408Tr|8da^NAm8OU;b!Y`Q}ICvv~4u7tXi!L+LFLNZE`;bnupR zy*;Jkzhcs;E+W*dJM*{ef%h~zlQRR!X%5}1-Ci3HWwcnIUl&-^p34k02I^l?Pgv(3 zUIa7)#=tK1s9T68m#WF^U5dO%6AYCGG~t-YgV9cg#n3D&g9FD-cS=%e>T4BRv+fVS!)r|Pff4|l7QM_LgDek zo}}zZ+T%1Ky{eX*kT1&DpltSP@2`C9S(f=huZdLyh5Mz~W6DoqHo4u_NOfEs_t09ck!Z&`P+urzQ=DaD!DjORpKQG zR0*sz)l0tcbR<6Be=(q{Vwph40$epyi&3@2rb;|O-5V=;B+5F0mW}2@d`kDTTJL8K zFH0!|HMTgkvVZ~uSH(uVYE$8x$2B&Fj)y_92?7Pz=!eXWVhlHGwlH#bu1_6S-<)}) z=b*?R8`XI-d1B=G?N4BT-SABqZF9Gm+4{?&Q+zFOr+Q=*Oi}GBxML^u3fR)^cAk1{ z%6*64w0!MnA7i=!<1^jDz`kj#Z3UZzZMlt$R7tww;X8S-+c!haq;cT>H}>YG%cTi@ z(xvZHA#rZ{;C`tmQAxA9Hd=Q}{I7zJu8MaL>yZ%zudqA%p5cS8%df4Z;k?2N8=tSA zI{%Ri??`~JY0dUG8DIWnkwVcFS4|O_j$%?uOJ*<(gPQo#>VnJrl}2?A!8X_iN8fFQ zDceHz9%M9aH{T|t95s7(cvaZFNRy`n)u)M$)F+oHtrm|?*VhCOPx{&KI5@zby%e6M zg#%`!8GPuj%t|A6<3RV`oHsfpgNai)I|%zQFoL1B z%!u>e!2DtVChB2A?4ua=uV59SO3nHe~U$vp8`MQ@u zbz^50wf@S1dMq`Zahg6iN}HX!oE~K{WLE3DZWldzV-ys8G0+e{%XS_!QqAzPg!12^ z?pNH?Gyp6Y?`?`~@Y)x51+@%_{at3{7iOeH&@}*Z4g|yx0^@CMXGlrP3W?~?XLmG3 zP{Y?evAlJ>%E}9zK>uaS`9;t#Te^MH(I)=SmQCubq9%H^V!k|mLQbY<$Xqu6*Uzxr2a%<ox*J zs4S*X`2c2D!yfMVThc_q*$bv5pY?|goOP_X$J8k0X>MnF_)mfg;@-KpcCWX=6if?0 z=UvYlR7;FJ61TYXv`T#OjZZOx?M9F=rj=ocI85puG5J#K!F%JYx+&qy^1Q-Ei$jWA z4DEoVX!nn+sg$|jV39<-3on&PH@@t&>R{xIxRyEN8a@zhH&^CCT23D?Q>`;6>rdCj zWkn2O&QDfYrFDf1}2GA$3ci8WE9<%nh zS=omwZ#+e1Pj8JXn*djE9M3*72AfQF9^hWifGulYTah~H`ym;5Dfd@(8bM{v3ou8b zIuH|s|5t#jMjNYavhv_`gzcvup*eKvp{TR8|1d7!#_IR!`puyK8%E3b`o|DnK&uUJ a1w%mi>auLng>$*{ztJRT4`QJsE$ZK7%KAM3 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_ad_action_download_selector.xml b/res/drawable-hdpi/umeng_xp_ad_action_download_selector.xml new file mode 100644 index 0000000..1154800 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_ad_action_download_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_ad_action_open.png b/res/drawable-hdpi/umeng_xp_ad_action_open.png new file mode 100644 index 0000000000000000000000000000000000000000..9979372cf6cb6014703a233f6035a0bff4f57ac6 GIT binary patch literal 2731 zcmaJ@3pkVeAD_!;b3aDW!Hgtjdp9O9Z?-~WA{_x=8UzvuJ$d@sN6^L*c3UhCFs!HwY% z2tLZWK>Ml#o!Lb%~1g{4oZF{0tFC zl2HEy<+fQZ4w#>S#!?a+K-7zXR)Wf@I)#K%D4;o<5F!Nt9G$Ra2ZEcMI~Ge-l*!(SOm=s} z{Yl1#ZYUuH$#P^R2)YC_Ga@Atwe5@euO4$j>PgIp2>3|6RQ= z+>r0bLijEhqX-5wf3g3%=!GLi_slQ9wyk3GwedloqT7Xvwtkme*bITFo6#w5ev+Yy z!*NlFXhi$HiHT8m?6xQj(o1_~O_eese9a#6Wu#hPhPl!?�ok2=j+iYncp2#;0AD zQVJ}|aDM?(N%<5l6<*ly9!W1bGRzx($!n-?4|E>;u%CmZR@rjHGMW!0)E*oh?cuv7 zzM8wcts3;(0F8(}ybDzjWW5BQmRvY*o+#nvL0c}|mp7-yn;7CX@ap@ES1bjoyR6MR zv+J{nNu{RasafT{W{Ci~64k$1UxmN;$zWl)Oa+(oGi^N~W%(|sM%T_wRyXP2tJSa3ithN!)NWBghRxD^)-Qk7SsNTf)6~+hsp4YH;F3y+uRj95@U>W84P75 zk~?iA8GHY7y5Mx)+{82Q<%dv}W3@=J@O5ZH#8}D_Ps<&-w)vCW9}gTf)!j?kl<-W; zhVG(w*@@%|^L%}@@;I^XK~SP2Q+`aO<7r)9b?9KlE!%D>M?VK?c?t+5HAwHa6{wdV zI;ySTcj1ynN(wlv?#2nw_;zF_C7 ze>z4(p!@_H_sHPM2EmCt_kSzC(P7*vTjFWZ1@vXfi3RCqqbmwBSQ{MCFhfIlWHv!S zQW-4w(CDrnM0Yiait7t3N_)fmdrK-GVReo)7!T{pteRSV!(@-dQK;itBAgW0USH z<6i~__Bw>QgRKW6)im0YhUJ?phO+{SxAGcf9pa#+dP6(sZdD!LYH>TQyay-nBAsX~=dTFxq1<7AJ!R2qvE2j8?HI)1-N*l1~QIzOU_5 zPua0ou%1E3>(%1(V6arFkH1;AHv*k>C0R*?$rJoiS}LgD>5X_!#8{bzc89hmc~@2X zfY0k!2U!++>prGhwS_tYFz;k3g5M97U4=%}NeGU%^fVRytc;84o6FK|?bYQE%Urpn z!9j~R+L^SUf)KDerkbOk@l4dI0jTWL$V{O9qkCrAa{n$MO|Mt3tMfjFI(IF3OSBA8 zA6R|!uw6_^$GCmZMw8ucn{L8{?LPfljMmB5zMOser>|9>WK{dVU4N-aH@)Z27tMs1 zbAM+)Fm}=;=3Z@+W=;o|4O_IgHqPWn8?2^bwd(^SY_|S_ zZ>8kCRU?OL>)m^`A(~tB!9gCVYvQkFxUH`5hmFFEBJ;lnCQ23&@*}JsXhB+u8b%S^ z^&^&ot+(qvt1Sk)TyXrF_A#X{>vQlTOSih^svqB541b)RPDzy5oQj*O94crsYX!QG zrvGuJXARS4bIs$LBM+~fa5Cc2g#K$a;fo))m}!z<3?>FFwYk0T<-4SBJg;{O1LfaZP?HY?H`+jZ+5dKhZ1&| z9B-~&0@cJickVWRbqqKjbR%cxz*EMtsczK@{j(!8zdk*eCaJrjmoojNI(=zu#XSR^ zyLFkx6&$b0Qt@x9X?-r~(gAf5OQ>uU0FIyzNR7e{>F|>5RIjc6`^?DJveY+N; zw=t(&ujS3M5Zpf6O`*;d>UAo0_|DH|#X;Kf{gXXCc;`UQ=_`9L4IO!oGlN;5)!iFB zs#MreUUU58^|&{C3~d=#Dd?RMYg5mSPagxDy<6U-{!UeS)Q3EOj$JnWW7&Y0%uqXX zI%$~}%}*{XP_ryG5PUlCZ;|p`C&MzVSj`Ih_&Veueof*UO8M#RaMaxv9mLfX)ss6? zxs&SBf%_}wTs(eUr8(L%n=kt~1A~%Vya0sezfJ$Q$?|2uD2&H{!4R7Gg#q*p7IexR d_{7_x0YLZyzoyhMZT|f4Bb~aAa>hL<`9D{Naex2- literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_ad_action_open_clicked.png b/res/drawable-hdpi/umeng_xp_ad_action_open_clicked.png new file mode 100644 index 0000000000000000000000000000000000000000..7286e49091b4f743943eec712bd09781b3831a5d GIT binary patch literal 2692 zcmaJ@2~<;O77juXLJ&~IATBWxiUL`PfQbai!V(~qRY3vC@&XaEkOUG8bqUI1u`Di? zmddJFMJf!6h^=6X5DbeHS`Zk@q9_WAU<*zv6Rg^`QrC!(k2WoV+he$6lUp2%RoB) z|3i7a4`{I@82BsR|0ygEO%Vdo+;p#nj|aux&Q1QLNb zP9TI+LY&}q28+vIn!m%-=>!^IEMf3j0F6pSXcbUgE}KBbV0PlM6tXjkM8;x0wQ1Uc zr%=cwCnrxAFFX#n%%uugNj!irS?03;;!-}!U1|lMQ0tirh`7lB+e;+i!QUO3!2NhE z_>bzn=dwQ@3+ba=v^E&@QeppA=;bAC_bd%Rw5@jXq45E}w%bM8w*D>;(*OeL&(o-+ zP}#%hU&SYwhncr@s-N?vbqz!Ox~_GnGinWtOI#JJKM&h<)JSuu)y z0LwmfVD6L;*#oO*Yq-ALhJ1v2jl3mzeXVDL-8JA}52xI2br$p&%nTCFlv7qowjNW5Shg@ox}qfJz1alD*t!29t{oFzf`nRM_6c)qJGMG7 zI@F~tjgWJB^OQ%dw8P&BrreoUl=1MM^QN@B zG$wMz{!j%6ZQ>B6Fmaa}TsKLYT^z?=37qDlSV>_KHm*@jl7Zt^uo`yvof!#`$ZgdXK>E*|Gi<$o$>J+@Ed^RKxfw{RLfpC5=BA zZGn0}0&b`JzfeizZ=4xe3^=pKap$J#-)6>gA!}dGmjx13(9M;Jr1qyCywhKfkc8be zFqS6O`e57JC<9O5=B8hY^n!x#(TO8^RqPGPl_F*-=Rl%HL{uc^7LHb__0Q*!FenAQ z>873On#69yzE|d!n+C_g9Q%@5c~m_w?LI=`jtGc5X_je#8B#T!!2isf;Qy#p_FuJu zs3$e{%HKY@XsOTKZ}jYmUt?Q;^3BI1QZTbS@wUX%BxVqesv+$YnAav;f0(G51Uv5x z+?@PO$A2NTBJpb0TKMVi8#>m8^-7|s~qx(To?6nxK^ zx2QQDoBE6;E7OBo@1BVR-!mJ#a5Ti_`vSOc-+}F@_C`~|10<~X^Nn8}XHq%sZkSu1zIKq2}4)T7fw-2DE(ca9$YC?T|=i+p|#`gu+ zeDB+Xgz5W5V;__n!nTYGGL29%b1mR_J8*te#~aCK!&t6lvT1>iaYlHd_@++_98pupqZtY8RI)5d;2l07_8 zKNB_kpf2E4%7xhmZ{74kJHw%??vlW})<0b~uo=sT+)ziuEY(M(#dN=ZG8ornipqM$Be`}XYWsF z_S7fS^a+RY)pZL`0&0kLB|fB2h6Zk3Uy1ALDSeeWak@%=n9lESyF9whb2hTvF+lvy zsNc0;>xT|qsQ7le=PItKsQLbQ!RctHiKG8)G{u$KlwFMN4A;z8I=!gslvir%$zMb9 zXR8JK-tIK|CTP{cf$z>Az}L(Q5nYK^=;5G}m%mebOkiHGH>}&>WQ0m3=AU z=I@s-mkCvV7d-u3s#?`WVbe7Q8|!ylCfKMcg^r*T5z<4PWoDx9l|$zH_KW(Gj0*&-z^G_iRDqoYib7OgNT=k_YV0kp3j*xsxT)tKqD@cVg04AXNRA71d?-+u>=DIMdAH zv#*1~e%zI>1i!)@wcN|FN(YUE%3hh~n0Y}cVoXkc5XKw|rZffqrzu;$F8+3Ttp9Hq mrsr?_AMO~hCfB~Vt7AY((}mH3g(A + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_ad_action_phone.png b/res/drawable-hdpi/umeng_xp_ad_action_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..c539ffabf87ef904acfe204095c3d68f17388950 GIT binary patch literal 2663 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 T8Oyc5%@F`Mvo-BB_DK2{ItK(q literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_ad_action_phone_clicked.png b/res/drawable-hdpi/umeng_xp_ad_action_phone_clicked.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd27be61a7bb8952625cc8522f9e1ca851023fc GIT binary patch literal 2640 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_ad_action_phone_selector.xml b/res/drawable-hdpi/umeng_xp_ad_action_phone_selector.xml new file mode 100644 index 0000000..0ace1a1 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_ad_action_phone_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_back.png b/res/drawable-hdpi/umeng_xp_back.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5499d272712762c502688fe1303e685802e670 GIT binary patch literal 1538 zcmV+d2L1VoP)U+<{;{;+% zFxV1dMUc2eED(6XBd|td#f}9V9sw2zP#%H>5-Xm8MUWD)0wTeN#EysfGWOi3yQ{l7 zT|F}%&&`NZL;I40mkp{L+v7(sgT~#aBOqZQC#mV+hBHq1fcA9@7E*IymP-IdL4H!l74c zhH_o?kUZi@z=@(rz!`+5W=DoKDW$hC6mUkvh?R137EanM7^r5Hhe~S_q_qL0aX?Br zxhJ)FL_uf6fO2b6)SPLd(wZb`Z7Lj<)}&>llp~WN7#)4(L~4R^WfRR&jxq%D8UmSX zPI`SqC;uN}Sx=&Q^Dk}9F$@>FZVaU#1YIm;3Z7qcAzJ)9U5sZFYyW7#DFV@-hhB zaPqD>w!1PHOsjc}IP?h&>1HY2S|q1(Y_~#S>^Wd+hF+%8mLm?@ZV z?w9biJqD(cfbj&FrK~mot>$E$D#&d)g;fIM%ml*&A8w&ce_O`0db5y}=XD#GGp%KP zMmmLSbHRv%GOY{yJdLb5V;XwxW98Q7ibm66SPo8l8os?>#C|7rUpoyQU)?J$zimE?FuV=Aw~BRu9LL1E1K;{TK|kr zissQCd`dgBQe64D4bi2};}|m?vecZx5NU=0H4e`K^!&?Wts-T;xS%ns=FmbTNo)BG zO(RI48g#fzfI2e)t=xD8x?v#CV_oc!OgX0t5-tJt1W<1_Aa`YLsg)y5&6%u0sY$3G z?o0ss;h`%!3Z`8krRhssbEc&?X)aTzC5QkWJVu4m*jA+=041G-RVN~7ZE|h_u2M*~ z!6Q*n6mit||3+nPO8^>lmYcOF%XzVF9vs>HKNEmL)T)2MFkNzL1_HlB);k_vbh|>z zk#BJ(YEaS=!7Q@2($lG+)+S=Vw0zd_5pqj&wU4W|CY+LZcWk24UEB#a1h;sWu=cS z9(|^?a%;Ij@u0IVG_+Cmw}8?nT+^Hm$6~u`#xjgr$HZZ`hy-u_Ze*@D%=n7BWRAVdU!Tb30#j^nwm>lcef&$ew&uQ|OJX~|B@p~`>{)%0c6 z3qW#f9jB4(@k(~+d;Q;o{(@)pOOFJcTWa1i0TcHD3;+#&@@ZfOa8}jaEgZ}^pwSUe o12cf5zOyYK6`lK?ZT|`|0CW-K3fXH`s{jB107*qoM6N<$f*4A}PXGV_ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_back_button.xml b/res/drawable-hdpi/umeng_xp_back_button.xml new file mode 100644 index 0000000..9a9dd90 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_back_button.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_back_button_normal.png b/res/drawable-hdpi/umeng_xp_back_button_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..5faa2361cba0aadefa79d7f14bf12145c5635b24 GIT binary patch literal 2333 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 + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_btn_gradient_dark_grey.xml b/res/drawable-hdpi/umeng_xp_btn_gradient_dark_grey.xml new file mode 100644 index 0000000..1799f8e --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_btn_gradient_dark_grey.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_btn_gradient_grey.xml b/res/drawable-hdpi/umeng_xp_btn_gradient_grey.xml new file mode 100644 index 0000000..ebd531f --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_btn_gradient_grey.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_button_cancel.9.png b/res/drawable-hdpi/umeng_xp_button_cancel.9.png new file mode 100644 index 0000000000000000000000000000000000000000..df0b7156ba74ecf7f9c87a73d1af179dde3d068d GIT binary patch literal 2215 zcmV;Y2w3-tP))PAT+Kd4}oi`FJsQx))TBZ>;C2nY>w(<&F`Di<$! z1Mhd#q{-=dR_8rA%mF;;jNQ|0k~hrk*>h%{y`Ho7+G`(}6)QgPPq4!O{J+P#wzl@m zbLY-|AF4gn`%r$i&n)YjJab=YxWcz8INnVAV*zkVIOdGp50%k=8i ztKi1JQRYR|Xa3<@Q+ZILd|dSxoG3Bp_nR=AtmTudmMrI*oo< zz1keOlyD|{h54`-5UQ)H%$A~c>mq1IM@GyxM4S4Pq|$d=MTNar?R~wy(fI(NYkt9| z1Vk*^T$Bcy+Y#zdpSFP=37zon-MirJ+qd>R-rjNkeDKry^^s$;rPlzHW9QmlA_yCl zogEz!1YMn-b`F!1lMzTjOn*VNJp&PKQ?Y)N6BALpOS*gaZW1DvY_1AtQ=2$_>XZ%m z;MJ@490ySNQv1;0pgB-b0a^T>7@qI1sj=5?-n?mpk!xE868lR44G3eSqZW;@6?g>K zojZ5tLB#uLV>+ab_p7kynokN2B7_r8*45eI4)pg&0L0s`3=G&+3uJm8PX+-GXW>8< z%<^F?$Hgx8m=sClZNM=xK5oymAwo=t^wA!bi~d*;B9?3}3ug$H>b-k|+GEE|B%e%E zf{T9q<~jGgaKbtU4vJ45`LJ_(dOG;);>9R}0)b$ay>%x}n0U;}44ar{c}yGUiFn-H z+&u3bToDm70TD|!mxUt)(PHY)L?~U|I0^^o7$mf`|9ON@QKq_3PJ@5RoXkEF7=pFo`GAh5ooe1AaM#2&d7Xfo}|>4((KrsSPnT z02hOhPg^-YpsZQ7%BIygMC3%+{Gpq^D4ND0a?KwLLPVnEvbd@RkrHUFh!mlK2#3)h zn0Q^=2P!_&mTz16>^-}8+hWX~4i!T5Ic#38*c4AdM3{G3I7Sd%x^&5| z2HH6pt-AK^*%SP>Yge$Zy4qgHaYv6FiKal3RUDdcTY-RSl+Ps>Qe@P22l-rSn9nUG z)ti8bDD0X)n648Lktn$;mh^3HZB}?=V2d|y3^r}puwWvJ^A7CaAI;lxrd71VNW=i- z+g|?6SWyRfR4Woh%IB66eFPCuy5awYf zcI;Ztl3gVMLFAfWu3fv9goruLMM1q1Q-m|LY*rGhTnRXcG#fJ!sHUpQYBeg}2{s~9 zOLMagMy~Aznl+h3p2u7STJ8%9l>nB~$jHdD`hRY5VHXTUND&F3vK

~=HYhYlVz zKm-t5BANX8CzCBp?#Z zqyA zSI!}NPk3UU^YTg~ZmY@u7sNfiy}dTid3mJ~caetN{1HLa($cc3ySv*Dj#p}Rc6QGH zS_XYVOixdb&2?U0ONoG!_=1?&S5*yiBNd^_50+Q9;DQLW;8#_}BN9_v=1cSZ7sYwS p^*7OnFU<=%`NDs(rT@w4&p$9UDLp{4r#%1w002ovPDHLkV1mFBE$sjR literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_button_cancel_click.9.png b/res/drawable-hdpi/umeng_xp_button_cancel_click.9.png new file mode 100644 index 0000000000000000000000000000000000000000..52fc7c97e6ae59f8e6cdcd2ea54c26ce5b912b4a GIT binary patch literal 2231 zcmV;o2uSydP)x|b z9yw)b z=`oisU2>h~kd{ncU0q_KEN^~EkjPr01uT#wkb_?$VUa9vroAMRDa>_{gI`z|2on9B zL?W!v$jFF;gD(sW3_zlPl1St_#$hcO92`s{k>mg_U%u?%;2WtV%5fxea3pdF28pg* zx#Hm98-)3eL=KrJ(dg)?Lxw;H`>i`ZK5nXy95IozXU*8ySZLZvN+?t$V$Ft*uBonG z6<=BzBg4by=Pg@IX-SEE_m-Cw7n@itmL%V`YuC&V>(-g=Wo2e^axygJT9!lz8bnM? zOh^iXj`o9%8#b7-(o$1qmADd6Fv>(xnU?p)jT`2`{{14$ro22^XQB-Z1Z2xyzh1Jv z`s~}cZ%f^s<>hiMWt{71ZOkTbEkw_Lw zB+98*v2&-ndGn^+V{l+V>TS%;6&aOWfhQ3S3L@ylsi`S*|NebbABjkZ4_i~p@!h+3 z&7((;66Iu4r>CdQxrPQghG4H=y-EPmF+~XB?0v6VrDj@Q?s@ChE%W^Ob0I2Zz(;~0 zj~_oaqt+=^a^axT1|<>KQMPUCRw;vsT*H(XG`-N*p&^li5q{?MY3bZPJ2l`xq?Y&h z^@&m-nH=}`%XEQqz=H=5L|H%D5zhB)kVuISX`ViPDkQ&m@1DrZV0iN6iC9bOQ74r| zlvN!#AOymq(LU}M3KAh`kby~8vQ$~0qpr5r)YjCPV@Hpg3Oh|HiBJOM;kY+WHob@X zAC*>NC@&jw(z&e{FUoTv0K|Yi93$`XW5>+tQ>V_;HbGvz=x+M|)@| z;Fz6+kUePnAmJEl60HPCgyIw>-7D8o9|d1He_rbS+0&CK z&m1_uy6X!^i+3pI(zxjcOM zP@HQVPj##z5u+A`9Xfc>6l~g*PyhIt*fci>AaG@X(rZ>pIw>W#|Ou}J?1S^$8oaUw`DI2qvfO?b>-WL}YiK4Mg znU;}zLRRko`t@tmP+u>EWdJCN@W=R$oaw+lyd(;mKCrN%CQ;G0Z8E~~Kkykg$8$eQ zB9x{+2#UlK5N2~s&IU`BO<8#!Bm%pbwIh4 z3;EK4L}lnmw3?&$rGa0dBw}p|MNv+Jh{PyASXE_yw^7mILxsOW5=2t@y`ueBn}ga*mls?+M38r7ZnyJ)|XO2 z1cv_u>6lhjnYy;7eo8i>IUcn-Jkv`eh*7Z$xHfboqM<FxYJD1 z4u1oSL&q1!iAK0D(^`DdGu!h1ap6KDGGyBIk_exO1SvjUIxH+KBuJ$92omC3bizR* z{DUbQ4Rpp6qVM0omkx$3IM#HyMl$$3OkrHNch8>0(g*c>y1V5#-$rW#{ry>!7YoR= zs%v*dR$dZeVVL3|MmoHB@gjUAV%`oSAdzN)0nrr-(Tug%u^t*6l;omXAhvyw^utN@ z?nlBRu}G?`=9vUCaetnJjF3vVfhZ{`U+q4+Sxw|mzvlb@F-$y1>1AV@&= zP>@KIaA5-@UrD5!(U`g*5Q>9*)YFika;y;k3g^B1jXo7Ti!=l4W=9Smmgng?EU1@6 z-s>0$$V76~>-*t9K}6aZw01eQdrCBK3S-6G3~rNdDo%G2pD z6_leiuu`4>3ca^F$KLy^oREp{sn@B0M;o*)%he4E@Y%i^5~&jC>`arw!9R)QCpjp< z!ND(BDOh5OT*o+kGKrWD931?Dr4L6U2S*}@0Fp?&T&{HiIV;W@uF@i zb#U;5_$vO4_q7aBehuL|$H6c7Wlhp+8T17)Y}j%guu0E7Sl002ovPDHLk FV1l*~AsPSx literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_button_cancel_selector.xml b/res/drawable-hdpi/umeng_xp_button_cancel_selector.xml new file mode 100644 index 0000000..22c3a7d --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_button_cancel_selector.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_button_download.9.png b/res/drawable-hdpi/umeng_xp_button_download.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a05081358303ae983b2058489ea88fcaa6db84b2 GIT binary patch literal 819 zcmV-31I+x1P);R%3ij4Sp=j7 zR0K-I#CTJqiQq!_PAji77#qsGnkR;f$?r`*r+04s=AB6o@1xT#|Kd8V|79)zZ)KLG zmG>K@@yZ$&sCX>#YmWeaxvunZw}#0N8ky~nAy!*h%B^blqr799m)d4{iCyN!Q$c_Q zC6hA0Z2ioyv`umKkTEtheON^538VxxU&h|@B6|?vugbdK@Hntx&HUTI~2S4$9Cgux8q<%yfjQe^1L;!%Kc+|mfR!Q@r zh}5s|yzu}4S<$GI-!Mo#ETW6b1^`u|D5Bh#0RXc6B@r$BnUpgY03gd75u8NlUdRAs z7ls|$h_au{0A#r~K}1=~1^`u#D55jZWB{`BRzXCWqcQ+l_K+Z=QzL!=vaF|b+K5gJ z`vJ&K4+TBhkO8JC;Pu^BT5(T)xe0NFl^AfniIHvril%U5kgF>P)D zvfZtMh@vfS0J8WNK}1olZUC}f&4P#`TU-ESaZO*e5p8XD0g&k%1rcp&asiOVHV7ix ztZV>K#VmJ`N6 z%?`d+*#w~2Ryz}Z1@Ubo3+hcD`I07*j4JM}Vj|Dv%B%$`|g=c{WS03^AFvGB1B zzX!ymR=?&E$^!s@lV0^oJ0ND!sH*u4gPrS*ANVSh10W>AG{@tN@A+B7gm_d{_|QCN xS0BQlI9RMgp`JeK&^)twc!g+a9tZeGx}QT^#IXpL*$w~z002ovPDHLkV1h7}XxIP% literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_button_download_click.9.png b/res/drawable-hdpi/umeng_xp_button_download_click.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ca04dc9bb648270e5bc343f2c468c390d54ef0 GIT binary patch literal 788 zcmV+v1MB>WP)A0EgBXoB9;hJ=BX5DabOZwifLtT zOIugofIH)5$nktlAe0`P69b8f&zJmG=Viq|Z<{W@V>0c{Lnb```m;CxBj?O~V#kE% zN7J}_(=*VTr&1KcS%G<#tmcyRQ__B;-Aiwxn+$ktwFN9{t7^rwoteSvvrl?pM0cB z>vZ^5iipVg2)ougOXlV!{sY7Vv4RRxeA5Ee+2*Kw%JXe2q9&JnBg^`k68Jy@9|VYr zJIQVNM9t&wUt19wUz(C$tx{rp2tXydb%`4JD^O%aZ2?N+A%Mp5b}uzLcSN+`76MR9 zZucP~*xiW2KO`OC0f1JDbQ2xq0f5#?DWXFiApo^hn-I}q9sp>iNf90C3<0R6cL)(3 z + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_container_banner_background_selector.xml b/res/drawable-hdpi/umeng_xp_container_banner_background_selector.xml new file mode 100644 index 0000000..0882ec7 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_container_banner_background_selector.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_darkbg.png b/res/drawable-hdpi/umeng_xp_darkbg.png new file mode 100644 index 0000000000000000000000000000000000000000..9a2e18810d30ca2f1316eedb8e7117143c3358ae GIT binary patch literal 3921 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_detail.png b/res/drawable-hdpi/umeng_xp_detail.png new file mode 100644 index 0000000000000000000000000000000000000000..5bed77bf71601c308610b911b691706b1b4f0138 GIT binary patch literal 4747 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 Z0|2pZwOOlTgH8Yd002ovPDHLkV1jwK0k;4E literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_detail365.png b/res/drawable-hdpi/umeng_xp_detail365.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf720e08f0851d7430b87e5982bb93179f7777e GIT binary patch literal 989 zcmeAS@N?(olHy`uVBq!ia0vp^=0I%7!3-olV-99AFff(}_=LFr|NkE-LLT_|@gq?C z-@ku1ZQ6up!lFfs;39wi{Fygz9-RB+$&)#A<^Z`eGBS7W+yOEqBqVO$ya{B8iHY5~ zaRZ_f$i8~@D$wxXzkdTw`1R`-L>ELBNQ#PzUc7km=g*&?KY#xI{rk6X-xe%b0GAaK z5;}SEC>m#vu6XP3JVK?-23*fDu|c}Yo0xGo4|>+-TxAgi_{$S)We6-+G5tQ_3DT!f-;Bx|43I7>P}G|HhVP+M+f$2sjs~Yr zihlB&e*3Lp#6`Bv*0Vl(xfT_6E-Escad%>n@ATB2JAAI^2t4R1GJg4_>y(ys%Z{vg zU#@GvE(<)cIJsu^`Id&AA6DJFaAOK1W3>S9Ngk8!HSG-U#!jo(uid+N^Xk>Rmxq^c zWO<_D(xj+*=eoUtL?;h#zeXH8+fJ1y?q4^4>^!+Lqa>@!?P=zW#T#Da@SZ<+R$oU? zPj~&Ax;T*%xw49>Tfg?6jnLV(RrY$rb48t^cR$X(yZ3M3R0|6mE54)~_Cl6t>o@H# zugaP`m)+;2Kw`DRnpN>jA|CBITdv8HSbc!cap$ijFO8!P@6SBme=cP~`CGHKPdxJS za(SM;d#C&Qp+Z8k!0}yQjyv4Hyt#5_+Jv13elMS1O@B3MLfQtq&sk6NC;d7nFeSNu zniSjd?h?PhGv8#-su3&etM&am<9_kaKmThODnlHdT>q?210@?zS3j3^P682-44YCGiqc;2d+Y^Hwc zStCf&ICHad?mds$@|T`X-4Z$3tbWN^_RP(Sx$``L>hDc5JHLc;9lN}Tu+9uuc4qHy z9RA2onDwCQ18-&%>*f~^tS_-}yBRe7T>ii|Q=E~Fq59!nTj4df(}7NA@O1Ta JS?83{1OUE6i46b% literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_download_dialog_bg.png b/res/drawable-hdpi/umeng_xp_download_dialog_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9773150f0c8201eaf4f23a54f3d25ceaf7aae8ef GIT binary patch literal 6850 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

@{^K+V)r+I4+@dGg1`G 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⩔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 OHksjYuNNm&m7 literal 0 HcmV?d00001 diff --git a/libs/domob_android_sdk_3.1.5.jar b/libs/domob_android_sdk_3.1.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..1770e10b50c7cc14420099a66dc685ccf76d7ebd GIT binary patch literal 346811 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 z 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/list_divider.png b/res/drawable-hdpi/list_divider.png new file mode 100644 index 0000000000000000000000000000000000000000..554184542395fe4aadd4c8de28d94b2fd29dbfac GIT binary patch literal 929 zcmaJ=O^?z*7_Jx-vvE(GnCQi^>p>Ig7f|Vhx`7tlCYBH&k%Ng2?EnqiPMr=?IC${p zFYsUZ2Tb&!7f;5kSAT$sXAjP>l=UDsZD;1q^E~h8yyqN|C8AhrhGdL^7o#ceV-&7le8CM#x_l=Zj@Zb53+UdE&jTxzPac9s4!J;# z83K8HmSixu<&7@ndtp{(uz|3-EuRN9@_WD`6oZ;lDF>Ra1JhLWYRxqD`@qn2L)G|e zmh~#Enb3FuwvWuc(QpF$ZfEO@pKN)?SPE5jxm+sCibCjA)h){s8irBkh;p_{7|P2@ zc3dd9I16Z$vWO%=D55c0Fk9x4o~IC}JJ}@LmWdZk%~7iAiY8JjfWH5KXdLg*8SCSV zc>gJ!4Ob~v`#2*D8t}$Vj)kifIus*D=#Y@JqKds4VI-T86gUGD-1SiqCBkrT!|;9R zB^g6WfIZiixrP!&A#^)hvs!hvTFYtbdfTwfmepxGmSGuYMXR?9u1kVNj1yLH!wasy zmn()LPPu0n)957*JCwv=lQfL>#^SX1>TS8<-dLQ@Uarc6QAKP2YIR}a^CPyq!R3eD z=;MUXJLQA@&HW1br8x53<}m+0uD|+S|MXUUCY7#9M<1>jx1Rp`EG~`L?z-<<&tLxm D=2{zV literal 0 HcmV?d00001 diff --git a/res/layout-hdpi/listitem_content.xml b/res/layout-hdpi/listitem_content.xml index 1943ae9..ff10319 100644 --- a/res/layout-hdpi/listitem_content.xml +++ b/res/layout-hdpi/listitem_content.xml @@ -6,7 +6,8 @@ android:id="@android:id/text1" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:layout_marginRight="2dip"/> + android:layout_marginRight="2dip" + android:textColor="@color/content_black"/> + android:id="@android:id/text2" + android:textColor="@color/content_black"/> + android:drawSelectorOnTop="false" + android:cacheColorHint="@color/common_bg_gray" + android:background="@color/common_bg_gray" + android:divider="@drawable/list_divider"/> diff --git a/res/layout/entry.xml b/res/layout/entry.xml index 8627988..8464860 100644 --- a/res/layout/entry.xml +++ b/res/layout/entry.xml @@ -1,71 +1,102 @@ - + android:orientation="vertical" > + + android:background="@color/common_bg_gray" + android:paddingLeft="4pt" > + + android:autoLink="email" + android:paddingTop="2pt" /> + + android:layout_height="wrap_content" /> - + android:layout_height="1dp" + android:background="@android:drawable/title_bar" /> + + + android:layout_height="fill_parent" + android:layout_above="@+id/adv" + android:background="@color/common_bg_gray" /> + + + + + + - + + - + + - + + - + + + android:src="@android:drawable/ic_media_next" /> - + + \ No newline at end of file diff --git a/res/layout/entrylistitem.xml b/res/layout/entrylistitem.xml index 3bc1833..54b6cfe 100644 --- a/res/layout/entrylistitem.xml +++ b/res/layout/entrylistitem.xml @@ -4,6 +4,7 @@ android:paddingBottom="7dip" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:mode="twoLine"> + android:mode="twoLine" + android:background="@color/common_bg_gray"> diff --git a/res/layout/feedlistitem.xml b/res/layout/feedlistitem.xml index 5c13d02..ef1d11c 100644 --- a/res/layout/feedlistitem.xml +++ b/res/layout/feedlistitem.xml @@ -4,7 +4,8 @@ android:paddingBottom="7dip" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:mode="twoLine"> + android:mode="twoLine" + android:background="@color/common_bg_gray"> + android:layout_gravity="fill_horizontal" + android:background="@color/common_bg_gray"> + android:layout_height="wrap_content" + android:textColor="@color/content_black"/> + android:layout_height="wrap_content" + android:textColor="@color/content_black"/> + android:layout_marginRight="2dip" + android:textColor="@color/content_black"/> + android:id="@android:id/text2" + android:textColor="@color/content_black"/> + android:orientation="vertical" + android:background="@color/common_bg_gray"> + android:gravity="center" + android:textColor="@color/content_black"/> + android:drawSelectorOnTop="false" + android:divider="@drawable/list_divider"/> diff --git a/res/layout/preferences.xml b/res/layout/preferences.xml index 7aaf5ba..87fae5a 100644 --- a/res/layout/preferences.xml +++ b/res/layout/preferences.xml @@ -85,18 +85,7 @@ android:summary="@string/settings_fetchpictures_description" android:key="pictures.fetch" android:dependency="pictures.disable"/> - - + + android:layout_weight="1" + android:background="@color/common_bg_gray" + android:cacheColorHint="@color/common_bg_gray" + android:divider="@drawable/list_divider"/> + + + #eeeeee + #595959 + #333333 + + \ No newline at end of file diff --git a/src/cn/eric/rss/ApplicationPreferencesActivity.java b/src/cn/eric/rss/ApplicationPreferencesActivity.java index efe4b03..5d2d7b9 100644 --- a/src/cn/eric/rss/ApplicationPreferencesActivity.java +++ b/src/cn/eric/rss/ApplicationPreferencesActivity.java @@ -45,9 +45,6 @@ public class ApplicationPreferencesActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.preferences); @@ -79,20 +76,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { } }); - preference = (Preference) findPreference(Strings.SETTINGS_LIGHTTHEME); - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); - editor.putBoolean(Strings.SETTINGS_LIGHTTHEME, Boolean.TRUE.equals(newValue)); - editor.commit(); - android.os.Process.killProcess(android.os.Process.myPid()); - - // this return statement will never be reached - return true; - } - }); - preference = (Preference) findPreference(Strings.SETTINGS_EFFICIENTFEEDPARSING); preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(final Preference preference, Object newValue) { diff --git a/src/cn/eric/rss/EntriesListActivity.java b/src/cn/eric/rss/EntriesListActivity.java index a16586f..57ef9aa 100644 --- a/src/cn/eric/rss/EntriesListActivity.java +++ b/src/cn/eric/rss/EntriesListActivity.java @@ -83,9 +83,6 @@ public class EntriesListActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } super.onCreate(savedInstanceState); diff --git a/src/cn/eric/rss/EntryActivity.java b/src/cn/eric/rss/EntryActivity.java index 6f14079..37164a9 100644 --- a/src/cn/eric/rss/EntryActivity.java +++ b/src/cn/eric/rss/EntryActivity.java @@ -29,6 +29,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.adsmogo.adview.AdsMogoLayout; import com.umeng.analytics.MobclickAgent; import android.app.Activity; @@ -77,144 +78,149 @@ public class EntryActivity extends Activity { /* - private static final String NEWLINE = "\n"; - - private static final String BR = "
"; - */ - + * private static final String NEWLINE = "\n"; + * + * private static final String BR = "
"; + */ + private static final String TEXT_HTML = "text/html"; - + private static final String UTF8 = "utf-8"; - + private static final String OR_DATE = " or date "; - + private static final String DATE = "(date="; - + private static final String AND_ID = " and _id"; - + private static final String ASC = "date asc, _id desc limit 1"; - + private static final String DESC = "date desc, _id asc limit 1"; - + private static final String CSS = ""; - - private static final String FONT_START = CSS+""; - - private static final String FONT_FONTSIZE_START = CSS+""; + + private static final String FONT_FONTSIZE_START = CSS + + ""; - + private static final String FONTSIZE_END = ""; - + private static final String FONT_END = "



"; - + private static final String BODY_START = ""; - + private static final String BODY_END = "



"; - + private static final int BUTTON_ALPHA = 180; private static final String IMAGE_ENCLOSURE = "[@]image/"; - + private static final String TEXTPLAIN = "text/plain"; - + private static final String BRACKET = " ("; - + private int titlePosition; - + private int datePosition; - + private int abstractPosition; - + private int linkPosition; - + private int feedIdPosition; - + private int favoritePosition; - + private int readDatePosition; - + private int enclosurePosition; - + private int authorPosition; - + private String _id; - + private String _nextId; - + private String _previousId; - + private Uri uri; - + private Uri parentUri; - + private int feedId; - + boolean favorite; - + private boolean showRead; - + private boolean canShowIcon; - + private byte[] iconBytes; - + private WebView webView; - + private WebView webView0; // only needed for the animation - + private ViewFlipper viewFlipper; - + private ImageButton nextButton; - + private ImageButton urlButton; - + private ImageButton previousButton; - + private ImageButton playButton; - + int scrollX; - + int scrollY; - + private String link; - + private LayoutParams layoutParams; - + private View content; - + private SharedPreferences preferences; - + private boolean localPictures; - + private TextView titleTextView; - + + private int backgroundColor; + @Override protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - + super.onCreate(savedInstanceState); - + int titleId = -1; - + if (MainTabActivity.POSTGINGERBREAD) { canShowIcon = true; setContentView(R.layout.entry); try { - /* This is a trick as com.android.internal.R.id.action_bar_title is not directly accessible */ - titleId = (Integer) Class.forName("com.android.internal.R$id").getField("action_bar_title").get(null); + /* + * This is a trick as com.android.internal.R.id.action_bar_title + * is not directly accessible + */ + titleId = (Integer) Class.forName("com.android.internal.R$id") + .getField("action_bar_title").get(null); } catch (Exception exception) { - + } } else { canShowIcon = requestWindowFeature(Window.FEATURE_LEFT_ICON); setContentView(R.layout.entry); titleId = android.R.id.title; } - + try { titleTextView = (TextView) findViewById(titleId); titleTextView.setSingleLine(true); @@ -226,47 +232,54 @@ protected void onCreate(Bundle savedInstanceState) { } catch (Exception e) { // just in case for non standard android, nullpointer etc } - + uri = getIntent().getData(); parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); - showRead = getIntent().getBooleanExtra(EntriesListActivity.EXTRA_SHOWREAD, true); + showRead = getIntent().getBooleanExtra( + EntriesListActivity.EXTRA_SHOWREAD, true); iconBytes = getIntent().getByteArrayExtra(FeedData.FeedColumns.ICON); feedId = 0; - - Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); - + + Cursor entryCursor = getContentResolver().query(uri, null, null, null, + null); + titlePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.TITLE); datePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.DATE); - abstractPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ABSTRACT); + abstractPosition = entryCursor + .getColumnIndex(FeedData.EntryColumns.ABSTRACT); linkPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.LINK); - feedIdPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FEED_ID); - favoritePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); - readDatePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.READDATE); - enclosurePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ENCLOSURE); - authorPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.AUTHOR); - + feedIdPosition = entryCursor + .getColumnIndex(FeedData.EntryColumns.FEED_ID); + favoritePosition = entryCursor + .getColumnIndex(FeedData.EntryColumns.FAVORITE); + readDatePosition = entryCursor + .getColumnIndex(FeedData.EntryColumns.READDATE); + enclosurePosition = entryCursor + .getColumnIndex(FeedData.EntryColumns.ENCLOSURE); + authorPosition = entryCursor + .getColumnIndex(FeedData.EntryColumns.AUTHOR); + entryCursor.close(); if (RSSOverview.notificationManager == null) { RSSOverview.notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } - + nextButton = (ImageButton) findViewById(R.id.next_button); urlButton = (ImageButton) findViewById(R.id.url_button); - urlButton.setAlpha(BUTTON_ALPHA+30); + urlButton.setAlpha(BUTTON_ALPHA + 30); previousButton = (ImageButton) findViewById(R.id.prev_button); playButton = (ImageButton) findViewById(R.id.play_button); playButton.setAlpha(BUTTON_ALPHA); - + viewFlipper = (ViewFlipper) findViewById(R.id.content_flipper); - - - - layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); - + + layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, + LayoutParams.FILL_PARENT); + webView = new WebView(this); - + backgroundColor = this.getResources().getColor(R.color.common_bg_gray); viewFlipper.addView(webView, layoutParams); - + OnKeyListener onKeyEventListener = new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { @@ -282,81 +295,82 @@ public boolean onKey(View v, int keyCode, KeyEvent event) { } }; webView.setOnKeyListener(onKeyEventListener); - + content = findViewById(R.id.entry_content); - + webView0 = new WebView(this); webView0.setOnKeyListener(onKeyEventListener); - + preferences = PreferenceManager.getDefaultSharedPreferences(this); - - final boolean gestures = preferences.getBoolean(Strings.SETTINGS_GESTURESENABLED, true); - - final GestureDetector gestureDetector = new GestureDetector(this, new OnGestureListener() { - public boolean onDown(MotionEvent e) { - return false; - } - - public boolean onFling(MotionEvent e1, MotionEvent e2, - float velocityX, float velocityY) { - if (gestures) { - if (Math.abs(velocityY) < Math.abs(velocityX)) { - if (velocityX > 800) { - if (previousButton.isEnabled()) { - previousEntry(true); - } - } else if (velocityX < -800) { - if (nextButton.isEnabled()) { - nextEntry(true); + + final boolean gestures = preferences.getBoolean( + Strings.SETTINGS_GESTURESENABLED, true); + + final GestureDetector gestureDetector = new GestureDetector(this, + new OnGestureListener() { + public boolean onDown(MotionEvent e) { + return false; + } + + public boolean onFling(MotionEvent e1, MotionEvent e2, + float velocityX, float velocityY) { + if (gestures) { + if (Math.abs(velocityY) < Math.abs(velocityX)) { + if (velocityX > 800) { + if (previousButton.isEnabled()) { + previousEntry(true); + } + } else if (velocityX < -800) { + if (nextButton.isEnabled()) { + nextEntry(true); + } + } } } + return false; } - } - return false; - } - - public void onLongPress(MotionEvent e) { - - } - - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - return false; - } - - public void onShowPress(MotionEvent e) { - - } - - public boolean onSingleTapUp(MotionEvent e) { - return false; - } - }); - + + public void onLongPress(MotionEvent e) { + + } + + public boolean onScroll(MotionEvent e1, MotionEvent e2, + float distanceX, float distanceY) { + return false; + } + + public void onShowPress(MotionEvent e) { + + } + + public boolean onSingleTapUp(MotionEvent e) { + return false; + } + }); + OnTouchListener onTouchListener = new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } }; - + webView.setOnTouchListener(onTouchListener); - + content.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { gestureDetector.onTouchEvent(event); return true; // different to the above one! } }); - + webView0.setOnTouchListener(onTouchListener); - + scrollX = 0; scrollY = 0; } - + @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) - { + protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); webView.restoreState(savedInstanceState); } @@ -375,35 +389,40 @@ protected void onResume() { } reload(); } - + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); } - + private void reload() { if (_id != null && _id.equals(uri.getLastPathSegment())) { return; } - + _id = uri.getLastPathSegment(); - + ContentValues values = new ContentValues(); - + values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); - - Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); - + + Cursor entryCursor = getContentResolver().query(uri, null, null, null, + null); + if (entryCursor.moveToFirst()) { String abstractText = entryCursor.getString(abstractPosition); - + if (entryCursor.isNull(readDatePosition)) { - getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null); + getContentResolver().update( + uri, + values, + new StringBuilder(FeedData.EntryColumns.READDATE) + .append(Strings.DB_ISNULL).toString(), null); } if (abstractText == null) { String link = entryCursor.getString(linkPosition); - + entryCursor.close(); finish(); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(link))); @@ -412,200 +431,296 @@ private void reload() { if (titleTextView != null) { titleTextView.requestFocus(); // restart ellipsize } - + int _feedId = entryCursor.getInt(feedIdPosition); - + if (feedId != _feedId) { if (feedId != 0) { iconBytes = null; // triggers re-fetch of the icon } feedId = _feedId; } - + if (canShowIcon) { if (iconBytes == null || iconBytes.length == 0) { - Cursor iconCursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(Integer.toString(feedId)), new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.ICON}, null, null, null); - + Cursor iconCursor = getContentResolver().query( + FeedData.FeedColumns.CONTENT_URI(Integer + .toString(feedId)), + new String[] { FeedData.FeedColumns._ID, + FeedData.FeedColumns.ICON }, null, + null, null); + if (iconCursor.moveToFirst()) { iconBytes = iconCursor.getBlob(1); } iconCursor.close(); } - + if (iconBytes != null && iconBytes.length > 0) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + int bitmapSizeInDip = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, 24f, + getResources().getDisplayMetrics()); + Bitmap bitmap = BitmapFactory.decodeByteArray( + iconBytes, 0, iconBytes.length); if (bitmap != null) { if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); + bitmap = Bitmap + .createScaledBitmap(bitmap, + bitmapSizeInDip, + bitmapSizeInDip, false); } - + if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); + CompatibilityHelper.setActionBarDrawable(this, + new BitmapDrawable(bitmap)); } else { - setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); + setFeatureDrawable(Window.FEATURE_LEFT_ICON, + new BitmapDrawable(bitmap)); } } } } - + long timestamp = entryCursor.getLong(datePosition); - + Date date = new Date(timestamp); - - StringBuilder dateStringBuilder = new StringBuilder(DateFormat.getDateFormat(this).format(date)).append(' ').append(DateFormat.getTimeFormat(this).format(date)); - + + StringBuilder dateStringBuilder = new StringBuilder(DateFormat + .getDateFormat(this).format(date)).append(' ').append( + DateFormat.getTimeFormat(this).format(date)); + String author = entryCursor.getString(authorPosition); - + if (author != null) { - dateStringBuilder.append(BRACKET).append(author).append(')'); + dateStringBuilder.append(BRACKET).append(author) + .append(')'); } - - ((TextView) findViewById(R.id.entry_date)).setText(dateStringBuilder); - + + ((TextView) findViewById(R.id.entry_date)) + .setText(dateStringBuilder); + final ImageView imageView = (ImageView) findViewById(android.R.id.icon); - + favorite = entryCursor.getInt(favoritePosition) == 1; - - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); + + imageView + .setImageResource(favorite ? android.R.drawable.star_on + : android.R.drawable.star_off); imageView.setOnClickListener(new OnClickListener() { public void onClick(View view) { favorite = !favorite; - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); + imageView + .setImageResource(favorite ? android.R.drawable.star_on + : android.R.drawable.star_off); ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.FAVORITE, favorite ? 1 : 0); + + values.put(FeedData.EntryColumns.FAVORITE, favorite ? 1 + : 0); getContentResolver().update(uri, values, null, null); } }); - // loadData does not recognize the encoding without correct html-header - localPictures = abstractText.indexOf(Strings.IMAGEID_REPLACEMENT) > -1; + // loadData does not recognize the encoding without correct + // html-header + localPictures = abstractText + .indexOf(Strings.IMAGEID_REPLACEMENT) > -1; - abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, uri.getLastPathSegment()+Strings.IMAGEFILE_IDSEPARATOR); + abstractText = abstractText.replace( + Strings.IMAGEID_REPLACEMENT, uri.getLastPathSegment() + + Strings.IMAGEFILE_IDSEPARATOR); Pattern linkP = Pattern.compile("]*href=[^>]*>"); Matcher linkM = linkP.matcher(abstractText); - if(!linkM.find()) { - abstractText = abstractText.replaceAll("(?i)(https?://[^ \n\r\t\\[\\]]+)", "
$1"); + if (!linkM.find()) { + abstractText = abstractText.replaceAll( + "(?i)(https?://[^ \n\r\t\\[\\]]+)", + "$1"); } - + Pattern brP = Pattern.compile("]*>"); Matcher brM = brP.matcher(abstractText); - if(!brM.find()) { - abstractText = abstractText.replaceAll("\n", "
"); - } - - abstractText = abstractText.replaceAll("(?i)\\[(/?(b|u))\\]", "<$1>"); - abstractText = abstractText.replaceAll("(?i)\\[img\\](https?://[^ \n\r\t\\[\\]]+)\\[/img\\]", ""); - abstractText = abstractText.replaceAll("(?i)\\[/?(center|color|size|img|url|pre)[^\\]]*\\]", ""); - - final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); - + if (!brM.find()) { + abstractText = abstractText.replaceAll("\n", "
"); + } + + abstractText = abstractText.replaceAll("(?i)\\[(/?(b|u))\\]", + "<$1>"); + abstractText = abstractText.replaceAll( + "(?i)\\[img\\](https?://[^ \n\r\t\\[\\]]+)\\[/img\\]", + ""); + abstractText = abstractText.replaceAll( + "(?i)\\[/?(center|color|size|img|url|pre)[^\\]]*\\]", + ""); + + final SharedPreferences preferences = PreferenceManager + .getDefaultSharedPreferences(this); + if (localPictures) { - abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, _id+Strings.IMAGEFILE_IDSEPARATOR); + abstractText = abstractText.replace( + Strings.IMAGEID_REPLACEMENT, _id + + Strings.IMAGEFILE_IDSEPARATOR); } - if (preferences.getBoolean(Strings.SETTINGS_DISABLEPICTURES, false)) { - abstractText = abstractText.replaceAll(Strings.HTML_IMG_REGEX, Strings.EMPTY); + if (preferences.getBoolean(Strings.SETTINGS_DISABLEPICTURES, + false)) { + abstractText = abstractText.replaceAll( + Strings.HTML_IMG_REGEX, Strings.EMPTY); webView.getSettings().setBlockNetworkImage(true); } else { if (webView.getSettings().getBlockNetworkImage()) { /* - * setBlockNetwortImage(false) calls postSync, which takes time, - * so we clean up the html first and change the value afterwards + * setBlockNetwortImage(false) calls postSync, which + * takes time, so we clean up the html first and change + * the value afterwards */ webView.loadData(Strings.EMPTY, TEXT_HTML, UTF8); webView.getSettings().setBlockNetworkImage(false); } } - - int fontsize = Integer.parseInt(preferences.getString(Strings.SETTINGS_FONTSIZE, Strings.ONE)); - + + int fontsize = Integer.parseInt(preferences.getString( + Strings.SETTINGS_FONTSIZE, Strings.ONE)); + /* - if (abstractText.indexOf('<') > -1 && abstractText.indexOf('>') > -1) { - abstractText = abstractText.replace(NEWLINE, BR); - } - */ - - if (MainTabActivity.isLightTheme(this) || preferences.getBoolean(Strings.SETTINGS_BLACKTEXTONWHITE, false)) { - if (fontsize > 0) { - webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONTSIZE_END).toString(), TEXT_HTML, UTF8, null); - } else { - webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(BODY_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); - } - webView.setBackgroundColor(Color.WHITE); - content.setBackgroundColor(Color.WHITE); + * if (abstractText.indexOf('<') > -1 && + * abstractText.indexOf('>') > -1) { abstractText = + * abstractText.replace(NEWLINE, BR); } + */ + + // if (MainTabActivity.isLightTheme(this) || + // preferences.getBoolean(Strings.SETTINGS_BLACKTEXTONWHITE, + // false)) { + if (fontsize > 0) { + webView.loadDataWithBaseURL(null, + new StringBuilder(CSS).append(FONTSIZE_START) + .append(fontsize).append(FONTSIZE_MIDDLE) + .append(abstractText).append(FONTSIZE_END) + .toString(), TEXT_HTML, UTF8, null); } else { - if (fontsize > 0) { - webView.loadDataWithBaseURL(null, new StringBuilder(FONT_FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONT_END).toString(), TEXT_HTML, UTF8, null); - } else { - webView.loadDataWithBaseURL(null, new StringBuilder(FONT_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); - } - webView.setBackgroundColor(Color.BLACK); - content.setBackgroundColor(Color.BLACK); + webView.loadDataWithBaseURL( + null, + new StringBuilder(CSS).append(BODY_START) + .append(abstractText).append(BODY_END) + .toString(), TEXT_HTML, UTF8, null); } - + webView.setBackgroundColor(backgroundColor); + content.setBackgroundColor(Color.WHITE); + // } + // else { + // if (fontsize > 0) { + // webView.loadDataWithBaseURL(null, new + // StringBuilder(FONT_FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONT_END).toString(), + // TEXT_HTML, UTF8, null); + // } else { + // webView.loadDataWithBaseURL(null, new + // StringBuilder(FONT_START).append(abstractText).append(BODY_END).toString(), + // TEXT_HTML, UTF8, null); + // } + // webView.setBackgroundColor(Color.BLACK); + // content.setBackgroundColor(Color.BLACK); + // } + link = entryCursor.getString(linkPosition); - + if (link != null && link.length() > 0) { urlButton.setEnabled(true); - urlButton.setAlpha(BUTTON_ALPHA+20); + urlButton.setAlpha(BUTTON_ALPHA + 20); urlButton.setOnClickListener(new OnClickListener() { public void onClick(View view) { - startActivityForResult(new Intent(Intent.ACTION_VIEW, Uri.parse(link)), 0); + startActivityForResult(new Intent( + Intent.ACTION_VIEW, Uri.parse(link)), 0); } }); } else { urlButton.setEnabled(false); urlButton.setAlpha(80); } - - final String enclosure = entryCursor.getString(enclosurePosition); - - if (enclosure != null && enclosure.length() > 6 && enclosure.indexOf(IMAGE_ENCLOSURE) == -1) { + + final String enclosure = entryCursor + .getString(enclosurePosition); + + if (enclosure != null && enclosure.length() > 6 + && enclosure.indexOf(IMAGE_ENCLOSURE) == -1) { playButton.setVisibility(View.VISIBLE); playButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { - final int position1 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR); - - final int position2 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR, position1+3); - - final Uri uri = Uri.parse(enclosure.substring(0, position1)); - - if (preferences.getBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, true)) { - Builder builder = new AlertDialog.Builder(EntryActivity.this); - + final int position1 = enclosure + .indexOf(Strings.ENCLOSURE_SEPARATOR); + + final int position2 = enclosure.indexOf( + Strings.ENCLOSURE_SEPARATOR, position1 + 3); + + final Uri uri = Uri.parse(enclosure.substring(0, + position1)); + + if (preferences.getBoolean( + Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, + true)) { + Builder builder = new AlertDialog.Builder( + EntryActivity.this); + builder.setTitle(R.string.question_areyousure); builder.setIcon(android.R.drawable.ic_dialog_alert); - if (position2+4 > enclosure.length()) { - builder.setMessage(getString(R.string.question_playenclosure, uri, position2+4 > enclosure.length() ? Strings.QUESTIONMARKS : enclosure.substring(position2+3))); + if (position2 + 4 > enclosure.length()) { + builder.setMessage(getString( + R.string.question_playenclosure, + uri, + position2 + 4 > enclosure.length() ? Strings.QUESTIONMARKS + : enclosure + .substring(position2 + 3))); } else { try { - builder.setMessage(getString(R.string.question_playenclosure, uri, (Integer.parseInt(enclosure.substring(position2+3)) / 1024f)+getString(R.string.kb))); + builder.setMessage(getString( + R.string.question_playenclosure, + uri, + (Integer.parseInt(enclosure + .substring(position2 + 3)) / 1024f) + + getString(R.string.kb))); } catch (Exception e) { - builder.setMessage(getString(R.string.question_playenclosure, uri, enclosure.substring(position2+3))); + builder.setMessage(getString( + R.string.question_playenclosure, + uri, + enclosure + .substring(position2 + 3))); } } builder.setCancelable(true); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - showEnclosure(uri, enclosure, position1, position2); - } - }); - builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - preferences.edit().putBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, false).commit(); - showEnclosure(uri, enclosure, position1, position2); - } - }); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick( + DialogInterface dialog, + int which) { + showEnclosure(uri, enclosure, + position1, position2); + } + }); + builder.setNeutralButton( + R.string.button_alwaysokforall, + new DialogInterface.OnClickListener() { + public void onClick( + DialogInterface dialog, + int which) { + preferences + .edit() + .putBoolean( + Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, + false).commit(); + showEnclosure(uri, enclosure, + position1, position2); + } + }); + builder.setNegativeButton( + android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick( + DialogInterface dialog, + int which) { + dialog.dismiss(); + } + }); builder.show(); } else { - showEnclosure(uri, enclosure, position1, position2); + showEnclosure(uri, enclosure, position1, + position2); } } }); @@ -620,43 +735,57 @@ public void onClick(DialogInterface dialog, int which) { } else { entryCursor.close(); } - + /* - new Thread() { - public void run() { - sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); // this is slow - } - }.start(); - */ + * new Thread() { public void run() { sendBroadcast(new + * Intent(Strings.ACTION_UPDATEWIDGET)); // this is slow } }.start(); + */ } - - private void showEnclosure(Uri uri, String enclosure, int position1, int position2) { + + private void showEnclosure(Uri uri, String enclosure, int position1, + int position2) { try { - startActivityForResult(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, enclosure.substring(position1+3, position2)), 0); + startActivityForResult( + new Intent(Intent.ACTION_VIEW).setDataAndType(uri, + enclosure.substring(position1 + 3, position2)), 0); } catch (Exception e) { try { - startActivityForResult(new Intent(Intent.ACTION_VIEW, uri), 0); // fallbackmode - let the browser handle this + startActivityForResult(new Intent(Intent.ACTION_VIEW, uri), 0); // fallbackmode + // - + // let + // the + // browser + // handle + // this } catch (Throwable t) { - Toast.makeText(EntryActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); + Toast.makeText(EntryActivity.this, t.getMessage(), + Toast.LENGTH_LONG).show(); } } } - private void setupButton(ImageButton button, final boolean successor, long date) { - StringBuilder queryString = new StringBuilder(DATE).append(date).append(AND_ID).append(successor ? '>' : '<').append(_id).append(')').append(OR_DATE).append(successor ? '<' : '>').append(date); - + private void setupButton(ImageButton button, final boolean successor, + long date) { + StringBuilder queryString = new StringBuilder(DATE).append(date) + .append(AND_ID).append(successor ? '>' : '<').append(_id) + .append(')').append(OR_DATE).append(successor ? '<' : '>') + .append(date); + if (!showRead) { - queryString.append(Strings.DB_AND).append(EntriesListAdapter.READDATEISNULL); + queryString.append(Strings.DB_AND).append( + EntriesListAdapter.READDATEISNULL); } - Cursor cursor = getContentResolver().query(parentUri, new String[] {FeedData.EntryColumns._ID}, queryString.toString() , null, successor ? DESC : ASC); - + Cursor cursor = getContentResolver().query(parentUri, + new String[] { FeedData.EntryColumns._ID }, + queryString.toString(), null, successor ? DESC : ASC); + if (cursor.moveToFirst()) { button.setEnabled(true); button.setAlpha(BUTTON_ALPHA); - + final String id = cursor.getString(0); - + if (successor) { _nextId = id; } else { @@ -677,22 +806,23 @@ public void onClick(View view) { } cursor.close(); } - - private void switchEntry(String id, boolean animate, Animation inAnimation, Animation outAnimation) { + + private void switchEntry(String id, boolean animate, Animation inAnimation, + Animation outAnimation) { uri = parentUri.buildUpon().appendPath(id).build(); getIntent().setData(uri); scrollX = 0; scrollY = 0; - + if (animate) { WebView dummy = webView; // switch reference - + webView = webView0; webView0 = dummy; } - + reload(); - + if (animate) { viewFlipper.setInAnimation(inAnimation); viewFlipper.setOutAnimation(outAnimation); @@ -701,15 +831,17 @@ private void switchEntry(String id, boolean animate, Animation inAnimation, Anim viewFlipper.removeViewAt(0); } } - + private void nextEntry(boolean animate) { - switchEntry(_nextId, animate, Animations.SLIDE_IN_RIGHT, Animations.SLIDE_OUT_LEFT); + switchEntry(_nextId, animate, Animations.SLIDE_IN_RIGHT, + Animations.SLIDE_OUT_LEFT); } - + private void previousEntry(boolean animate) { - switchEntry(_previousId, animate, Animations.SLIDE_IN_LEFT, Animations.SLIDE_OUT_RIGHT); + switchEntry(_previousId, animate, Animations.SLIDE_IN_LEFT, + Animations.SLIDE_OUT_RIGHT); } - + @Override protected void onPause() { super.onPause(); @@ -720,52 +852,54 @@ protected void onPause() { scrollX = webView.getScrollX(); scrollY = webView.getScrollY(); } - + @Override - protected void onSaveInstanceState(Bundle outState) - { + protected void onSaveInstanceState(Bundle outState) { webView.saveState(outState); super.onSaveInstanceState(outState); } - + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.entry, menu); return true; } - + @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { - case R.id.menu_copytoclipboard: { - if (link != null) { - ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(link); - } - break; + case R.id.menu_copytoclipboard: { + if (link != null) { + ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)) + .setText(link); } - case R.id.menu_delete: { - getContentResolver().delete(uri, null, null); - if (localPictures) { - FeedData.deletePicturesOfEntry(_id); - } - - if (nextButton.isEnabled()) { - nextButton.performClick(); + break; + } + case R.id.menu_delete: { + getContentResolver().delete(uri, null, null); + if (localPictures) { + FeedData.deletePicturesOfEntry(_id); + } + + if (nextButton.isEnabled()) { + nextButton.performClick(); + } else { + if (previousButton.isEnabled()) { + previousButton.performClick(); } else { - if (previousButton.isEnabled()) { - previousButton.performClick(); - } else { - finish(); - } + finish(); } - break; } - case R.id.menu_share: { - if (link != null) { - startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND).putExtra(Intent.EXTRA_TEXT, link).setType(TEXTPLAIN), getString(R.string.menu_share))); - } - break; + break; + } + case R.id.menu_share: { + if (link != null) { + startActivity(Intent.createChooser(new Intent( + Intent.ACTION_SEND).putExtra(Intent.EXTRA_TEXT, link) + .setType(TEXTPLAIN), getString(R.string.menu_share))); } + break; + } } return true; } @@ -783,13 +917,13 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { } return super.onKeyDown(keyCode, event); } - + private void scrollUp() { if (webView != null) { webView.pageUp(false); } } - + private void scrollDown() { if (webView != null) { webView.pageDown(false); @@ -808,4 +942,13 @@ public void unregisterReceiver(BroadcastReceiver receiver) { } } + @Override + protected void onDestroy() { + AdsMogoLayout.clear(); + // 清除adsMogoLayout 实例所产生用于多线程缓冲机制的线程池 + // 此方法请不要轻易调用,如果调用时间不当,会造成无法统计计数 + // adsMogoLayoutCode.clearThread(); + super.onDestroy(); + } + } diff --git a/src/cn/eric/rss/FeedConfigActivity.java b/src/cn/eric/rss/FeedConfigActivity.java index d39b6d7..ec086f3 100644 --- a/src/cn/eric/rss/FeedConfigActivity.java +++ b/src/cn/eric/rss/FeedConfigActivity.java @@ -237,14 +237,17 @@ public static void insertInitialFeeds(Activity activity) { return; } String url, name; - url = "http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss"; - name = "百度新闻(国内)"; - insertFeed(activity, url, name); - url = "http://news.baidu.com/n?cmd=1&class=internews&tn=rss"; - name = "百度新闻(国外)"; - insertFeed(activity, url, name); - url = "http://news.baidu.com/n?cmd=1&class=housenews&tn=rss"; - name = "百度新闻(房产)"; +// url = "http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss"; +// name = "百度新闻(国内)"; +// insertFeed(activity, url, name); +// url = "http://news.baidu.com/n?cmd=1&class=internews&tn=rss"; +// name = "百度新闻(国外)"; +// insertFeed(activity, url, name); +// url = "http://news.baidu.com/n?cmd=1&class=housenews&tn=rss"; +// name = "百度新闻(房产)"; +// insertFeed(activity, url, name); + url = "http://feed.mtime.com/movienews.rss"; + name = "时光电影新闻"; insertFeed(activity, url, name); url = "http://feed.williamlong.info/"; name = "月光博客"; diff --git a/src/cn/eric/rss/MainTabActivity.java b/src/cn/eric/rss/MainTabActivity.java index ab7bdad..4920524 100644 --- a/src/cn/eric/rss/MainTabActivity.java +++ b/src/cn/eric/rss/MainTabActivity.java @@ -76,14 +76,7 @@ public class MainTabActivity extends TabActivity { private static Boolean LIGHTTHEME; - - public static boolean isLightTheme(Context context) { - if (LIGHTTHEME == null) { - LIGHTTHEME = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_LIGHTTHEME, true); - } - return LIGHTTHEME; - } - + private Menu menu; private BroadcastReceiver refreshReceiver = new BroadcastReceiver() { @@ -96,12 +89,13 @@ public void onReceive(Context context, Intent intent) { private boolean hasContent; public void onCreate(Bundle savedInstanceState) { - if (isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } +// if (isLightTheme(this)) { +// setTheme(R.style.Theme_Light); +// } super.onCreate(savedInstanceState); MobclickAgent.updateOnlineConfig(this); - UmengUpdateAgent.update(this.getParent()); + UmengUpdateAgent.update(this); + UmengUpdateAgent.setUpdateOnlyWifi(false); //We need to display progress information requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); diff --git a/src/cn/eric/rss/RSSOverview.java b/src/cn/eric/rss/RSSOverview.java index 321c822..3642ef8 100644 --- a/src/cn/eric/rss/RSSOverview.java +++ b/src/cn/eric/rss/RSSOverview.java @@ -29,6 +29,7 @@ import java.io.FilenameFilter; import com.umeng.analytics.MobclickAgent; +import com.umeng.update.UmengUpdateAgent; import android.app.AlertDialog; import android.app.AlertDialog.Builder; @@ -111,11 +112,11 @@ public class RSSOverview extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } +// if (MainTabActivity.isLightTheme(this)) { +// setTheme(R.style.Theme_Light); +// } super.onCreate(savedInstanceState); - + if (notificationManager == null) { notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); } diff --git a/src/cn/eric/rss/Strings.java b/src/cn/eric/rss/Strings.java index 7d5f2b9..c4f8275 100644 --- a/src/cn/eric/rss/Strings.java +++ b/src/cn/eric/rss/Strings.java @@ -1,189 +1,187 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; - -public final class Strings { - - public static final String FEED_SETTINGS_OTHER_ALERT_RINGTONE = "other_alertringtone"; - - public static final String FEED_SETTINGS_ALERT_RINGTONE = "alertringtone"; - - public static final String FEED_SETTINGS_SKIP_ALERT = "skipalert"; - - public static final String PACKAGE = "cn.eric.rss"; - - public static final String SETTINGS_REFRESHINTERVAL = "refresh.interval"; - - public static final String SETTINGS_NOTIFICATIONSENABLED = "notifications.enabled"; - - public static final String SETTINGS_REFRESHENABLED = "refresh.enabled"; - - public static final String SETTINGS_REFRESHONPENENABLED = "refreshonopen.enabled"; - - public static final String SETTINGS_NOTIFICATIONSRINGTONE = "notifications.ringtone"; - - public static final String SETTINGS_NOTIFICATIONSVIBRATE = "notifications.vibrate"; - - public static final String SETTINGS_PRIORITIZE = "contentpresentation.prioritize"; - - public static final String SETTINGS_SHOWTABS = "tabs.show"; - - public static final String SETTINGS_FETCHPICTURES = "pictures.fetch"; - - public static final String SETTINGS_PROXYENABLED = "proxy.enabled"; - - public static final String SETTINGS_PROXYPORT = "proxy.port"; - - public static final String SETTINGS_PROXYHOST = "proxy.host"; - - public static final String SETTINGS_PROXYWIFIONLY = "proxy.wifionly"; - - public static final String SETTINGS_PROXYTYPE = "proxy.type"; - - public static final String SETTINGS_KEEPTIME = "keeptime"; - - public static final String SETTINGS_BLACKTEXTONWHITE = "blacktextonwhite"; - - public static final String SETTINGS_LIGHTTHEME = "lighttheme"; - - public static final String SETTINGS_FONTSIZE = "fontsize"; - - public static final String SETTINGS_STANDARDUSERAGENT = "standarduseragent"; - - public static final String SETTINGS_DISABLEPICTURES = "pictures.disable"; - - public static final String SETTINGS_HTTPHTTPSREDIRECTS = "httphttpsredirects"; - - public static final String SETTINGS_OVERRIDEWIFIONLY = "overridewifionly"; - - public static final String SETTINGS_GESTURESENABLED = "gestures.enabled"; - - public static final String SETTINGS_ENCLOSUREWARNINGSENABLED = "enclosurewarnings.enabled"; - - public static final String SETTINGS_EFFICIENTFEEDPARSING = "efficientfeedparsing"; - - public static final String ACTION_REFRESHFEEDS = "cn.eric.rss.REFRESH"; - - public static final String ACTION_UPDATEWIDGET = "cn.eric.rss.FEEDUPDATED"; - - public static final String ACTION_RESTART = "cn.eric.rss.RESTART"; - - public static final String FEEDID = "feedid"; - - public static final String DB_ISNULL = " IS NULL"; - - public static final String DB_DESC = " DESC"; - - public static final String DB_ARG = "=?"; - - public static final String DB_AND = " AND "; - - public static final String DB_EXCUDEFAVORITE = new StringBuilder(FeedData.EntryColumns.FAVORITE).append(Strings.DB_ISNULL).append(" OR ").append(FeedData.EntryColumns.FAVORITE).append("=0").toString(); - - public static final String EMPTY = ""; - - public static final String HTTP = "http://"; - - public static final String HTTPS = "https://"; - - public static final String _HTTP = "http"; - - public static final String _HTTPS = "https"; - - public static final String PROTOCOL_SEPARATOR = "://"; - - public static final String FILE_FAVICON = "/favicon.ico"; - - public static final String SPACE = " "; - - public static final String TWOSPACE = " "; - - public static final String HTML_TAG_REGEX = "<(.|\n)*?>"; - - public static final String FILEURL = "file://"; - - public static final String IMAGEFILE_IDSEPARATOR = "__"; - - public static final String IMAGEID_REPLACEMENT = "##ID##"; - - public static final String DEFAULTPROXYPORT = "8080"; - - public static final String URL_SPACE = "%20"; - - public static final String HTML_SPAN_REGEX = "<[/]?[ ]?span(.|\n)*?>"; - - public static final String HTML_IMG_REGEX = "<[/]?[ ]?img(.|\n)*?>"; - - public static final String ONE = "1"; - - public static final Object THREENEWLINES = "\n\n\n"; - - public static final String PREFERENCE_LICENSEACCEPTED = "license.accepted"; - - public static final String PREFERENCE_LASTSCHEDULEDREFRESH = "lastscheduledrefresh"; - - public static final String HTML_LT = "<"; - - public static final String HTML_GT = ">"; - - public static final String LT = "<"; - - public static final String GT = ">"; - - protected static final String TRUE = "true"; - - protected static final String FALSE = "false"; - - public static final String READDATE_GREATERZERO = FeedData.EntryColumns.READDATE+">0"; - - public static final String COUNT = "count"; - - public static final String ENCLOSURE_SEPARATOR = "[@]"; // exactly three characters! - - public static final String QUESTIONMARKS = "'??'"; - - public static final String HTML_QUOT = """; - - public static final String QUOT = "\""; - - public static final String HTML_APOSTROPHE = "'"; - - public static final String APOSTROPHE = "'"; - - public static final String AMP = "&"; - - public static final String AMP_SG = "&"; - - public static final String SLASH = "/"; - - public static final String COMMASPACE = ", "; - - public static final String SCHEDULED = "scheduled"; - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public final class Strings { + + public static final String FEED_SETTINGS_OTHER_ALERT_RINGTONE = "other_alertringtone"; + + public static final String FEED_SETTINGS_ALERT_RINGTONE = "alertringtone"; + + public static final String FEED_SETTINGS_SKIP_ALERT = "skipalert"; + + public static final String PACKAGE = "cn.eric.rss"; + + public static final String SETTINGS_REFRESHINTERVAL = "refresh.interval"; + + public static final String SETTINGS_NOTIFICATIONSENABLED = "notifications.enabled"; + + public static final String SETTINGS_REFRESHENABLED = "refresh.enabled"; + + public static final String SETTINGS_REFRESHONPENENABLED = "refreshonopen.enabled"; + + public static final String SETTINGS_NOTIFICATIONSRINGTONE = "notifications.ringtone"; + + public static final String SETTINGS_NOTIFICATIONSVIBRATE = "notifications.vibrate"; + + public static final String SETTINGS_PRIORITIZE = "contentpresentation.prioritize"; + + public static final String SETTINGS_SHOWTABS = "tabs.show"; + + public static final String SETTINGS_FETCHPICTURES = "pictures.fetch"; + + public static final String SETTINGS_PROXYENABLED = "proxy.enabled"; + + public static final String SETTINGS_PROXYPORT = "proxy.port"; + + public static final String SETTINGS_PROXYHOST = "proxy.host"; + + public static final String SETTINGS_PROXYWIFIONLY = "proxy.wifionly"; + + public static final String SETTINGS_PROXYTYPE = "proxy.type"; + + public static final String SETTINGS_KEEPTIME = "keeptime"; + + public static final String SETTINGS_BLACKTEXTONWHITE = "blacktextonwhite"; + + public static final String SETTINGS_FONTSIZE = "fontsize"; + + public static final String SETTINGS_STANDARDUSERAGENT = "standarduseragent"; + + public static final String SETTINGS_DISABLEPICTURES = "pictures.disable"; + + public static final String SETTINGS_HTTPHTTPSREDIRECTS = "httphttpsredirects"; + + public static final String SETTINGS_OVERRIDEWIFIONLY = "overridewifionly"; + + public static final String SETTINGS_GESTURESENABLED = "gestures.enabled"; + + public static final String SETTINGS_ENCLOSUREWARNINGSENABLED = "enclosurewarnings.enabled"; + + public static final String SETTINGS_EFFICIENTFEEDPARSING = "efficientfeedparsing"; + + public static final String ACTION_REFRESHFEEDS = "cn.eric.rss.REFRESH"; + + public static final String ACTION_UPDATEWIDGET = "cn.eric.rss.FEEDUPDATED"; + + public static final String ACTION_RESTART = "cn.eric.rss.RESTART"; + + public static final String FEEDID = "feedid"; + + public static final String DB_ISNULL = " IS NULL"; + + public static final String DB_DESC = " DESC"; + + public static final String DB_ARG = "=?"; + + public static final String DB_AND = " AND "; + + public static final String DB_EXCUDEFAVORITE = new StringBuilder(FeedData.EntryColumns.FAVORITE).append(Strings.DB_ISNULL).append(" OR ").append(FeedData.EntryColumns.FAVORITE).append("=0").toString(); + + public static final String EMPTY = ""; + + public static final String HTTP = "http://"; + + public static final String HTTPS = "https://"; + + public static final String _HTTP = "http"; + + public static final String _HTTPS = "https"; + + public static final String PROTOCOL_SEPARATOR = "://"; + + public static final String FILE_FAVICON = "/favicon.ico"; + + public static final String SPACE = " "; + + public static final String TWOSPACE = " "; + + public static final String HTML_TAG_REGEX = "<(.|\n)*?>"; + + public static final String FILEURL = "file://"; + + public static final String IMAGEFILE_IDSEPARATOR = "__"; + + public static final String IMAGEID_REPLACEMENT = "##ID##"; + + public static final String DEFAULTPROXYPORT = "8080"; + + public static final String URL_SPACE = "%20"; + + public static final String HTML_SPAN_REGEX = "<[/]?[ ]?span(.|\n)*?>"; + + public static final String HTML_IMG_REGEX = "<[/]?[ ]?img(.|\n)*?>"; + + public static final String ONE = "1"; + + public static final Object THREENEWLINES = "\n\n\n"; + + public static final String PREFERENCE_LICENSEACCEPTED = "license.accepted"; + + public static final String PREFERENCE_LASTSCHEDULEDREFRESH = "lastscheduledrefresh"; + + public static final String HTML_LT = "<"; + + public static final String HTML_GT = ">"; + + public static final String LT = "<"; + + public static final String GT = ">"; + + protected static final String TRUE = "true"; + + protected static final String FALSE = "false"; + + public static final String READDATE_GREATERZERO = FeedData.EntryColumns.READDATE+">0"; + + public static final String COUNT = "count"; + + public static final String ENCLOSURE_SEPARATOR = "[@]"; // exactly three characters! + + public static final String QUESTIONMARKS = "'??'"; + + public static final String HTML_QUOT = """; + + public static final String QUOT = "\""; + + public static final String HTML_APOSTROPHE = "'"; + + public static final String APOSTROPHE = "'"; + + public static final String AMP = "&"; + + public static final String AMP_SG = "&"; + + public static final String SLASH = "/"; + + public static final String COMMASPACE = ", "; + + public static final String SCHEDULED = "scheduled"; + +} From 7d51e81ae0aaece1f517ea458106005eac537e38 Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Sun, 17 Mar 2013 20:39:25 +0800 Subject: [PATCH 05/19] update license --- AndroidManifest.xml | 2 +- LICENSE | 5 +++-- README | 34 +++++++++++++++++++++------------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f27f3d8..42eca4e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -142,7 +142,7 @@ + android:value="hiapk" /> Date: Sun, 17 Mar 2013 20:39:50 +0800 Subject: [PATCH 06/19] update license --- LICENSE | 2 +- README | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 1613870..0c77239 100644 --- a/LICENSE +++ b/LICENSE @@ -12,7 +12,7 @@ Translators Code-Contributors - Joel Low - - Ruobin Wang(王若斌) + - Ruobin Wang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README b/README index 1613870..0c77239 100644 --- a/README +++ b/README @@ -12,7 +12,7 @@ Translators Code-Contributors - Joel Low - - Ruobin Wang(王若斌) + - Ruobin Wang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From dca3239b329f5d9afee94cb20e2c5031b9eae0af Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Sun, 17 Mar 2013 22:02:22 +0800 Subject: [PATCH 07/19] add Neteasy and Tencent news feeds --- src/cn/eric/rss/FeedConfigActivity.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cn/eric/rss/FeedConfigActivity.java b/src/cn/eric/rss/FeedConfigActivity.java index ec086f3..87f53bb 100644 --- a/src/cn/eric/rss/FeedConfigActivity.java +++ b/src/cn/eric/rss/FeedConfigActivity.java @@ -246,6 +246,15 @@ public static void insertInitialFeeds(Activity activity) { // url = "http://news.baidu.com/n?cmd=1&class=housenews&tn=rss"; // name = "百度新闻(房产)"; // insertFeed(activity, url, name); + url = "http://news.163.com/special/00011K6L/rss_newstop.xml"; + name = "网易新闻(头条)"; + insertFeed(activity, url, name); + url = "http://news.163.com/special/00011K6L/rss_hotnews.xml"; + name = "网易新闻(深度)"; + insertFeed(activity, url, name); + url = "http://news.qq.com/newssh/rss_newssh.xml"; + name = "腾讯社会新闻"; + insertFeed(activity, url, name); url = "http://feed.mtime.com/movienews.rss"; name = "时光电影新闻"; insertFeed(activity, url, name); From 1dc37c5d29e2463909845d6cd573128684e1ab30 Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Sun, 17 Mar 2013 23:19:46 +0800 Subject: [PATCH 08/19] update favorite icon --- res/drawable-hdpi/favorite.png | Bin 0 -> 1704 bytes res/drawable-hdpi/not_favorite.png | Bin 0 -> 1839 bytes res/layout-hdpi/listitem_content.xml | 35 +- res/layout/entry.xml | 4 +- res/layout/listitem_content.xml | 37 +- src/cn/eric/rss/EntriesListAdapter.java | 560 +++++++++++++----------- src/cn/eric/rss/EntryActivity.java | 9 +- src/cn/eric/rss/FeedConfigActivity.java | 3 + 8 files changed, 354 insertions(+), 294 deletions(-) create mode 100644 res/drawable-hdpi/favorite.png create mode 100644 res/drawable-hdpi/not_favorite.png diff --git a/res/drawable-hdpi/favorite.png b/res/drawable-hdpi/favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..7c25f351188f98caa89792889ae3e27960c16da7 GIT binary patch literal 1704 zcmaJ?Yfuwc6i$H1qeTS)ff2inh{8a2HwHptBIW@SaS?%mR742L0x8*S%q|dgP{68F zP)AWwunJW~TNreTS}X#=N(4c~Hx(_6wW7rbB2^xa?FNDNN9oS&-h0oS?>pal+}W=q z!dKYax!cibG<#X7G?H2&^J_DM`o>y}?4TAmGFVPV;mKsCLXXl!Dm)1VWSAlajYJiy ztPQQGfJU?QR7cB6IkJkc#4(n_?87o(Itopr34#ndg)$8#fh06Vtrap~)ip8!wMxj0 z^+zB?CqYxyp&RvR)W+~=<;FB6PsI#c1_%s%iU31N1z^B5T7qv7GRJxO)ZT0cnZURU znI>d@6eUL@012)~0e=?cr-TAvAb`VyIS`M-^99%t41q8kgt&e%#P{d&AsCo=m{c^q zDw!WC4Vj2VorKI(lGO1*Ff%igmAQn4>r+6O$K!zz8)UQnC=Wj(OG_#Yep+I|B!d(s zlzO#}RO4E}%&17h(@7zdQu;9kOgBZVB__&56$~^ebRf)v%qdMeBFO){V%U^7K}Mqg z=>1P(B05Wlf{`eJr|XqeqdM(^(u^=S| zG`IF&t)4Vd^JCsl4K8(<8hunt&AXl&Y{N0{9_qfh%cP=c!~N$a*V5*QTun72koxfc zN8fGk3_%#6u>5u9+cN9seFlfi$G7Z`$X_JP8Y;87FL9{v+9y}u*lJx60p=&}b&rEv zwWgHbFIlk}}@y)s0j^gq{&9mrBm}jCVa15Y-i5GJ(hWo z#-C~0?z<~DZso;x%4;GI<@mj`HS98Kk zO;+uTd$RKal6W1g!&kHS6ve8^hTNYHSP!Js=Rx?L9?oJ7YLMw(ifd49q5Cq zjN5(73;SLVER4OgeX!1H&|w|p;2}10!WtX(9UOA5%=uY!>Uep9)4+TIqnm!+zxGkX z?{>>p)3H&Xo9|*CP!fmF*6w&+5q1b8Dyu3E^jB)cM!2HjL0A2N?BM!qhht8NOrk~$ zyLE4Sa<9bSJP{jp>yH`PZ2=!l-o3U#_*2dZ^W^{$o?uaRqtSh*)lMtV?hm#Q?br8B TC7)^^j{iJl!Qs+sabn)z>{FN^ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/not_favorite.png b/res/drawable-hdpi/not_favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..c10325fe114dd69e75297bc427d5d1530466ff20 GIT binary patch literal 1839 zcmaJ?X;2eq7!DvPArTcZDr%RARm5a>Ljoii5<)f5rVGyL_ zQ8gZbc+rX#1zY2RQH$VNysF}bq5)ex2d@!rH!9d4rMt8HecwCJ^StNI7A7W4qEm-c zDHIA_7AuvLE989od64g^u5Sy-Wf&2yAd>MkB1>sPDUljng#t26sYT_eQj={wjZUOc z+yZnd3PORz3)DEqRyr|k3uYkM6v{-A#h_GYpah^owK~0!`SkEHCZN*@nNxWPgczdG zbX{zY2~EyPNKxlxsQDVEC<2&h5s(5HN+ z?29}Jndt;!5P)D-Ru(%en2npXAk63UL5Kr#I4lyuGH2@vrG=$8kM35GqGq*8XCQRA z9&jouRrq{D$Rs2Elmcexk=2_&mx(MGXi*wKm<>5o>INdn|3fjX2W=+g=$Cl^Q`nr6 zZ9qXeYR2cA)MVq*Mmt>@1W_hbN#Ldw9G}-+#l&=+z|HBn0fxMNPU)R1;&uG2mm;0$uO1@O#z!%+>TBOJuKHkPHTNw)S7G z?lzJ0f^xrrfyA~vb_^p=5?8gaqhf7-{`&p3 zFJ?dLWOaFzaDugtTbtc#?iDoD{61~LqIXp_*P68>BFexE7tRm#89?69?A(S{_|k`o zA0Bhgq+;0PgMYUorR5UU^x$OipvEz>%)vkj2-q@xS}1Re-?K-BcLb!m+uWYyJxsN3 z>GNP|#54Jj{!QM$T#vRdoVN1OLhn_r2Re#!T>K)LmY>4LHh6Xv&2=fHm3fyZ8S7TH zy|5rxs0z1BcAxV2=MkloTX{)A;&o?3TIfw}=$ys1R0VZ^ByT9KNz_<3Z+1qkIp4Z= z=YT*@c_XcU-)}GDmajR!vD0^{{8`Dh*Q*!TKc@`!uZwlBO1p23DbOyn0>1IPfHKME z5#Hw8ODKY<;%lcfG_u=Os;8lE>QP0X_b&AE1jIhIy8k@)CCA4;Tjh~+aszxIlYT2P zyCQJ2J$j~XXWpbv=@3=e*SGkpDfsMtPt?M1s4Dk9v@R*zSh8!S3H3=P|xB!;($yhcr*<#jdK z`m(+HVwB&@HA&}eR%8=#J-vedTGOvFHTz=4$rvw8qhN`joOPX}@X}#NYgg^K%Gl#7 zw>ow-`q7QIRX^Mqxr5HYHtzqb-;jt41MaP%W#&Gfa7SNLI;`KIn1tr4nmDmQyO(cw zXocen{oZYVQ{0xdjNUT7(rWl77~3%;P&{QNe$M5CLzVxk>BrU;NB0fZEKsx^Nxd`| zofC@L_E5J<`@h=gHwrx%yK;%=t+GVb5!a{3L#llqyx5IhjX#-g&a86ZRdbs~;&%%`4g@FfM z?^Fg<$Ib{pIle&s9Se9BZj2Yl=bm@(Vx&@xw!ZBjwr{9){=#I@3DTb>sd@hZNzKEr literal 0 HcmV?d00001 diff --git a/res/layout-hdpi/listitem_content.xml b/res/layout-hdpi/listitem_content.xml index ff10319..befb4e7 100644 --- a/res/layout-hdpi/listitem_content.xml +++ b/res/layout-hdpi/listitem_content.xml @@ -1,26 +1,31 @@ - + + + android:layout_toLeftOf="@android:id/icon" + android:gravity="top" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="@color/content_black" /> + + android:singleLine="true" + android:textColor="@color/content_black" /> + + android:id="@android:id/icon" + android:layout_width="30dip" + android:layout_height="30dip" + android:layout_alignTop="@android:id/text1" + android:layout_alignParentRight="true" /> + \ No newline at end of file diff --git a/res/layout/entry.xml b/res/layout/entry.xml index 8464860..fe1afe7 100644 --- a/res/layout/entry.xml +++ b/res/layout/entry.xml @@ -22,8 +22,8 @@ + android:layout_width="30dip" + android:layout_height="30dip" /> + + + android:layout_toLeftOf="@android:id/icon" + android:gravity="top" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="@color/content_black" /> + + android:singleLine="true" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="@color/content_black" /> + + android:id="@android:id/icon" + android:layout_width="30dip" + android:layout_height="30dip" + android:layout_alignTop="@android:id/text1" + android:layout_alignParentRight="true" /> + \ No newline at end of file diff --git a/src/cn/eric/rss/EntriesListAdapter.java b/src/cn/eric/rss/EntriesListAdapter.java index fa99d7e..52a585d 100644 --- a/src/cn/eric/rss/EntriesListAdapter.java +++ b/src/cn/eric/rss/EntriesListAdapter.java @@ -1,256 +1,304 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import java.text.DateFormat; -import java.util.Date; -import java.util.Vector; - -import android.app.Activity; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Typeface; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.preference.PreferenceManager; -import android.util.TypedValue; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ImageView; -import android.widget.ResourceCursorAdapter; -import android.widget.TextView; -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; - -public class EntriesListAdapter extends ResourceCursorAdapter { - private static final int STATE_NEUTRAL = 0; - - private static final int STATE_ALLREAD = 1; - - private static final int STATE_ALLUNREAD = 2; - - private int titleColumnPosition; - - private int dateColumn; - - private int readDateColumn; - - private int favoriteColumn; - - private int idColumn; - - private int feedIconColumn; - - private int feedNameColumn; - - private int linkColumn; - - private static final String SQLREAD = "length(readdate) ASC, "; - - public static final String READDATEISNULL = "readdate is null"; - - private boolean showRead; - - private Activity context; - - private Uri uri; - - private boolean showFeedInfo; - - private int forcedState; - - private Vector markedAsRead; - - private Vector markedAsUnread; - - private Vector favorited; - - private Vector unfavorited; - - private DateFormat dateFormat; - - private DateFormat timeFormat; - - public EntriesListAdapter(Activity context, Uri uri, boolean showFeedInfo, boolean autoreload) { - super(context, R.layout.entrylistitem, createManagedCursor(context, uri, true), autoreload); - showRead = true; - this.context = context; - this.uri = uri; - - Cursor cursor = getCursor(); - - titleColumnPosition = cursor.getColumnIndex(FeedData.EntryColumns.TITLE); - dateColumn = cursor.getColumnIndex(FeedData.EntryColumns.DATE); - readDateColumn = cursor.getColumnIndex(FeedData.EntryColumns.READDATE); - favoriteColumn = cursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); - idColumn = cursor.getColumnIndex(FeedData.EntryColumns._ID); - linkColumn = cursor.getColumnIndex(FeedData.EntryColumns.LINK); - this.showFeedInfo = showFeedInfo; - if (showFeedInfo) { - feedIconColumn = cursor.getColumnIndex(FeedData.FeedColumns.ICON); - feedNameColumn = cursor.getColumnIndex(FeedData.FeedColumns.NAME); - } - forcedState = STATE_NEUTRAL; - markedAsRead = new Vector(); - markedAsUnread = new Vector(); - favorited = new Vector(); - unfavorited = new Vector(); - dateFormat = android.text.format.DateFormat.getDateFormat(context); - timeFormat = android.text.format.DateFormat.getTimeFormat(context); - } - - @Override - public void bindView(View view, final Context context, Cursor cursor) { - TextView textView = (TextView) view.findViewById(android.R.id.text1); - - textView.setText(cursor.getString(titleColumnPosition)); - - TextView dateTextView = (TextView) view.findViewById(android.R.id.text2); - - final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); - - final long id = cursor.getLong(idColumn); - - view.setTag(cursor.getString(linkColumn)); - - final boolean favorite = !unfavorited.contains(id) && (cursor.getInt(favoriteColumn) == 1 || favorited.contains(id)); - - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); - imageView.setTag(favorite ? Strings.TRUE : Strings.FALSE); - imageView.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - boolean newFavorite = !Strings.TRUE.equals(view.getTag()); - - if (newFavorite) { - view.setTag(Strings.TRUE); - imageView.setImageResource(android.R.drawable.star_on); - favorited.add(id); - unfavorited.remove(id); - } else { - view.setTag(Strings.FALSE); - imageView.setImageResource(android.R.drawable.star_off); - unfavorited.add(id); - favorited.remove(id); - } - - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.FAVORITE, newFavorite ? 1 : 0); - view.getContext().getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns._ID).append(Strings.DB_ARG).toString(), new String[] {Long.toString(id)}); - context.getContentResolver().notifyChange(FeedData.EntryColumns.FAVORITES_CONTENT_URI, null); - - } - }); - - Date date = new Date(cursor.getLong(dateColumn)); - - if (showFeedInfo && feedIconColumn > -1 && feedNameColumn > -1) { - byte[] iconBytes = cursor.getBlob(feedIconColumn); - - if (iconBytes != null && iconBytes.length > 0) { - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - - if (bitmap != null) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 18f, context.getResources().getDisplayMetrics()); - if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); - } - dateTextView.setText(new StringBuilder().append(' ').append(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); // bad style - } else { - dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); - } - dateTextView.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(bitmap), null, null, null); - } else { - dateTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); - dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date)).append(Strings.COMMASPACE).append(cursor.getString(feedNameColumn))); - } - - } else { - textView.setText(cursor.getString(titleColumnPosition)); - dateTextView.setText(new StringBuilder(dateFormat.format(date)).append(' ').append(timeFormat.format(date))); - } - - if (forcedState == STATE_ALLUNREAD && !markedAsRead.contains(id) || (forcedState != STATE_ALLREAD && cursor.isNull(readDateColumn) && !markedAsRead.contains(id)) || markedAsUnread.contains(id)) { - textView.setTypeface(Typeface.DEFAULT_BOLD); - textView.setEnabled(true); - dateTextView.setEnabled(true); - } else { - textView.setTypeface(Typeface.DEFAULT); - textView.setEnabled(false); - dateTextView.setEnabled(false); - } - } - - public void showRead(boolean showRead) { - if (showRead != this.showRead) { - context.stopManagingCursor(getCursor()); - changeCursor(createManagedCursor(context, uri, showRead)); - this.showRead = showRead; - } - } - - public boolean isShowRead() { - return showRead; - } - - private static Cursor createManagedCursor(Activity context, Uri uri, boolean showRead) { - return context.managedQuery(uri, null, showRead ? null : READDATEISNULL, null, new StringBuilder(PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Strings.SETTINGS_PRIORITIZE, false) ? SQLREAD : Strings.EMPTY).append(FeedData.EntryColumns.DATE).append(Strings.DB_DESC).toString()); - } - - public void markAsRead() { - forcedState = STATE_ALLREAD; - markedAsRead.clear(); - markedAsUnread.clear(); - notifyDataSetInvalidated(); - } - - public void markAsUnread() { - forcedState = STATE_ALLUNREAD; - markedAsRead.clear(); - markedAsUnread.clear(); - notifyDataSetInvalidated(); - } - - public void neutralizeReadState() { - forcedState = STATE_NEUTRAL; - } - - public void markAsRead(long id) { - markedAsRead.add(id); - markedAsUnread.remove(id); - notifyDataSetInvalidated(); - } - - public void markAsUnread(long id) { - markedAsUnread.add(id); - markedAsRead.remove(id); - notifyDataSetInvalidated(); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import java.text.DateFormat; +import java.util.Date; +import java.util.Vector; + +import android.app.Activity; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.preference.PreferenceManager; +import android.util.TypedValue; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; +import android.widget.ResourceCursorAdapter; +import android.widget.TextView; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class EntriesListAdapter extends ResourceCursorAdapter { + private static final int STATE_NEUTRAL = 0; + + private static final int STATE_ALLREAD = 1; + + private static final int STATE_ALLUNREAD = 2; + + private int titleColumnPosition; + + private int dateColumn; + + private int readDateColumn; + + private int favoriteColumn; + + private int idColumn; + + private int feedIconColumn; + + private int feedNameColumn; + + private int linkColumn; + + private static final String SQLREAD = "length(readdate) ASC, "; + + public static final String READDATEISNULL = "readdate is null"; + + private boolean showRead; + + private Activity context; + + private Uri uri; + + private boolean showFeedInfo; + + private int forcedState; + + private Vector markedAsRead; + + private Vector markedAsUnread; + + private Vector favorited; + + private Vector unfavorited; + + private DateFormat dateFormat; + + private DateFormat timeFormat; + + public EntriesListAdapter(Activity context, Uri uri, boolean showFeedInfo, + boolean autoreload) { + super(context, R.layout.entrylistitem, createManagedCursor(context, + uri, true), autoreload); + showRead = true; + this.context = context; + this.uri = uri; + + Cursor cursor = getCursor(); + + titleColumnPosition = cursor + .getColumnIndex(FeedData.EntryColumns.TITLE); + dateColumn = cursor.getColumnIndex(FeedData.EntryColumns.DATE); + readDateColumn = cursor.getColumnIndex(FeedData.EntryColumns.READDATE); + favoriteColumn = cursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); + idColumn = cursor.getColumnIndex(FeedData.EntryColumns._ID); + linkColumn = cursor.getColumnIndex(FeedData.EntryColumns.LINK); + this.showFeedInfo = showFeedInfo; + if (showFeedInfo) { + feedIconColumn = cursor.getColumnIndex(FeedData.FeedColumns.ICON); + feedNameColumn = cursor.getColumnIndex(FeedData.FeedColumns.NAME); + } + forcedState = STATE_NEUTRAL; + markedAsRead = new Vector(); + markedAsUnread = new Vector(); + favorited = new Vector(); + unfavorited = new Vector(); + dateFormat = android.text.format.DateFormat.getDateFormat(context); + timeFormat = android.text.format.DateFormat.getTimeFormat(context); + } + + @Override + public void bindView(View view, final Context context, Cursor cursor) { + TextView textView = (TextView) view.findViewById(android.R.id.text1); + + textView.setText(cursor.getString(titleColumnPosition)); + + TextView dateTextView = (TextView) view + .findViewById(android.R.id.text2); + + final ImageView imageView = (ImageView) view + .findViewById(android.R.id.icon); + + final long id = cursor.getLong(idColumn); + + view.setTag(cursor.getString(linkColumn)); + + final boolean favorite = !unfavorited.contains(id) + && (cursor.getInt(favoriteColumn) == 1 || favorited + .contains(id)); + + imageView.setBackgroundResource(favorite ? R.drawable.favorite + : R.drawable.not_favorite); + imageView.setTag(favorite ? Strings.TRUE : Strings.FALSE); + imageView.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + boolean newFavorite = !Strings.TRUE.equals(view.getTag()); + + if (newFavorite) { + view.setTag(Strings.TRUE); + imageView.setBackgroundResource(R.drawable.favorite); + favorited.add(id); + unfavorited.remove(id); + } else { + view.setTag(Strings.FALSE); + imageView.setBackgroundResource(R.drawable.not_favorite); + unfavorited.add(id); + favorited.remove(id); + } + + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.FAVORITE, newFavorite ? 1 : 0); + view.getContext() + .getContentResolver() + .update(uri, + values, + new StringBuilder(FeedData.EntryColumns._ID) + .append(Strings.DB_ARG).toString(), + new String[] { Long.toString(id) }); + context.getContentResolver().notifyChange( + FeedData.EntryColumns.FAVORITES_CONTENT_URI, null); + + } + }); + + Date date = new Date(cursor.getLong(dateColumn)); + + if (showFeedInfo && feedIconColumn > -1 && feedNameColumn > -1) { + byte[] iconBytes = cursor.getBlob(feedIconColumn); + + if (iconBytes != null && iconBytes.length > 0) { + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, + iconBytes.length); + + if (bitmap != null) { + int bitmapSizeInDip = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, 18f, context + .getResources().getDisplayMetrics()); + if (bitmap.getHeight() != bitmapSizeInDip) { + bitmap = Bitmap.createScaledBitmap(bitmap, + bitmapSizeInDip, bitmapSizeInDip, false); + } + dateTextView.setText(new StringBuilder().append(' ') + .append(dateFormat.format(date)).append(' ') + .append(timeFormat.format(date)) + .append(Strings.COMMASPACE) + .append(cursor.getString(feedNameColumn))); // bad + // style + } else { + dateTextView.setText(new StringBuilder(dateFormat + .format(date)).append(' ') + .append(timeFormat.format(date)) + .append(Strings.COMMASPACE) + .append(cursor.getString(feedNameColumn))); + } + dateTextView.setCompoundDrawablesWithIntrinsicBounds( + new BitmapDrawable(bitmap), null, null, null); + } else { + dateTextView.setCompoundDrawablesWithIntrinsicBounds(null, + null, null, null); + dateTextView.setText(new StringBuilder(dateFormat.format(date)) + .append(' ').append(timeFormat.format(date)) + .append(Strings.COMMASPACE) + .append(cursor.getString(feedNameColumn))); + } + + } else { + textView.setText(cursor.getString(titleColumnPosition)); + dateTextView.setText(new StringBuilder(dateFormat.format(date)) + .append(' ').append(timeFormat.format(date))); + } + + if (forcedState == STATE_ALLUNREAD + && !markedAsRead.contains(id) + || (forcedState != STATE_ALLREAD + && cursor.isNull(readDateColumn) && !markedAsRead + .contains(id)) || markedAsUnread.contains(id)) { + textView.setTypeface(Typeface.DEFAULT_BOLD); + textView.setEnabled(true); + dateTextView.setEnabled(true); + } else { + textView.setTypeface(Typeface.DEFAULT); + textView.setEnabled(false); + dateTextView.setEnabled(false); + } + } + + public void showRead(boolean showRead) { + if (showRead != this.showRead) { + context.stopManagingCursor(getCursor()); + changeCursor(createManagedCursor(context, uri, showRead)); + this.showRead = showRead; + } + } + + public boolean isShowRead() { + return showRead; + } + + private static Cursor createManagedCursor(Activity context, Uri uri, + boolean showRead) { + return context.managedQuery( + uri, + null, + showRead ? null : READDATEISNULL, + null, + new StringBuilder(PreferenceManager + .getDefaultSharedPreferences(context).getBoolean( + Strings.SETTINGS_PRIORITIZE, false) ? SQLREAD + : Strings.EMPTY).append(FeedData.EntryColumns.DATE) + .append(Strings.DB_DESC).toString()); + } + + public void markAsRead() { + forcedState = STATE_ALLREAD; + markedAsRead.clear(); + markedAsUnread.clear(); + notifyDataSetInvalidated(); + } + + public void markAsUnread() { + forcedState = STATE_ALLUNREAD; + markedAsRead.clear(); + markedAsUnread.clear(); + notifyDataSetInvalidated(); + } + + public void neutralizeReadState() { + forcedState = STATE_NEUTRAL; + } + + public void markAsRead(long id) { + markedAsRead.add(id); + markedAsUnread.remove(id); + notifyDataSetInvalidated(); + } + + public void markAsUnread(long id) { + markedAsUnread.add(id); + markedAsRead.remove(id); + notifyDataSetInvalidated(); + } + +} diff --git a/src/cn/eric/rss/EntryActivity.java b/src/cn/eric/rss/EntryActivity.java index 37164a9..79e101c 100644 --- a/src/cn/eric/rss/EntryActivity.java +++ b/src/cn/eric/rss/EntryActivity.java @@ -503,15 +503,14 @@ private void reload() { favorite = entryCursor.getInt(favoritePosition) == 1; - imageView - .setImageResource(favorite ? android.R.drawable.star_on - : android.R.drawable.star_off); + imageView.setBackgroundResource(favorite ? R.drawable.favorite + : R.drawable.not_favorite); imageView.setOnClickListener(new OnClickListener() { public void onClick(View view) { favorite = !favorite; imageView - .setImageResource(favorite ? android.R.drawable.star_on - : android.R.drawable.star_off); + .setBackgroundResource(favorite ? R.drawable.favorite + : R.drawable.not_favorite); ContentValues values = new ContentValues(); values.put(FeedData.EntryColumns.FAVORITE, favorite ? 1 diff --git a/src/cn/eric/rss/FeedConfigActivity.java b/src/cn/eric/rss/FeedConfigActivity.java index 87f53bb..4f5d5de 100644 --- a/src/cn/eric/rss/FeedConfigActivity.java +++ b/src/cn/eric/rss/FeedConfigActivity.java @@ -255,6 +255,9 @@ public static void insertInitialFeeds(Activity activity) { url = "http://news.qq.com/newssh/rss_newssh.xml"; name = "腾讯社会新闻"; insertFeed(activity, url, name); + url = "http://comic.qq.com/news/rss_news.xml"; + name = "腾讯动漫频道"; + insertFeed(activity, url, name); url = "http://feed.mtime.com/movienews.rss"; name = "时光电影新闻"; insertFeed(activity, url, name); From b71906cfa2aa59fd0feef4e5fe1cdfde35848315 Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Thu, 21 Mar 2013 20:20:15 +0800 Subject: [PATCH 09/19] change action bar style --- .classpath | 12 +- .gitignore | 5 + .project | 2 +- AndroidManifest.xml | 5 +- project.properties | 3 +- res/drawable-hdpi/ic_more.png | Bin 0 -> 1007 bytes res/drawable-hdpi/upbar_back.png | Bin 0 -> 1191 bytes res/layout-v11/feedsettings.xml | 29 - res/layout/feedsettings.xml | 60 +- res/layout/feedsettings_content.xml | 53 +- res/layout/main.xml | 5 +- res/layout/tabs.xml | 23 - res/values-v11/styles.xml | 6 - res/values-v14/styles.xml | 6 - res/values/colors.xml | 4 + res/values/strings.xml | 486 +++++---- res/values/styles.xml | 19 +- res/values/styles_actionbar.xml | 81 ++ .../rss/ApplicationPreferencesActivity.java | 11 +- src/cn/eric/rss/EntriesListActivity.java | 425 ++++---- src/cn/eric/rss/EntryActivity.java | 55 +- src/cn/eric/rss/FeedConfigActivity.java | 41 +- .../{RSSOverview.java => MainActivity.java} | 932 +++++++++--------- src/cn/eric/rss/MainTabActivity.java | 293 ------ src/cn/eric/rss/RSSOverviewListAdapter.java | 1 + src/cn/eric/rss/RefreshBroadcastReceiver.java | 6 +- src/cn/eric/rss/SherlockActivityBase.java | 101 ++ src/cn/eric/rss/SherlockTabActivity.java | 273 +++++ src/cn/eric/rss/provider/FeedData.java | 161 +-- src/cn/eric/rss/service/FetcherService.java | 8 +- src/cn/eric/rss/ui/MenuData.java | 32 + .../rss/widget/MiniRSSAppWidgetProvider.java | 4 +- 32 files changed, 1712 insertions(+), 1430 deletions(-) create mode 100644 res/drawable-hdpi/ic_more.png create mode 100644 res/drawable-hdpi/upbar_back.png delete mode 100644 res/layout-v11/feedsettings.xml delete mode 100644 res/layout/tabs.xml delete mode 100644 res/values-v11/styles.xml delete mode 100644 res/values-v14/styles.xml create mode 100644 res/values/styles_actionbar.xml rename src/cn/eric/rss/{RSSOverview.java => MainActivity.java} (67%) delete mode 100644 src/cn/eric/rss/MainTabActivity.java create mode 100644 src/cn/eric/rss/SherlockActivityBase.java create mode 100644 src/cn/eric/rss/SherlockTabActivity.java create mode 100644 src/cn/eric/rss/ui/MenuData.java diff --git a/.classpath b/.classpath index 6aed2eb..08be9d6 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,10 @@ - - - - - + + + + + diff --git a/.gitignore b/.gitignore index bae96b2..ccbc0bc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ gen/ authors.txt keystore +/.apt_generated +.settings/ +build.xml +local.properties +proguard-project.txt \ No newline at end of file diff --git a/.project b/.project index 4c749e7..58fcd0a 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - RSS Quick Reader + test diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 42eca4e..1d9df29 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -43,7 +43,8 @@ android:allowClearUserData="true" android:icon="@drawable/icon" android:label="@string/app_name" - android:testOnly="false" > + android:testOnly="false" + android:theme="@style/Theme.Sherlock" > @@ -55,7 +56,7 @@ diff --git a/project.properties b/project.properties index 8f81673..0fa7c6a 100644 --- a/project.properties +++ b/project.properties @@ -10,4 +10,5 @@ # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-16 +target=android-14 +android.library.reference.1=../ActionBarSherlock/library diff --git a/res/drawable-hdpi/ic_more.png b/res/drawable-hdpi/ic_more.png new file mode 100644 index 0000000000000000000000000000000000000000..663799381b2b99cd1f3dc8243f093b16143653ba GIT binary patch literal 1007 zcmaJ=PiWIn91fk1QRq!YcaTTsLBZy4ldiGZ+9s_lm@&Gdy=j`ft#M0Ue0j6k7$TnL zVX}h<&mNqJ2%_L&2X6yG@FE^|^&|+>^T7Git(}L>NAmvhec$hU@ArF;XQr=b(xYjH zVKVh8vq48G`A3Fne{pi{Egde9YKzRGInuQ;WXdjTLs0kadDwuqyL|5xEHcc{C9l~c zE$fEnAfK}n3>W($Wiw21G7fEL0TR%L^Io8{yIUVw;JG?`OR)qiG+@V@TETF3WxDCC zEI0+1otyy0Sfc_yBsPfs#URpRo$cvrbe?SUEa*YVg3cb8YFRVDKo|mrle3N>ia=F4 zF{h}icoj&3DDeXQ)U24(6jhV*;IOeY8g}QjhFLp|MOQl8AtcmzzT53`U7168o)-&+ zLZTr_S&GO;%K@?DY!Hq06-*d8*b9k=0+1-$ZL~ymmO4E+f*%fKgXr*@=!NmI9r7Y4 zBuDB4E$jbK-yfhO(tt;Pj}?xZ%OT_&FhWb%p^2LtOG1U3fuT(hZX&eUzr~pjA}H#h z5E!#6xNO;u7bF{3dJN0b>On;8z=3sBXQ>9~d9GHLbCM~GqN3*VqF9v*l98{;6=Phf zRFvAd)aRPWS@K~(`ds&jE1k$qiop+QWD{cVK6Gms`Ji`b%{#`6q8O4a2;+(>SC98{ zz;#ddBAn=jr)Kyhwg05LzeVdOnGOna_W$a_3Pd{TFy|JRtx8 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/upbar_back.png b/res/drawable-hdpi/upbar_back.png new file mode 100644 index 0000000000000000000000000000000000000000..4c5dab8512702b3a0828403f6ab01f8f8ec0cae7 GIT binary patch literal 1191 zcmeAS@N?(olHy`uVBq!ia0vp^(m<@k!3HF!tUl}jq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfglRhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Kep0RGSfuW&-nVFuU ziK&^Hp^k!)fuWJU0T7w#8k$&{npqi{D?ot~(6*wKG^-#NH>h1eo~=?wNlAf~zJ7Um zxn8-kUVc%!zM-Y1CCCgTBVC{h-Qvo;lEez#ykcdT2`;I{$wiq3C7Jno3Lp~`lk!VT zY?Xj6g?J&i0B&qvF*KNf0j6J(SfFpHX8`gNOrftYexnUy@&(kzb(T9Bihb;hUJ8nFkWk z1ncniwerj>E=kNwPW5!LRRWr!mzkMj<>YMPW@%yKW@=>WVrb}USAJQ;cQ^w z=w@Qz2Gi@3pIn-onpXnTn*!HsYJgKOC^6&~0Bv?jEy^rQO>ryA&s6|>+A0&bTU>CO z2i2Q`(=8^hIQ8lS9itD5TBN9k2?5g&hzU=)Kn^_Vr{)3Edl4{U-_ZI}#K6EP>FMGa zQgJKk&;S4S%zGJxnPm^INL@UwH_9yQCdWn{hK};TEkRN zR4T-Arxr68nx5R~n-rkI_>n)upee&O=*#3;Qtuf*x@gRn?f9MX(pcab^P}k=oJS{4 zn<>>2JW*#i&yh1*w(z9zopr0M0;;6aWAK literal 0 HcmV?d00001 diff --git a/res/layout-v11/feedsettings.xml b/res/layout-v11/feedsettings.xml deleted file mode 100644 index 5213007..0000000 --- a/res/layout-v11/feedsettings.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - -

@JUN<#bj>Ud-IR1Cb4aC_`7KGw^ie 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_download_dialog_close_selector.xml b/res/drawable-hdpi/umeng_xp_download_dialog_close_selector.xml new file mode 100644 index 0000000..1be5ac9 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_download_dialog_close_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_download_gradient_grey.xml b/res/drawable-hdpi/umeng_xp_download_gradient_grey.xml new file mode 100644 index 0000000..b9a427c --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_download_gradient_grey.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_gradient_grey.xml b/res/drawable-hdpi/umeng_xp_gradient_grey.xml new file mode 100644 index 0000000..ff6c705 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_gradient_grey.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_gradient_grey1.xml b/res/drawable-hdpi/umeng_xp_gradient_grey1.xml new file mode 100644 index 0000000..4da43f3 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_gradient_grey1.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_gradient_grey2.xml b/res/drawable-hdpi/umeng_xp_gradient_grey2.xml new file mode 100644 index 0000000..72fdd85 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_gradient_grey2.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_greenbg_selector.xml b/res/drawable-hdpi/umeng_xp_greenbg_selector.xml new file mode 100644 index 0000000..f86d900 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_greenbg_selector.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/res/drawable-hdpi/umeng_xp_handler_rc.png b/res/drawable-hdpi/umeng_xp_handler_rc.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5b1d56f65b25726d668055f39d7eae70022cbf GIT binary patch literal 3664 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 ij9v*Pd=B{^0R{k2!u))rCtc?N0000 + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_highlight_banner_bg.9.png b/res/drawable-hdpi/umeng_xp_highlight_banner_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2e54534ff7c6031d7dfcc978e9ac4b45dbb1ce GIT binary patch literal 2148 zcmX|D2{hDe8-Gbxo8=}Vm2L{KyJ%*AZ`zJ;uA$P_aEo8=+HrfA{?Ausk z$XZ#xNldcOFlt=XFf>LOGtBpQ&pqG&Jm-Jj<@ufG_rCA*{N6Xg4r3*=>%cAmfQ zVX!e$5R62jGP8_BPZGDgb4E;dKYAD9O~U&7&!u>UMXt<`m3&b3O4Lt&ZA>~_P`ySR z^0l(+9+-ZN4JiFt`1b9&$r$~vR08BkivICdy81v=K~s~EW<CoAi1rFcTZbzVS^P|ITjEJV`qp36i2OXA&2Pgo329i91al5^(3$b1Et-+_em# z&h4&8A#mkY$ZTIHmuXWiwn9ndm}}ZXi7}gQTg?<**K~&I;P7xgCvHkW)652@4un@X znM|f3{f_V|O5)3PG#ZUKlyd|EcPd7sGOlKe8~Zr+C&t%naZI0c2vdQL|v+0&w5rbL-;PhB<3S?q17)d~D44JJli&M6W4pdtG9Z85Z4c>I~@ zOVe#7!^K9nL;R9M}hP(mQpSm6es{xw&6?dA;Y^JHd!T z+mv8axG2`H3$p0vV|Y?Ab4Jl3e0}KL@L~Z{SNn~(HUv&(<>uy=7Ze;v?wYvQtK$rN zeeY<>Vp0PGFSs^0`KE9`@)G0ofgPz2LT7L%+r*0{337j1Ee*lv=3*tfe-Ven)!!T_ zoLzFjy7m^q3G$^Bf*?GFpDc2ky<4^ww`^S~teu&eX)93rlMVtV@4RH(OjVFFC@CAszX~QaZrV+%m z0v^99D=YtZt4g`779qudq;dn}H!&rsWE2?w3NO&ZlfbMEvJ4QFkFr`K#2ZUJdTmcA zNHyBzluPDfX-oednA2`VW;LJ?2P5VGvEp@n7t$RRo2#pRGFeP?ew0ZTKCU1els$hgo@Z!t(CtuJ$b5>x#XM<}m*1lq}~Ut0oHx=@XZ@EpkZs%O@-vhjIo7 z5q9qK0Qbz-{#Nir+dXlTj&ptU6UI+dRuv<-o6o7Gd(+J5DE`N5I4)yobYddQ!hFg= z$z2)nPh8(;Lm2Wo?FZjN?gXD{ZfRK>v+*{{pD4NRvDCq*n}|tNR`?uQTJG?z1a%R6 zo0>`VLGVF?p&&z0Y7xw2P%7P8*1r!H)2Frj%D$FoQSeIAr(d?MYLLy%pBD?SeI_ht z=(Q|=CL7)w{h + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_highlight_footview_loading.png b/res/drawable-hdpi/umeng_xp_highlight_footview_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..911230c7f9863f383c4435e37514c9647973f6b0 GIT binary patch literal 775 zcmV+i1Ni)jP)u|5_xfAJwJR4Q?p?X)rYPO$qR@q))CW~dAL%P?+B}+Mj`!S~ znar4J9K-{GWaixOe&;*iIU#07)Zm>}hU0)nPSW3Ut;nDsUNfHF1D@OgFU;_N0p>=H zG4~4C{0VF=1Mgmf+ii{v%;k0F`8Ukp=7WdW0cv~Q-{m!+b=a4T?VW8l7&Fg+FYndU zIC$zI)Ajr00sAk}l)9XRJ;h=a3XG~^w7slB(X0b+UqI0|;Fd~@r@N=J!_dzXH#E=H%izinJ0 z6-z^v0c>q8CA>%wh=F8uV5@gCXpMQ}2cxuPSW8mJ(_{}smttqd*i!~4KN@rex0BiwGnK&D8^M9ECwOLUI}$miiuU=1qkvA%C)89D*V4uyjA?gnG8WTrHo2aTPk zqxZ2S3aEq}P!{rUK<#%oL{rD{mYB;v9M}h>8OvC^?AE>l>)*|^NhH$2vtqZNwdsaz zux4ku-S5usUJE&P1Y>Av z2mrtY9`&aHfQp5EDtZTOQJmsb0Cq$M`X3HsPOD_!29KY${x!q*sAzU185tO+@&*SY z`ATK@1Z}B2jka`9IArAFIvmAT>Z34ZmyV?xep#X3#li>?r#ddycPQwno!g#0H|c*L z@+#Q4_iWcDH&L9FUm%+=E}`G8n0c?Q`LJ_m*$o{azYzDoD{s1wH)DAnqdh3VNJ_Mv zdKtu@^)R^HU3GKJ)v5kWxLRS`-_Y|8;;Cl`-#;A??eDN%f326C$8`%35r3dMCyur@uiWRq9dU%dpqg;@ zVnr{xJmuNyzIsk?=XmO5*Jq_QoM?hid$U#4)cj^FijpQ$CMwPkoB0HN%#-ysMYsC|;dxi2SDlVklNgtRBPLAID z=;uMFC3XOZcSWJ9NGkcWrPt$WU-V?=hiv@+jfy1pDZD#c}TNB{*en57^V-7FI!in7Od`FRZ*ei`0G?(RcL3n8W zA1ht1CbroK0M_+(*XGR<^KZ$_`sv+Bt+UvB!N>-=H4T98f?TE1Vy|`z>;W+KppV;$ z=GzPa@GA(9Vr>j{Y&*vG6lw0Z8EFEbPrCle7zMMBuAD z*+^pEh;W70((se4jT_f@fWnacDiU*b&5;k+8gie+G>Q2RuG~g&3L85w z1)%Evr;=HzP@U!je3R5UMVjT$S9Ad@+dPWJi1-NyY_p!*iE;|wpa6w9r^uc#0j3Yp zYPL&0D6Awg>Bs*C;50HT<@_*UusxENP-X&b6R=3J9}WV)swFW;4f6n~UDGMj@IKi< z0oIFB0}G_lL)8CtTOW%znH~DE=i*Lpk&n%a4q)9X)w4o|%TrP%=D>C>UP59{ zT5F*`v2_lMs0&uNyVj4;>P`bOWZ;Y=S&Vg*Gu)x@lG$8L*NiSOeXA_=+|;zaoJT?Q z7A*0g_B^b{H>ysw`i0^XP&iVNi|^qG2BDWGd1@yr%HAFiVnngrynlz{*Yad6a#^N; z0ezm)Pp&ea5Z!?9XM2CQ6VW>bDBzbN!}oY5KC}Y1yM@Dcq94zF4-2PE>p-hpqM8|EKS#2A}3VRCza(;05j2jfAY~N8O1mGw98`+x6vP9KlOWOY81P38Q#{dpjKj zE?N7yWJYk_+dRedBf(#J!by+JViP|tB{b&yT8-5+KFoRi%Aap>Jn+5o4j?Cb-q&m{ zY~DG0La~hFaok684h|6rF9;od8e*)Qf29yPXD@jk(`Tx3PZek{68&joX%Sa#5thj@5G1pt+b_9g6o2;MF6kE^p1jko&Y`Zbg$y42Yd|3B Ln17q!sf+&sD0c?{ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_highlight_item_bg_clicked.9.png b/res/drawable-hdpi/umeng_xp_highlight_item_bg_clicked.9.png new file mode 100644 index 0000000000000000000000000000000000000000..63155d806888a6da849d16f7e983a0e41b179e19 GIT binary patch literal 1658 zcmX|Cdo+}39DYZuM66a(LrU7!q?=`=mB=- zGL_^qGpMOmR8tx?n&CrrO52$EWEdNpeZThX{_~yRd7tO^d!F|>zxRAO0TdrYeWE@9 zz|eQQXCMHCNLUB!&4ph=$teZ^bGP|=ZVN)>ql&%s0MhE3ubFfG zt8)pN-!l%D|E}gDw2zbz5fd7rlNs}y!CCILjeqq3b_vVL!szX6nz&TY`f0Wf=wJ1e z+#o89ynQph67_vt$1P6z_(~&wS+zTN{Q=;Xp*iu=gVfq_O1U+f(za%ysgLYalIC^4 zbh+PPV5LFFhG+LqKG6L2w1WT&EL=jX$BhdAJXo?*bMg0c9t>yR*t*jyYS(5PleelF zKd#ekA*xL(LRlllk{JpCta*V<6{E-NzF%%nD7*1@Wm%)@b=1Ms(Ro$ERg$ud-CaFhZo7V@@)0Kn3#m}J@;9+|2p_0$pe0Iaxi%SOaKRu6!C z@?&!+QPM*I*bh^=SlY(|+>{G*2$RTpI6PqNB(i^m!xmgj(pUT6ne@nNz<#2nS`I(j zh`YLxDt10Bgw2oo-z`K*ibcTfK&C$;ZCV3qjms>D{m3|N>DJ*=kr!^SY!eHyVc@3Hme9cM+Eyz*Fp;<{arQgggiSEo+f=(qd?e-tL3=(1T!y-BH*PkMq3e8LAJN zpcUrO_39oQkw+pd?r)7Uut0CWhfV*Mzr+CG7Q^vJT=(EIlZ5agteuO8cxMyBX`T(! z1;)fTCTQAcUX4F87+wXz^rS6f#ZNck1q{Q~3(+H=!*t_flil#yR}kJqH0g8dq1`%J z%~?wUIP*?zf^rI=@92Fb=s{%*?bN7=r?F&vJf>r*;_1mmsMc`xysi;56puuzun{qT zgkcA$*FxUjYN*^6a+IU>`;1B?yW?V(L{ShOChsGY8w8l#^|>AKCVg=1EXnI@L0n92 z+R?K*fK#sc5a_}iIgx)duCKeXv0~RWWjJqR?9z!m)AShT4nI=M_Ef@(yCc=67e)xu z4@!nM(i$a`D+O4la2`EDmD?Zd=8g6q+O4*FQ5e7ASl5DiAZVn0CfBk_^=nhTvareS zMdLU@_GFK&7jw>#Mds{}s8!p^9b)ATRr9f#i{yKhK3fM+E}puw-&N!Hplq>hNM%%A zR6klm<5$@6YoBE{rw$m8Cbtl0{OUKUl^dOxh(OV1vImkxluDENH=QH5f+!`)> zp0Hu9Cntj?zI=BRN-YXsq7@dqMmLfz=dy`)^>MT~S*Iz#V2oed!{-gttjfB_@)A|Q*S_k2RUgSU5Q3!AE`f8dq`@ySrGin{GCq3gJ2Qg-12Sj95%69bo@F$ z=O)#*J&kSm(O0Pw21Dx--oBls^9D-V5(1(yn#Xz<&zx^`dz4-J?$Y E1F3NQ*8l(j literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_highlight_item_bg_selector.xml b/res/drawable-hdpi/umeng_xp_highlight_item_bg_selector.xml new file mode 100644 index 0000000..ad46ff2 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_highlight_item_bg_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_horizontal_divider.xml b/res/drawable-hdpi/umeng_xp_horizontal_divider.xml new file mode 100644 index 0000000..319d73b --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_horizontal_divider.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_icon_background.png b/res/drawable-hdpi/umeng_xp_icon_background.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5f7ce1b9977b3116d4ce47360bb53ef7cfb67f GIT binary patch literal 461 zcmV;;0W$uHP)HGc* zKr3SAf+o(dpxthFl;K+0Y&Kg8;3(vDU3ZJz2&~z*Z4SdAsK~M`6S)yyRTO10jw2a( z;KjtKc#s86$y3fLMdprP5Z2^8rM&-ury3jj&NDp2^T4w6>^#SYooDBHU>TkVmYrwk z`R@V8hGX-)^KIJ>nx>Iyr0crz20!F^{)^$x{YLOFpk$ZuQ zO<9(g{eCZ2tCemTh71vs<_29=)tIJfABJI(Wf|@QeoT8(P!CW~P)jJ|8mBomfT=j6 z@lZ#occ{}15YPA(v}+@C99~?{PdKkomuo|G^)0{v*^9K=_vP)JEp)i4ekNjNK5;R20QYN*RY?__ACsPfd8`*=+XU`~DMz zrbKg7#GlE#w&yk?S2HS4ahWUTOym^N;%>ROUgU!{j$+E1#7Cz7Oh8q?|kxbJx z#}qz}<4mE?RrRHm_GmP6Db@dj@$q=9Hk-{WTt8I!dcWV7FaykWT}KGPIOp1p;&3?B zyWQ@*Ua#MhB#EFaYyL@rZSXyK0Pcf%+po + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_kaijuan_bg.xml b/res/drawable-hdpi/umeng_xp_kaijuan_bg.xml new file mode 100644 index 0000000..54d366f --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_kaijuan_bg.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_large_gallery_failed.jpg b/res/drawable-hdpi/umeng_xp_large_gallery_failed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..443f4d5b8bfecd4e7e45cf0ab93b8c1cc8748f48 GIT binary patch literal 4068 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 + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_link_radius_shape.xml b/res/drawable-hdpi/umeng_xp_link_radius_shape.xml new file mode 100644 index 0000000..fcddc6a --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_link_radius_shape.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_list_item_text_selector.xml b/res/drawable-hdpi/umeng_xp_list_item_text_selector.xml new file mode 100644 index 0000000..e5f3318 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_list_item_text_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_loading.png b/res/drawable-hdpi/umeng_xp_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..fb7e02489713a33f47e3f27de086933306c245f5 GIT binary patch literal 4683 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 N002ovPDHLkV1oYh`qTgb literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_loading_seek.xml b/res/drawable-hdpi/umeng_xp_loading_seek.xml new file mode 100644 index 0000000..171a6b7 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_loading_seek.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_more_bottom.9.png b/res/drawable-hdpi/umeng_xp_more_bottom.9.png new file mode 100644 index 0000000000000000000000000000000000000000..21af98b57e1ab5be8c0085d7804de6c61a26bc85 GIT binary patch literal 219 zcmV<103`p3P)jjv9Pmr11`ZexC)oyCR`wTN15lPFfYzD=r4$E6QE(uo{6f6(-xH}+ VP--=Dr?db7002ovPDHLkV1n9|R)zoo literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_more_top.9.png b/res/drawable-hdpi/umeng_xp_more_top.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1ed0b8abb0a48052779ca901537dbd36b0a513 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^%s_0-!3HGvF&fkZsimGSjv*DddN1wfJ!Bx#n#dh^ zA#f9eathnB1fFRLUg{sU{gR%`PIqH!)DP;Lvj6w2)xj~x>|DR;wlHj1_gYTpG?T%3 z;{ztX43902-QQ==bC}`6_gbgxr409~8J@>D-QIS)!}qevl~Ue>wZ1D>aUGCgUa-|K zz>CpCld(mBAvH3uS=5zr!t_RelF{r5}E)nhEqTQ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_new_tip.png b/res/drawable-hdpi/umeng_xp_new_tip.png new file mode 100644 index 0000000000000000000000000000000000000000..d0390178805b26c78c6a4b4fb99bc3532edd16ef GIT binary patch literal 2312 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 Ye{Q5LxjtyefB*mh07*qoM6N<$f}p7L@&Et; literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_new_tip_button.png b/res/drawable-hdpi/umeng_xp_new_tip_button.png new file mode 100644 index 0000000000000000000000000000000000000000..d0390178805b26c78c6a4b4fb99bc3532edd16ef GIT binary patch literal 2312 zcmV+j3HSDiP)h z4fO+4MG5gMlvEK7Bs8j;)a3^)wG(2Arb$X4NclnYqg5rU22kYwX{%IKRjGlbriP@b zHnwSFnzTR&IHkm|+Ntdl8-tDQW!Lt;_ujod=kCn)?6QP)z#i*(=FZOJJic@0%t&yT zMc4HWSY_VD5?3Tix(Ulwkl{+CMx-JA-jx7S3(~idTuZ`uC=@E!H0@1&>B|)E^Mj$G zA$vM}N$HGHRduH<%STc{CFb!0Xxe91jI_c9lHH!l(ihxr_c!zN^C#%@vj{-HNzrKZ zWkpe56@Q5K^np6?F~lY&?}>G#j0}+1mxFcFLtx2XB?@uX}3?2J=3j zufgeb9x=7;c0>5&DbU8RFPV>7AF2j>?N>!1MtXaDH&<6z&oE2qcM^d5ETf~NH6;u>t;WbR&4aS%yL=o5s^TULxJSx2)m)-b;F*>6rPAF!~Mhm_CkK(2)C;&-OK>7UoI2@2sfC zv=l7)d5O`dq!^U)a<vW9z^HuhtQd`h5#9Ro-@Y=T24X?$6I2V!rsP)4(0>Idn6e` z_Tk}SzvhZ+)&CfU2#mr!i`GAcn-C_|eKmyo~A3r`JI#x`N86+I-xAYm>^?D$D z?tI+Yo~?(%{!37B{ykXr>MM}-KbN>mbnvi#tBzBNNbSFo0^(l z*tKidHp7_)24QUDBapfE(YU5Z#~_MiM1`tKu&i2XKqf3OK>akH#sv{FvDw+gG@-Nv zqfklQ0vu8)`ZBkC3D&;TZsNbHs_JL`{b*VM439ucp5+1%u5yuzkk*%%msj`n^t^Z)a^2;i!qor%#{u)z{aTA(V^*Z&lq+jLlI9^!I}n3>x9{UjDhZJqBfOHA5ED zJeB6==Fz=-_g=*241*0>fSii*n+U%TSQ+Ew2W!cZ$rq4{YierBT3cHmK}cnoDF!;F z=g%i#w&N6pG5o1Bm|c!tT{OlW8#fyDibpp?&NEMg^WldRem{Ej==kp4yFbJW%{Bb| z1ZhNYV1iLd5;IZ4KhkPK3=@LtB22GWA3Juea_iQu*~{U)!C+83aNxj|Lx&CxF^!MY z`w`OrSlf*>Pf(JRZekYZ&{pQubmH0Y1e6aSKJ3AZP6#dH!b`SwDHuoC>Ij+X9Xoam zwzaiQGA$Eys68QQKEQk-CMBiQ87$wTB`LLSxyO?#v6H&BcS`U0et+R-tGOZHxbBxhRCcrqezzl;N1iG5tvg9A`e83E&h`TSXA~(}WN& z;abw+8DQ(rGKSsE68zK+a>xBN0U$}^sRW?KR|o=#{vfAm0TDV822DR>)W?LFV{Hzb zTbRG&)1u(mHsO@!lp*+mXaOk=9}pc^6e7SB#cQ5AXsMV_2d|Ql?D6x#CXiLoz9a~c z4*t0iB8;L;kZ5wwbGsMnw4T?6adHyfPV-Wl;Zqbs6P!ABC&m{e!0m)d*0{9D^+e`k i$xnuNVw{)%3oroK@Wf2DZ*E=y0000 + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_point_normal.png b/res/drawable-hdpi/umeng_xp_point_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..6a924c5e0caa321ac7761c544fe0ae0f2397ec77 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^azHG?!3-qVmezg)QXT<5A+G=b|Br}`qa5{lUCaiW zDNz#S7tFvUrOBo8;(s%nT@kPhG3lfZ1ynu=VJY5_^ zG|pc=?=I9}z~g+eBW>~p&Zqy>Q`yopWfkgwyK%P$I6GV}vt>BcyyBGvr~2R79OsYi z`msmsUd=sjdAs?`glf-C@4dOP#{QGqx80lUT-GujJfZcB186pbr>mdKI;Vst0Mm \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_radius_shape.xml b/res/drawable-hdpi/umeng_xp_radius_shape.xml new file mode 100644 index 0000000..969d3c3 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_radius_shape.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_recommend_titile_bg.png b/res/drawable-hdpi/umeng_xp_recommend_titile_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c7cd33fdd7a4f5227d44ffaaacf248ddd023a8d3 GIT binary patch literal 3642 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 M07*qoM6N<$f=?^(A^-pY literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_recoright.png b/res/drawable-hdpi/umeng_xp_recoright.png new file mode 100644 index 0000000000000000000000000000000000000000..31f7b2c3446d6f2817aa5a82cf2b4aa74f0cb1cd GIT binary patch literal 2808 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 KMNUMnLSTX~=QGIw literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_seek.png b/res/drawable-hdpi/umeng_xp_seek.png new file mode 100644 index 0000000000000000000000000000000000000000..ea92e889947c3659c0542ed2c3803b0031849693 GIT binary patch literal 414 zcmV;P0b%}$P)>JYZ~@@iw0l%C<2$8W zZL-V*fM-RM*?6pJW0?g2&uaGdqsid{;6J2oy&1UwsSUFL;8|pCDyVAH$1DJNR<%9p z)VVeb%mRRCXJ&ZwX;7Oxm0}(MJgKXp?>Bizx65m~*kUFCJXuxw^?*IS* literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_seek_bg.png b/res/drawable-hdpi/umeng_xp_seek_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c71a12f5cbbffe3d6e2c1ea91abe843b48cc62 GIT binary patch literal 699 zcmV;s0!00ZP)ue#0k zl+H|7+BQnYDkK`T*eG@m!g~bk5VYGaBPuFlm)+`?5Z%3W9zjBff_7+x#b&N_Ii1Yu z%s+|FJm`4Zse=XHjckpKYxZ~kY6 zc+KrRTuCIf)v!Boj(fa)db!j~7>>^j@b=g>I-*q1JAH!*f7%YR;3TKx3-SK#;tPm7(++jJ_)z85ypDFA4T zj?OOXaX3ZjoR55XAC;QhASIYtOEGbbG8%DR0|4zIG9{neU^crW$p4NR&JAC@R4f)= z#+Re$4glz)*V9K9OXp=tQA~mLOd2~I0MJdPR3gUg0ZCR&<2XtIfZj(dku{Q{s=ZrV zb&@0rT>$`Hh>Q_gBdMynEGx2Huhq~M0MLcOaDaH$khsJ7W;SOXHCCrt##|qgRWO z`O&Yj2s#4*ZFS7+qXC~k{CM{ESo2L|MV%Ntd*NNZUbC*Qd`5==pglXAqaNbflBebn z=kMXo>HAN#;mwZ=Z&++;0i6PXeew1W(W#+fF-LWE=H9LFp1=|A&O8-EoX;|;#7L6w zbn@9X%57xOIRI!$_dy$3nVp=j6J&F^#f12EUeO2BH|Vdx+3|4p`R)&J`O!uIXwg4E hz;$Qpnzn8WFaX(FzlOR%-~Ipq002ovPDHLkV1j)yO`iY& literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_selector_back.xml b/res/drawable-hdpi/umeng_xp_selector_back.xml new file mode 100644 index 0000000..0d84962 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_selector_back.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_selector_cancel.xml b/res/drawable-hdpi/umeng_xp_selector_cancel.xml new file mode 100644 index 0000000..22c3a7d --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_selector_cancel.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_selector_download.xml b/res/drawable-hdpi/umeng_xp_selector_download.xml new file mode 100644 index 0000000..49e6e7e --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_selector_download.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shadow_bg.9.png b/res/drawable-hdpi/umeng_xp_shadow_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e18ad5c89f1ccb9ee26966ee2aa1c997ca678581 GIT binary patch literal 1643 zcmbW2>0i=`7RGT1ax`$R8)})i?#(`G%Y@}#u0-T$k4lTb2+X5>bVV%%z++!DoH zLQ>o?%Me6GP0N06SyrQo%@hVAY7x1hY0}W#x&Od@ah~)2Jm>SA7w65%zy_mXMm9zu z5D11j5D=p8v0uv&s#gGSzXAe5k(dDAu;j7#H{a9D!mS>ODS1JDX0s#gj_R3f0eopU9|Wm5cZVzGJFi z;`^G<5FYK3FEd(|6IlC_e+XuM;b{K7trkjfBLb@^cLcV6!nr78ZAg;GMz6D?>?MA8 zLCfK6rT^^37z^UoC1R~Jx%al;l`SSjk8>~VjEg1F=kn=AE?5PVSK$!E+4Ilr+<2v% z<}KHveUDT1?~_bVTjVWIEAS`W=|3jN23_+jk*Ra(|H6M)o!JxF zIa7mb_2n4~DVAZiVnIVyTmL}U=3zMJ^mSa^cyisxs?f+p@W?|VVZ6glqbQaIw3 zed96FcFhR~Yw3fO%BbNMm!fED<7&d?J;4X}CuY!L42#k3OM#(ziNzGFvPnn?QgAb_ zKy+v01~0QzBXx$jBMV#H6!6l(VT<@lJEhH#wK-7gEDM<*GCg#Fow*Z2pDyEVA*^eiQevs@7z@nrDl%_XHCSSt76GRDm7=j!^4g`kkH>mywHWpVd-)a2Umx!EsJdVmt2(vvagXI{}{A^GLh!e~H$MVi1~rp5|F;z-p1 z9w>vXk&0+a zE!<>$tG@NcytEE*&ALC4jeYfwQ$@+S5LSBAX+)Jwts9Ihv`$o!>FUj7iT@+1$Nk8TE;fVY$rPA!}&^-X8 zWvp9dXgMEI>}s5S-}S^{C6k5+zeJ)_6oPNsY{!%cz$7cpRd;=y%+f}VFU+P|!nj9$ zymO`g$}4#DZq$g#9l3KCrs`EVo-pwEBNYA`Nu6^94@B{w9P5q)(yYFaKZ`#`%hNRX z!6z5n?O2xw6^BelT}eqyG(HY%MGNCG*;D3`Lh`a^S~!SunOqqv7rTn26ON?KVKtHAf>li!$#7Aa@S(gy~pRBqLuOv*7r3cVN{MD0^ zeXZ0E>)K0Xt9KjR_9*()NhnCLh$JkyGjRP9P`4=}d_0yPe~YQIu@39y1?-0)2edXv zof!MNg-0?rA=nj;#^C9;LVs0wga-nSV2(ts!!115 PKM@cH6&!HKk9g@%?XV@V literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_shape_conner_blackish_green.xml b/res/drawable-hdpi/umeng_xp_shape_conner_blackish_green.xml new file mode 100644 index 0000000..0abc7e7 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_conner_blackish_green.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_conner_green.xml b/res/drawable-hdpi/umeng_xp_shape_conner_green.xml new file mode 100644 index 0000000..4653218 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_conner_green.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_blue.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_blue.xml new file mode 100644 index 0000000..ef249ca --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_blue.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_blue_container.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_blue_container.xml new file mode 100644 index 0000000..7e9a2c1 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_blue_container.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_blue_v2.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_blue_v2.xml new file mode 100644 index 0000000..6a9980f --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_blue_v2.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_gray_stroke.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_gray_stroke.xml new file mode 100644 index 0000000..3ba838d --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_gray_stroke.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_0.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_0.xml new file mode 100644 index 0000000..f6610b0 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_0.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_1.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_1.xml new file mode 100644 index 0000000..03f7f5a --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_1.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_2.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_2.xml new file mode 100644 index 0000000..8073d46 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_3.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_3.xml new file mode 100644 index 0000000..ce82e2b --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_3.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_4.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_4.xml new file mode 100644 index 0000000..ef249ca --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_5.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_5.xml new file mode 100644 index 0000000..c459a37 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_5.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_7.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_7.xml new file mode 100644 index 0000000..f0b0ada --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_7.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_gradient_grey_list.xml b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_list.xml new file mode 100644 index 0000000..e8b5b91 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_gradient_grey_list.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_shape_grey.xml b/res/drawable-hdpi/umeng_xp_shape_grey.xml new file mode 100644 index 0000000..832b5fb --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_shape_grey.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_standalone_bg.9.png b/res/drawable-hdpi/umeng_xp_standalone_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f466ccf664bc2b1fe93ece327abb1922ad02ef5d GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^RzU2_!3HG1&nXXNU|_WHba4!+xb^nV?W{u%0>?h? z`LDe-%OorM%b}!=msYV}ma+LNx~#1!;HY$Y)8^U#57->&x2@eRF6~;c8p!PRt$qH2 z-zuzJA{qe;92%K08Kzuw_nlobo99WY$+SHhhgr1?DCmg9?uhxcpiIQe9ftkkC?;W%53cm<>i^S@zu!_THB^^WC%t_ zU)$T}%jUo7w)`Qkuk%k|W!>_sx+g35f{uP)@K+eL+RG>&#;pFQpZMG%9 + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_vertical_divider.xml b/res/drawable-hdpi/umeng_xp_vertical_divider.xml new file mode 100644 index 0000000..92470b4 --- /dev/null +++ b/res/drawable-hdpi/umeng_xp_vertical_divider.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_x_button.png b/res/drawable-hdpi/umeng_xp_x_button.png new file mode 100644 index 0000000000000000000000000000000000000000..62535e232736031c7660d150d7ac8d6090f32a7a GIT binary patch literal 1254 zcmV-k9}6NCOOcfXS+suu2@3{iWfx-IP{+i8 zA4!WJg!uq$NeAA0_xd|C?~xbE%uq?}#+SU@fqQ@F_s%)LbIxT#24#8`+)k_(C1m4qlDMR&On>5a|J-w$Jp)yrwHvGJs=D1C}7zmC-a zu_4Ja2RWdENu0|dRJmztCgJ0?~ zuW6e04hXl&ON4fpLhAGRYAW6Bb~8Fh=Ltu6*m)23Uam`uFn$2=&VBgM)+Zb8~ZVO-@cGfFW|DtbrP5%PJW&$at(!MjA&hc9;psDs|$D% zA4+W(Z+BH8;oyr9fPp$Ng(YkJ=3i$rf8h@|ygG@HF%UP*%*-UcUhf`$etv%a@})~Z zx!i8Uf(o(&n>tGE)vBH%Bq35BAi~ZWK7zjZ(Za&QeUL8O9y`<0gya{MvJeijP)Qi@a66q&-_K^VTTVc!RN^FldwZjE!{hPDUrtT6H8(dah{|JF%bs496kk_BA7##xuwFJYGSb=I z)6-&~U0PcD+YWV8Q&Ypl#6%BreQZD0vbR>16eX}C9w%k}{rzoSU0uiRbD2yg|L(bS z*`bRUSDeHsr*4E&an>;5vEHpk`VFRpV)fE85dBm^{XOd-%nb|-{NQrAw&v66d!Gyq z?TM?UrNtiz1f1S7%iecYO9qFQ5RN}_CpYc89ba5r%&o1h=@8xCAb`Dlu<>KfDH9HdPs8X()RkzeU|+%1@M2baux(O{ zr1oYte}+h?=vuVzhS-R3o0@_(bv(MRU(M(9cj}I|NF?$hz^4doML?#nronB`(|tDf z?@QL0`!<)$jUMWb1i%<_@e6q&Rc4l{RK}Zez<3k;_6biniDg9K#uE+kU@)km5BH%D zzd^=Wr3OWvTL|Tm2yf#S@x_CU4P8ILe%(7#BpmJm@!KGc$d$VhuNGdcIS}5;<@2|X zbTPBMmeJxm(Y#NC^aZL8TS$0UVdFQ!`69%0r&uiVBi{!9zu_O{`A2{O05Q?lynuK5 Q9RL6T07*qoM6N<$f<^66t^fc4 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/umeng_xp_x_button_clicked.png b/res/drawable-hdpi/umeng_xp_x_button_clicked.png new file mode 100644 index 0000000000000000000000000000000000000000..cb5180fd9203cfb8eb2228814363aa9937a35841 GIT binary patch literal 1139 zcmV-(1dRKMP)|`}Ua>>AVXPNiDpU?Y#-{<>%k4Y)D_x*6~13Vvu)VS=# zWFm2gG4=zjMPsazNoh*PEKSOPu|+Ro508$IUt9)@mD}eTH*huX8RLj58LD z3;0VRm;)0+{39G^0OY^DGifTBe5@PBU0v4&Ome(IjzC%91b-saK*k-%VXoQs)6CIP z&y`72RaMUo(`+#fL*OkCog1Y`C@EHXfx#$RM9nPA;{QP`*GMRL<;~VW~UteErV`HOo zdU`re8G#88gR=DCt)x}S8A zLgTHitwuZ^=j2EJgaf+)+`FNqNY6K}O7p9AQ%OI|%gfjv%binSU(aV}XNi~(4Gop0 z(`nQ9Us+kPv)Qcc=VK5a?AuTw)z;Sj9gRk75v?7NVw}|2(a{l^oSbwcqUYq~M3$GA z2L-#jx@u2NP325dy61~bkdpOWF82mcL(xc)mI|7i=gRMyzv}JnZEIv?kOL{m?cg-X^4&Uw*1sXpabxhtE;P-R>YU^s0u+a`F`p+{18EP5Yx5VQ+75OeI`jUw8WZ`*Xv?!{@51shrgG1_5Z=t58x* zdLr_th3d$fo11l&aD06HjJnR&)|RCbH#Ro%ii!$e5GmpP5?V5;R0>$;pAbbtkv&6G zFa`z&qI-LLVqsw+M}<%0)N^sF@V2%#6J5#J+}w1QmX^+_Hho`|%pn$aE0f7sp$)&L zrsf_^xicvSL~L6dj};?L9uK~Z^1 zEPBd#r4@{OQNBV``213LBshG5p8ML5j==cESz5H5)N$e8B7{g^=@3WV#SL9wL(Xm! zSXliQM67uS`tP>mq_dgKsZ|8OMjnt!nWYQb{{H@hYhBDdahXWp z_n`X + + + + + \ No newline at end of file diff --git a/res/drawable-hdpi/umeng_xp_zhanwei.png b/res/drawable-hdpi/umeng_xp_zhanwei.png new file mode 100644 index 0000000000000000000000000000000000000000..df869fd78ce57e67384d4fb26dd08eff734304d4 GIT binary patch literal 3960 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 S03w?J0000 + + + + \ No newline at end of file diff --git a/res/drawable/umeng_common_gradient_orange.xml b/res/drawable/umeng_common_gradient_orange.xml new file mode 100644 index 0000000..bd62c66 --- /dev/null +++ b/res/drawable/umeng_common_gradient_orange.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/umeng_common_gradient_red.xml b/res/drawable/umeng_common_gradient_red.xml new file mode 100644 index 0000000..3b010c4 --- /dev/null +++ b/res/drawable/umeng_common_gradient_red.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_bar_bg.9.png b/res/drawable/umeng_fb_bar_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..52e66b4310943fc0ed280a034b9da8046c8e9ec7 GIT binary patch literal 229 zcmV^P)6#5re@#QlIg($l=NA4z&=mwujC@6UX&ZQB9Xbp^|^9AKVj zFijH}#}N#}aDcw=LDzMlZClVZ4XEoHR8FqX + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_bottom_banner.xml b/res/drawable/umeng_fb_bottom_banner.xml new file mode 100644 index 0000000..0716893 --- /dev/null +++ b/res/drawable/umeng_fb_bottom_banner.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_dev_bubble.9.png b/res/drawable/umeng_fb_dev_bubble.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9f662448780981837456457a177454422f74f748 GIT binary patch literal 576 zcmV-G0>AxK00069Nkl<%ubqW1U7~^tBdF-}60&rNE+Iy` z26aeXaI`Av)LF>L@t+$r&1|~W!W)2-&C5R$>Z^iqD+9=BIEPkI?}S6Z?Shr`c`+0^NDS~-sUlq3mg + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_gradient_orange.xml b/res/drawable/umeng_fb_gradient_orange.xml new file mode 100644 index 0000000..bd62c66 --- /dev/null +++ b/res/drawable/umeng_fb_gradient_orange.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_gray_frame.xml b/res/drawable/umeng_fb_gray_frame.xml new file mode 100644 index 0000000..daf2745 --- /dev/null +++ b/res/drawable/umeng_fb_gray_frame.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_list_item.9.png b/res/drawable/umeng_fb_list_item.9.png new file mode 100644 index 0000000000000000000000000000000000000000..963896aeaf9a82d147064d9fd287c22c5487cc11 GIT binary patch literal 322 zcmV-I0lof-P)A-?ZV@a>s#5P+^>7&FAy z;o1X;I^ibI^R|d>XFFrGZ5~fh6h#-rcHzb|h`SKmhnsgsiJ&1Y{R$*kpbAuhD$pBH za)y*Jy>GKF6;8$_Pmtp{yUg@XWm(n~t2pt1gkgBrG;M*{PWC*yNz`?H?7Hp>-R+A2 zk~-VAH>#@6k=KJ;d3T38y-Zf3&>nwkh3Z?Bmn)IlZPJgFKd?k~joe!hr%Pn6uHTLO UM^a<^>i_@%07*qoM6N<$g2-ZzZvX%Q literal 0 HcmV?d00001 diff --git a/res/drawable/umeng_fb_list_item_pressed.9.png b/res/drawable/umeng_fb_list_item_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6731eb060b5a9f739575e2644096e0d3cffb2c GIT binary patch literal 328 zcmV-O0k{5%P)(YT+kOp6mh|%a80ca0CJ+KU349w{PEm1sW>_#O&x6 z{iikt8mj=rTrfLmX^|2TbJNQro>7ZNEgH3G)FJ{Ff$9(%l-`(S-K$rx)=|@ + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_point_new.xml b/res/drawable/umeng_fb_point_new.xml new file mode 100644 index 0000000..c9cb154 --- /dev/null +++ b/res/drawable/umeng_fb_point_new.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_point_normal.xml b/res/drawable/umeng_fb_point_normal.xml new file mode 100644 index 0000000..903c900 --- /dev/null +++ b/res/drawable/umeng_fb_point_normal.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_see_list_normal.png b/res/drawable/umeng_fb_see_list_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f6607794f7e02475489fb52318f829598c5686 GIT binary patch literal 949 zcmV;m14{gfP)KOWiSjQADM=k` zWJIOAdMdjo7Z!W$Q+fiHvNMnjpM$~R@f!cv><8Nu9}Jy={h^aBY<`Q3%_}c}53n%5 z@e=k1Mr!=7AZr_JcH=qzz)=e@%$8Ng#2^QV54?k|iLLnUni$}k&PkrNBo`yT+mI=J zfhdP^p;u#vJ=Y+oeYXwfXLo~XnC)-=P)wjp6ke!C3kt;CTf1}QC*M`Fv;ncvb z_G{%THv^G`06+2{G4^_$->xlhOyf8=+u!_xD1c@bK@?myv7+b!)l_VQc|Cs1?t*$h zHB}CW!%YWb{3Tc|r6A@=f+kf@q2bMfv;(;aqFlg+xb5>yCevC;f}9Hm93!CSN*HTY zy9*@@18kpdFkL~}F}3zfl8XAJYFfjtW4q4dpA>Pk$K+xYjKW6GKrnKj>lG-%#A0{4 zhTUX{bg8{yq_ZVVEVjqvk|fxM9__C7a zBliiCEkO`Ii=ud*ot&Ip9UB`v#`F9GEXo(ivXaX}CyiWm$ntqSo(cT?Fflk-_$|Ny X`4cTcNqzRR00000NkvXXu0mjf=3ulD literal 0 HcmV?d00001 diff --git a/res/drawable/umeng_fb_see_list_pressed.png b/res/drawable/umeng_fb_see_list_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..d2bc4cb856483de81dccd580051d01c392b84109 GIT binary patch literal 1059 zcmV+;1l;?HP)xDo~-Ipu<^hQU~7 zIxlY!VzHS0bNCrJ3!tjVxiA*SB&d`oCjNriguIYAWnoMSFj>iuXeH8_U`c_o>Y&K^ z0j8vbv1lne5p!C~FvGC|!J$?};=VC@qw?>2(uJ{%rjkZW)`{2-&lT9rE(F3}JZRfJ zMsFDGS0C=SRE?iXIX#uKekvUn>YSDmtHq(Q`=d81POCekKP3gmu@8y<&|97TwKUZV z-t|Ay=zG35r9y9P^?ZG*>yI&!uC6Y%rgIPq~ouv0O|Pu@y!8v1IOMwD@kr|E*S|UpBAOu=5uG9rOh5O&l?{ z;W!L8rfZnDz|;q~_|WBRWG zd-v4|6c?_BZ{V56uCDzoW)&i8Q4OBqh8TntbBsbnmSNnoXz(Q{Isj6G7almAVn-l^PGeh#ZkE79=!IvU?x7^62T zjqNwl&~ZjLm5E*{r}j>!wWh2Rgtnhmi?@!eH@eD~?bP+B9Tau0k|R!J51{jyle+HB($J(jz9tlkFzg7hX0* zGL{4wp-tFoD#VBw1SjNpMD-Q1Ser&@4y#=vx8QD&$nyg=QT#G^G|9}7h002ovPDHLkV1kFI_y_<1 literal 0 HcmV?d00001 diff --git a/res/drawable/umeng_fb_see_list_selector.xml b/res/drawable/umeng_fb_see_list_selector.xml new file mode 100644 index 0000000..ff7bf9c --- /dev/null +++ b/res/drawable/umeng_fb_see_list_selector.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/res/drawable/umeng_fb_statusbar_icon.png b/res/drawable/umeng_fb_statusbar_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2b82ce572c260f30adaa2b7bb128ab30f2a964 GIT binary patch literal 3776 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 + + + + diff --git a/res/drawable/umeng_fb_top_banner.xml b/res/drawable/umeng_fb_top_banner.xml new file mode 100644 index 0000000..529f0c3 --- /dev/null +++ b/res/drawable/umeng_fb_top_banner.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/res/drawable/umeng_fb_user_bubble.9.png b/res/drawable/umeng_fb_user_bubble.9.png new file mode 100644 index 0000000000000000000000000000000000000000..13b75adfccef1d81676df93a88de3b071cc17104 GIT binary patch literal 620 zcmV-y0+aoTP)K0006rNklFq&O5`9~t(KWi zryoFb+){D5Tz*9^qE@SYhGs}^#oyq!k;@1K0+(d9@|)>FM5EC=@&J1$jYJ|-P@ViI z{go8-b3xG7yr5j-BCRj^$key?B@KteccD7SGFxOY;9_jvhWoV zXf%`vg+iXxld4GT^|}(C^e9SA(^TS!N!z_t&!pV-Y3TY^o(?&YcJ5D&MM3K?1$|9C zaxdiyx#9gjhfey%2yJUC&ZX_1pBvqcxiMOOH%*o8Rb^pE>3$X~OEIyLTWnH{k)|7= zuIuFU`L0>!sBAX-1{1MkX)c$`Kr?Qc_=3UUy<)NWyHcr;s+{vUU(+-r7K_b5bJjAO zA};v-{`(lQ=kxje4CX;!Kf*xZ1gl&pOoCfE?WpD#bg4?^m&u@Y&To4$x z&HM6ZfluxXI4AdKT)wCi{A?7A$aVIciG#XBadM5+HU0ppj2(bPbXFRCwCVm^*CKP!xv$YhOPSw=wP` zs6rsMQVXpZKw_y7Dl8SEOpHv-NK7njEDY={EJ*B(g@LI>yd)&V01`r|tr!9#g%(GC zBz|&lAW7Y3sOvQGk@C3K_3`I(j{keENgT%r!*J5J?FWwIocDeINEAirrwM`pNs|5) zi^bQPrri=naf2|BIny-Xx~^L?3R4P`fRMJ#c1yAcBjSzx*y^dO~W(zEY8c*M#p}27d&cc~!3n&j@ zt*CJpfq&%%sudvqp?L#q!SxKRYJG&|{Xj`MjxlXEA7Ezv8{Yi93y}&4wjwN^c!;7j zK6o%cc3>P++hZ?sP{`o34VHBYiV!onu;Uond^W*)Ar&0LBOS1aM45f|B$ZLj*19<8 z+_8|&=YeYM!{!rwHD4sV1KERE_S@s<-|ry~q{N)lqgOF!Tuup=q8{GYA43@neG5lV?UN5xYtz5BZk=SeLWGq{3TIoY>W{7?8Ct+dBy=yid1xTG~iGt<5T%xhq720G93$d=$II06WC^%rhF>9>ljPZ z4jqe9)@_%NrGF~BHg}K^#2pZkD4BfrY^|J-r?FJLjjF$a326p~KhZ4qfp-_7AL5*J z4YVL42m-i)+nau@7aLsLvJRnx?eot2P?n_rg5@z{L=X@%FutG53lwLfvMm4hJa3f! z<^qhdfHP6HC0{m8^9FyRl82Wnj^jYr^<}cYwl;2A)=S&APx7cyO8cHxo<6RBJX)Hj zeHj`Wx4P)RCwCVm`i9AQ51&%naQI~+Qc@k zZB5^;6(4BbDOD+0P^uuJYjGop_}YqVaU;4=D7X<^xwBv`SOkk$T108YjeV)rQu|8V z)J)POGj}|9YMUABBFTiL7lvdech3Fh|L;BbOoZ!?1l+%zXpm+3VI&f1OC%E87-Ps~ z6GahryM5W^at*lM?rV}HeG>>|Pbd@`oLw6Ad>S9j898xLD3J&3b?=~t* zT2{PX?_ptSX{qPOY~a-EpJ$;8A>^}3nim~4&rw^^`qD=BwGYqSL!5;m2zlj#s)fK= z%8DPi+hVbpdn)u6q7%?G8cP;h%K}pEer*>f%p1to&fAWhdg88<4@xPR(LP<{k z0&&yt<(1_rEr^ZDuaS1?C>B{=AcY)e#RLhGSZD|yA$arbUyZG#G={DiF{Pbg-vk~| zSyE@ZR$SD8CV%_J`PfuH=cUDD_Dks zKzH^lSVrGjJBpWOF*5FHW~zxi~gCjG53FB(7SnE!EcY zSEY9+hy|QU_&PCBF3a*eRa07C4Lrs8Q~Q + + + + \ No newline at end of file diff --git a/res/layout/preferences.xml b/res/layout/preferences.xml index 8b394d4..7aaf5ba 100644 --- a/res/layout/preferences.xml +++ b/res/layout/preferences.xml @@ -20,7 +20,7 @@ android:entryValues="@array/settings_intervalvalues" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/umeng_xp_container_banner.xml b/res/layout/umeng_xp_container_banner.xml new file mode 100644 index 0000000..a54d957 --- /dev/null +++ b/res/layout/umeng_xp_container_banner.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/umeng_xp_download_dialog_landscape.xml b/res/layout/umeng_xp_download_dialog_landscape.xml new file mode 100644 index 0000000..133a7e1 --- /dev/null +++ b/res/layout/umeng_xp_download_dialog_landscape.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/umeng_xp_full_screen_list_layout.xml b/res/layout/umeng_xp_full_screen_list_layout.xml new file mode 100644 index 0000000..d039882 --- /dev/null +++ b/res/layout/umeng_xp_full_screen_list_layout.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/res/layout/umeng_xp_handler_gallery.xml b/res/layout/umeng_xp_handler_gallery.xml new file mode 100644 index 0000000..855e963 --- /dev/null +++ b/res/layout/umeng_xp_handler_gallery.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/umeng_xp_handler_grid_item.xml b/res/layout/umeng_xp_handler_grid_item.xml new file mode 100644 index 0000000..729acc2 --- /dev/null +++ b/res/layout/umeng_xp_handler_grid_item.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + diff --git a/res/layout/umeng_xp_handler_template.xml b/res/layout/umeng_xp_handler_template.xml new file mode 100644 index 0000000..dd905ab --- /dev/null +++ b/res/layout/umeng_xp_handler_template.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/umeng_xp_highlight_banner.xml b/res/layout/umeng_xp_highlight_banner.xml new file mode 100644 index 0000000..59ea85b --- /dev/null +++ b/res/layout/umeng_xp_highlight_banner.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values-se/strings.xml b/res/values-se/strings.xml index 31adf7f..ef07253 100644 --- a/res/values-se/strings.xml +++ b/res/values-se/strings.xml @@ -141,7 +141,7 @@ License Tips - + 1 minut 5 minuter 15 minuter diff --git a/res/values-zh/strings.xml b/res/values-zh/strings.xml index 6cfc903..9aa65ca 100644 --- a/res/values-zh/strings.xml +++ b/res/values-zh/strings.xml @@ -27,7 +27,7 @@ --> - RSS极速阅读器 + 极速RSS 添加订阅 没有订阅 没有新鲜事 @@ -195,48 +195,48 @@ 启用: 有新鲜事时不提示 禁用: 有新鲜事时提示 - Do you really want to delete this feed and all of its entries? - Do you really want to refresh this feed while not being on wifi? - Are you sure? - Do you want to download and play the file %1$s of alleged size of %2$s?\nThis may cause a lot of traffic! + 您是否要删除此订阅及其所有的新鲜事? + 您确定要在非wifi模式下刷新此订阅吗? + 确定? + 您确定要下载并运行文件 %1$s (大小为) %2$s?\n这也许会使用很多流量! - Disabling this option causes more traffic. + 禁用此选项会使用更多流量. - Accept - Decline - Always ok for all + 接受 + 拒绝 + 对所有项选择是 - Exported into %s. + 导出到 %s. - License - Hint + 许可 + 提示 - 1 minute - 5 minutes - 15 minutes - 30 minutes - 1 hour - 2 hours - 6 hours - 12 hours - 1 day + 1分钟 + 5分钟 + 15分钟 + 30分钟 + 1小时 + 2小时 + 6小时 + 12小时 + 1天 - 1 day - 2 days - 4 days - 1 week - 2 weeks - 1 month - 2 months - 3 months - Forever + 1天 + 2天 + 4天 + 1周 + 2周 + 1个月 + 2个月 + 3个月 + 永远 - Standard + 标准 +1 +2 +3 @@ -247,8 +247,8 @@ SOCKS - Read feed data - Allows the application to read Sparse RSS feeds and entries. - Write feed data - Allows the application to write Sparse RSS feeds and entries. + 阅读订阅 + 允许应用阅读rss订阅和新鲜事. + 操作订阅 + 允许应用操作rss订阅和新鲜事. diff --git a/res/values-zh/umeng_common_strings.xml b/res/values-zh/umeng_common_strings.xml new file mode 100644 index 0000000..4f25f1b --- /dev/null +++ b/res/values-zh/umeng_common_strings.xml @@ -0,0 +1,11 @@ + + + 正在下载中. + 下载出错啦,请检查网络后继续。 + 暂停 + 继续 + 取消 + 正在下载: + 请连接网络后再尝试! + 下载失败 + diff --git a/res/values-zh/umeng_fb_strings.xml b/res/values-zh/umeng_fb_strings.xml new file mode 100644 index 0000000..70af9be --- /dev/null +++ b/res/values-zh/umeng_fb_strings.xml @@ -0,0 +1,49 @@ + + + 请输入你的反馈内容 + 超过140字了,再简短一些吧 + 失败,轻触以重发 + 发送中… + 重发 + 发送失败 + 发送失败 + 发送中… + 发送失败,轻触以重发 + 反馈意见 + 我的反馈 + 反馈问题 + 每条建议都将帮助我们做得更好。 + 请输入您的反馈意见 + 提交 + 返回 + + 知道了 + 去看看 + + + 年龄 + 18岁以下 + 18-24岁 + 25-30岁 + 31-35岁 + 36-40岁 + 41-50岁 + 51-59岁 + 60岁及以上 + + + 性别 + + + + 查看反馈 + 您的反馈收到了回复 + 删除反馈 + 查看反馈 + 删除反馈 + 重发反馈 + 删除信息 + 有新的回复 + 有新的回复 + 点击查看 + diff --git a/res/values-zh/umeng_update_string.xml b/res/values-zh/umeng_update_string.xml new file mode 100644 index 0000000..d7dd3c2 --- /dev/null +++ b/res/values-zh/umeng_update_string.xml @@ -0,0 +1,12 @@ + + + 未联网 + 应用程序有新版本更新 + 最新版本: + (提示:非WIFI环境) + 立即更新 + 应用更新 + 以后再说 + 正在更新中.... + 最新版本已下载,是否安装? + diff --git a/res/values-zh/umeng_xp_strings.xml b/res/values-zh/umeng_xp_strings.xml new file mode 100644 index 0000000..29a4fc7 --- /dev/null +++ b/res/values-zh/umeng_xp_strings.xml @@ -0,0 +1,22 @@ + + + + 大小 + 打开 + 浏览 + 下载 + + 更多精彩推荐 + 回到顶部 + 返回 + 是否下载推荐应用? + 精彩推荐 + 马上下载 + 马上拨打 + 加载失败... + 请先安装浏览器.. + 开始下载 + 请连接网络后再尝试! + 当前SDK版本不支持Banner样式,请联系客服. + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index d613ffd..fdf47f0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -27,7 +27,7 @@ --> - RSS Quick Reader + Quick RSS Add feed No RSS feeds No entries diff --git a/res/values/umeng_common_strings.xml b/res/values/umeng_common_strings.xml new file mode 100644 index 0000000..6f1810a --- /dev/null +++ b/res/values/umeng_common_strings.xml @@ -0,0 +1,12 @@ + + + + The app is already in downloading list. + dowload interrupted. + Pause + Continue + Cancel + Downloading: + Please make sure you are connected to internet, download failed + Download Failed! + \ No newline at end of file diff --git a/res/values/umeng_fb_strings.xml b/res/values/umeng_fb_strings.xml new file mode 100644 index 0000000..19c59b7 --- /dev/null +++ b/res/values/umeng_fb_strings.xml @@ -0,0 +1,51 @@ + + + Please input your feedback. + Your content was over 140 characters. You\'ll have + to be more clever. + Fail,Press to resend + Sending… + Resending + Fail + Fail + Sending… + 发送失败,轻触以重发 + Fail,press to resend + Feedback + My Feedback + My Feedback + Every word you write will benefit us. + Input your suggestions here + Submit + Return + + Got it + See Detail + + + Age + <18 + 18~24 + 25~30 + 31~35 + 36~40 + 41~50 + 51~59 + >=60 + + + Gender + Male + Female + + View Thread + You\'ve got reply + Delete Thread + View Feedback + Delete Feedback + Resend Feedback + Delete message + Got new reply + Got new reply + Click to view + diff --git a/res/values/umeng_update_string.xml b/res/values/umeng_update_string.xml new file mode 100644 index 0000000..959833e --- /dev/null +++ b/res/values/umeng_update_string.xml @@ -0,0 +1,14 @@ + + + + Please make sure you are connected to internet,update failed + New version found + Latest version: + (Warning: Not WIFI Condition) + Update now + App updating + Not now + Updating... + The lastest version has been downloaded, install now ? + + \ No newline at end of file diff --git a/res/values/umeng_xp_strings.xml b/res/values/umeng_xp_strings.xml new file mode 100644 index 0000000..72c324a --- /dev/null +++ b/res/values/umeng_xp_strings.xml @@ -0,0 +1,22 @@ + + + + Size + open + browse + download + + Please make sure you are connected to internet, download failed + Top + more + Back + Featured + Download + Call + Download the app? + Failed loading... + 请先安装浏览器.. + Start download + Banner style is not supported for current version of SDK, please contact us for support. + + \ No newline at end of file diff --git a/res/values/umeng_xp_style.xml b/res/values/umeng_xp_style.xml new file mode 100644 index 0000000..02073d1 --- /dev/null +++ b/res/values/umeng_xp_style.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/cn/eric/rss/ApplicationPreferencesActivity.java b/src/cn/eric/rss/ApplicationPreferencesActivity.java index 5894208..efe4b03 100644 --- a/src/cn/eric/rss/ApplicationPreferencesActivity.java +++ b/src/cn/eric/rss/ApplicationPreferencesActivity.java @@ -1,127 +1,141 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.Intent; -import android.content.SharedPreferences.Editor; -import android.os.Bundle; -import android.os.SystemClock; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.PreferenceActivity; -import android.preference.PreferenceManager; -import cn.eric.rss.R; -import cn.eric.rss.service.RefreshService; - -public class ApplicationPreferencesActivity extends PreferenceActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.layout.preferences); - - Preference preference = (Preference) findPreference(Strings.SETTINGS_REFRESHENABLED); - - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (Boolean.TRUE.equals(newValue)) { - new Thread() { - public void run() { - startService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); - } - }.start(); - } else { - getPreferences(MODE_PRIVATE).edit().putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0).commit(); - stopService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); - } - return true; - } - }); - - preference = (Preference) findPreference(Strings.SETTINGS_SHOWTABS); - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (MainTabActivity.INSTANCE != null ) { - MainTabActivity.INSTANCE.setTabWidgetVisible(Boolean.TRUE.equals(newValue)); - } - return true; - } - }); - - preference = (Preference) findPreference(Strings.SETTINGS_LIGHTTHEME); - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference preference, Object newValue) { - Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); - - editor.putBoolean(Strings.SETTINGS_LIGHTTHEME, Boolean.TRUE.equals(newValue)); - editor.commit(); - android.os.Process.killProcess(android.os.Process.myPid()); - - // this return statement will never be reached - return true; - } - }); - - preference = (Preference) findPreference(Strings.SETTINGS_EFFICIENTFEEDPARSING); - preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - public boolean onPreferenceChange(final Preference preference, Object newValue) { - if (newValue.equals(Boolean.FALSE)) { - AlertDialog.Builder builder = new AlertDialog.Builder(ApplicationPreferencesActivity.this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(android.R.string.dialog_alert_title); - builder.setPositiveButton(android.R.string.ok, new OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); - - editor.putBoolean(Strings.SETTINGS_EFFICIENTFEEDPARSING, Boolean.FALSE); - editor.commit(); - ((CheckBoxPreference) preference).setChecked(false); - dialog.dismiss(); - } - }); - builder.setNegativeButton(android.R.string.cancel, new OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.setMessage(R.string.warning_moretraffic); - builder.show(); - return false; - } else { - return true; - } - } - }); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import com.umeng.analytics.MobclickAgent; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.content.SharedPreferences.Editor; +import android.os.Bundle; +import android.os.SystemClock; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceActivity; +import android.preference.PreferenceManager; +import cn.eric.rss.R; +import cn.eric.rss.service.RefreshService; + +public class ApplicationPreferencesActivity extends PreferenceActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.layout.preferences); + + Preference preference = (Preference) findPreference(Strings.SETTINGS_REFRESHENABLED); + + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (Boolean.TRUE.equals(newValue)) { + new Thread() { + public void run() { + startService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); + } + }.start(); + } else { + getPreferences(MODE_PRIVATE).edit().putLong(Strings.PREFERENCE_LASTSCHEDULEDREFRESH, 0).commit(); + stopService(new Intent(ApplicationPreferencesActivity.this, RefreshService.class)); + } + return true; + } + }); + + preference = (Preference) findPreference(Strings.SETTINGS_SHOWTABS); + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (MainTabActivity.INSTANCE != null ) { + MainTabActivity.INSTANCE.setTabWidgetVisible(Boolean.TRUE.equals(newValue)); + } + return true; + } + }); + + preference = (Preference) findPreference(Strings.SETTINGS_LIGHTTHEME); + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference preference, Object newValue) { + Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); + + editor.putBoolean(Strings.SETTINGS_LIGHTTHEME, Boolean.TRUE.equals(newValue)); + editor.commit(); + android.os.Process.killProcess(android.os.Process.myPid()); + + // this return statement will never be reached + return true; + } + }); + + preference = (Preference) findPreference(Strings.SETTINGS_EFFICIENTFEEDPARSING); + preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + public boolean onPreferenceChange(final Preference preference, Object newValue) { + if (newValue.equals(Boolean.FALSE)) { + AlertDialog.Builder builder = new AlertDialog.Builder(ApplicationPreferencesActivity.this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(android.R.string.dialog_alert_title); + builder.setPositiveButton(android.R.string.ok, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + Editor editor = PreferenceManager.getDefaultSharedPreferences(ApplicationPreferencesActivity.this).edit(); + + editor.putBoolean(Strings.SETTINGS_EFFICIENTFEEDPARSING, Boolean.FALSE); + editor.commit(); + ((CheckBoxPreference) preference).setChecked(false); + dialog.dismiss(); + } + }); + builder.setNegativeButton(android.R.string.cancel, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.setMessage(R.string.warning_moretraffic); + builder.show(); + return false; + } else { + return true; + } + } + }); + } + + @Override + public void onResume() { + super.onResume(); + MobclickAgent.onResume(this); + } + + @Override + public void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + } + +} diff --git a/src/cn/eric/rss/EntriesListActivity.java b/src/cn/eric/rss/EntriesListActivity.java index 8b7b353..a16586f 100644 --- a/src/cn/eric/rss/EntriesListActivity.java +++ b/src/cn/eric/rss/EntriesListActivity.java @@ -1,278 +1,293 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import android.app.AlertDialog; -import android.app.AlertDialog.Builder; -import android.app.ListActivity; -import android.content.ContentUris; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Typeface; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.os.Bundle; -import android.text.ClipboardManager; -import android.util.TypedValue; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnCreateContextMenuListener; -import android.view.Window; -import android.widget.AdapterView; -import android.widget.ListView; -import android.widget.TextView; -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; - -public class EntriesListActivity extends ListActivity { - private static final int CONTEXTMENU_MARKASREAD_ID = 6; - - private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; - - private static final int CONTEXTMENU_DELETE_ID = 8; - - private static final int CONTEXTMENU_COPYURL = 9; - - public static final String EXTRA_SHOWREAD = "show_read"; - - public static final String EXTRA_SHOWFEEDINFO = "show_feedinfo"; - - public static final String EXTRA_AUTORELOAD = "autoreload"; - - private static final String[] FEED_PROJECTION = {FeedData.FeedColumns.NAME, - FeedData.FeedColumns.URL, - FeedData.FeedColumns.ICON - }; - - private Uri uri; - - private EntriesListAdapter entriesListAdapter; - - private byte[] iconBytes; - - @Override - protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - - super.onCreate(savedInstanceState); - - String title = null; - - iconBytes = null; - - Intent intent = getIntent(); - - long feedId = intent.getLongExtra(FeedData.FeedColumns._ID, 0); - - if (feedId > 0) { - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), FEED_PROJECTION, null, null, null); - - if (cursor.moveToFirst()) { - title = cursor.isNull(0) ? cursor.getString(1) : cursor.getString(0); - iconBytes = cursor.getBlob(2); - } - cursor.close(); - } - - if (!MainTabActivity.POSTGINGERBREAD && iconBytes != null && iconBytes.length > 0) { // we cannot insert the icon here because it would be overwritten, but we have to reserve the icon here - if (!requestWindowFeature(Window.FEATURE_LEFT_ICON)) { - iconBytes = null; - } - } - - setContentView(R.layout.entries); - - uri = intent.getData(); - - entriesListAdapter = new EntriesListAdapter(this, uri, intent.getBooleanExtra(EXTRA_SHOWFEEDINFO, false), intent.getBooleanExtra(EXTRA_AUTORELOAD, false)); - setListAdapter(entriesListAdapter); - - if (title != null) { - setTitle(title); - } - if (iconBytes != null && iconBytes.length > 0) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - if (bitmap != null) { - if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); - } - - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); - } else { - setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); - } - } - } - if (RSSOverview.notificationManager != null) { - RSSOverview.notificationManager.cancel(0); - } - - getListView().setOnCreateContextMenuListener(new OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { - menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView.findViewById(android.R.id.text1)).getText()); - menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, R.string.contextmenu_markasread).setIcon(android.R.drawable.ic_menu_manage); - menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, R.string.contextmenu_markasunread).setIcon(android.R.drawable.ic_menu_manage); - menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, R.string.contextmenu_delete).setIcon(android.R.drawable.ic_menu_delete); - menu.add(0, CONTEXTMENU_COPYURL, Menu.NONE, R.string.contextmenu_copyurl).setIcon(android.R.drawable.ic_menu_share); - } - }); - } - - @Override - protected void onListItemClick(ListView listView, View view, int position, long id) { - TextView textView = (TextView) view.findViewById(android.R.id.text1); - - textView.setTypeface(Typeface.DEFAULT); - textView.setEnabled(false); - view.findViewById(android.R.id.text2).setEnabled(false); - entriesListAdapter.neutralizeReadState(); - startActivity(new Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(uri, id)).putExtra(EXTRA_SHOWREAD, entriesListAdapter.isShowRead()).putExtra(FeedData.FeedColumns.ICON, iconBytes)); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.entrylist, menu); - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menu.setGroupVisible(R.id.menu_group_0, entriesListAdapter.getCount() > 0); - return true; - } - - public boolean onMenuItemSelected(int featureId, MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_markasread: { - new Thread() { // the update process takes some time - public void run() { - getContentResolver().update(uri, RSSOverview.getReadContentValues(), null, null); - } - }.start(); - entriesListAdapter.markAsRead(); - break; - } - case R.id.menu_markasunread: { - new Thread() { // the update process takes some time - public void run() { - getContentResolver().update(uri, RSSOverview.getUnreadContentValues(), null, null); - } - }.start(); - entriesListAdapter.markAsUnread(); - break; - } - case R.id.menu_hideread: { - if (item.isChecked()) { - item.setChecked(false).setTitle(R.string.contextmenu_hideread).setIcon(android.R.drawable.ic_menu_close_clear_cancel); - entriesListAdapter.showRead(true); - } else { - item.setChecked(true).setTitle(R.string.contextmenu_showread).setIcon(android.R.drawable.ic_menu_view); - entriesListAdapter.showRead(false); - } - break; - } - case R.id.menu_deleteread: { - new Thread() { // the delete process takes some time - public void run() { - String selection = Strings.READDATE_GREATERZERO+Strings.DB_AND+" ("+Strings.DB_EXCUDEFAVORITE+")"; - - getContentResolver().delete(uri, selection, null); - FeedData.deletePicturesOfFeed(EntriesListActivity.this, uri, selection); - runOnUiThread(new Runnable() { - public void run() { - entriesListAdapter.getCursor().requery(); - } - }); - } - }.start(); - break; - } - case R.id.menu_deleteallentries: { - Builder builder = new AlertDialog.Builder(this); - - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setTitle(R.string.contextmenu_deleteallentries); - builder.setMessage(R.string.question_areyousure); - builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - new Thread() { - public void run() { - getContentResolver().delete(uri, Strings.DB_EXCUDEFAVORITE, null); - runOnUiThread(new Runnable() { - public void run() { - entriesListAdapter.getCursor().requery(); - } - }); - } - }.start(); - } - }); - builder.setNegativeButton(android.R.string.no, null); - builder.show(); - break; - } - case CONTEXTMENU_MARKASREAD_ID: { - long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; - - getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getReadContentValues(), null, null); - entriesListAdapter.markAsRead(id); - break; - } - case CONTEXTMENU_MARKASUNREAD_ID: { - long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; - - getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getUnreadContentValues(), null, null); - entriesListAdapter.markAsUnread(id); - break; - } - case CONTEXTMENU_DELETE_ID: { - long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; - - getContentResolver().delete(ContentUris.withAppendedId(uri, id), null, null); - FeedData.deletePicturesOfEntry(Long.toString(id)); - entriesListAdapter.getCursor().requery(); // he have no other choice - break; - } - case CONTEXTMENU_COPYURL: { - ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).targetView.getTag().toString()); - break; - } - - } - return true; - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import com.umeng.analytics.MobclickAgent; + +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.ListActivity; +import android.content.ContentUris; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.text.ClipboardManager; +import android.util.TypedValue; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnCreateContextMenuListener; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.TextView; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class EntriesListActivity extends ListActivity { + private static final int CONTEXTMENU_MARKASREAD_ID = 6; + + private static final int CONTEXTMENU_MARKASUNREAD_ID = 7; + + private static final int CONTEXTMENU_DELETE_ID = 8; + + private static final int CONTEXTMENU_COPYURL = 9; + + public static final String EXTRA_SHOWREAD = "show_read"; + + public static final String EXTRA_SHOWFEEDINFO = "show_feedinfo"; + + public static final String EXTRA_AUTORELOAD = "autoreload"; + + private static final String[] FEED_PROJECTION = {FeedData.FeedColumns.NAME, + FeedData.FeedColumns.URL, + FeedData.FeedColumns.ICON + }; + + private Uri uri; + + private EntriesListAdapter entriesListAdapter; + + private byte[] iconBytes; + + @Override + protected void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + + super.onCreate(savedInstanceState); + + String title = null; + + iconBytes = null; + + Intent intent = getIntent(); + + long feedId = intent.getLongExtra(FeedData.FeedColumns._ID, 0); + + if (feedId > 0) { + Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), FEED_PROJECTION, null, null, null); + + if (cursor.moveToFirst()) { + title = cursor.isNull(0) ? cursor.getString(1) : cursor.getString(0); + iconBytes = cursor.getBlob(2); + } + cursor.close(); + } + + if (!MainTabActivity.POSTGINGERBREAD && iconBytes != null && iconBytes.length > 0) { // we cannot insert the icon here because it would be overwritten, but we have to reserve the icon here + if (!requestWindowFeature(Window.FEATURE_LEFT_ICON)) { + iconBytes = null; + } + } + + setContentView(R.layout.entries); + + uri = intent.getData(); + + entriesListAdapter = new EntriesListAdapter(this, uri, intent.getBooleanExtra(EXTRA_SHOWFEEDINFO, false), intent.getBooleanExtra(EXTRA_AUTORELOAD, false)); + setListAdapter(entriesListAdapter); + + if (title != null) { + setTitle(title); + } + if (iconBytes != null && iconBytes.length > 0) { + int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + if (bitmap != null) { + if (bitmap.getHeight() != bitmapSizeInDip) { + bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); + } + + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); + } else { + setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); + } + } + } + if (RSSOverview.notificationManager != null) { + RSSOverview.notificationManager.cancel(0); + } + + getListView().setOnCreateContextMenuListener(new OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { + menu.setHeaderTitle(((TextView) ((AdapterView.AdapterContextMenuInfo) menuInfo).targetView.findViewById(android.R.id.text1)).getText()); + menu.add(0, CONTEXTMENU_MARKASREAD_ID, Menu.NONE, R.string.contextmenu_markasread).setIcon(android.R.drawable.ic_menu_manage); + menu.add(0, CONTEXTMENU_MARKASUNREAD_ID, Menu.NONE, R.string.contextmenu_markasunread).setIcon(android.R.drawable.ic_menu_manage); + menu.add(0, CONTEXTMENU_DELETE_ID, Menu.NONE, R.string.contextmenu_delete).setIcon(android.R.drawable.ic_menu_delete); + menu.add(0, CONTEXTMENU_COPYURL, Menu.NONE, R.string.contextmenu_copyurl).setIcon(android.R.drawable.ic_menu_share); + } + }); + } + + @Override + protected void onListItemClick(ListView listView, View view, int position, long id) { + TextView textView = (TextView) view.findViewById(android.R.id.text1); + + textView.setTypeface(Typeface.DEFAULT); + textView.setEnabled(false); + view.findViewById(android.R.id.text2).setEnabled(false); + entriesListAdapter.neutralizeReadState(); + startActivity(new Intent(Intent.ACTION_VIEW, ContentUris.withAppendedId(uri, id)).putExtra(EXTRA_SHOWREAD, entriesListAdapter.isShowRead()).putExtra(FeedData.FeedColumns.ICON, iconBytes)); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.entrylist, menu); + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.setGroupVisible(R.id.menu_group_0, entriesListAdapter.getCount() > 0); + return true; + } + + public boolean onMenuItemSelected(int featureId, MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_markasread: { + new Thread() { // the update process takes some time + public void run() { + getContentResolver().update(uri, RSSOverview.getReadContentValues(), null, null); + } + }.start(); + entriesListAdapter.markAsRead(); + break; + } + case R.id.menu_markasunread: { + new Thread() { // the update process takes some time + public void run() { + getContentResolver().update(uri, RSSOverview.getUnreadContentValues(), null, null); + } + }.start(); + entriesListAdapter.markAsUnread(); + break; + } + case R.id.menu_hideread: { + if (item.isChecked()) { + item.setChecked(false).setTitle(R.string.contextmenu_hideread).setIcon(android.R.drawable.ic_menu_close_clear_cancel); + entriesListAdapter.showRead(true); + } else { + item.setChecked(true).setTitle(R.string.contextmenu_showread).setIcon(android.R.drawable.ic_menu_view); + entriesListAdapter.showRead(false); + } + break; + } + case R.id.menu_deleteread: { + new Thread() { // the delete process takes some time + public void run() { + String selection = Strings.READDATE_GREATERZERO+Strings.DB_AND+" ("+Strings.DB_EXCUDEFAVORITE+")"; + + getContentResolver().delete(uri, selection, null); + FeedData.deletePicturesOfFeed(EntriesListActivity.this, uri, selection); + runOnUiThread(new Runnable() { + public void run() { + entriesListAdapter.getCursor().requery(); + } + }); + } + }.start(); + break; + } + case R.id.menu_deleteallentries: { + Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setTitle(R.string.contextmenu_deleteallentries); + builder.setMessage(R.string.question_areyousure); + builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + new Thread() { + public void run() { + getContentResolver().delete(uri, Strings.DB_EXCUDEFAVORITE, null); + runOnUiThread(new Runnable() { + public void run() { + entriesListAdapter.getCursor().requery(); + } + }); + } + }.start(); + } + }); + builder.setNegativeButton(android.R.string.no, null); + builder.show(); + break; + } + case CONTEXTMENU_MARKASREAD_ID: { + long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; + + getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getReadContentValues(), null, null); + entriesListAdapter.markAsRead(id); + break; + } + case CONTEXTMENU_MARKASUNREAD_ID: { + long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; + + getContentResolver().update(ContentUris.withAppendedId(uri, id), RSSOverview.getUnreadContentValues(), null, null); + entriesListAdapter.markAsUnread(id); + break; + } + case CONTEXTMENU_DELETE_ID: { + long id = ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id; + + getContentResolver().delete(ContentUris.withAppendedId(uri, id), null, null); + FeedData.deletePicturesOfEntry(Long.toString(id)); + entriesListAdapter.getCursor().requery(); // he have no other choice + break; + } + case CONTEXTMENU_COPYURL: { + ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).targetView.getTag().toString()); + break; + } + + } + return true; + } + + + @Override + public void onResume() { + super.onResume(); + MobclickAgent.onResume(this); + } + + @Override + public void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + } + +} diff --git a/src/cn/eric/rss/EntryActivity.java b/src/cn/eric/rss/EntryActivity.java index d674a40..6f14079 100644 --- a/src/cn/eric/rss/EntryActivity.java +++ b/src/cn/eric/rss/EntryActivity.java @@ -1,807 +1,811 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import java.util.Date; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.AlertDialog.Builder; -import android.app.NotificationManager; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.ClipboardManager; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.util.TypedValue; -import android.view.GestureDetector; -import android.view.GestureDetector.OnGestureListener; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnKeyListener; -import android.view.View.OnTouchListener; -import android.view.ViewGroup.LayoutParams; -import android.view.Window; -import android.view.animation.Animation; -import android.webkit.WebView; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; -import android.widget.ViewFlipper; -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; - -public class EntryActivity extends Activity { - /* - private static final String NEWLINE = "\n"; - - private static final String BR = "
"; - */ - - private static final String TEXT_HTML = "text/html"; - - private static final String UTF8 = "utf-8"; - - private static final String OR_DATE = " or date "; - - private static final String DATE = "(date="; - - private static final String AND_ID = " and _id"; - - private static final String ASC = "date asc, _id desc limit 1"; - - private static final String DESC = "date desc, _id asc limit 1"; - - private static final String CSS = ""; - - private static final String FONT_START = CSS+""; - - private static final String FONT_FONTSIZE_START = CSS+""; - - private static final String FONTSIZE_END = ""; - - private static final String FONT_END = "



"; - - private static final String BODY_START = ""; - - private static final String BODY_END = "



"; - - private static final int BUTTON_ALPHA = 180; - - private static final String IMAGE_ENCLOSURE = "[@]image/"; - - private static final String TEXTPLAIN = "text/plain"; - - private static final String BRACKET = " ("; - - private int titlePosition; - - private int datePosition; - - private int abstractPosition; - - private int linkPosition; - - private int feedIdPosition; - - private int favoritePosition; - - private int readDatePosition; - - private int enclosurePosition; - - private int authorPosition; - - private String _id; - - private String _nextId; - - private String _previousId; - - private Uri uri; - - private Uri parentUri; - - private int feedId; - - boolean favorite; - - private boolean showRead; - - private boolean canShowIcon; - - private byte[] iconBytes; - - private WebView webView; - - private WebView webView0; // only needed for the animation - - private ViewFlipper viewFlipper; - - private ImageButton nextButton; - - private ImageButton urlButton; - - private ImageButton previousButton; - - private ImageButton playButton; - - int scrollX; - - int scrollY; - - private String link; - - private LayoutParams layoutParams; - - private View content; - - private SharedPreferences preferences; - - private boolean localPictures; - - private TextView titleTextView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - if (MainTabActivity.isLightTheme(this)) { - setTheme(R.style.Theme_Light); - } - - super.onCreate(savedInstanceState); - - int titleId = -1; - - if (MainTabActivity.POSTGINGERBREAD) { - canShowIcon = true; - setContentView(R.layout.entry); - try { - /* This is a trick as com.android.internal.R.id.action_bar_title is not directly accessible */ - titleId = (Integer) Class.forName("com.android.internal.R$id").getField("action_bar_title").get(null); - } catch (Exception exception) { - - } - } else { - canShowIcon = requestWindowFeature(Window.FEATURE_LEFT_ICON); - setContentView(R.layout.entry); - titleId = android.R.id.title; - } - - try { - titleTextView = (TextView) findViewById(titleId); - titleTextView.setSingleLine(true); - titleTextView.setHorizontallyScrolling(true); - titleTextView.setMarqueeRepeatLimit(1); - titleTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); - titleTextView.setFocusable(true); - titleTextView.setFocusableInTouchMode(true); - } catch (Exception e) { - // just in case for non standard android, nullpointer etc - } - - uri = getIntent().getData(); - parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); - showRead = getIntent().getBooleanExtra(EntriesListActivity.EXTRA_SHOWREAD, true); - iconBytes = getIntent().getByteArrayExtra(FeedData.FeedColumns.ICON); - feedId = 0; - - Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); - - titlePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.TITLE); - datePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.DATE); - abstractPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ABSTRACT); - linkPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.LINK); - feedIdPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FEED_ID); - favoritePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); - readDatePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.READDATE); - enclosurePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ENCLOSURE); - authorPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.AUTHOR); - - entryCursor.close(); - if (RSSOverview.notificationManager == null) { - RSSOverview.notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - } - - nextButton = (ImageButton) findViewById(R.id.next_button); - urlButton = (ImageButton) findViewById(R.id.url_button); - urlButton.setAlpha(BUTTON_ALPHA+30); - previousButton = (ImageButton) findViewById(R.id.prev_button); - playButton = (ImageButton) findViewById(R.id.play_button); - playButton.setAlpha(BUTTON_ALPHA); - - viewFlipper = (ViewFlipper) findViewById(R.id.content_flipper); - - - - layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); - - webView = new WebView(this); - - viewFlipper.addView(webView, layoutParams); - - OnKeyListener onKeyEventListener = new OnKeyListener() { - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (keyCode == 92 || keyCode == 94) { - scrollUp(); - return true; - } else if (keyCode == 93 || keyCode == 95) { - scrollDown(); - return true; - } - } - return false; - } - }; - webView.setOnKeyListener(onKeyEventListener); - - content = findViewById(R.id.entry_content); - - webView0 = new WebView(this); - webView0.setOnKeyListener(onKeyEventListener); - - preferences = PreferenceManager.getDefaultSharedPreferences(this); - - final boolean gestures = preferences.getBoolean(Strings.SETTINGS_GESTURESENABLED, true); - - final GestureDetector gestureDetector = new GestureDetector(this, new OnGestureListener() { - public boolean onDown(MotionEvent e) { - return false; - } - - public boolean onFling(MotionEvent e1, MotionEvent e2, - float velocityX, float velocityY) { - if (gestures) { - if (Math.abs(velocityY) < Math.abs(velocityX)) { - if (velocityX > 800) { - if (previousButton.isEnabled()) { - previousEntry(true); - } - } else if (velocityX < -800) { - if (nextButton.isEnabled()) { - nextEntry(true); - } - } - } - } - return false; - } - - public void onLongPress(MotionEvent e) { - - } - - public boolean onScroll(MotionEvent e1, MotionEvent e2, - float distanceX, float distanceY) { - return false; - } - - public void onShowPress(MotionEvent e) { - - } - - public boolean onSingleTapUp(MotionEvent e) { - return false; - } - }); - - OnTouchListener onTouchListener = new OnTouchListener() { - public boolean onTouch(View v, MotionEvent event) { - return gestureDetector.onTouchEvent(event); - } - }; - - webView.setOnTouchListener(onTouchListener); - - content.setOnTouchListener(new OnTouchListener() { - public boolean onTouch(View v, MotionEvent event) { - gestureDetector.onTouchEvent(event); - return true; // different to the above one! - } - }); - - webView0.setOnTouchListener(onTouchListener); - - scrollX = 0; - scrollY = 0; - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) - { - super.onRestoreInstanceState(savedInstanceState); - webView.restoreState(savedInstanceState); - } - - @Override - protected void onResume() { - super.onResume(); - if (RSSOverview.notificationManager != null) { - RSSOverview.notificationManager.cancel(0); - } - uri = getIntent().getData(); - parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.onResume(webView); - } - reload(); - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - setIntent(intent); - } - - private void reload() { - if (_id != null && _id.equals(uri.getLastPathSegment())) { - return; - } - - _id = uri.getLastPathSegment(); - - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); - - Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); - - if (entryCursor.moveToFirst()) { - String abstractText = entryCursor.getString(abstractPosition); - - if (entryCursor.isNull(readDatePosition)) { - getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null); - } - if (abstractText == null) { - String link = entryCursor.getString(linkPosition); - - entryCursor.close(); - finish(); - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(link))); - } else { - setTitle(entryCursor.getString(titlePosition)); - if (titleTextView != null) { - titleTextView.requestFocus(); // restart ellipsize - } - - int _feedId = entryCursor.getInt(feedIdPosition); - - if (feedId != _feedId) { - if (feedId != 0) { - iconBytes = null; // triggers re-fetch of the icon - } - feedId = _feedId; - } - - if (canShowIcon) { - if (iconBytes == null || iconBytes.length == 0) { - Cursor iconCursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(Integer.toString(feedId)), new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.ICON}, null, null, null); - - if (iconCursor.moveToFirst()) { - iconBytes = iconCursor.getBlob(1); - } - iconCursor.close(); - } - - if (iconBytes != null && iconBytes.length > 0) { - int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); - Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); - if (bitmap != null) { - if (bitmap.getHeight() != bitmapSizeInDip) { - bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); - } - - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); - } else { - setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); - } - } - } - } - - long timestamp = entryCursor.getLong(datePosition); - - Date date = new Date(timestamp); - - StringBuilder dateStringBuilder = new StringBuilder(DateFormat.getDateFormat(this).format(date)).append(' ').append(DateFormat.getTimeFormat(this).format(date)); - - String author = entryCursor.getString(authorPosition); - - if (author != null) { - dateStringBuilder.append(BRACKET).append(author).append(')'); - } - - ((TextView) findViewById(R.id.entry_date)).setText(dateStringBuilder); - - final ImageView imageView = (ImageView) findViewById(android.R.id.icon); - - favorite = entryCursor.getInt(favoritePosition) == 1; - - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); - imageView.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - favorite = !favorite; - imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); - ContentValues values = new ContentValues(); - - values.put(FeedData.EntryColumns.FAVORITE, favorite ? 1 : 0); - getContentResolver().update(uri, values, null, null); - } - }); - // loadData does not recognize the encoding without correct html-header - localPictures = abstractText.indexOf(Strings.IMAGEID_REPLACEMENT) > -1; - - abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, uri.getLastPathSegment()+Strings.IMAGEFILE_IDSEPARATOR); - - Pattern linkP = Pattern.compile("]*href=[^>]*>"); - Matcher linkM = linkP.matcher(abstractText); - if(!linkM.find()) { - abstractText = abstractText.replaceAll("(?i)(https?://[^ \n\r\t\\[\\]]+)", "
$1"); - } - - Pattern brP = Pattern.compile("]*>"); - Matcher brM = brP.matcher(abstractText); - if(!brM.find()) { - abstractText = abstractText.replaceAll("\n", "
"); - } - - abstractText = abstractText.replaceAll("(?i)\\[(/?(b|u))\\]", "<$1>"); - abstractText = abstractText.replaceAll("(?i)\\[img\\](https?://[^ \n\r\t\\[\\]]+)\\[/img\\]", ""); - abstractText = abstractText.replaceAll("(?i)\\[/?(center|color|size|img|url|pre)[^\\]]*\\]", ""); - - final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); - - if (localPictures) { - abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, _id+Strings.IMAGEFILE_IDSEPARATOR); - } - - if (preferences.getBoolean(Strings.SETTINGS_DISABLEPICTURES, false)) { - abstractText = abstractText.replaceAll(Strings.HTML_IMG_REGEX, Strings.EMPTY); - webView.getSettings().setBlockNetworkImage(true); - } else { - if (webView.getSettings().getBlockNetworkImage()) { - /* - * setBlockNetwortImage(false) calls postSync, which takes time, - * so we clean up the html first and change the value afterwards - */ - webView.loadData(Strings.EMPTY, TEXT_HTML, UTF8); - webView.getSettings().setBlockNetworkImage(false); - } - } - - int fontsize = Integer.parseInt(preferences.getString(Strings.SETTINGS_FONTSIZE, Strings.ONE)); - - /* - if (abstractText.indexOf('<') > -1 && abstractText.indexOf('>') > -1) { - abstractText = abstractText.replace(NEWLINE, BR); - } - */ - - if (MainTabActivity.isLightTheme(this) || preferences.getBoolean(Strings.SETTINGS_BLACKTEXTONWHITE, false)) { - if (fontsize > 0) { - webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONTSIZE_END).toString(), TEXT_HTML, UTF8, null); - } else { - webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(BODY_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); - } - webView.setBackgroundColor(Color.WHITE); - content.setBackgroundColor(Color.WHITE); - } else { - if (fontsize > 0) { - webView.loadDataWithBaseURL(null, new StringBuilder(FONT_FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONT_END).toString(), TEXT_HTML, UTF8, null); - } else { - webView.loadDataWithBaseURL(null, new StringBuilder(FONT_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); - } - webView.setBackgroundColor(Color.BLACK); - content.setBackgroundColor(Color.BLACK); - } - - link = entryCursor.getString(linkPosition); - - if (link != null && link.length() > 0) { - urlButton.setEnabled(true); - urlButton.setAlpha(BUTTON_ALPHA+20); - urlButton.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - startActivityForResult(new Intent(Intent.ACTION_VIEW, Uri.parse(link)), 0); - } - }); - } else { - urlButton.setEnabled(false); - urlButton.setAlpha(80); - } - - final String enclosure = entryCursor.getString(enclosurePosition); - - if (enclosure != null && enclosure.length() > 6 && enclosure.indexOf(IMAGE_ENCLOSURE) == -1) { - playButton.setVisibility(View.VISIBLE); - playButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - final int position1 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR); - - final int position2 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR, position1+3); - - final Uri uri = Uri.parse(enclosure.substring(0, position1)); - - if (preferences.getBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, true)) { - Builder builder = new AlertDialog.Builder(EntryActivity.this); - - builder.setTitle(R.string.question_areyousure); - builder.setIcon(android.R.drawable.ic_dialog_alert); - if (position2+4 > enclosure.length()) { - builder.setMessage(getString(R.string.question_playenclosure, uri, position2+4 > enclosure.length() ? Strings.QUESTIONMARKS : enclosure.substring(position2+3))); - } else { - try { - builder.setMessage(getString(R.string.question_playenclosure, uri, (Integer.parseInt(enclosure.substring(position2+3)) / 1024f)+getString(R.string.kb))); - } catch (Exception e) { - builder.setMessage(getString(R.string.question_playenclosure, uri, enclosure.substring(position2+3))); - } - } - builder.setCancelable(true); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - showEnclosure(uri, enclosure, position1, position2); - } - }); - builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - preferences.edit().putBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, false).commit(); - showEnclosure(uri, enclosure, position1, position2); - } - }); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.show(); - } else { - showEnclosure(uri, enclosure, position1, position2); - } - } - }); - } else { - playButton.setVisibility(View.GONE); - } - entryCursor.close(); - setupButton(previousButton, false, timestamp); - setupButton(nextButton, true, timestamp); - webView.scrollTo(scrollX, scrollY); // resets the scrolling - } - } else { - entryCursor.close(); - } - - /* - new Thread() { - public void run() { - sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); // this is slow - } - }.start(); - */ - } - - private void showEnclosure(Uri uri, String enclosure, int position1, int position2) { - try { - startActivityForResult(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, enclosure.substring(position1+3, position2)), 0); - } catch (Exception e) { - try { - startActivityForResult(new Intent(Intent.ACTION_VIEW, uri), 0); // fallbackmode - let the browser handle this - } catch (Throwable t) { - Toast.makeText(EntryActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); - } - } - } - - private void setupButton(ImageButton button, final boolean successor, long date) { - StringBuilder queryString = new StringBuilder(DATE).append(date).append(AND_ID).append(successor ? '>' : '<').append(_id).append(')').append(OR_DATE).append(successor ? '<' : '>').append(date); - - if (!showRead) { - queryString.append(Strings.DB_AND).append(EntriesListAdapter.READDATEISNULL); - } - - Cursor cursor = getContentResolver().query(parentUri, new String[] {FeedData.EntryColumns._ID}, queryString.toString() , null, successor ? DESC : ASC); - - if (cursor.moveToFirst()) { - button.setEnabled(true); - button.setAlpha(BUTTON_ALPHA); - - final String id = cursor.getString(0); - - if (successor) { - _nextId = id; - } else { - _previousId = id; - } - button.setOnClickListener(new OnClickListener() { - public void onClick(View view) { - if (successor) { - nextEntry(false); - } else { - previousEntry(false); - } - } - }); - } else { - button.setEnabled(false); - button.setAlpha(60); - } - cursor.close(); - } - - private void switchEntry(String id, boolean animate, Animation inAnimation, Animation outAnimation) { - uri = parentUri.buildUpon().appendPath(id).build(); - getIntent().setData(uri); - scrollX = 0; - scrollY = 0; - - if (animate) { - WebView dummy = webView; // switch reference - - webView = webView0; - webView0 = dummy; - } - - reload(); - - if (animate) { - viewFlipper.setInAnimation(inAnimation); - viewFlipper.setOutAnimation(outAnimation); - viewFlipper.addView(webView, layoutParams); - viewFlipper.showNext(); - viewFlipper.removeViewAt(0); - } - } - - private void nextEntry(boolean animate) { - switchEntry(_nextId, animate, Animations.SLIDE_IN_RIGHT, Animations.SLIDE_OUT_LEFT); - } - - private void previousEntry(boolean animate) { - switchEntry(_previousId, animate, Animations.SLIDE_IN_LEFT, Animations.SLIDE_OUT_RIGHT); - } - - @Override - protected void onPause() { - super.onPause(); - if (MainTabActivity.POSTGINGERBREAD) { - CompatibilityHelper.onPause(webView); - } - scrollX = webView.getScrollX(); - scrollY = webView.getScrollY(); - } - - @Override - protected void onSaveInstanceState(Bundle outState) - { - webView.saveState(outState); - super.onSaveInstanceState(outState); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.entry, menu); - return true; - } - - @Override - public boolean onMenuItemSelected(int featureId, MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_copytoclipboard: { - if (link != null) { - ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(link); - } - break; - } - case R.id.menu_delete: { - getContentResolver().delete(uri, null, null); - if (localPictures) { - FeedData.deletePicturesOfEntry(_id); - } - - if (nextButton.isEnabled()) { - nextButton.performClick(); - } else { - if (previousButton.isEnabled()) { - previousButton.performClick(); - } else { - finish(); - } - } - break; - } - case R.id.menu_share: { - if (link != null) { - startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND).putExtra(Intent.EXTRA_TEXT, link).setType(TEXTPLAIN), getString(R.string.menu_share))); - } - break; - } - } - return true; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (keyCode == 92 || keyCode == 94) { - scrollUp(); - return true; - } else if (keyCode == 93 || keyCode == 95) { - scrollDown(); - return true; - } - } - return super.onKeyDown(keyCode, event); - } - - private void scrollUp() { - if (webView != null) { - webView.pageUp(false); - } - } - - private void scrollDown() { - if (webView != null) { - webView.pageDown(false); - } - } - - /** - * Works around android issue 6191 - */ - @Override - public void unregisterReceiver(BroadcastReceiver receiver) { - try { - super.unregisterReceiver(receiver); - } catch (Exception e) { - // do nothing - } - } - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.umeng.analytics.MobclickAgent; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.text.ClipboardManager; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.util.TypedValue; +import android.view.GestureDetector; +import android.view.GestureDetector.OnGestureListener; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnKeyListener; +import android.view.View.OnTouchListener; +import android.view.ViewGroup.LayoutParams; +import android.view.Window; +import android.view.animation.Animation; +import android.webkit.WebView; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.ViewFlipper; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class EntryActivity extends Activity { + /* + private static final String NEWLINE = "\n"; + + private static final String BR = "
"; + */ + + private static final String TEXT_HTML = "text/html"; + + private static final String UTF8 = "utf-8"; + + private static final String OR_DATE = " or date "; + + private static final String DATE = "(date="; + + private static final String AND_ID = " and _id"; + + private static final String ASC = "date asc, _id desc limit 1"; + + private static final String DESC = "date desc, _id asc limit 1"; + + private static final String CSS = ""; + + private static final String FONT_START = CSS+""; + + private static final String FONT_FONTSIZE_START = CSS+""; + + private static final String FONTSIZE_END = ""; + + private static final String FONT_END = "



"; + + private static final String BODY_START = ""; + + private static final String BODY_END = "



"; + + private static final int BUTTON_ALPHA = 180; + + private static final String IMAGE_ENCLOSURE = "[@]image/"; + + private static final String TEXTPLAIN = "text/plain"; + + private static final String BRACKET = " ("; + + private int titlePosition; + + private int datePosition; + + private int abstractPosition; + + private int linkPosition; + + private int feedIdPosition; + + private int favoritePosition; + + private int readDatePosition; + + private int enclosurePosition; + + private int authorPosition; + + private String _id; + + private String _nextId; + + private String _previousId; + + private Uri uri; + + private Uri parentUri; + + private int feedId; + + boolean favorite; + + private boolean showRead; + + private boolean canShowIcon; + + private byte[] iconBytes; + + private WebView webView; + + private WebView webView0; // only needed for the animation + + private ViewFlipper viewFlipper; + + private ImageButton nextButton; + + private ImageButton urlButton; + + private ImageButton previousButton; + + private ImageButton playButton; + + int scrollX; + + int scrollY; + + private String link; + + private LayoutParams layoutParams; + + private View content; + + private SharedPreferences preferences; + + private boolean localPictures; + + private TextView titleTextView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + if (MainTabActivity.isLightTheme(this)) { + setTheme(R.style.Theme_Light); + } + + super.onCreate(savedInstanceState); + + int titleId = -1; + + if (MainTabActivity.POSTGINGERBREAD) { + canShowIcon = true; + setContentView(R.layout.entry); + try { + /* This is a trick as com.android.internal.R.id.action_bar_title is not directly accessible */ + titleId = (Integer) Class.forName("com.android.internal.R$id").getField("action_bar_title").get(null); + } catch (Exception exception) { + + } + } else { + canShowIcon = requestWindowFeature(Window.FEATURE_LEFT_ICON); + setContentView(R.layout.entry); + titleId = android.R.id.title; + } + + try { + titleTextView = (TextView) findViewById(titleId); + titleTextView.setSingleLine(true); + titleTextView.setHorizontallyScrolling(true); + titleTextView.setMarqueeRepeatLimit(1); + titleTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); + titleTextView.setFocusable(true); + titleTextView.setFocusableInTouchMode(true); + } catch (Exception e) { + // just in case for non standard android, nullpointer etc + } + + uri = getIntent().getData(); + parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); + showRead = getIntent().getBooleanExtra(EntriesListActivity.EXTRA_SHOWREAD, true); + iconBytes = getIntent().getByteArrayExtra(FeedData.FeedColumns.ICON); + feedId = 0; + + Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); + + titlePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.TITLE); + datePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.DATE); + abstractPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ABSTRACT); + linkPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.LINK); + feedIdPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FEED_ID); + favoritePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.FAVORITE); + readDatePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.READDATE); + enclosurePosition = entryCursor.getColumnIndex(FeedData.EntryColumns.ENCLOSURE); + authorPosition = entryCursor.getColumnIndex(FeedData.EntryColumns.AUTHOR); + + entryCursor.close(); + if (RSSOverview.notificationManager == null) { + RSSOverview.notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + + nextButton = (ImageButton) findViewById(R.id.next_button); + urlButton = (ImageButton) findViewById(R.id.url_button); + urlButton.setAlpha(BUTTON_ALPHA+30); + previousButton = (ImageButton) findViewById(R.id.prev_button); + playButton = (ImageButton) findViewById(R.id.play_button); + playButton.setAlpha(BUTTON_ALPHA); + + viewFlipper = (ViewFlipper) findViewById(R.id.content_flipper); + + + + layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); + + webView = new WebView(this); + + viewFlipper.addView(webView, layoutParams); + + OnKeyListener onKeyEventListener = new OnKeyListener() { + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + if (keyCode == 92 || keyCode == 94) { + scrollUp(); + return true; + } else if (keyCode == 93 || keyCode == 95) { + scrollDown(); + return true; + } + } + return false; + } + }; + webView.setOnKeyListener(onKeyEventListener); + + content = findViewById(R.id.entry_content); + + webView0 = new WebView(this); + webView0.setOnKeyListener(onKeyEventListener); + + preferences = PreferenceManager.getDefaultSharedPreferences(this); + + final boolean gestures = preferences.getBoolean(Strings.SETTINGS_GESTURESENABLED, true); + + final GestureDetector gestureDetector = new GestureDetector(this, new OnGestureListener() { + public boolean onDown(MotionEvent e) { + return false; + } + + public boolean onFling(MotionEvent e1, MotionEvent e2, + float velocityX, float velocityY) { + if (gestures) { + if (Math.abs(velocityY) < Math.abs(velocityX)) { + if (velocityX > 800) { + if (previousButton.isEnabled()) { + previousEntry(true); + } + } else if (velocityX < -800) { + if (nextButton.isEnabled()) { + nextEntry(true); + } + } + } + } + return false; + } + + public void onLongPress(MotionEvent e) { + + } + + public boolean onScroll(MotionEvent e1, MotionEvent e2, + float distanceX, float distanceY) { + return false; + } + + public void onShowPress(MotionEvent e) { + + } + + public boolean onSingleTapUp(MotionEvent e) { + return false; + } + }); + + OnTouchListener onTouchListener = new OnTouchListener() { + public boolean onTouch(View v, MotionEvent event) { + return gestureDetector.onTouchEvent(event); + } + }; + + webView.setOnTouchListener(onTouchListener); + + content.setOnTouchListener(new OnTouchListener() { + public boolean onTouch(View v, MotionEvent event) { + gestureDetector.onTouchEvent(event); + return true; // different to the above one! + } + }); + + webView0.setOnTouchListener(onTouchListener); + + scrollX = 0; + scrollY = 0; + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) + { + super.onRestoreInstanceState(savedInstanceState); + webView.restoreState(savedInstanceState); + } + + @Override + protected void onResume() { + super.onResume(); + MobclickAgent.onResume(this); + if (RSSOverview.notificationManager != null) { + RSSOverview.notificationManager.cancel(0); + } + uri = getIntent().getData(); + parentUri = FeedData.EntryColumns.PARENT_URI(uri.getPath()); + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.onResume(webView); + } + reload(); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + } + + private void reload() { + if (_id != null && _id.equals(uri.getLastPathSegment())) { + return; + } + + _id = uri.getLastPathSegment(); + + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.READDATE, System.currentTimeMillis()); + + Cursor entryCursor = getContentResolver().query(uri, null, null, null, null); + + if (entryCursor.moveToFirst()) { + String abstractText = entryCursor.getString(abstractPosition); + + if (entryCursor.isNull(readDatePosition)) { + getContentResolver().update(uri, values, new StringBuilder(FeedData.EntryColumns.READDATE).append(Strings.DB_ISNULL).toString(), null); + } + if (abstractText == null) { + String link = entryCursor.getString(linkPosition); + + entryCursor.close(); + finish(); + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(link))); + } else { + setTitle(entryCursor.getString(titlePosition)); + if (titleTextView != null) { + titleTextView.requestFocus(); // restart ellipsize + } + + int _feedId = entryCursor.getInt(feedIdPosition); + + if (feedId != _feedId) { + if (feedId != 0) { + iconBytes = null; // triggers re-fetch of the icon + } + feedId = _feedId; + } + + if (canShowIcon) { + if (iconBytes == null || iconBytes.length == 0) { + Cursor iconCursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(Integer.toString(feedId)), new String[] {FeedData.FeedColumns._ID, FeedData.FeedColumns.ICON}, null, null, null); + + if (iconCursor.moveToFirst()) { + iconBytes = iconCursor.getBlob(1); + } + iconCursor.close(); + } + + if (iconBytes != null && iconBytes.length > 0) { + int bitmapSizeInDip = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, getResources().getDisplayMetrics()); + Bitmap bitmap = BitmapFactory.decodeByteArray(iconBytes, 0, iconBytes.length); + if (bitmap != null) { + if (bitmap.getHeight() != bitmapSizeInDip) { + bitmap = Bitmap.createScaledBitmap(bitmap, bitmapSizeInDip, bitmapSizeInDip, false); + } + + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.setActionBarDrawable(this, new BitmapDrawable(bitmap)); + } else { + setFeatureDrawable(Window.FEATURE_LEFT_ICON, new BitmapDrawable(bitmap)); + } + } + } + } + + long timestamp = entryCursor.getLong(datePosition); + + Date date = new Date(timestamp); + + StringBuilder dateStringBuilder = new StringBuilder(DateFormat.getDateFormat(this).format(date)).append(' ').append(DateFormat.getTimeFormat(this).format(date)); + + String author = entryCursor.getString(authorPosition); + + if (author != null) { + dateStringBuilder.append(BRACKET).append(author).append(')'); + } + + ((TextView) findViewById(R.id.entry_date)).setText(dateStringBuilder); + + final ImageView imageView = (ImageView) findViewById(android.R.id.icon); + + favorite = entryCursor.getInt(favoritePosition) == 1; + + imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); + imageView.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + favorite = !favorite; + imageView.setImageResource(favorite ? android.R.drawable.star_on : android.R.drawable.star_off); + ContentValues values = new ContentValues(); + + values.put(FeedData.EntryColumns.FAVORITE, favorite ? 1 : 0); + getContentResolver().update(uri, values, null, null); + } + }); + // loadData does not recognize the encoding without correct html-header + localPictures = abstractText.indexOf(Strings.IMAGEID_REPLACEMENT) > -1; + + abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, uri.getLastPathSegment()+Strings.IMAGEFILE_IDSEPARATOR); + + Pattern linkP = Pattern.compile("]*href=[^>]*>"); + Matcher linkM = linkP.matcher(abstractText); + if(!linkM.find()) { + abstractText = abstractText.replaceAll("(?i)(https?://[^ \n\r\t\\[\\]]+)", "$1"); + } + + Pattern brP = Pattern.compile("]*>"); + Matcher brM = brP.matcher(abstractText); + if(!brM.find()) { + abstractText = abstractText.replaceAll("\n", "
"); + } + + abstractText = abstractText.replaceAll("(?i)\\[(/?(b|u))\\]", "<$1>"); + abstractText = abstractText.replaceAll("(?i)\\[img\\](https?://[^ \n\r\t\\[\\]]+)\\[/img\\]", ""); + abstractText = abstractText.replaceAll("(?i)\\[/?(center|color|size|img|url|pre)[^\\]]*\\]", ""); + + final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); + + if (localPictures) { + abstractText = abstractText.replace(Strings.IMAGEID_REPLACEMENT, _id+Strings.IMAGEFILE_IDSEPARATOR); + } + + if (preferences.getBoolean(Strings.SETTINGS_DISABLEPICTURES, false)) { + abstractText = abstractText.replaceAll(Strings.HTML_IMG_REGEX, Strings.EMPTY); + webView.getSettings().setBlockNetworkImage(true); + } else { + if (webView.getSettings().getBlockNetworkImage()) { + /* + * setBlockNetwortImage(false) calls postSync, which takes time, + * so we clean up the html first and change the value afterwards + */ + webView.loadData(Strings.EMPTY, TEXT_HTML, UTF8); + webView.getSettings().setBlockNetworkImage(false); + } + } + + int fontsize = Integer.parseInt(preferences.getString(Strings.SETTINGS_FONTSIZE, Strings.ONE)); + + /* + if (abstractText.indexOf('<') > -1 && abstractText.indexOf('>') > -1) { + abstractText = abstractText.replace(NEWLINE, BR); + } + */ + + if (MainTabActivity.isLightTheme(this) || preferences.getBoolean(Strings.SETTINGS_BLACKTEXTONWHITE, false)) { + if (fontsize > 0) { + webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONTSIZE_END).toString(), TEXT_HTML, UTF8, null); + } else { + webView.loadDataWithBaseURL(null, new StringBuilder(CSS).append(BODY_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); + } + webView.setBackgroundColor(Color.WHITE); + content.setBackgroundColor(Color.WHITE); + } else { + if (fontsize > 0) { + webView.loadDataWithBaseURL(null, new StringBuilder(FONT_FONTSIZE_START).append(fontsize).append(FONTSIZE_MIDDLE).append(abstractText).append(FONT_END).toString(), TEXT_HTML, UTF8, null); + } else { + webView.loadDataWithBaseURL(null, new StringBuilder(FONT_START).append(abstractText).append(BODY_END).toString(), TEXT_HTML, UTF8, null); + } + webView.setBackgroundColor(Color.BLACK); + content.setBackgroundColor(Color.BLACK); + } + + link = entryCursor.getString(linkPosition); + + if (link != null && link.length() > 0) { + urlButton.setEnabled(true); + urlButton.setAlpha(BUTTON_ALPHA+20); + urlButton.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + startActivityForResult(new Intent(Intent.ACTION_VIEW, Uri.parse(link)), 0); + } + }); + } else { + urlButton.setEnabled(false); + urlButton.setAlpha(80); + } + + final String enclosure = entryCursor.getString(enclosurePosition); + + if (enclosure != null && enclosure.length() > 6 && enclosure.indexOf(IMAGE_ENCLOSURE) == -1) { + playButton.setVisibility(View.VISIBLE); + playButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + final int position1 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR); + + final int position2 = enclosure.indexOf(Strings.ENCLOSURE_SEPARATOR, position1+3); + + final Uri uri = Uri.parse(enclosure.substring(0, position1)); + + if (preferences.getBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, true)) { + Builder builder = new AlertDialog.Builder(EntryActivity.this); + + builder.setTitle(R.string.question_areyousure); + builder.setIcon(android.R.drawable.ic_dialog_alert); + if (position2+4 > enclosure.length()) { + builder.setMessage(getString(R.string.question_playenclosure, uri, position2+4 > enclosure.length() ? Strings.QUESTIONMARKS : enclosure.substring(position2+3))); + } else { + try { + builder.setMessage(getString(R.string.question_playenclosure, uri, (Integer.parseInt(enclosure.substring(position2+3)) / 1024f)+getString(R.string.kb))); + } catch (Exception e) { + builder.setMessage(getString(R.string.question_playenclosure, uri, enclosure.substring(position2+3))); + } + } + builder.setCancelable(true); + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + showEnclosure(uri, enclosure, position1, position2); + } + }); + builder.setNeutralButton(R.string.button_alwaysokforall, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + preferences.edit().putBoolean(Strings.SETTINGS_ENCLOSUREWARNINGSENABLED, false).commit(); + showEnclosure(uri, enclosure, position1, position2); + } + }); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.show(); + } else { + showEnclosure(uri, enclosure, position1, position2); + } + } + }); + } else { + playButton.setVisibility(View.GONE); + } + entryCursor.close(); + setupButton(previousButton, false, timestamp); + setupButton(nextButton, true, timestamp); + webView.scrollTo(scrollX, scrollY); // resets the scrolling + } + } else { + entryCursor.close(); + } + + /* + new Thread() { + public void run() { + sendBroadcast(new Intent(Strings.ACTION_UPDATEWIDGET)); // this is slow + } + }.start(); + */ + } + + private void showEnclosure(Uri uri, String enclosure, int position1, int position2) { + try { + startActivityForResult(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, enclosure.substring(position1+3, position2)), 0); + } catch (Exception e) { + try { + startActivityForResult(new Intent(Intent.ACTION_VIEW, uri), 0); // fallbackmode - let the browser handle this + } catch (Throwable t) { + Toast.makeText(EntryActivity.this, t.getMessage(), Toast.LENGTH_LONG).show(); + } + } + } + + private void setupButton(ImageButton button, final boolean successor, long date) { + StringBuilder queryString = new StringBuilder(DATE).append(date).append(AND_ID).append(successor ? '>' : '<').append(_id).append(')').append(OR_DATE).append(successor ? '<' : '>').append(date); + + if (!showRead) { + queryString.append(Strings.DB_AND).append(EntriesListAdapter.READDATEISNULL); + } + + Cursor cursor = getContentResolver().query(parentUri, new String[] {FeedData.EntryColumns._ID}, queryString.toString() , null, successor ? DESC : ASC); + + if (cursor.moveToFirst()) { + button.setEnabled(true); + button.setAlpha(BUTTON_ALPHA); + + final String id = cursor.getString(0); + + if (successor) { + _nextId = id; + } else { + _previousId = id; + } + button.setOnClickListener(new OnClickListener() { + public void onClick(View view) { + if (successor) { + nextEntry(false); + } else { + previousEntry(false); + } + } + }); + } else { + button.setEnabled(false); + button.setAlpha(60); + } + cursor.close(); + } + + private void switchEntry(String id, boolean animate, Animation inAnimation, Animation outAnimation) { + uri = parentUri.buildUpon().appendPath(id).build(); + getIntent().setData(uri); + scrollX = 0; + scrollY = 0; + + if (animate) { + WebView dummy = webView; // switch reference + + webView = webView0; + webView0 = dummy; + } + + reload(); + + if (animate) { + viewFlipper.setInAnimation(inAnimation); + viewFlipper.setOutAnimation(outAnimation); + viewFlipper.addView(webView, layoutParams); + viewFlipper.showNext(); + viewFlipper.removeViewAt(0); + } + } + + private void nextEntry(boolean animate) { + switchEntry(_nextId, animate, Animations.SLIDE_IN_RIGHT, Animations.SLIDE_OUT_LEFT); + } + + private void previousEntry(boolean animate) { + switchEntry(_previousId, animate, Animations.SLIDE_IN_LEFT, Animations.SLIDE_OUT_RIGHT); + } + + @Override + protected void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + if (MainTabActivity.POSTGINGERBREAD) { + CompatibilityHelper.onPause(webView); + } + scrollX = webView.getScrollX(); + scrollY = webView.getScrollY(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) + { + webView.saveState(outState); + super.onSaveInstanceState(outState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.entry, menu); + return true; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_copytoclipboard: { + if (link != null) { + ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).setText(link); + } + break; + } + case R.id.menu_delete: { + getContentResolver().delete(uri, null, null); + if (localPictures) { + FeedData.deletePicturesOfEntry(_id); + } + + if (nextButton.isEnabled()) { + nextButton.performClick(); + } else { + if (previousButton.isEnabled()) { + previousButton.performClick(); + } else { + finish(); + } + } + break; + } + case R.id.menu_share: { + if (link != null) { + startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND).putExtra(Intent.EXTRA_TEXT, link).setType(TEXTPLAIN), getString(R.string.menu_share))); + } + break; + } + } + return true; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + if (keyCode == 92 || keyCode == 94) { + scrollUp(); + return true; + } else if (keyCode == 93 || keyCode == 95) { + scrollDown(); + return true; + } + } + return super.onKeyDown(keyCode, event); + } + + private void scrollUp() { + if (webView != null) { + webView.pageUp(false); + } + } + + private void scrollDown() { + if (webView != null) { + webView.pageDown(false); + } + } + + /** + * Works around android issue 6191 + */ + @Override + public void unregisterReceiver(BroadcastReceiver receiver) { + try { + super.unregisterReceiver(receiver); + } catch (Exception e) { + // do nothing + } + } + +} diff --git a/src/cn/eric/rss/FeedConfigActivity.java b/src/cn/eric/rss/FeedConfigActivity.java index a2c2e01..d39b6d7 100644 --- a/src/cn/eric/rss/FeedConfigActivity.java +++ b/src/cn/eric/rss/FeedConfigActivity.java @@ -1,179 +1,288 @@ -/** - * Sparse rss - * - * Copyright (c) 2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss; - -import android.app.Activity; -import android.content.ContentValues; -import android.content.Intent; -import android.database.Cursor; -import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Toast; -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; - -public class FeedConfigActivity extends Activity { - private static final String WASACTIVE = "wasactive"; - - private static final String[] PROJECTION = new String[] {FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, FeedData.FeedColumns.WIFIONLY}; - - private EditText nameEditText; - - private EditText urlEditText; - - private CheckBox refreshOnlyWifiCheckBox; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.feedsettings); - setResult(RESULT_CANCELED); - - Intent intent = getIntent(); - - nameEditText = (EditText) findViewById(R.id.feed_title); - urlEditText = (EditText) findViewById(R.id.feed_url); - refreshOnlyWifiCheckBox = (CheckBox) findViewById(R.id.wifionlycheckbox); - - if (intent.getAction().equals(Intent.ACTION_INSERT)) { - setTitle(R.string.newfeed_title); - restoreInstanceState(savedInstanceState); - ((Button) findViewById(R.id.button_ok)).setOnClickListener(new OnClickListener() { - public void onClick(View v) { - String url = urlEditText.getText().toString(); - - if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { - url = Strings.HTTP+url; - } - - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, null, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); - - if (cursor.moveToFirst()) { - cursor.close(); - Toast.makeText(FeedConfigActivity.this, R.string.error_feedurlexists, Toast.LENGTH_LONG).show(); - } else { - cursor.close(); - ContentValues values = new ContentValues(); - - values.put(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked() ? 1 : 0); - values.put(FeedData.FeedColumns.URL, url); - values.put(FeedData.FeedColumns.ERROR, (String) null); - - String name = nameEditText.getText().toString(); - - if (name.trim().length() > 0) { - values.put(FeedData.FeedColumns.NAME, name); - } - getContentResolver().insert(FeedData.FeedColumns.CONTENT_URI, values); - setResult(RESULT_OK); - finish(); - } - } - }); - } else { - setTitle(R.string.editfeed_title); - - if (!restoreInstanceState(savedInstanceState)) { - Cursor cursor = getContentResolver().query(intent.getData(), PROJECTION, null, null, null); - - if (cursor.moveToNext()) { - nameEditText.setText(cursor.getString(0)); - urlEditText.setText(cursor.getString(1)); - refreshOnlyWifiCheckBox.setChecked(cursor.getInt(2) == 1); - cursor.close(); - } else { - cursor.close(); - Toast.makeText(FeedConfigActivity.this, R.string.error, Toast.LENGTH_LONG).show(); - finish(); - } - } - ((Button) findViewById(R.id.button_ok)).setOnClickListener(new OnClickListener() { - public void onClick(View v) { - String url = urlEditText.getText().toString(); - - Cursor cursor = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID}, new StringBuilder(FeedData.FeedColumns.URL).append(Strings.DB_ARG).toString(), new String[] {url}, null); - - if (cursor.moveToFirst() && !getIntent().getData().getLastPathSegment().equals(cursor.getString(0))) { - cursor.close(); - Toast.makeText(FeedConfigActivity.this, R.string.error_feedurlexists, Toast.LENGTH_LONG).show(); - } else { - cursor.close(); - ContentValues values = new ContentValues(); - - if (!url.startsWith(Strings.HTTP) && !url.startsWith(Strings.HTTPS)) { - url = Strings.HTTP+url; - } - values.put(FeedData.FeedColumns.URL, url); - - String name = nameEditText.getText().toString(); - - values.put(FeedData.FeedColumns.NAME, name.trim().length() > 0 ? name : null); - values.put(FeedData.FeedColumns.FETCHMODE, 0); - values.put(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked() ? 1 : 0); - values.put(FeedData.FeedColumns.ERROR, (String) null); - getContentResolver().update(getIntent().getData(), values, null, null); - - setResult(RESULT_OK); - finish(); - } - } - - }); - - } - - ((Button) findViewById(R.id.button_cancel)).setOnClickListener(new OnClickListener() { - public void onClick(View v) { - finish(); - } - }); - } - - private boolean restoreInstanceState(Bundle savedInstanceState) { - if (savedInstanceState != null && savedInstanceState.getBoolean(WASACTIVE, false)) { - nameEditText.setText(savedInstanceState.getCharSequence(FeedData.FeedColumns.NAME)); - urlEditText.setText(savedInstanceState.getCharSequence(FeedData.FeedColumns.URL)); - refreshOnlyWifiCheckBox.setChecked(savedInstanceState.getBoolean(FeedData.FeedColumns.WIFIONLY)); - return true; - } else { - return false; - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - outState.putBoolean(WASACTIVE, true); - outState.putCharSequence(FeedData.FeedColumns.NAME, nameEditText.getText()); - outState.putCharSequence(FeedData.FeedColumns.URL, urlEditText.getText()); - outState.putBoolean(FeedData.FeedColumns.WIFIONLY, refreshOnlyWifiCheckBox.isChecked()); - } - -} +/** + * Sparse rss + * + * Copyright (c) 2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss; + +import com.umeng.analytics.MobclickAgent; + +import android.app.Activity; +import android.content.ContentValues; +import android.content.Intent; +import android.database.Cursor; +import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Toast; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class FeedConfigActivity extends Activity { + private static final String WASACTIVE = "wasactive"; + + private static final String[] PROJECTION = new String[] { + FeedData.FeedColumns.NAME, FeedData.FeedColumns.URL, + FeedData.FeedColumns.WIFIONLY }; + + private EditText nameEditText; + + private EditText urlEditText; + + private CheckBox refreshOnlyWifiCheckBox; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.feedsettings); + setResult(RESULT_CANCELED); + + Intent intent = getIntent(); + + nameEditText = (EditText) findViewById(R.id.feed_title); + urlEditText = (EditText) findViewById(R.id.feed_url); + refreshOnlyWifiCheckBox = (CheckBox) findViewById(R.id.wifionlycheckbox); + + if (intent.getAction().equals(Intent.ACTION_INSERT)) { + setTitle(R.string.newfeed_title); + restoreInstanceState(savedInstanceState); + ((Button) findViewById(R.id.button_ok)) + .setOnClickListener(new OnClickListener() { + public void onClick(View v) { + String url = urlEditText.getText().toString(); + + if (!url.startsWith(Strings.HTTP) + && !url.startsWith(Strings.HTTPS)) { + url = Strings.HTTP + url; + } + + Cursor cursor = getContentResolver().query( + FeedData.FeedColumns.CONTENT_URI, + null, + new StringBuilder(FeedData.FeedColumns.URL) + .append(Strings.DB_ARG).toString(), + new String[] { url }, null); + + if (cursor.moveToFirst()) { + cursor.close(); + Toast.makeText(FeedConfigActivity.this, + R.string.error_feedurlexists, + Toast.LENGTH_LONG).show(); + } else { + cursor.close(); + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.WIFIONLY, + refreshOnlyWifiCheckBox.isChecked() ? 1 + : 0); + values.put(FeedData.FeedColumns.URL, url); + values.put(FeedData.FeedColumns.ERROR, + (String) null); + + String name = nameEditText.getText().toString(); + + if (name.trim().length() > 0) { + values.put(FeedData.FeedColumns.NAME, name); + } + getContentResolver().insert( + FeedData.FeedColumns.CONTENT_URI, + values); + setResult(RESULT_OK); + finish(); + } + } + }); + } else { + setTitle(R.string.editfeed_title); + + if (!restoreInstanceState(savedInstanceState)) { + Cursor cursor = getContentResolver().query(intent.getData(), + PROJECTION, null, null, null); + + if (cursor.moveToNext()) { + nameEditText.setText(cursor.getString(0)); + urlEditText.setText(cursor.getString(1)); + refreshOnlyWifiCheckBox.setChecked(cursor.getInt(2) == 1); + cursor.close(); + } else { + cursor.close(); + Toast.makeText(FeedConfigActivity.this, R.string.error, + Toast.LENGTH_LONG).show(); + finish(); + } + } + ((Button) findViewById(R.id.button_ok)) + .setOnClickListener(new OnClickListener() { + public void onClick(View v) { + String url = urlEditText.getText().toString(); + + Cursor cursor = getContentResolver().query( + FeedData.FeedColumns.CONTENT_URI, + new String[] { FeedData.FeedColumns._ID }, + new StringBuilder(FeedData.FeedColumns.URL) + .append(Strings.DB_ARG).toString(), + new String[] { url }, null); + + if (cursor.moveToFirst() + && !getIntent().getData() + .getLastPathSegment() + .equals(cursor.getString(0))) { + cursor.close(); + Toast.makeText(FeedConfigActivity.this, + R.string.error_feedurlexists, + Toast.LENGTH_LONG).show(); + } else { + cursor.close(); + ContentValues values = new ContentValues(); + + if (!url.startsWith(Strings.HTTP) + && !url.startsWith(Strings.HTTPS)) { + url = Strings.HTTP + url; + } + values.put(FeedData.FeedColumns.URL, url); + + String name = nameEditText.getText().toString(); + + values.put(FeedData.FeedColumns.NAME, name + .trim().length() > 0 ? name : null); + values.put(FeedData.FeedColumns.FETCHMODE, 0); + values.put(FeedData.FeedColumns.WIFIONLY, + refreshOnlyWifiCheckBox.isChecked() ? 1 + : 0); + values.put(FeedData.FeedColumns.ERROR, + (String) null); + getContentResolver().update( + getIntent().getData(), values, null, + null); + + setResult(RESULT_OK); + finish(); + } + } + + }); + + } + + ((Button) findViewById(R.id.button_cancel)) + .setOnClickListener(new OnClickListener() { + public void onClick(View v) { + finish(); + } + }); + } + + private boolean restoreInstanceState(Bundle savedInstanceState) { + if (savedInstanceState != null + && savedInstanceState.getBoolean(WASACTIVE, false)) { + nameEditText.setText(savedInstanceState + .getCharSequence(FeedData.FeedColumns.NAME)); + urlEditText.setText(savedInstanceState + .getCharSequence(FeedData.FeedColumns.URL)); + refreshOnlyWifiCheckBox.setChecked(savedInstanceState + .getBoolean(FeedData.FeedColumns.WIFIONLY)); + return true; + } else { + return false; + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + outState.putBoolean(WASACTIVE, true); + outState.putCharSequence(FeedData.FeedColumns.NAME, + nameEditText.getText()); + outState.putCharSequence(FeedData.FeedColumns.URL, + urlEditText.getText()); + outState.putBoolean(FeedData.FeedColumns.WIFIONLY, + refreshOnlyWifiCheckBox.isChecked()); + } + + /** + * fill in some common feed urls for users + * + * @param activity + * @return + */ + public static void insertInitialFeeds(Activity activity) { + Cursor cursor = activity.getContentResolver().query( + FeedData.FeedColumns.CONTENT_URI, null, null, null, null); + + if (cursor.moveToFirst()) { + // the feed list isn't empty, do nothing + return; + } + String url, name; + url = "http://news.baidu.com/n?cmd=1&class=civilnews&tn=rss"; + name = "百度新闻(国内)"; + insertFeed(activity, url, name); + url = "http://news.baidu.com/n?cmd=1&class=internews&tn=rss"; + name = "百度新闻(国外)"; + insertFeed(activity, url, name); + url = "http://news.baidu.com/n?cmd=1&class=housenews&tn=rss"; + name = "百度新闻(房产)"; + insertFeed(activity, url, name); + url = "http://feed.williamlong.info/"; + name = "月光博客"; + insertFeed(activity, url, name); + url = "http://online.wsj.com/xml/rss/3_7085.xml"; + name = "华尔街日报(世界新闻,英文)"; + insertFeed(activity, url, name); + } + + private static boolean insertFeed(Activity activity, String url, String name) { + ContentValues values = new ContentValues(); + + values.put(FeedData.FeedColumns.URL, url); + values.put(FeedData.FeedColumns.NAME, name); + values.put(FeedData.FeedColumns.FETCHMODE, 0); + values.put(FeedData.FeedColumns.WIFIONLY, 0); + values.put(FeedData.FeedColumns.ERROR, (String) null); + try { + activity.getContentResolver().insert( + FeedData.FeedColumns.CONTENT_URI, values); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + @Override + public void onResume() { + super.onResume(); + MobclickAgent.onResume(this); + } + + @Override + public void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + } + +} diff --git a/src/cn/eric/rss/FeedPrefsActivity.java b/src/cn/eric/rss/FeedPrefsActivity.java index 186977e..46db0b7 100644 --- a/src/cn/eric/rss/FeedPrefsActivity.java +++ b/src/cn/eric/rss/FeedPrefsActivity.java @@ -1,66 +1,80 @@ -package cn.eric.rss; - -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; -import android.content.ContentValues; -import android.database.Cursor; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.preference.Preference.OnPreferenceChangeListener; - -public class FeedPrefsActivity extends PreferenceActivity { - - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.feedsettings); - - final String feedId = getIntent().getStringExtra(FeedData.FeedColumns._ID); - - OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { - public boolean onPreferenceChange(Preference pref, Object change) { - ContentValues values = new ContentValues(); - - if( pref.getKey().equals(Strings.FEED_SETTINGS_ALERT_RINGTONE)) { - values.put(FeedData.FeedColumns.ALERT_RINGTONE, change.toString()); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); - return true; - } else if(pref.getKey().equals(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE)) { - int val = change.equals(Boolean.TRUE) ? 1 : 0; - values.put(FeedData.FeedColumns.OTHER_ALERT_RINGTONE, val); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); - return true; - } else if(pref.getKey().equals(Strings.FEED_SETTINGS_SKIP_ALERT)) { - int val = change.equals(Boolean.TRUE) ? 1 : 0; - values.put(FeedData.FeedColumns.SKIP_ALERT, val); - getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); - return true; - } - return false; - } - }; - - CheckBoxPreference skipAlert = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_SKIP_ALERT); - CheckBoxPreference other_ringtone = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE); - Preference ringtone = findPreference(Strings.FEED_SETTINGS_ALERT_RINGTONE); - - skipAlert.setOnPreferenceChangeListener(listener); - ringtone.setOnPreferenceChangeListener(listener); - other_ringtone.setOnPreferenceChangeListener(listener); - - Cursor defaultValues = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), new String[] { - FeedData.FeedColumns.OTHER_ALERT_RINGTONE, - FeedData.FeedColumns.ALERT_RINGTONE, - FeedData.FeedColumns.SKIP_ALERT - }, null, null, null); - - defaultValues.moveToFirst(); - other_ringtone.setChecked(defaultValues.getInt(0) == 1); - ringtone.setDefaultValue(defaultValues.getString(1)); // XXX does not work - skipAlert.setChecked(defaultValues.getInt(2) == 1); - defaultValues.close(); - - } - -} +package cn.eric.rss; + +import com.umeng.analytics.MobclickAgent; + +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; +import android.content.ContentValues; +import android.database.Cursor; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.preference.Preference.OnPreferenceChangeListener; + +public class FeedPrefsActivity extends PreferenceActivity { + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.feedsettings); + + final String feedId = getIntent().getStringExtra(FeedData.FeedColumns._ID); + + OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { + public boolean onPreferenceChange(Preference pref, Object change) { + ContentValues values = new ContentValues(); + + if( pref.getKey().equals(Strings.FEED_SETTINGS_ALERT_RINGTONE)) { + values.put(FeedData.FeedColumns.ALERT_RINGTONE, change.toString()); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); + return true; + } else if(pref.getKey().equals(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE)) { + int val = change.equals(Boolean.TRUE) ? 1 : 0; + values.put(FeedData.FeedColumns.OTHER_ALERT_RINGTONE, val); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); + return true; + } else if(pref.getKey().equals(Strings.FEED_SETTINGS_SKIP_ALERT)) { + int val = change.equals(Boolean.TRUE) ? 1 : 0; + values.put(FeedData.FeedColumns.SKIP_ALERT, val); + getContentResolver().update(FeedData.FeedColumns.CONTENT_URI(feedId), values, null, null); + return true; + } + return false; + } + }; + + CheckBoxPreference skipAlert = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_SKIP_ALERT); + CheckBoxPreference other_ringtone = (CheckBoxPreference)findPreference(Strings.FEED_SETTINGS_OTHER_ALERT_RINGTONE); + Preference ringtone = findPreference(Strings.FEED_SETTINGS_ALERT_RINGTONE); + + skipAlert.setOnPreferenceChangeListener(listener); + ringtone.setOnPreferenceChangeListener(listener); + other_ringtone.setOnPreferenceChangeListener(listener); + + Cursor defaultValues = getContentResolver().query(FeedData.FeedColumns.CONTENT_URI(feedId), new String[] { + FeedData.FeedColumns.OTHER_ALERT_RINGTONE, + FeedData.FeedColumns.ALERT_RINGTONE, + FeedData.FeedColumns.SKIP_ALERT + }, null, null, null); + + defaultValues.moveToFirst(); + other_ringtone.setChecked(defaultValues.getInt(0) == 1); + ringtone.setDefaultValue(defaultValues.getString(1)); // XXX does not work + skipAlert.setChecked(defaultValues.getInt(2) == 1); + defaultValues.close(); + + } + + + @Override + public void onResume() { + super.onResume(); + MobclickAgent.onResume(this); + } + + @Override + public void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + } +} diff --git a/src/cn/eric/rss/MainTabActivity.java b/src/cn/eric/rss/MainTabActivity.java index 95fdf07..ab7bdad 100644 --- a/src/cn/eric/rss/MainTabActivity.java +++ b/src/cn/eric/rss/MainTabActivity.java @@ -25,6 +25,9 @@ package cn.eric.rss; +import com.umeng.analytics.MobclickAgent; +import com.umeng.update.UmengUpdateAgent; + import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; @@ -97,6 +100,8 @@ public void onCreate(Bundle savedInstanceState) { setTheme(R.style.Theme_Light); } super.onCreate(savedInstanceState); + MobclickAgent.updateOnlineConfig(this); + UmengUpdateAgent.update(this.getParent()); //We need to display progress information requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); @@ -125,8 +130,8 @@ protected void onResume() @Override protected void onPause() { - unregisterReceiver(refreshReceiver); super.onPause(); + unregisterReceiver(refreshReceiver); } @Override diff --git a/src/cn/eric/rss/RSSOverview.java b/src/cn/eric/rss/RSSOverview.java index 0a369ab..321c822 100644 --- a/src/cn/eric/rss/RSSOverview.java +++ b/src/cn/eric/rss/RSSOverview.java @@ -28,6 +28,8 @@ import java.io.File; import java.io.FilenameFilter; +import com.umeng.analytics.MobclickAgent; + import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; @@ -120,6 +122,9 @@ public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.main); listAdapter = new RSSOverviewListAdapter(this); setListAdapter(listAdapter); + + FeedConfigActivity.insertInitialFeeds(this); + getListView().setOnCreateContextMenuListener( new OnCreateContextMenuListener() { public void onCreateContextMenu(ContextMenu menu, @@ -260,7 +265,7 @@ public boolean onTouch(View v, MotionEvent event) { stopService(new Intent(this, RefreshService.class)); } if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean( - Strings.SETTINGS_REFRESHONPENENABLED, false)) { + Strings.SETTINGS_REFRESHONPENENABLED, true)) { new Thread() { public void run() { sendBroadcast(new Intent(Strings.ACTION_REFRESHFEEDS)); @@ -275,6 +280,7 @@ protected void onResume() { if (RSSOverview.notificationManager != null) { notificationManager.cancel(0); } + MobclickAgent.onResume(this); } @Override @@ -788,5 +794,11 @@ private void setFeedSortEnabled(boolean enabled) { feedSort = enabled; } } + + @Override + public void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + } } diff --git a/src/cn/eric/rss/widget/WidgetConfigActivity.java b/src/cn/eric/rss/widget/WidgetConfigActivity.java index 670e674..905e902 100644 --- a/src/cn/eric/rss/widget/WidgetConfigActivity.java +++ b/src/cn/eric/rss/widget/WidgetConfigActivity.java @@ -1,142 +1,155 @@ -/** - * Sparse rss - * - * Copyright (c) 2010-2012 Stefan Handschuh - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package cn.eric.rss.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.view.View; -import android.view.View.OnClickListener; -import cn.eric.rss.R; -import cn.eric.rss.provider.FeedData; - -public class WidgetConfigActivity extends PreferenceActivity { - private int widgetId; - - private static final String NAMECOLUMN = new StringBuilder("ifnull(").append(FeedData.FeedColumns.NAME).append(',').append(FeedData.FeedColumns.URL).append(") as title").toString(); - - public static final String ZERO = "0"; - - @Override - protected void onCreate(Bundle bundle) { - super.onCreate(bundle); - setResult(RESULT_CANCELED); - - Bundle extras = getIntent().getExtras(); - - if (extras != null) { - widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - } - if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { - finish(); - } - addPreferencesFromResource(R.layout.widgetpreferences); - setContentView(R.layout.widgetconfig); - - final ListPreference entryCountPreference = (ListPreference) findPreference("widget.entrycount"); - - final PreferenceCategory feedsPreferenceCategory = (PreferenceCategory) findPreference("widget.visiblefeeds"); - - - Cursor cursor = this.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID, NAMECOLUMN}, null, null, null); - - if (cursor.moveToFirst()) { - int[] ids = new int[cursor.getCount()+1]; - - CheckBoxPreference checkboxPreference = new CheckBoxPreference(this); - - checkboxPreference.setTitle(R.string.all_feeds); - feedsPreferenceCategory.addPreference(checkboxPreference); - checkboxPreference.setKey(ZERO); - checkboxPreference.setDisableDependentsState(true); - ids[0] = 0; - for (int n = 1; !cursor.isAfterLast(); cursor.moveToNext(), n++) { - checkboxPreference = new CheckBoxPreference(this); - checkboxPreference.setTitle(cursor.getString(1)); - ids[n] = cursor.getInt(0); - checkboxPreference.setKey(Integer.toString(ids[n])); - feedsPreferenceCategory.addPreference(checkboxPreference); - checkboxPreference.setDependency(ZERO); - } - cursor.close(); - - findViewById(R.id.save_button).setOnClickListener(new OnClickListener() { - public void onClick(View view) { - SharedPreferences.Editor preferences = getSharedPreferences(MiniRSSAppWidgetProvider.class.getName(), 0).edit(); - - boolean hideRead = false;//((CheckBoxPreference) getPreferenceManager().findPreference("widget.hideread")).isChecked(); - - preferences.putBoolean(widgetId+".hideread", hideRead); - - StringBuilder builder = new StringBuilder(); - - for (int n = 0, i = feedsPreferenceCategory.getPreferenceCount(); n < i; n++) { - CheckBoxPreference preference = (CheckBoxPreference) feedsPreferenceCategory.getPreference(n); - - if (preference.isChecked()) { - if (n == 0) { - break; - } else { - if (builder.length() > 0) { - builder.append(','); - } - builder.append(preference.getKey()); - } - } - } - - String feedIds = builder.toString(); - - String entryCount = entryCountPreference.getValue(); - - preferences.putString(widgetId+".feeds", feedIds); - preferences.putString(widgetId+".entrycount", entryCount); - - int color = getPreferenceManager().getSharedPreferences().getInt("widget.background", MiniRSSAppWidgetProvider.STANDARD_BACKGROUND); - - preferences.putInt(widgetId+".background", color); - preferences.commit(); - - MiniRSSAppWidgetProvider.updateAppWidget(WidgetConfigActivity.this, widgetId, hideRead, entryCount, feedIds, color); - setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); - finish(); - } - }); - } else { - // no feeds found --> use all feeds, no dialog needed - cursor.close(); - setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); - } - } - - -} +/** + * Sparse rss + * + * Copyright (c) 2010-2012 Stefan Handschuh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package cn.eric.rss.widget; + +import com.umeng.analytics.MobclickAgent; + +import android.appwidget.AppWidgetManager; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceCategory; +import android.view.View; +import android.view.View.OnClickListener; +import cn.eric.rss.R; +import cn.eric.rss.provider.FeedData; + +public class WidgetConfigActivity extends PreferenceActivity { + private int widgetId; + + private static final String NAMECOLUMN = new StringBuilder("ifnull(").append(FeedData.FeedColumns.NAME).append(',').append(FeedData.FeedColumns.URL).append(") as title").toString(); + + public static final String ZERO = "0"; + + @Override + protected void onCreate(Bundle bundle) { + super.onCreate(bundle); + setResult(RESULT_CANCELED); + + Bundle extras = getIntent().getExtras(); + + if (extras != null) { + widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + } + if (widgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { + finish(); + } + addPreferencesFromResource(R.layout.widgetpreferences); + setContentView(R.layout.widgetconfig); + + final ListPreference entryCountPreference = (ListPreference) findPreference("widget.entrycount"); + + final PreferenceCategory feedsPreferenceCategory = (PreferenceCategory) findPreference("widget.visiblefeeds"); + + + Cursor cursor = this.getContentResolver().query(FeedData.FeedColumns.CONTENT_URI, new String[] {FeedData.FeedColumns._ID, NAMECOLUMN}, null, null, null); + + if (cursor.moveToFirst()) { + int[] ids = new int[cursor.getCount()+1]; + + CheckBoxPreference checkboxPreference = new CheckBoxPreference(this); + + checkboxPreference.setTitle(R.string.all_feeds); + feedsPreferenceCategory.addPreference(checkboxPreference); + checkboxPreference.setKey(ZERO); + checkboxPreference.setDisableDependentsState(true); + ids[0] = 0; + for (int n = 1; !cursor.isAfterLast(); cursor.moveToNext(), n++) { + checkboxPreference = new CheckBoxPreference(this); + checkboxPreference.setTitle(cursor.getString(1)); + ids[n] = cursor.getInt(0); + checkboxPreference.setKey(Integer.toString(ids[n])); + feedsPreferenceCategory.addPreference(checkboxPreference); + checkboxPreference.setDependency(ZERO); + } + cursor.close(); + + findViewById(R.id.save_button).setOnClickListener(new OnClickListener() { + public void onClick(View view) { + SharedPreferences.Editor preferences = getSharedPreferences(MiniRSSAppWidgetProvider.class.getName(), 0).edit(); + + boolean hideRead = false;//((CheckBoxPreference) getPreferenceManager().findPreference("widget.hideread")).isChecked(); + + preferences.putBoolean(widgetId+".hideread", hideRead); + + StringBuilder builder = new StringBuilder(); + + for (int n = 0, i = feedsPreferenceCategory.getPreferenceCount(); n < i; n++) { + CheckBoxPreference preference = (CheckBoxPreference) feedsPreferenceCategory.getPreference(n); + + if (preference.isChecked()) { + if (n == 0) { + break; + } else { + if (builder.length() > 0) { + builder.append(','); + } + builder.append(preference.getKey()); + } + } + } + + String feedIds = builder.toString(); + + String entryCount = entryCountPreference.getValue(); + + preferences.putString(widgetId+".feeds", feedIds); + preferences.putString(widgetId+".entrycount", entryCount); + + int color = getPreferenceManager().getSharedPreferences().getInt("widget.background", MiniRSSAppWidgetProvider.STANDARD_BACKGROUND); + + preferences.putInt(widgetId+".background", color); + preferences.commit(); + + MiniRSSAppWidgetProvider.updateAppWidget(WidgetConfigActivity.this, widgetId, hideRead, entryCount, feedIds, color); + setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); + finish(); + } + }); + } else { + // no feeds found --> use all feeds, no dialog needed + cursor.close(); + setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)); + } + } + + + @Override + public void onResume() { + super.onResume(); + MobclickAgent.onResume(this); + } + + @Override + public void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + } +} From 7939e472920d7811e88a2a1c0f7025bdf1571ecf Mon Sep 17 00:00:00 2001 From: Ruobin Wang Date: Sat, 16 Mar 2013 01:20:09 +0800 Subject: [PATCH 04/19] change UI; disable the configs of theme style and text/background color; add admogo and domob SDK --- AndroidManifest.xml | 39 +- libs/AdsMOGO_Android_SDK_1.2.6.jar | Bin 0 -> 307776 bytes libs/domob_android_sdk_3.1.5.jar | Bin 0 -> 346811 bytes res/drawable-hdpi/list_divider.png | Bin 0 -> 929 bytes res/layout-hdpi/listitem_content.xml | 6 +- res/layout/entries.xml | 5 +- res/layout/entry.xml | 89 +- res/layout/entrylistitem.xml | 3 +- res/layout/feedlistitem.xml | 3 +- res/layout/feedsettings_content.xml | 9 +- res/layout/listitem_content.xml | 6 +- res/layout/main.xml | 9 +- res/layout/preferences.xml | 13 +- res/layout/widgetconfig.xml | 5 +- res/values/colors.xml | 8 + .../rss/ApplicationPreferencesActivity.java | 16 - src/cn/eric/rss/EntriesListActivity.java | 3 - src/cn/eric/rss/EntryActivity.java | 795 +++++++++++------- src/cn/eric/rss/FeedConfigActivity.java | 19 +- src/cn/eric/rss/MainTabActivity.java | 18 +- src/cn/eric/rss/RSSOverview.java | 9 +- src/cn/eric/rss/Strings.java | 376 ++++----- 22 files changed, 813 insertions(+), 618 deletions(-) create mode 100644 libs/AdsMOGO_Android_SDK_1.2.6.jar create mode 100644 libs/domob_android_sdk_3.1.5.jar create mode 100644 res/drawable-hdpi/list_divider.png create mode 100644 res/values/colors.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index dcd3846..f27f3d8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,18 +2,26 @@ + android:versionCode="5" + android:versionName="1.04" > + + + - + + + + + + @@ -134,13 +142,34 @@ + android:value="anzhi" /> + + + + + + + + + + + \ No newline at end of file diff --git a/libs/AdsMOGO_Android_SDK_1.2.6.jar b/libs/AdsMOGO_Android_SDK_1.2.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..483e940c9fbc92a142c620cb72aab1a3e153cdec GIT binary patch literal 307776 zcmbTcWl)@5*CiY*SOdY`-QC^Y-QC^Yp>cPDYjAgWcMom>f@`qAko$Sw@0*&MJ3pqo z&Q(`eTh(4`@3Z#WM?o449OV-f6x1i56f>bu|JwuQ<6c%&MUYlfPK;hwP)<@zR9S^i zR_s=GazaL$mTnGCnwDyMa;8CvVUc;~aPJWGlY%rPRJ}jw1@^~RF+Y~VzyA22ca80B z=?zVsZSBqN>22*zOl{~5>5Od*ot;HzWTgiLzI@(sm$7}Wvy%O7(exlppBXI8+q^fF zq;M>F)h%l!VTm-m^M0cMj_~%$KbfO}#>Frvt@h01$FIv5$X?uPD~=n--TnGl+%xEx z{=iuz_)q~0_8mdWtR0PA0B)$W3#ylpJ_eMqVF(=v_~rADP=zk}+eRM(6}%`9$vko) z2JH-l!WA<4JLjj=A7jb%fR!L>qQ*j^1v0;x$f8-y9&PKkn6{!JYIPwC+m1=}3R4xM z$t17NuQNSIgoMUdS!~{PFLaP}VRYhjl5QsQPuBgvJg&nXOfaBfwq74}t{ zr_00SXHSrSLRV}_$9DG-7z>cUg^u?B8ahD}XW5TH3ftS6S(=L&x){n>I=lQQoW;tr z_DG5-ya*Vd9lpdHX_sjwH-mlK7vB>zB5_#=DT!jkYWD^ZD?tte6bktViX}H&k4s=< zq>yD7S4EKDqhCtuw%B>7G~Ba?Jl!ukE;nwcH=dqe_RT-BI|_$Z6P4~oMpjT&hwcjN z^kzW4hKuF_2nY!%4TJ=wdNtwD8LJ4RqJf-~7U?6TaIi#aBb;!+fYWr7tJ5}8pto1G z5f^Rn3O8-(E=I}1MSHBR_637zM%a|t$Vpp?Y4Xo()A5w94Wi2%ZoD~PU~+eIh0T?$ z-D>A1gPIj~>RRz;q94=SM*9xmG|dgE@9)8%!lDay&0jY=0DT1jP}5R7Mur=5*5i#+ zHrv93_E*i~HN=(3YPYs0j|_gzeOB#7C#Im4Q zH`f88XyjDy3kuO!{e6r?e`V`9ouiW-(6RT8BpS!6)CS4*K)KttP=IWHE^sj{9D|X* z0Hjb=6bhXI4yfrRJxhf*^bX(GqBlBdFn*3nga~o{N+Vr zU)6GRng15hzZISrx3ILA>LG1UNXB%+*I0vb_H25ls7qF~P399ou`V8+Z0e|&*h7FB z%I6(_8uxOdtr{pOC;IlKbPQc99RV2~_{LPiVdSj*0z(NF$Pq3mO7B8l=nNu13MDB+cQrMq#U@ z58=N7fXZ|Zkv5uI*aOTwCBVnfzd0o6pCJbm9bVG*IG`se^ju6*uHJR5VmIls6PK6gQMLR5p|}6ei6* z7mIp௾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