package treehou.se.habit.ui.control; import android.app.Activity; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; 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.ImageButton; import android.widget.LinearLayout; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.Unbinder; import io.realm.Realm; import treehou.se.habit.R; import treehou.se.habit.core.db.model.controller.CellDB; import treehou.se.habit.core.db.model.controller.CellRowDB; import treehou.se.habit.core.db.model.controller.ControllerDB; import treehou.se.habit.ui.colorpicker.ColorDialog; import treehou.se.habit.ui.control.config.ControllCellFragment; import treehou.se.habit.ui.control.config.cells.ButtonConfigCellBuilder; import treehou.se.habit.ui.control.config.cells.ColorConfigCellBuilder; import treehou.se.habit.ui.control.config.cells.DefaultConfigCellBuilder; import treehou.se.habit.ui.control.config.cells.IncDecConfigCellBuilder; import treehou.se.habit.ui.control.config.cells.SliderConfigCellBuilder; import treehou.se.habit.ui.control.config.cells.VoiceConfigCellBuilder; import treehou.se.habit.ui.homescreen.ControllerWidget; public class EditControlFragment extends Fragment implements ColorDialog.ColorDialogCallback { private static final String TAG = "EditControlFragment"; public static final String ARG_ID = "ARG_ID"; public static final int REQUEST_COLOR = 3117; @BindView(R.id.lou_btn_holder) LinearLayout louController; @BindView(R.id.viw_background) View viwBackground; private ActionBar actionBar; private ControllerDB controller; private AppCompatActivity activity; private CellFactory<Integer> cellFactory; private Realm realm; private Unbinder unbinder; public static EditControlFragment newInstance(long id) { EditControlFragment fragment = new EditControlFragment(); Bundle args = new Bundle(); args.putLong(ARG_ID, id); fragment.setArguments(args); return fragment; } public EditControlFragment() {} @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); realm = Realm.getDefaultInstance(); activity = (AppCompatActivity) getActivity(); cellFactory = new CellFactory<>(); cellFactory.setDefaultBuilder(new DefaultConfigCellBuilder()); cellFactory.addBuilder(CellDB.TYPE_BUTTON, new ButtonConfigCellBuilder()); cellFactory.addBuilder(CellDB.TYPE_VOICE, new VoiceConfigCellBuilder()); cellFactory.addBuilder(CellDB.TYPE_SLIDER, new SliderConfigCellBuilder()); cellFactory.addBuilder(CellDB.TYPE_INC_DEC, new IncDecConfigCellBuilder()); cellFactory.addBuilder(CellDB.TYPE_COLOR, new ColorConfigCellBuilder()); if (getArguments() != null) { long id = getArguments().getLong(ARG_ID); controller = ControllerDB.load(realm, id); } ControlHelper.showNotification(getActivity(), controller); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_edit_control, container, false); unbinder = ButterKnife.bind(this, rootView); actionBar = activity.getSupportActionBar(); updateColorPalette(controller.getColor()); ImageButton btnAddRow = (ImageButton) rootView.findViewById(R.id.btn_add_row); btnAddRow.setOnClickListener(v -> { controller.addRow(realm); Log.d("Controller", "Added controller, currently " + controller.getCellRows().size() + " rows"); redrawController(); }); redrawController(); Intent i = new Intent("treehou.se.UPDATE_WIDGET"); getActivity().sendBroadcast(i); return rootView; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.edit_controllers, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_more: openExtraSettings(); break; } return super.onOptionsItemSelected(item); } public void openExtraSettings(){ Intent intent = new Intent(getActivity(), EditControllerSettingsActivity.class); Bundle extras = new Bundle(); extras.putLong(ARG_ID, controller.getId()); intent.putExtras(extras); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); startActivity(intent); getActivity().overridePendingTransition(0, 0); } @Override public void onResume() { super.onResume(); redrawController(); } @Override public void onPause() { super.onPause(); Intent intent = new Intent(getActivity(), ControllerWidget.class); intent.setAction("android.appwidget.action.APPWIDGET_UPDATE"); Activity activity = getActivity(); int ids[] = AppWidgetManager.getInstance(activity.getApplication()).getAppWidgetIds(new ComponentName(activity.getApplication(), ControllerWidget.class)); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids); getActivity().sendBroadcast(intent); } @Override public void onDestroy() { super.onDestroy(); realm.close(); } public void redrawController(){ ControlHelper.showNotification(getActivity(), controller); louController.removeAllViews(); LayoutInflater inflater = LayoutInflater.from(getActivity()); Log.d(TAG, "Drawing controller " + controller.getCellRows().size()); for (final CellRowDB row : controller.getCellRows()){ Log.d(TAG, "Drawing row " + row.getId()); final LinearLayout louRow = (LinearLayout) inflater.inflate(R.layout.controller_row_edit, null); LinearLayout.LayoutParams rowParam = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); rowParam.weight = 1; louRow.setLayoutParams(rowParam); final LinearLayout louColumnHolder = (LinearLayout) louRow.findViewById(R.id.lou_btn_holder); final ImageButton btnAddCell = (ImageButton) louRow.findViewById(R.id.btn_add_column); for (final CellDB cell : row.getCells()) { Log.d(TAG, "Drawing cell " + cell.getId()); final View itemView = cellFactory.create(getActivity(), controller, cell); itemView.setOnClickListener(v -> getActivity().getSupportFragmentManager().beginTransaction() .replace(R.id.page_container, ControllCellFragment.newInstance(cell.getId())) .addToBackStack(null) .commit()); itemView.setOnLongClickListener(v -> { new AlertDialog.Builder(getActivity()) .setMessage(activity.getString(R.string.delete_cell)) .setPositiveButton(R.string.ok, (dialog, which) -> { realm.beginTransaction(); cell.deleteFromRealm(); if(row.getCells().size() <= 0) row.deleteFromRealm(); realm.commitTransaction(); redrawController(); }) .setNegativeButton(R.string.cancel, null) .show(); return true; }); louColumnHolder.addView(itemView); } btnAddCell.setOnClickListener(v -> { row.addCell(realm); redrawController(); }); louController.addView(louRow); } } /** * Update ui to match color set. * * @param color the color to use as base. */ public void updateColorPalette(int color){ /*int[] pallete; if(Colour.alpha(color) < 100){ pallete = Util.generatePallete(getResources().getColor(R.color.colorPrimary)); }else{ pallete = Util.generatePallete(color); } btnColor.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY); viwBackground.setBackgroundColor(pallete[0]); titleHolder.setBackgroundColor(pallete[0]); lblSettingsContainer.setBackgroundColor(pallete[0]); if (android.os.Build.VERSION.SDK_INT >= 21) { activity.getWindow().setStatusBarColor(pallete[0]); activity.getWindow().setNavigationBarColor(pallete[0]); if(actionBar != null) { actionBar.setBackgroundDrawable(new ColorDrawable(pallete[0])); } }*/ redrawController(); } @Override public void onDestroyView() { unbinder.unbind(); if (android.os.Build.VERSION.SDK_INT >= 21) { activity.getWindow().setStatusBarColor(activity.getResources().getColor(R.color.colorPrimaryDark)); activity.getWindow().setNavigationBarColor(activity.getResources().getColor(R.color.navigationBarColor)); if(actionBar != null) { actionBar.setBackgroundDrawable(new ColorDrawable(activity.getResources().getColor(R.color.colorPrimary))); } } ControlHelper.showNotification(getActivity(), controller); super.onDestroyView(); } @Override public void setColor(int color) { controller.setColor(color); updateColorPalette(color); } }