package org.itxtech.daedalus.fragment; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import org.itxtech.daedalus.Daedalus; import org.itxtech.daedalus.R; import org.itxtech.daedalus.activity.ConfigActivity; import org.itxtech.daedalus.util.Rule; import java.io.File; import java.text.DecimalFormat; import java.util.ArrayList; /** * Daedalus Project * * @author iTX Technologies * @link https://itxtech.org * <p> * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. */ public class RulesFragment extends ToolbarFragment implements Toolbar.OnMenuItemClickListener { private View view = null; private RuleAdapter adapter; private Rule rule = null; private int currentType; private ArrayList<Rule> getRules() { if (currentType == Rule.TYPE_HOSTS) { return Daedalus.configurations.getHostsRules(); } else { return Daedalus.configurations.getDnsmasqRules(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_rules, container, false); currentType = Daedalus.configurations.getUsingRuleType(); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_rules); LinearLayoutManager manager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(manager); adapter = new RuleAdapter(); recyclerView.setAdapter(adapter); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { if (viewHolder instanceof RulesFragment.ViewHolder) { Rule rule = Rule.getRuleById(((ViewHolder) viewHolder).getId()); if (rule != null && rule.isServiceAndUsing()) { Snackbar.make(view, R.string.notice_after_stop, Snackbar.LENGTH_LONG) .setAction("Action", null).show(); return 0; } } return makeMovementFlags(0, ItemTouchHelper.START | ItemTouchHelper.END); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); rule = getRules().get(position); getRules().remove(position); Snackbar.make(view, R.string.action_removed, Snackbar.LENGTH_LONG) .setAction(R.string.action_undo, new SnackbarClickListener(position)).show(); adapter.notifyItemRemoved(position); } }); itemTouchHelper.attachToRecyclerView(recyclerView); FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab_add_rule); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(getActivity(), ConfigActivity.class) .putExtra(ConfigActivity.LAUNCH_ACTION_ID, ConfigActivity.ID_NONE) .putExtra(ConfigActivity.LAUNCH_ACTION_FRAGMENT, ConfigActivity.LAUNCH_FRAGMENT_RULE) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } }); return view; } @Override public void checkStatus() { menu.findItem(R.id.nav_rules).setChecked(true); toolbar.inflateMenu(R.menu.rules); toolbar.setTitle(R.string.action_rules); toolbar.setOnMenuItemClickListener(this); toolbar.getMenu().findItem(R.id.action_change_type).setTitle(Rule.getTypeById(currentType)); } @Override public boolean onMenuItemClick(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_change_type) { if (currentType == Rule.TYPE_HOSTS) { currentType = Rule.TYPE_DNAMASQ; } else if (currentType == Rule.TYPE_DNAMASQ) { currentType = Rule.TYPE_HOSTS; } toolbar.getMenu().findItem(R.id.action_change_type).setTitle(Rule.getTypeById(currentType)); adapter.notifyDataSetChanged(); } return true; } @Override public void onDestroyView() { super.onDestroyView(); Daedalus.configurations.save(); view = null; adapter = null; rule = null; } @Override public void onResume() { super.onResume(); adapter.notifyDataSetChanged(); } private class SnackbarClickListener implements View.OnClickListener { private final int position; private SnackbarClickListener(int position) { this.position = position; } @Override public void onClick(View v) { if (rule.getType() == Rule.TYPE_HOSTS) { Daedalus.configurations.getHostsRules().add(position, rule); } else if (rule.getType() == Rule.TYPE_DNAMASQ) { Daedalus.configurations.getDnsmasqRules().add(position, rule); } if (currentType == rule.getType()) { adapter.notifyItemInserted(position); } } } private class RuleAdapter extends RecyclerView.Adapter<ViewHolder> { @Override public void onBindViewHolder(ViewHolder holder, int position) { Rule rule = getRules().get(position); holder.setId(rule.getId()); holder.textViewName.setText(rule.getName()); holder.textViewAddress.setText(rule.getFileName()); File file = new File(Daedalus.rulesPath + rule.getFileName()); StringBuilder builder = new StringBuilder(); if (file.exists()) { builder.append(new DecimalFormat("0.00").format(((float) file.length() / 1024))); } else { builder.append("0"); } holder.textViewSize.setText(builder.append(" KB").toString()); } @Override public int getItemCount() { return getRules().size(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_rule, parent, false); return new ViewHolder(view); } } private class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private final TextView textViewName; private final TextView textViewAddress; private final TextView textViewSize; private final View view; private String id; ViewHolder(View view) { super(view); this.view = view; textViewName = (TextView) view.findViewById(R.id.textView_rule_name); textViewAddress = (TextView) view.findViewById(R.id.textView_rule_detail); textViewSize = (TextView) view.findViewById(R.id.textView_rule_size); view.setOnClickListener(this); view.setOnLongClickListener(this); view.findViewById(R.id.cardView_indicator).setBackgroundResource(R.drawable.background_selectable); } void setId(String id) { this.id = id; Rule rule = Rule.getRuleById(id); if (rule != null) { view.setSelected(rule.isUsing()); } } String getId() { return id; } @Override public void onClick(View v) { if (!Daedalus.getInstance().isServiceActivated()) { Rule rule = Rule.getRuleById(id); if (rule != null) { rule.setUsing(!v.isSelected()); v.setSelected(!v.isSelected()); } } else { Snackbar.make(view, R.string.notice_after_stop, Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } } @Override public boolean onLongClick(View v) { Rule rule = Rule.getRuleById(id); if (rule != null && !rule.isServiceAndUsing()) { Daedalus.getInstance().startActivity(new Intent(Daedalus.getInstance(), ConfigActivity.class) .putExtra(ConfigActivity.LAUNCH_ACTION_ID, Integer.parseInt(id)) .putExtra(ConfigActivity.LAUNCH_ACTION_FRAGMENT, ConfigActivity.LAUNCH_FRAGMENT_RULE) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } else { Snackbar.make(view, R.string.notice_after_stop, Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } return true; } } }