1 /*
2  * Copyright 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.sampletvinput.rich;
18 
19 import android.content.ContentResolver;
20 import android.content.Context;
21 import android.net.Uri;
22 import android.util.Log;
23 import android.util.Xml;
24 
25 import com.example.android.sampletvinput.R;
26 import com.example.android.sampletvinput.rich.RichTvInputService.ChannelInfo;
27 import com.example.android.sampletvinput.rich.RichTvInputService.TvInput;
28 
29 import org.xmlpull.v1.XmlPullParser;
30 import org.xmlpull.v1.XmlPullParserException;
31 
32 import java.io.IOException;
33 import java.io.InputStream;
34 import java.net.URL;
35 import java.net.URLConnection;
36 import java.util.List;
37 
38 /**
39  * Static helper methods for fetching the channel feed.
40  */
41 public class RichFeedUtil {
42     private static final String TAG = "RichFeedUtil";
43     private static List<ChannelInfo> sSampleChannels;
44     private static TvInput sTvInput;
45 
46     private static final boolean USE_LOCAL_XML_FEED = false;
47 
RichFeedUtil()48     private RichFeedUtil() {
49     }
50 
51     /**
52      * Returns the channel metadata for {@link RichTvInputService}. Note that this will block until
53      * the channel feed has been retrieved.
54      */
getRichChannels(Context context)55     public static List<ChannelInfo> getRichChannels(Context context) {
56         Uri catalogUri =
57                 USE_LOCAL_XML_FEED ?
58                         Uri.parse("android.resource://" + context.getPackageName() + "/"
59                                 + R.raw.rich_tv_inputs_tif)
60                         : Uri.parse(context.getResources().getString(R.string.rich_input_feed_url));
61         if (sSampleChannels != null) {
62             return sSampleChannels;
63         }
64 
65         InputStream inputStream = null;
66         try {
67             if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(catalogUri.getScheme())) {
68                 inputStream = context.getContentResolver().openInputStream(catalogUri);
69             } else {
70                 URLConnection urlConnection = new URL(catalogUri.toString()).openConnection();
71                 inputStream = urlConnection.getInputStream();
72             }
73 
74             XmlPullParser parser = Xml.newPullParser();
75             parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
76             parser.setInput(inputStream, null);
77             sTvInput = ChannelXMLParser.parseTvInput(parser);
78             sSampleChannels = ChannelXMLParser.parseChannelXML(parser);
79         } catch (IOException e) {
80             Log.e(TAG, "Error in fetching " + catalogUri, e);
81         } catch (XmlPullParserException e) {
82             Log.e(TAG, "Error in parsing " + catalogUri, e);
83         } finally {
84             if (inputStream != null) {
85                 try {
86                     inputStream.close();
87                 } catch (IOException e) {
88                     // Do nothing.
89                 }
90             }
91         }
92         return sSampleChannels;
93     }
94 
getTvInput(Context context)95     public static TvInput getTvInput(Context context) {
96         if (sTvInput == null) {
97             getRichChannels(context);
98         }
99         return sTvInput;
100     }
101 }
102