package it.angelic.soulissclient.adapters;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.util.Pair;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.io.File;
import java.util.List;
import it.angelic.soulissclient.Constants;
import it.angelic.soulissclient.NodeDetailActivity;
import it.angelic.soulissclient.NodesListActivity;
import it.angelic.soulissclient.ProgramListActivity;
import it.angelic.soulissclient.R;
import it.angelic.soulissclient.SceneListActivity;
import it.angelic.soulissclient.SoulissApp;
import it.angelic.soulissclient.SoulissDataService;
import it.angelic.soulissclient.TagDetailActivity;
import it.angelic.soulissclient.TagGridActivity;
import it.angelic.soulissclient.TypicalDetailFragWrapper;
import it.angelic.soulissclient.helpers.SoulissPreferenceHelper;
import it.angelic.soulissclient.model.ISoulissCommand;
import it.angelic.soulissclient.model.LauncherElement;
import it.angelic.soulissclient.model.SoulissNode;
import it.angelic.soulissclient.model.SoulissScene;
import it.angelic.soulissclient.model.SoulissTag;
import it.angelic.soulissclient.model.SoulissTypical;
import it.angelic.soulissclient.util.FontAwesomeEnum;
import it.angelic.soulissclient.util.FontAwesomeUtil;
import it.angelic.soulissclient.util.LauncherElementEnum;
import it.angelic.soulissclient.util.SoulissUtils;
import static it.angelic.soulissclient.Constants.TAG;
public class StaggeredDashboardElementAdapter extends RecyclerView.Adapter<StaggeredDashboardElementAdapter.ViewHolder> {
public SoulissDataService getmBoundService() {
return mBoundService;
}
public void setmBoundService(SoulissDataService mBoundService) {
this.mBoundService = mBoundService;
}
SoulissDataService mBoundService;
private Activity context;
private List<LauncherElement> launcherElements;
public StaggeredDashboardElementAdapter(Activity context, List<LauncherElement> launcherElements, SoulissDataService mBoundService) {
this.launcherElements = launcherElements;
this.context = context;
this.mBoundService = mBoundService;
}
@Override
public int getItemCount() {
return launcherElements.size();
}
@Override
public int getItemViewType(int position) {
// Just as an example, return 0 or 2 depending on position
// Note that unlike in ListView adapters, types don't have to be contiguous
return launcherElements.get(position).getComponentEnum().ordinal();
}
public LauncherElement getLocationLauncherElements() {
for (LauncherElement lal :
launcherElements) {
if (lal.getComponentEnum().equals(LauncherElementEnum.STATIC_LOCATION))
return lal;
}
return null;
}
public List<LauncherElement> getLauncherElements() {
return launcherElements;
}
public void setLauncherElements(List<LauncherElement> in) {
launcherElements = in;
notifyDataSetChanged();
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final LauncherElement item = launcherElements.get(position);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
//holder.container.removeAllViews();
//holder.textView.setText(item.title);
// holder.container = launcherElements[position].inflateCardView();
final ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if (lp instanceof StaggeredGridLayoutManager.LayoutParams) {
StaggeredGridLayoutManager.LayoutParams sglp = (StaggeredGridLayoutManager.LayoutParams) lp;
sglp.setFullSpan(item.isFullSpan());
//Log.d(Constants.TAG, "Full span for element?" + holder.getItemViewType());
holder.itemView.setLayoutParams(sglp);
}
//qui la view c'e` gia
switch (item.getComponentEnum()) {
case STATIC_LOCATION:
View viewLineL = holder.container.findViewById(R.id.StaticTileLine);
TextView txtTitL = (TextView) holder.container.findViewById(R.id.card_static_title);
TextView txtDescL = (TextView) holder.container.findViewById(R.id.card_static_desc);
TextView txtAwesomL = (TextView) holder.container.findViewById(R.id.card_thumbnail_fa);
FontAwesomeUtil.prepareFontAweTextView(context, txtAwesomL, FontAwesomeEnum.fa_location_arrow.getFontName());
txtTitL.setText(item.getTitle());
txtDescL.setText(item.getDesc());
viewLineL.setBackgroundColor(context.getResources().getColor(R.color.md_blue_grey_500));
break;
case STATIC_SCENES:
View viewLine = holder.container.findViewById(R.id.StaticTileLine);
TextView txtTit = (TextView) holder.container.findViewById(R.id.card_static_title);
TextView txtDesc = (TextView) holder.container.findViewById(R.id.card_static_desc);
TextView txtAwesom = (TextView) holder.container.findViewById(R.id.card_thumbnail_fa);
FontAwesomeUtil.prepareFontAweTextView(context, txtAwesom, FontAwesomeEnum.fa_moon_o.getFontName());
txtTit.setText(item.getTitle());
txtDesc.setText(item.getDesc());
holder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent nodeDatail = new Intent(context, SceneListActivity.class);
context.startActivity(nodeDatail);
}
});
viewLine.setBackgroundColor(context.getResources().getColor(R.color.std_yellow));
break;
case STATIC_MANUAL:
View viewLine2 = holder.container.findViewById(R.id.StaticTileLine);
TextView txtTit2 = (TextView) holder.container.findViewById(R.id.card_static_title);
TextView txtDesc2 = (TextView) holder.container.findViewById(R.id.card_static_desc);
TextView txtAwesom2 = (TextView) holder.container.findViewById(R.id.card_thumbnail_fa);
FontAwesomeUtil.prepareFontAweTextView(context, txtAwesom2, FontAwesomeEnum.fa_codepen.getFontName());
txtTit2.setText(item.getTitle());
txtDesc2.setText(item.getDesc());
holder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent nodeDatail = new Intent(context, NodesListActivity.class);
context.startActivity(nodeDatail);
}
});
viewLine2.setBackgroundColor(context.getResources().getColor(R.color.std_green));
break;
case STATIC_PROGRAMS:
View viewLine3 = holder.container.findViewById(R.id.StaticTileLine);
TextView txtTit3 = (TextView) holder.container.findViewById(R.id.card_static_title);
TextView txtDesc3 = (TextView) holder.container.findViewById(R.id.card_static_desc);
TextView txtAwesom3 = (TextView) holder.container.findViewById(R.id.card_thumbnail_fa);
FontAwesomeUtil.prepareFontAweTextView(context, txtAwesom3, "fa-calendar");
txtTit3.setText(item.getTitle());
txtDesc3.setText(item.getDesc());
holder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent nodeDatail = new Intent(context, ProgramListActivity.class);
context.startActivity(nodeDatail);
}
});
viewLine3.setBackgroundColor(context.getResources().getColor(R.color.std_blue));
break;
case STATIC_TAGS:
View viewLine34 = holder.container.findViewById(R.id.StaticTileLine);
TextView txtTit34 = (TextView) holder.container.findViewById(R.id.card_static_title);
TextView txtDesc34 = (TextView) holder.container.findViewById(R.id.card_static_desc);
TextView txtAwesom34 = (TextView) holder.container.findViewById(R.id.card_thumbnail_fa);
FontAwesomeUtil.prepareFontAweTextView(context, txtAwesom34, "fa-tags");
txtTit34.setText(item.getTitle());
txtDesc34.setText(item.getDesc());
holder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent nodeDatail = new Intent(context, TagGridActivity.class);
context.startActivity(nodeDatail);
}
});
viewLine34.setBackgroundColor(context.getResources().getColor(R.color.std_purple));
break;
case TYPICAL:
bindTypicalElement(holder, item);
break;
case SCENE:
final SoulissScene nodo = (SoulissScene) item.getLinkedObject();
Log.d(Constants.TAG, "Launcher Element scenesList " + nodo.getName());
TextView commandIcon = (TextView) holder.container.findViewById(R.id.command_icon);
TextView textViewCommand = (TextView) holder.container.findViewById(R.id.TextViewCommand);
TextView textViewCommandWhen = (TextView) holder.container.findViewById(R.id.TextViewCommandWhen);
Button exe = (Button) holder.container.findViewById(R.id.sceneBtn);
textViewCommand.setText(nodo.getNiceName());
String strMeatFormat = context.getString(R.string.scene_subtitle);
textViewCommandWhen.setText(String.format(strMeatFormat, nodo.getCommandArray().size()));
FontAwesomeUtil.prepareFontAweTextView(context, commandIcon, nodo.getIconResourceId());
exe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.w(Constants.TAG, "Activating SCENE " + nodo.getNiceName());
nodo.execute();
}
});
break;
case NODE:
bindNodeElement(holder, item);
break;
case STATIC_STATUS:
TextView textCmdsd = (TextView) holder.container.findViewById(R.id.textViewBasicInfo);
TextView textCmdWhens = (TextView) holder.container.findViewById(R.id.textViewBasicInfoLittle);
setServiceInfo(textCmdsd, textCmdWhens);
break;
case TAG:
bindTagElement(holder, item);
break;
}
}
private void bindNodeElement(ViewHolder holder, LauncherElement item) {
final SoulissNode nodo = (SoulissNode) item.getLinkedObject();
Log.d(Constants.TAG, "Launcher Element node " + nodo.getName() + "set: last upd: " + SoulissUtils.getTimeAgo(nodo.getRefreshedAt()));
TextView textView = (TextView) holder.container.findViewById(R.id.TextViewTypicalsTitle);
TextView imageView = (TextView) holder.container.findViewById(R.id.card_thumbnail_image2);
TextView textViewInfo1 = (TextView) holder.container.findViewById(R.id.TextViewInfoNodo1);
TextView textViewInfo2 = (TextView) holder.container.findViewById(R.id.TextViewInfoNodo2);
textView.setText(nodo.getNiceName());
textViewInfo1.setText(context.getResources().getQuantityString(R.plurals.Devices,
nodo.getActiveTypicals().size(), nodo.getActiveTypicals().size()));
//textView.setTag(position);
textViewInfo2.setText(context.getString(R.string.update) + " " + SoulissUtils.getTimeAgo(nodo.getRefreshedAt()) + context.getString(R.string.health) + nodo.getHealthPercent());
// imageView.setImageResource(FontAwesomeUtil.remapIconResId(tipico.getIconResourceId()));
FontAwesomeUtil.prepareFontAweTextView(context, imageView, nodo.getIconResourceId());
//tipico.getActionsLayout(SoulissApp.getAppContext(), linearActionsLayout);
holder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.w(Constants.TAG, "Activating NODE " + nodo.getNiceName());
Intent nodeDatail = new Intent(context, NodeDetailActivity.class);
// TagRecyclerAdapter.TagViewHolder holder = ( TagRecyclerAdapter.TagViewHolder holder) view;
nodeDatail.putExtra("NODO", nodo.getNodeId());
context.startActivity(nodeDatail);
}
});
}
private void bindTagElement(ViewHolder holder, LauncherElement item) {
final SoulissTag soulissTag = (SoulissTag) item.getLinkedObject();
TextView textCmd = (TextView) holder.container.findViewById(R.id.TextViewTagTitle);
TextView textCmdWhen = (TextView) holder.container.findViewById(R.id.TextViewTagDesc);
final ImageView image = (ImageView) holder.container.findViewById(R.id.imageViewTag);
final TextView imageTag = (TextView) holder.container.findViewById(R.id.imageTagIconFa);
final ImageView shadowbar = (ImageView) holder.container.findViewById(R.id.infoTagAlpha);
String quantityString = context.getResources().getQuantityString(R.plurals.Devices,
0);
try {
List<SoulissTypical> appoggio = soulissTag.getAssignedTypicals();
quantityString = context.getResources().getQuantityString(R.plurals.Devices,
appoggio.size(), appoggio.size());
} catch (Exception ce) {
Log.w(Constants.TAG, "TAG Empty? ");
}
textCmd.setText(soulissTag.getName());
textCmdWhen.setText(quantityString);
if (soulissTag.getIconResourceId() != 0) {
FontAwesomeUtil.prepareFontAweTextView(context, imageTag, soulissTag.getIconResourceId());
imageTag.setVisibility(View.VISIBLE);
} else {
FontAwesomeUtil.prepareFontAweTextView(context, imageTag, FontAwesomeEnum.fa_window_maximize.getFontName());
imageTag.setVisibility(View.INVISIBLE);
}
// Here you apply the animation when the view is bound
//setAnimation(holder.container, position);
holder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.w(Constants.TAG, "Activating TAG " + soulissTag.getNiceName());
Intent nodeDatail = new Intent(context, TagDetailActivity.class);
// TagRecyclerAdapter.TagViewHolder holder = ( TagRecyclerAdapter.TagViewHolder holder) view;
nodeDatail.putExtra("TAG", soulissTag.getTagId());
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(context,
//holder.image, // The view which starts the transition
//"photo_hero" // The transitionName of the view we’re transitioning to
Pair.create((View) image, "photo_hero"),
Pair.create((View) shadowbar, "shadow_hero"),
Pair.create((View) imageTag, "tag_icon")
);
ActivityCompat.startActivity(context, nodeDatail, options.toBundle());
}
});
holder.container.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;//chiama Parentàs onItemClickListener
}
});
//holder.image.setImageResource(soulissTags[position].getIconResourceId());
try {
File picture = new File(SoulissUtils.getRealPathFromURI(context, Uri.parse(soulissTag.getImagePath())));
// File picture = new File(Uri.parse(collectedTag.getImagePath()).getPath());
if (picture.exists()) {
//ImageView imageView = (ImageView)findViewById(R.id.imageView);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inPreferQualityOverSpeed = false;
Bitmap myBitmap = BitmapFactory.decodeFile(picture.getAbsolutePath(), options);
Log.i(Constants.TAG, "bitmap size " + myBitmap.getRowBytes());
image.setImageBitmap(myBitmap);
}
} catch (Exception io) {
Log.i(Constants.TAG, "cant load image " + soulissTag.getImagePath());
image.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.home_automation));
}
}
private void bindTypicalElement(ViewHolder holder, LauncherElement item) {
final SoulissTypical tipico = (SoulissTypical) item.getLinkedObject();
Log.d(Constants.TAG, "Launcher Element typical " + tipico.getName() + "set: last upd: " + SoulissUtils.getTimeAgo(tipico.getTypicalDTO().getRefreshedAt()));
TextView textView = (TextView) holder.container.findViewById(R.id.TextViewTypicalsTitle);
TextView imageView = (TextView) holder.container.findViewById(R.id.card_thumbnail_image2);
LinearLayout linearActionsLayout = (LinearLayout) holder.container.findViewById(R.id.linearLayoutButtons);
TextView textViewInfo1 = (TextView) holder.container.findViewById(R.id.TextViewInfoStatus);
TextView textViewInfo2 = (TextView) holder.container.findViewById(R.id.TextViewInfo2);
textView.setText(tipico.getNiceName());
tipico.setOutputDescView(textViewInfo1);
textViewInfo2.setText(SoulissUtils.getTimeAgo(tipico.getTypicalDTO().getRefreshedAt()));
// imageView.setImageResource(FontAwesomeUtil.remapIconResId(tipico.getIconResourceId()));
FontAwesomeUtil.prepareFontAweTextView(context, imageView, tipico.getIconResourceId());
linearActionsLayout.removeAllViews();
List<ISoulissCommand> pi = tipico.getCommands(context);
for (final ISoulissCommand cmd : pi) {
// LinearLayout view = (LinearLayout)LayoutInflater.from(context).inflate(R.layout.button_flat, null);
// or LinearLayout buttonView = (LinearLayout)this.getLayoutInflater().inflate(R.layout.my_button, null);
Button myButton = (AppCompatButton) LayoutInflater.from(context).inflate(R.layout.button_flat, linearActionsLayout, false);
//myButton.setId(myButton.getId());
myButton.setText(cmd.getName());
// view.removeView(myButton);
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cmd.execute();
}
});
linearActionsLayout.addView(myButton);
//non ce ne stanno piu di due
if (linearActionsLayout.getChildCount() >= 2)
break;
}
//linearActionsLayout.removeAllViews();
// LinearLayout ll = (LinearLayout)context.getLayoutInflater().inflate(R.layout.button_flat, linearActionsLayout);
holder.container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.w(Constants.TAG, "Activating TYP" + tipico.getNiceName());
Intent nodeDatail = new Intent(context, TypicalDetailFragWrapper.class);
// TagRecyclerAdapter.TagViewHolder holder = ( TagRecyclerAdapter.TagViewHolder holder) view;
nodeDatail.putExtra("TIPICO", tipico);
context.startActivity(nodeDatail);
}
});
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LauncherElementEnum enumVal = LauncherElementEnum.values()[viewType];
View itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.cardview_launcher2, parent, false);
switch (enumVal) {
case STATIC_LOCATION:
case STATIC_SCENES:
case STATIC_PROGRAMS:
case STATIC_MANUAL:
case STATIC_TAGS:
itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.card_button_static, parent, false);
break;
case TYPICAL:
itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.cardview_typical_vertical, parent, false);
break;
case NODE:
itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.cardview_node_vertical, parent, false);
break;
case TAG:
itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.cardview_tag, parent, false);
break;
case SCENE:
itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.cardview_scene, parent, false);
break;
case STATIC_STATUS:
itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.cardview_basicinfo, parent, false);
break;
}
return new ViewHolder(itemView);
}
public void removeAt(int position) {
launcherElements.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, launcherElements.size());
}
private void setServiceInfo(TextView basinfo, TextView serviceInfo) {
SoulissPreferenceHelper opzioni = SoulissApp.getOpzioni();
//basinfoLine.setBackgroundColor(this.getResources().getColor(R.color.std_green));
// check se IP non settato check system configured
if (!opzioni.isSoulissIpConfigured() && !opzioni.isSoulissPublicIpConfigured()) {
basinfo.setText(Html.fromHtml(context.getString(R.string.notconfigured)));
//basinfoLine.setBackgroundColor(this.getResources().getColor(R.color.std_red));
return;
}
if (!opzioni.getCustomPref().contains("connectionName")) {
basinfo.setText(context.getString(R.string.warn_connection));
//basinfoLine.setBackgroundColor(this.getResources().getColor(R.color.std_yellow));
return;
}
if (!opzioni.isSoulissPublicIpConfigured()
&& !("WIFI".compareTo(opzioni.getCustomPref().getString("connectionName", "")) == 0)) {
basinfo.setText(Html.fromHtml(context.getString(R.string.warn_wifi)));
// basinfoLine.setBackgroundColor(this.getResources().getColor(R.color.std_red));
return;
}
String base = opzioni.getCachedAddress();
Log.d(TAG, "cached Address: " + base + " backoff: " + opzioni.getBackoff());
if (base != null && "".compareTo(base) != 0) {
basinfo.setText(Html.fromHtml(context.getString(R.string.contact_at) + "<font color=\"#99CC00\"><b> " + base
+ "</b></font> via <b>" + opzioni.getCustomPref().getString("connectionName", "ERROR") + "</b>"));
} else if (base != null && context.getString(R.string.unavailable).compareTo(base) != 0) {
basinfo.setText(context.getString(R.string.souliss_unavailable));
} else {
basinfo.setText(context.getString(R.string.contact_progress));
}
StringBuilder sb = new StringBuilder();
//serviceinfoLine.setBackgroundColor(ContextCompat.getColor(this, R.color.std_green));
/* SERVICE MANAGEMENT */
if (!opzioni.isDataServiceEnabled()) {
if (mBoundService != null) {// in esecuzione? strano
sb.append("<br/><b>").append(context.getString(R.string.service_disabled)).append("!</b> ");
// serviceinfoLine.setBackgroundColor(ContextCompat.getColor(this, R.color.std_red));
if (opzioni.getTextFx()) {
Animation a2 = AnimationUtils.loadAnimation(context, R.anim.alpha_out);
a2.reset();
//serviceinfoLine.startAnimation(a2);
}
mBoundService.stopSelf();
}
} else {
if (mBoundService != null) {
sb.append("<b>").append(context.getString(R.string.service_lastexec)).append("</b> ").append(SoulissUtils.getTimeAgo(mBoundService.getLastupd())).append("<br/><b>");
sb.append(context.getString(R.string.opt_serviceinterval)).append(":</b> ")
.append(SoulissUtils.getScaledTime(opzioni.getDataServiceIntervalMsec() / 1000));
} else {
sb.append(context.getString(R.string.service_warnbound));
Intent serviceIntent = new Intent(context, SoulissDataService.class);
Log.w(TAG, "Service not bound yet, restarting");
context.startService(serviceIntent);
//serviceinfoLine.setBackgroundColor(ContextCompat.getColor(context, R.color.std_yellow));
}
}
serviceInfo.setText(Html.fromHtml(sb.toString()));
}
static class ViewHolder extends RecyclerView.ViewHolder {
public CardView container;
public ViewHolder(View itemView) {
super(itemView);
container = (CardView) itemView.getRootView();
}
//enum componentEnum
}
}