package com.erakk.lnreader.UI.fragment;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.erakk.lnreader.Constants;
import com.erakk.lnreader.LNReaderApplication;
import com.erakk.lnreader.R;
import com.erakk.lnreader.UI.activity.DisplayLightNovelContentActivity;
import com.erakk.lnreader.UI.activity.NovelListContainerActivity;
import com.erakk.lnreader.UIHelper;
import com.erakk.lnreader.adapter.UpdateInfoModelAdapter;
import com.erakk.lnreader.callback.ICallbackEventData;
import com.erakk.lnreader.callback.IExtendedCallbackNotifier;
import com.erakk.lnreader.dao.NovelsDao;
import com.erakk.lnreader.model.UpdateInfoModel;
import com.erakk.lnreader.model.UpdateTypeEnum;
import com.erakk.lnreader.task.AsyncTaskResult;
import com.erakk.lnreader.task.LoadUpdatesTask;
import java.util.ArrayList;
import java.util.Arrays;
public class UpdateInfoFragment extends Fragment implements IExtendedCallbackNotifier<AsyncTaskResult<?>> {
private static final String TAG = UpdateInfoFragment.class.toString();
private ArrayList<UpdateInfoModel> updateList;
private ListView updateListView;
private UpdateInfoModelAdapter adapter;
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public UpdateInfoFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_update_history, null);
updateListView = (ListView) view.findViewById(R.id.update_list);
updateListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
UpdateInfoModel item = updateList.get(arg2);
openChapter(item);
}
});
updateContent();
LNReaderApplication.getInstance().setUpdateServiceListener(this);
registerForContextMenu(updateListView);
getActivity().setTitle(getResources().getString(R.string.updates));
LNReaderApplication.getInstance().setUpdateServiceListener(this);
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_update_history, menu);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.context_menu_update_history, menu);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
UpdateInfoModel chapter = updateList.get(info.position);
if (chapter.getUpdateType() == UpdateTypeEnum.NewNovel) {
menu.findItem(R.id.menu_open_chapter).setVisible(false);
} else {
menu.findItem(R.id.menu_open_chapter).setVisible(true);
}
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.menu_open_chapter:
if (info.position > -1) {
UpdateInfoModel chapter = updateList.get(info.position);
openChapter(chapter);
}
return true;
case R.id.menu_open_details:
if (info.position > -1) {
UpdateInfoModel chapter = updateList.get(info.position);
openDetails(chapter);
}
return true;
case R.id.menu_update_delete_selected:
if (info.position > -1) {
UpdateInfoModel chapter = updateList.get(info.position);
NovelsDao.getInstance().deleteUpdateHistory(chapter);
updateContent();
}
return true;
default:
return super.onContextItemSelected(item);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_clear_all:
NovelsDao.getInstance().deleteAllUpdateHistory();
updateContent();
return true;
case R.id.menu_clear_selected:
if (updateList == null) return false;
for (UpdateInfoModel updateInfo : updateList) {
if (updateInfo.isSelected())
NovelsDao.getInstance().deleteUpdateHistory(updateInfo);
}
updateContent();
return true;
case R.id.menu_show_updated:
if (adapter != null) {
item.setChecked(!item.isChecked());
adapter.filterUpdated(item.isChecked());
}
return true;
case R.id.menu_show_new:
if (adapter != null) {
item.setChecked(!item.isChecked());
adapter.filterNew(item.isChecked());
}
return true;
case R.id.menu_show_deleted:
if (adapter != null) {
item.setChecked(!item.isChecked());
adapter.filterDeleted(item.isChecked());
}
return true;
case R.id.menu_show_external:
if (adapter != null) {
item.setChecked(!item.isChecked());
adapter.filterExternal(item.isChecked());
}
return true;
case R.id.menu_run_update:
runUpdate();
return true;
}
return super.onOptionsItemSelected(item);
}
// region IExtendedCallbackNotifier implementation
@Override
public void onProgressCallback(ICallbackEventData message) {
if (!this.isVisible())
return;
final LinearLayout p = (LinearLayout) getActivity().findViewById(R.id.layout_update_status);
if (p != null) {
p.setVisibility(View.VISIBLE);
TextView txtUpdate = (TextView) getActivity().findViewById(R.id.txtUpdate);
txtUpdate.setText("Update Status: " + message.getMessage());
ProgressBar progress = (ProgressBar) getActivity().findViewById(R.id.download_progress_bar);
if (message.getPercentage() < 100) {
progress.setIndeterminate(false);
progress.setMax(100);
progress.setProgress(message.getPercentage());
progress.setProgress(0);
progress.setProgress(message.getPercentage());
progress.setMax(100);
} else {
p.setVisibility(View.GONE);
updateContent();
}
}
}
@Override
public void onCompleteCallback(ICallbackEventData message, AsyncTaskResult<?> result) {
if (!this.isAdded() || this.isDetached() || this.isRemoving()) return;
if (result.getResultType() == UpdateInfoModel[].class) {
try {
UpdateInfoModel[] temp = (UpdateInfoModel[]) result.getResult();
updateList = new ArrayList<UpdateInfoModel>(Arrays.asList(temp));
int resourceId = R.layout.item_update;
adapter = new UpdateInfoModelAdapter(getActivity(), resourceId, updateList);
updateListView.setAdapter(adapter);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
Toast.makeText(LNReaderApplication.getInstance(), getResources().getString(R.string.error_update) + ": " + e.getMessage(), Toast.LENGTH_LONG).show();
}
} else {
// from run update
onProgressCallback(message);
}
}
@Override
public boolean downloadListSetup(String taskId, String message, int setupType, boolean hasError) {
// TODO Auto-generated method stub
return false;
}
// endregion
// region private method
private void openChapter(UpdateInfoModel item) {
// TODO: change to fragment
Intent intent = null;
if (item.getUpdateType() == UpdateTypeEnum.NewNovel) {
intent = new Intent(getActivity(), NovelListContainerActivity.class);
intent.putExtra(Constants.EXTRA_ONLY_WATCHED, false);
intent.putExtra(Constants.EXTRA_PAGE, item.getUpdatePage());
} else if (item.getUpdateType() == UpdateTypeEnum.New ||
item.getUpdateType() == UpdateTypeEnum.Updated ||
item.getUpdateType() == UpdateTypeEnum.UpdateTos) {
if (item.isExternal() && !UIHelper.isUseInternalWebView(getActivity())) {
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(item.getUpdatePage()));
} else {
intent = new Intent(getActivity(), DisplayLightNovelContentActivity.class);
intent.putExtra(Constants.EXTRA_PAGE, item.getUpdatePage());
}
}
if (intent != null)
startActivity(intent);
}
private void openDetails(UpdateInfoModel item) {
Intent intent = new Intent(getActivity(), NovelListContainerActivity.class);
intent.putExtra(Constants.EXTRA_ONLY_WATCHED, false);
if (item.getUpdateType() == UpdateTypeEnum.NewNovel) {
intent.putExtra(Constants.EXTRA_PAGE, item.getUpdatePage());
} else if (item.getUpdateType() == UpdateTypeEnum.New ||
item.getUpdateType() == UpdateTypeEnum.Updated ||
item.getUpdateType() == UpdateTypeEnum.Deleted) {
try {
String parent = item.getUpdatePageModel().getParent();
String details = parent.split(Constants.NOVEL_BOOK_DIVIDER)[0];
intent.putExtra(Constants.EXTRA_PAGE, details);
} catch (Exception ex) {
Log.e(TAG, "Failed to get parent page model", ex);
intent = null;
}
}
if (intent != null)
startActivity(intent);
}
private void runUpdate() {
LinearLayout panel = (LinearLayout) getActivity().findViewById(R.id.layout_update_status);
if (panel != null) {
panel.setVisibility(View.VISIBLE);
LNReaderApplication.getInstance().runUpdateService(true, this);
TextView txtUpdate = (TextView) getActivity().findViewById(R.id.txtUpdate);
txtUpdate.setText("Update Status: " + getResources().getString(R.string.running));
ProgressBar progress = (ProgressBar) getActivity().findViewById(R.id.download_progress_bar);
progress.setIndeterminate(true);
}
}
public void updateContent() {
LoadUpdatesTask task = new LoadUpdatesTask(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
task.execute();
}
// endregion
}