package com.commonsware.empublite; import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.content.SharedPreferences; import android.content.res.AssetManager; import android.os.Bundle; import android.os.Process; import android.preference.PreferenceManager; import android.util.Log; import com.google.gson.Gson; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.concurrent.atomic.AtomicReference; public class ModelFragment extends Fragment { final private AtomicReference<BookContents> contents= new AtomicReference<>(); final private AtomicReference<SharedPreferences> prefs= new AtomicReference<>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public void onAttach(Activity host) { super.onAttach(host); EventBus.getDefault().register(this); if (contents.get()==null) { new LoadThread(host).start(); } } @Override public void onDetach() { EventBus.getDefault().unregister(this); super.onDetach(); } @SuppressWarnings("unused") @Subscribe(threadMode =ThreadMode.BACKGROUND) public void onBookUpdated(BookUpdatedEvent event) { if (getActivity()!=null) { new LoadThread(getActivity()).start(); } } public BookContents getBook() { return(contents.get()); } public SharedPreferences getPrefs() { return(prefs.get()); } private class LoadThread extends Thread { final private Context ctxt; LoadThread(Context ctxt) { super(); this.ctxt=ctxt.getApplicationContext(); } @Override public void run() { prefs.set(PreferenceManager.getDefaultSharedPreferences(ctxt)); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Gson gson=new Gson(); File baseDir= new File(ctxt.getFilesDir(), DownloadCheckService.UPDATE_BASEDIR); try { InputStream is; if (baseDir.exists()) { is=new FileInputStream(new File(baseDir, "contents.json")); } else { is=ctxt.getAssets().open("book/contents.json"); } BufferedReader reader= new BufferedReader(new InputStreamReader(is)); contents.set(gson.fromJson(reader, BookContents.class)); if (baseDir.exists()) { contents.get().setBaseDir(baseDir); } EventBus.getDefault().post(new BookLoadedEvent(getBook())); } catch (IOException e) { Log.e(getClass().getSimpleName(), "Exception parsing JSON", e); } } } }