package io.homeassistant.android.shortcuts;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RadioButton;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import io.homeassistant.android.CommunicationHandler;
import io.homeassistant.android.HassService;
import io.homeassistant.android.R;
import io.homeassistant.android.api.requests.ToggleRequest;
import io.homeassistant.android.api.results.Entity;
import static io.homeassistant.android.HassService.EXTRA_ACTION_COMMAND;
import static io.homeassistant.android.api.Domain.AUTOMATION;
import static io.homeassistant.android.api.Domain.INPUT_BOOLEAN;
import static io.homeassistant.android.api.Domain.LIGHT;
import static io.homeassistant.android.api.Domain.SCENE;
import static io.homeassistant.android.api.Domain.SWITCH;
public class ShortcutActivity extends AppCompatActivity implements CommunicationHandler.ServiceCommunicator {
public static final String ACTION_SHORTCUT_LAUNCHED = "action_shortcut_launched";
private static final String TAG = ShortcutActivity.class.getSimpleName();
private final CommunicationHandler communicationHandler = new CommunicationHandler(this);
private HassService service;
private ServiceConnection hassConnection;
private RecyclerView selectShortcutItemRecycler;
private Spinner selectActionSpinner;
private ViewAdapter viewAdapter = new ViewAdapter();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Intent serviceIntent = new Intent(this, HassService.class);
switch (getIntent().getAction()) {
case Intent.ACTION_CREATE_SHORTCUT:
setContentView(R.layout.activity_create_shortcut);
Toolbar t = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(t);
hassConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
service = ((HassService.HassBinder) binder).getService();
service.setActivityHandler(communicationHandler);
// Make sure that service is connected, if not it'll re-attempt
service.connect();
}
@Override
public void onServiceDisconnected(ComponentName name) {
service.setActivityHandler(null);
service = null;
}
};
serviceIntent.setAction(TAG);
bindService(serviceIntent, hassConnection, BIND_AUTO_CREATE);
selectShortcutItemRecycler = (RecyclerView) findViewById(R.id.recycler_select_shortcut_item);
selectShortcutItemRecycler.setLayoutManager(new LinearLayoutManager(this));
selectShortcutItemRecycler.setItemAnimator(new DefaultItemAnimator());
selectShortcutItemRecycler.setAdapter(viewAdapter);
selectActionSpinner = (Spinner) findViewById(R.id.spinner_set_shortcut_type);
ArrayAdapter adapter = new ArrayAdapter<>(this, android.support.design.R.layout.support_simple_spinner_dropdown_item, new String[]{"On", "Off"});
selectActionSpinner.setAdapter(adapter);
findViewById(R.id.button_add_shortcut).setOnClickListener(v -> {
Entity selected = viewAdapter.entities.get(viewAdapter.selected);
Intent result = new Intent();
Intent shortcut = new Intent(ShortcutActivity.this, ShortcutActivity.class);
shortcut.setAction(ACTION_SHORTCUT_LAUNCHED);
boolean stateOn = selectActionSpinner.getSelectedItem().equals("On");
shortcut.putExtra(EXTRA_ACTION_COMMAND, new ToggleRequest(selected, stateOn).toString());
result.putExtra(Intent.EXTRA_SHORTCUT_NAME, selected.getFriendlyName());
result.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(),
selected.id.startsWith("light") ? stateOn ? R.mipmap.ic_lightbulb_on : R.mipmap.ic_lightbulb_off : stateOn ? R.mipmap.ic_switch_on : R.mipmap.ic_switch_off));
result.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcut);
setResult(RESULT_OK, result);
finish();
});
break;
case ACTION_SHORTCUT_LAUNCHED:
String action = getIntent().getStringExtra(EXTRA_ACTION_COMMAND);
serviceIntent.putExtra(EXTRA_ACTION_COMMAND, action);
startService(serviceIntent);
finish();
break;
}
}
@Override
public void loginSuccess() {
}
@Override
public void loginFailed(int reason) {
finish();
Toast.makeText(this, R.string.login_error, Toast.LENGTH_LONG).show();
}
@Override
public void updateStates() {
for (Map.Entry<String, Entity> s : service.getEntityMap().entrySet()) {
Entity e = s.getValue();
switch (e.getDomain()) {
case AUTOMATION:
case INPUT_BOOLEAN:
case LIGHT:
case SCENE:
case SWITCH:
if (!e.isHidden())
viewAdapter.entities.add(e);
break;
}
}
Collections.sort(viewAdapter.entities);
viewAdapter.notifyDataSetChanged();
}
@Override
protected void onDestroy() {
if (hassConnection != null)
unbindService(hassConnection);
super.onDestroy();
}
private static class ViewAdapter extends RecyclerView.Adapter<ItemViewHolder> {
List<Entity> entities = new ArrayList<>();
int selected = -1;
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.shortcut_item, parent, false));
}
@Override
public void onBindViewHolder(final ItemViewHolder holder, int position) {
Entity e = entities.get(holder.getAdapterPosition());
holder.item.setChecked(holder.getAdapterPosition() == selected);
holder.item.setText(e.getFriendlyName());
holder.item.setOnClickListener(v -> {
int last = selected;
selected = holder.getAdapterPosition();
notifyItemChanged(last);
notifyItemChanged(selected);
});
}
@Override
public int getItemCount() {
return entities.size();
}
}
private static class ItemViewHolder extends RecyclerView.ViewHolder {
RadioButton item;
ItemViewHolder(View itemView) {
super(itemView);
item = (RadioButton) itemView.findViewById(R.id.shortcut_item);
}
}
}