Added Android code
[wl-app.git] / Android / folioreader / src / main / java / com / folioreader / ui / base / ManifestTask.java
1 package com.folioreader.ui.base;
2
3 import android.os.AsyncTask;
4 import android.util.Log;
5
6 import com.fasterxml.jackson.databind.ObjectMapper;
7 import com.folioreader.util.AppUtil;
8
9 import org.readium.r2_streamer.model.publication.EpubPublication;
10 import org.readium.r2_streamer.model.tableofcontents.TOCLink;
11
12 import java.io.BufferedReader;
13 import java.io.IOException;
14 import java.io.InputStream;
15 import java.io.InputStreamReader;
16 import java.net.URL;
17 import java.net.URLConnection;
18
19 /**
20  * Background async task which makes API call to get Epub publication
21  * manifest from server
22  *
23  * @author by gautam on 12/6/17.
24  */
25
26 public class ManifestTask extends AsyncTask<String, Void, EpubPublication> {
27
28     private static final String TAG = "ManifestTask";
29
30     private ManifestCallBack manifestCallBack;
31
32     public ManifestTask(ManifestCallBack manifestCallBack) {
33         this.manifestCallBack = manifestCallBack;
34     }
35
36     @Override
37     protected EpubPublication doInBackground(String... urls) {
38         String strUrl = urls[0];
39
40         try {
41             URL url = new URL(strUrl);
42             URLConnection urlConnection = url.openConnection();
43             InputStream inputStream = urlConnection.getInputStream();
44             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, AppUtil.charsetNameForURLConnection(urlConnection)));
45             StringBuilder stringBuilder = new StringBuilder();
46             String line;
47             while ((line = bufferedReader.readLine()) != null) {
48                 stringBuilder.append(line);
49             }
50
51             ObjectMapper objectMapper = new ObjectMapper();
52             return objectMapper.readValue(stringBuilder.toString(), EpubPublication.class);
53         } catch (IOException e) {
54             Log.e(TAG, "ManifestTask failed", e);
55         }
56         return null;
57     }
58
59     @Override
60     protected void onPostExecute(EpubPublication publication) {
61         if (publication != null) {
62             //TODO can be implemented in r2-streamer?
63             if (publication.tableOfContents != null) {
64                 for (TOCLink link : publication.tableOfContents) {
65                     setBookTitle(link, publication);
66                 }
67             }
68             manifestCallBack.onReceivePublication(publication);
69         } else {
70             manifestCallBack.onError();
71         }
72         cancel(true);
73     }
74
75     private void setBookTitle(TOCLink link, EpubPublication publication) {
76         for (int i = 0; i < publication.spines.size(); i++) {
77             if (publication.spines.get(i).href.equals(link.href)) {
78                 publication.spines.get(i).bookTitle = link.bookTitle;
79                 return;
80             }
81         }
82     }
83 }