1 /***
2 * Ambient - A music player for the Android platform
3 Copyright (C) 2007 Martin Vysny
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 package sk.baka.ambient;
20
21 import java.io.BufferedInputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.net.URL;
25 import java.net.URLConnection;
26
27 import sk.baka.ambient.commons.CountingInputStream;
28 import sk.baka.ambient.commons.MiscUtils;
29
30 /***
31 * Notifies periodically the {@link BackgroundOpExecutor} about its progress.
32 *
33 * @author Martin Vysny
34 */
35 public class NotifyingInputStream extends CountingInputStream {
36 private final int length;
37 private final String caption;
38
39 /***
40 * @param in
41 * input stream
42 * @param length
43 * the length of the content.
44 * @param parts
45 * reports the progress {@code parts} times.
46 * @param caption
47 * the caption to set.
48 */
49 public NotifyingInputStream(final InputStream in, final int length,
50 final int parts, final String caption) {
51 super(in, length / parts);
52 this.length = length;
53 this.caption = caption;
54 executor = AmbientApplication.getInstance().getBackgroundTasks();
55 }
56
57 /***
58 * Creates an input stream from given URL. If the url fails to supply
59 * content length then a simple buffered input stream is returned.
60 *
61 * @param url
62 * the URL to open.
63 * @param parts
64 * reports the progress {@code parts} times.
65 * @param caption
66 * the caption to set.
67 * @return the stream instance.
68 * @throws IOException
69 */
70 public static InputStream fromURL(final URL url, final int parts,
71 final String caption) throws IOException {
72 final URLConnection conn = url.openConnection();
73 final int length = conn.getContentLength();
74 final InputStream source = new BufferedInputStream(conn
75 .getInputStream());
76 return length > 0 ? new NotifyingInputStream(source, length, parts,
77 caption) : source;
78 }
79
80 private final BackgroundOpExecutor executor;
81
82 @Override
83 protected void countEvent(long currentPosition) {
84 MiscUtils.sysout("CurrentPosition:" + currentPosition + " Length:"
85 + length);
86 executor.backgroundTask(0, caption, (int) currentPosition, length);
87 }
88 }