Home | History | Annotate | Download | only in data
      1 /*
      2  * Copyright (C) 2016 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.android.tv.data;
     18 
     19 import android.support.annotation.Nullable;
     20 import android.text.TextUtils;
     21 import android.util.Log;
     22 
     23 import com.android.tv.data.Program.CriticScore;
     24 import com.android.tv.dvr.data.RecordedProgram;
     25 
     26 import java.io.ByteArrayInputStream;
     27 import java.io.ByteArrayOutputStream;
     28 import java.io.IOException;
     29 import java.io.ObjectInputStream;
     30 import java.io.ObjectOutputStream;
     31 import java.util.List;
     32 
     33 /**
     34  * A utility class to parse and store data from the
     35  * {@link android.media.tv.TvContract.Programs#COLUMN_INTERNAL_PROVIDER_DATA} field in the
     36  * {@link android.media.tv.TvContract.Programs}.
     37  */
     38 public final class InternalDataUtils {
     39     private static final boolean DEBUG = false;
     40     private static final String TAG = "InternalDataUtils";
     41 
     42     private InternalDataUtils() {
     43         //do nothing
     44     }
     45 
     46     /**
     47      * Deserializes a byte array into objects to be stored in the Program class.
     48      *
     49      * <p> Series ID and critic scores are loaded from the bytes.
     50      *
     51      * @param bytes the bytes to be deserialized
     52      * @param builder the builder for the Program class
     53      */
     54     public static void deserializeInternalProviderData(byte[] bytes, Program.Builder builder) {
     55         if (bytes == null || bytes.length == 0) {
     56             return;
     57         }
     58         try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
     59             builder.setSeriesId((String) in.readObject());
     60             builder.setCriticScores((List<CriticScore>) in.readObject());
     61         } catch (NullPointerException e) {
     62             Log.e(TAG, "no bytes to deserialize");
     63         } catch (IOException e) {
     64             Log.e(TAG, "Could not deserialize internal provider contents");
     65         } catch (ClassNotFoundException e) {
     66             Log.e(TAG, "class not found in internal provider contents");
     67         }
     68     }
     69 
     70     /**
     71      * Convenience method for converting relevant data in Program class to a serialized blob type
     72      * for storage in internal_provider_data field.
     73      * @param program the program which contains the objects to be serialized
     74      * @return serialized blob-type data
     75      */
     76     @Nullable
     77     public static byte[] serializeInternalProviderData(Program program) {
     78         ByteArrayOutputStream bos = new ByteArrayOutputStream();
     79         try (ObjectOutputStream out = new ObjectOutputStream(bos)) {
     80             if (!TextUtils.isEmpty(program.getSeriesId()) || program.getCriticScores() != null) {
     81                 out.writeObject(program.getSeriesId());
     82                 out.writeObject(program.getCriticScores());
     83                 return bos.toByteArray();
     84             }
     85         } catch (IOException e) {
     86             Log.e(TAG, "Could not serialize internal provider contents for program: "
     87                     + program.getTitle());
     88         }
     89         return null;
     90     }
     91 
     92     /**
     93      * Deserializes a byte array into objects to be stored in the RecordedProgram class.
     94      *
     95      * <p> Series ID is loaded from the bytes.
     96      *
     97      * @param bytes the bytes to be deserialized
     98      * @param builder the builder for the RecordedProgram class
     99      */
    100     public static void deserializeInternalProviderData(byte[] bytes,
    101             RecordedProgram.Builder builder) {
    102         if (bytes == null || bytes.length == 0) {
    103             return;
    104         }
    105         try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
    106             builder.setSeriesId((String) in.readObject());
    107         } catch (NullPointerException e) {
    108             Log.e(TAG, "no bytes to deserialize");
    109         } catch (IOException e) {
    110             Log.e(TAG, "Could not deserialize internal provider contents");
    111         } catch (ClassNotFoundException e) {
    112             Log.e(TAG, "class not found in internal provider contents");
    113         }
    114     }
    115 
    116     /**
    117      * Serializes relevant objects in {@link android.media.tv.TvContract.Programs} to byte array.
    118      * @return the serialized byte array
    119      */
    120     public static byte[] serializeInternalProviderData(RecordedProgram program) {
    121         ByteArrayOutputStream bos = new ByteArrayOutputStream();
    122         try (ObjectOutputStream out = new ObjectOutputStream(bos)) {
    123             if (!TextUtils.isEmpty(program.getSeriesId())) {
    124                 out.writeObject(program.getSeriesId());
    125                 return bos.toByteArray();
    126             }
    127         } catch (IOException e) {
    128             Log.e(TAG, "Could not serialize internal provider contents for program: "
    129                     + program.getTitle());
    130         }
    131         return null;
    132     }
    133 }