package it.angelic.soulissclient.fragments;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.ListFragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import it.angelic.soulissclient.AbstractStatusedFragmentActivity;
import it.angelic.soulissclient.Constants;
import it.angelic.soulissclient.NodeDetailActivity;
import it.angelic.soulissclient.R;
import it.angelic.soulissclient.SoulissApp;
import it.angelic.soulissclient.adapters.NodesListAdapter;
import it.angelic.soulissclient.adapters.NodesListAdapter.NodeViewHolder;
import it.angelic.soulissclient.helpers.AlertDialogHelper;
import it.angelic.soulissclient.helpers.SoulissPreferenceHelper;
import it.angelic.soulissclient.model.LauncherElement;
import it.angelic.soulissclient.model.SoulissNode;
import it.angelic.soulissclient.model.db.SoulissDBHelper;
import it.angelic.soulissclient.model.db.SoulissDBLauncherHelper;
import it.angelic.soulissclient.net.UDPHelper;
import it.angelic.soulissclient.util.FontAwesomeEnum;
import it.angelic.soulissclient.util.FontAwesomeUtil;
import it.angelic.soulissclient.util.LauncherElementEnum;
import static it.angelic.soulissclient.Constants.TAG;
/**
* Activity per mostrare una lista di risultati (Nodi Souliss) questa modalita`
* e` manuale, ovvero l'utente interagisce direttamente coi tipici
* <p>
* dalla lista dei tipici si accede TypicalsActivity
* <p>
* legge dal DB tipici e tipici
*
* @author Ale
*/
public class NodesListFragment extends ListFragment {
private int mCurCheckPosition = 0;
//private Handler timeoutHandler;
private Timer autoUpdate;
private SoulissDBHelper datasource;
//private TextView tt;
private boolean mDualPane;
private NodesListAdapter nodesAdapter;
private SoulissPreferenceHelper opzioni;
private SwipeRefreshLayout swipeLayout;
// Aggiorna il feedback
private BroadcastReceiver datareceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Broadcast received, refresh from DB");
SoulissDBHelper.open();
//timeoutHandler.removeCallbacks(timeExpired);
// ferma la rotellina del refresh
swipeLayout.setRefreshing(false);
try {
// prendo tipici dal DB
List<SoulissNode> goer = datasource.getAllNodes();
nodesAdapter.setNodes(goer);
nodesAdapter.notifyDataSetChanged();
getListView().invalidateViews();
} catch (IllegalStateException e) {
Log.e(TAG, "DB read Impossible", e);
}
}
};
@Override
public void onActivityCreated(Bundle savedInstanceState) {
opzioni = SoulissApp.getOpzioni();
setHasOptionsMenu(true);
if (opzioni.isLightThemeSelected())
getActivity().setTheme(R.style.LightThemeSelector);
else
getActivity().setTheme(R.style.DarkThemeSelector);
super.onActivityCreated(savedInstanceState);
// getActivity().setContentView(R.layout.frag_nodelist);
//getActivity().setTitle(getString(R.string.app_name) + " - " + getString(R.string.nodes));
Bundle extras = getActivity().getIntent().getExtras();
if (savedInstanceState != null) {
// Restore last state for checked position.
mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
} else if (extras != null && extras.get("index") != null) {
mCurCheckPosition = (Integer) extras.get("index");
}
// Check to see if we have a frame in which to embed the details
// fragment directly in the containing UI.
View detailsFrame = getActivity().findViewById(R.id.detailPane);
mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
TextView nodeic = (TextView) getActivity().findViewById(R.id.scene_icon_awe);
FontAwesomeUtil.prepareAwesomeFontAweTextView(getActivity(), nodeic, FontAwesomeEnum.fa_codepen.getFontName());
final TextView textHeadListInfo = (TextView) getActivity().findViewById(R.id.TextViewTypListDesc);
final TextView textViewTagsDescFa = (TextView) getActivity().findViewById(R.id.TextViewTypListDescFa);
if (textViewTagsDescFa != null) {//forse nascosto > landscape
FontAwesomeUtil.prepareMiniFontAweTextView(getActivity(), textViewTagsDescFa, FontAwesomeEnum.fa_close.getFontName());
//NASCONDI
textViewTagsDescFa.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textViewTagsDescFa.setVisibility(View.GONE);
textHeadListInfo.setVisibility(View.GONE);
opzioni.setDontShowAgain("manualInfo", true);
}
});
if (opzioni.getDontShowAgain("manualInfo")) {
textViewTagsDescFa.setVisibility(View.GONE);
textHeadListInfo.setVisibility(View.GONE);
}
}
swipeLayout = (SwipeRefreshLayout) getActivity().findViewById(R.id.swipeRefreshContainer);
swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
if (nodesAdapter != null && nodesAdapter.getNodes() != null) {
UDPHelper.healthRequest(opzioni, nodesAdapter.getNodes().size(), 0);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
UDPHelper.pollRequest(opzioni, nodesAdapter.getNodes().size(), 0);
}
if (!opzioni.isSoulissReachable()) {
//rinuncio subito
getActivity().runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getActivity(),
getString(R.string.status_souliss_notreachable), Toast.LENGTH_SHORT)
.show();
swipeLayout.setRefreshing(false);
}
});
}
}
}).start();
}
});
swipeLayout.setColorSchemeResources(R.color.std_blue,
R.color.std_blue_shadow);
//SoulissApp.setBackground(getActivity().findViewById(R.id.relativeLayout1),
// getActivity().getWindowManager());
// check se IP non settato
if (!opzioni.isSoulissIpConfigured() && !opzioni.isSoulissReachable()) {
// refreshButton.setEnabled(false);
// GoButt.setEnabled(false);
AlertDialog.Builder alert = AlertDialogHelper.sysNotInitedDialog(getActivity());
alert.show();
}
datasource = new SoulissDBHelper(getActivity());
SoulissDBHelper.open();
if (!opzioni.isDbConfigured()) {
AlertDialogHelper.dbNotInitedDialog(getActivity());
} else {
final List<SoulissNode> nodiArray = datasource.getAllNodes();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getListView().setNestedScrollingEnabled(true);
}
getListView().setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Log.i(TAG, "Showing Node Detail:" + arg2);
NodeViewHolder holder = (NodeViewHolder) arg1.getTag();
// Activity Dettaglio nodo
showDetails(arg2, holder.data);
}
});
registerForContextMenu(getListView());
if (mDualPane) {
// Capita arrayOutofbound con size 0
if (mCurCheckPosition < nodiArray.size())
showDetails(mCurCheckPosition, nodiArray.get(mCurCheckPosition));
if (textHeadListInfo != null)
textHeadListInfo.setVisibility(View.GONE);
if (nodeic != null)
nodeic.setVisibility(View.GONE);
}
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
View detailsFrame = getActivity().findViewById(R.id.detailPane);
mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
super.onConfigurationChanged(newConfig);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
//BUG?
if (info.position >= nodesAdapter.getNodes().size()) {
Log.e(TAG, "info.position >= nodiArray.length");
return super.onContextItemSelected(item);
}
final SoulissNode todoItem = (SoulissNode) nodesAdapter.getItem(info.position);
switch (item.getItemId()) {
case R.id.rinominaNodo:
AlertDialog.Builder alert = AlertDialogHelper.renameSoulissObjectDialog(getActivity(), null, getListView(),
datasource, todoItem);
alert.show();
return true;
case R.id.changenodeicon:
//SoulissNode convertView = (SoulissNode) getListView().getItemAtPosition(item.getOrder());
AlertDialog.Builder alert2 = AlertDialogHelper.chooseIconDialog(getActivity(), null, getListView(),
datasource, todoItem);
alert2.show();
return true;
case R.id.AddToDashboard:
SoulissDBLauncherHelper dbl = new SoulissDBLauncherHelper(getActivity());
LauncherElement nodeLauncher = new LauncherElement();
nodeLauncher.setComponentEnum(LauncherElementEnum.NODE);
nodeLauncher.setLinkedObject(todoItem);
dbl.addElement(nodeLauncher);
Toast.makeText(getActivity(), todoItem.getNiceName() + " " + getActivity().getString(R.string.added_to_dashboard), Toast.LENGTH_SHORT).show();
return true;
default:
return super.onContextItemSelected(item);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater();
// Rinomina nodo e scelta icona
inflater.inflate(R.menu.node_ctx_menu, menu);
Log.w(TAG, "inflate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_nodelist, container, false);
}
@Override
public void onPause() {
autoUpdate.cancel();
super.onPause();
getActivity().unregisterReceiver(datareceiver);
//getActivity().unregisterReceiver(timeoutReceiver);
}
@Override
public void onResume() {
super.onResume();
IntentFilter filtere = new IntentFilter();
filtere.addAction("it.angelic.soulissclient.GOT_DATA");
filtere.addAction(Constants.CUSTOM_INTENT_SOULISS_RAWDATA);
getActivity().registerReceiver(datareceiver, filtere);
// timeout handler
//IntentFilter filtera = new IntentFilter();
//filtera.addAction(it.angelic.soulissclient.net.Constants.CUSTOM_INTENT_SOULISS_TIMEOUT);
//getActivity().registerReceiver(timeoutReceiver, filtera);
autoUpdate = new Timer();
autoUpdate.schedule(new TimerTask() {
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() {
public void run() {
try {
((AbstractStatusedFragmentActivity) getActivity()).refreshStatusIcon();
getListView().invalidateViews();
} catch (Exception e) {
Log.e(Constants.TAG, "InvalidateViews fallita:" + e.getMessage());
}
}
});
}
}, 2500, Constants.GUI_UPDATE_INTERVAL); // updates UI each 5 secs
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}
@Override
public void onStart() {
super.onStart();
opzioni.initializePrefs();
// doBindService();
SoulissDBHelper.open();
// prendo tipici dal DB
//timeoutHandler = new Handler();
List<SoulissNode> nodiArray = datasource.getAllNodes();
Log.i(TAG, NodesListFragment.class.getName() + " onStart:" + nodiArray.size());
nodesAdapter = new NodesListAdapter(getActivity(), nodiArray, opzioni);
// Adapter della lista
getListView().setAdapter(nodesAdapter);
final TextView nodesTitle = (TextView) getActivity().findViewById(R.id.TextViewTypicals);
if (nodesTitle != null) {//se dual pane salta
nodesTitle.setText(getActivity().getResources().getQuantityString(R.plurals.Nodes,
nodiArray.size(), nodiArray.size()));
}
}
/**
* Helper function to show the details of a selected item, either by
* displaying a fragment in-place in the current UI, or starting a whole new
* activity in which it is displayed.
*
* @param data
*/
private void showDetails(int index, SoulissNode data) {
mCurCheckPosition = index;
if (mDualPane) {
((AbstractStatusedFragmentActivity) getActivity()).setActionBarInfo(data.getNiceName());
((AbstractStatusedFragmentActivity) getActivity()).refreshStatusIcon();
// Istanzia e ci mette l'indice
NodeDetailFragment details = NodeDetailFragment.newInstance(index, data);
// Execute a transaction, replacing any existing fragment
// with this one inside the frame.
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (opzioni.isAnimationsEnabled())
ft.setCustomAnimations(R.anim.slide_in_left_delay, R.anim.slide_out_left);
ft.replace(R.id.detailPane, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
ft.commit();
} else {
// Otherwise alla vecchia
// the dialog fragment with selected text.
Intent intent = new Intent();
intent.setClass(getActivity(), NodeDetailActivity.class);
intent.putExtra("index", index);
intent.putExtra("NODO", data.getNodeId());
startActivity(intent);
if (opzioni.isAnimationsEnabled())
getActivity().overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
}
}
}