diff --git a/res/layout/channel_list_widget.xml b/res/layout/channel_list_widget.xml index 09c94af..74a79ca 100644 --- a/res/layout/channel_list_widget.xml +++ b/res/layout/channel_list_widget.xml @@ -11,12 +11,25 @@ android:layout_marginRight="5sp" > - + + + + + + + - TVHGuide - Hilfe - Einstellungen - Aktualisieren - Tags - Aufnahmen + "TVHGuide" + "Hilfe" + "Einstellungen" + "Aktualisieren" + "Tags" + "Aufnahmen" + "Aufnahme" + "Aufnahme abbrechen" + "Aufnahme entfernen" + "Hostname" + "Hostname eingeben" + "Port" + "Server-Port eingeben" + "Benutzername" + "Benutzername eingeben" + "Passwort" + "Passwort eingeben" + "Benutzerschnittstelle" + "Kanal-Logos" + "Kanal-Logos anzeigen? (verbraucht mehr Speicher)" + "Helles Thema" + "Helle Darstellung benutzen?" + "Auflösung" + "Maximale Auflösung für den Transcoder" + "Audio-Codec" + "Audio-Codec des Transcoders verwenden" + "Video-Codec" + "Video-Codec des Transcoder verwenden" + "Untertitel Codec" + "Untertitel Codec des Transcoder verwenden" + "Medien-Container" + "Bevorzugter Medien-Container" + "Wiedergabe" + "HTTP-Port" + "HTTP-Port des Servers" + "Stream transkodieren" + "Transkodiere Stream während live Wiedergabe" + "Bevorzuge externen Videoplayer" + "Soll ein externer Video-Player benutz werden? (z.B. BSPlayer)" + "Zugriff verweigert" + "Ungültige Antwort vom Server" + "Keine Verbindung zum Server möglich" + "Verbindung zum Server verloren" + "Ladevorgang läuft…" + "Bitte warten Sie ein paar Sekunden…" + "Alle Kanäle" + "Mehr" + "Staffel" + "Folge" + "Teil" + "Ausstrahlung" + "Bewertung" + "Genre" + "Teil" - Hostname - Hostnamen des Servers eingeben + + "Film / Drama" + "Nachrichten / Aktuelles" + "Show / Spielshow" + "Sport" + "Kinder / Jugend" + "Musik / Ballett / Tanz" + "Kunst / Kultur" + "Gesellschaft / Politik / Wirtschaft" + "Bildung / Wissenschaft" + "Freizeit / Hobbys" + "Verschiedenes" + + + "Film / Drama" + "Krimi / Thriller" + "Abenteuer / Western / Krieg" + "Science Fiction / Fantasy / Horror" + "Komödie" + "Seife Oper / Melodrama / Folklore" + "Romanze" + "Historisches" + "Erwachsenen Film / Drama" + + + "Nachrichten / Aktuelles" + "Nachrichten / Wetterbericht" + "Magazin" + "Dokumentation" + "Diskussion / Interview / Debatte" + + + "Show / Spielshow" + "Spiel Show / Quiz / Contest" + "Varietee" + "Unterhaltung" + + + "Sport" + "Sondersendung" + "Magazin" + "Fußball" + "Tennis / Squash" + "Mannschaftssport" + "Leichtathletik" + "Motorsport" + "Wassersport" + "Wintersport" + "Reitsport" + "Kampfsport" + + + "Kinder / Jugend" + "Vorschul" + "Unterhaltung (6 bis 14-Jährigen)" + "Unterhaltung (10 bis 16-Jährigen)" + "Informativ / Bildung / Schulen" + "Cartoons / Puppets" + + + "Musik / Ballett / Tanz" + "Rock und Pop" + "Klassik" + "Folk / Traditionelle Musik" + "Jazz" + "Musical / Oper" + "Ballet" + + + "Kunst / Kultur" + "Darstellenden Kunst" + "Ästhetisches" + "Religion" + "Pop Kultur / Traditionelle Kunst" + "Literatur" + "Film / Kino" + "Experimenteller Film / Video" + "Rundfunk / Presse" + "Neue Medien" + "Magazin" + "Mode" + + + "Gesellschaft / Politik / Wirtschaft" + "Magazin / Report / Dokumentation" + "Wirtschaft / Soziales Engagement" + "Bemerkenswerte Menschen" + + + "Bildung / Wissenschaft" + "Natur / Tiere / Umwelt" + "Technik / Naturwissenschaften" + "Medizin / Physiologie / Psychologie" + "Ausland / Expeditionen" + "Soziales / Spirituelles" + "Weiterbildung" + "Sprachen" + + + "Freizeit / Hobbys" + "Tourismus / Reisen" + "Handwerk" + "Motorsport" + "Fitness und Gesundheit" + "Kochen" + "Werbung / Shopping" + "Garten" + + + "Verschiedenes" + "Schwarz / Weiß" + "Unveröffentlicht" + "Live-Sendung" + - Port - Port der Servers eingeben + "Geplant" + "Aufzeichnung" + "Abgeschlossen" + "Entgangen" + "Ungültig" + "Abspielen" + "Keine Übertragung" + "EPG durchsuchen" + "heute" - Benutzername - Benutzernamen eingeben - - Passwort - Passwort eingeben - - Kanal-Logos - Kanal-Logos anzeigen? - - Zugriff verweigert - Ungültige Antwort des Servers - Konnte nicht mit dem Server verbinden - Verbindung zum Server verloren - - Lade... - Bitte warten Sie einen Moment... - - Alle Kanäle - - Geplant - Aufnahme - Fertig - Verpasst - Ungültig \ No newline at end of file diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 58b2319..db52f94 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -87,4 +87,133 @@ Sök i programtablån idag + + + + Movie/Drama + News/Current affairs + Show/Game show + Sports + Children\'s / Youth + Music/Ballet/Dance + Arts/Culture + Social/Political issues/Economics + Education/Science/Factual + Leisure hobbies + Misc + + + + Movie/Drama + Detective/Thriller + Adventure/Western/War + Science Fiction/Fantasy/Horror + Comedy + Soap/Melodrama/Folkloric + Romance + Serious/ClassicalReligion/Historical + Adult Movie/Drama + + + + News/Current affairs + News/Weather Report + Magazine + Documentary + Discussion/Interview/Debate + + + + Show/Game show + Game show/Quiz/Contest + Variety + Talk + + + + Sports + Special Event + Magazine + Football/Soccer + Tennis/Squash + Team sports + Athletics + Motor Sport + Water Sport + Winter Sports + Equestrian + Martial sports + + + + Children\'s / Youth + Pre-school + Entertainment (6 to 14 year-olds) + Entertainment (10 to 16 year-olds) + Informational/Educational/Schools + Cartoons/Puppets + + + + Music/Ballet/Dance + Rock/Pop + Serious music/Classical Music + Folk/Traditional music + Jazz + Musical/Opera + Ballet + + + + Arts/Culture + Performing Arts + Fine Arts + Religion + Popular Culture/Tradital Arts + Literature + Film/Cinema + Experimental Film/Video + Broadcasting/Press + New Media + Magazine + Fashion + + + + Social/Political issues/Economics + Magazine/Report/Domentary + Economics/Social Advisory + Remarkable People + + + + + Education/Science/Factual + Nature/Animals/Environment + Technology/Natural sciences + Medicine/Physiology/Psychology + Foreign Countries/Expeditions + Social/Spiritual Sciences + Further Education + Languages + + + + Leisure hobbies + Tourism/Travel + Handicraft + Motoring + Fitness and Health + Cooking + Advertisement/Shopping + Gardening + + + + Misc + Black and White + Unpublished + Live Broadcast + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index ec275ac..e6070b1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -27,7 +27,7 @@ User interface Channel icons - Show channel icons? + Show channel icons? (consumes more memory) Light theme Use a light theme @@ -45,7 +45,7 @@ Subtitle codec to use with the transcoder Media container - Prefered media container + Preferred media container Playback diff --git a/src/org/tvheadend/tvhguide/ChannelListViewWrapper.java b/src/org/tvheadend/tvhguide/ChannelListViewWrapper.java index 37c68d6..fa2a86e 100644 --- a/src/org/tvheadend/tvhguide/ChannelListViewWrapper.java +++ b/src/org/tvheadend/tvhguide/ChannelListViewWrapper.java @@ -18,8 +18,13 @@ */ package org.tvheadend.tvhguide; +import java.util.Date; +import java.util.Iterator; + +import org.tvheadend.tvhguide.model.Channel; +import org.tvheadend.tvhguide.model.Programme; + import android.content.SharedPreferences; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ClipDrawable; import android.preference.PreferenceManager; import android.text.format.DateFormat; @@ -27,11 +32,6 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; -import java.util.Date; -import java.util.Iterator; -import org.tvheadend.tvhguide.R; -import org.tvheadend.tvhguide.model.Channel; -import org.tvheadend.tvhguide.model.Programme; /** * @@ -45,6 +45,7 @@ public class ChannelListViewWrapper { private TextView nextTitle; private TextView nextTime; private ImageView icon; + private ImageView iconRec; private ImageView nowProgressImage; private ClipDrawable nowProgress; @@ -60,6 +61,7 @@ public ChannelListViewWrapper(View base) { nextTitle = (TextView) base.findViewById(R.id.ch_next_title); nextTime = (TextView) base.findViewById(R.id.ch_next_time); icon = (ImageView) base.findViewById(R.id.ch_icon); + iconRec = (ImageView) base.findViewById(R.id.ch_icon_rec); } public void repaint(Channel channel) { @@ -74,15 +76,24 @@ public void repaint(Channel channel) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(icon.getContext()); Boolean showIcons = prefs.getBoolean("showIconPref", false); - icon.setVisibility(showIcons ? ImageView.VISIBLE : ImageView.GONE); - icon.setBackgroundDrawable(new BitmapDrawable(channel.iconBitmap)); + if(showIcons){ + icon.setVisibility(ImageView.VISIBLE); + iconRec.setVisibility(ImageView.VISIBLE); + icon.setImageBitmap(channel.iconBitmap); + } + else{ + icon.setVisibility(ImageView.GONE); + iconRec.setVisibility(ImageView.GONE); + icon.setImageDrawable(null); + } - if (channel.isRecording()) { - icon.setImageResource(R.drawable.ic_rec_small); - } else { - icon.setImageDrawable(null); + if (channel.isRecording() && showIcons) { + iconRec.setImageResource(R.drawable.ic_rec_small); + } else { + iconRec.setImageDrawable(null); } icon.invalidate(); + iconRec.invalidate(); Iterator it = channel.epg.iterator(); if (!channel.isTransmitting && it.hasNext()) { diff --git a/src/org/tvheadend/tvhguide/htsp/HTSService.java b/src/org/tvheadend/tvhguide/htsp/HTSService.java index fcf6bcd..bf1bbcf 100644 --- a/src/org/tvheadend/tvhguide/htsp/HTSService.java +++ b/src/org/tvheadend/tvhguide/htsp/HTSService.java @@ -18,15 +18,6 @@ */ package org.tvheadend.tvhguide.htsp; -import android.app.Service; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Binder; -import android.os.IBinder; -import android.util.Log; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; @@ -43,6 +34,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; + import org.tvheadend.tvhguide.R; import org.tvheadend.tvhguide.TVHGuideApplication; import org.tvheadend.tvhguide.model.Channel; @@ -55,6 +47,18 @@ import org.tvheadend.tvhguide.model.Stream; import org.tvheadend.tvhguide.model.Subscription; +import android.app.Service; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Binder; +import android.os.IBinder; +import android.preference.PreferenceManager; +import android.util.Log; + /** * * @author john-tornblom @@ -575,46 +579,60 @@ public void cacheImage(String url, File f) throws MalformedURLException, IOExcep OutputStream os = new FileOutputStream(f); - float scale = getResources().getDisplayMetrics().scaledDensity; + float scale = getResources().getDisplayMetrics().density; int width = (int) (64 * scale); int height = (int) (64 * scale); BitmapFactory.Options o = new BitmapFactory.Options(); - o.outWidth = width; - o.outHeight = height; + o.inJustDecodeBounds = true; + BitmapFactory.decodeStream(is, null, o); + is.close(); + if (url.startsWith("http")) { + is = new BufferedInputStream(new URL(url).openStream()); + } + else if (connection.getProtocolVersion() > 9) { + is = new HTSFileInputStream(connection, url); + } + + int ratio = Math.max(o.outWidth / width, o.outHeight / height); + int sampleSize = Integer.highestOneBit((int) Math.floor(ratio)); + + o = new BitmapFactory.Options(); + o.inSampleSize = sampleSize; Bitmap bitmap = BitmapFactory.decodeStream(is, null, o); if(bitmap != null) { - Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); - bitmap.recycle(); - - resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, os); - resizedBitmap.recycle(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, os); } os.close(); - is.close(); + is.close(); } private Bitmap getIcon(final String url) throws MalformedURLException, IOException { if (url == null || url.length() == 0) { return null; } - + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + Boolean showIcons = prefs.getBoolean("showIconPref", false); + if(!showIcons){ + return null; // This will drastically reduce memory consumption if many channels with icons are available! + } File dir = getCacheDir(); File f = new File(dir, hashString(url) + ".png"); if (!f.exists()) { cacheImage(url, f); } - - return BitmapFactory.decodeFile(f.toString()); + + return BitmapFactory.decodeFile(f.toString()); } private void getChannelIcon(final Channel ch) { execService.execute(new Runnable() { - public void run() { + @Override + public void run() { try { ch.iconBitmap = getIcon(ch.icon);