package org.openhab.habclient; import android.content.ClipData; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.Log; import android.view.View; import android.widget.Toast; import org.openhab.domain.IApplicationModeProvider; import org.openhab.domain.model.ApplicationMode; import org.openhab.domain.model.GraphicUnit; import org.openhab.domain.model.OpenHABWidgetType; import org.openhab.habclient.dagger.DaggerGraphicUnitComponent; import org.openhab.habclient.dagger.GraphicUnitComponent; import org.openhab.habdroid.R; import org.openhab.habdroid.ui.OpenHABMainActivity; import org.openhab.habdroid.util.AutoRefreshImageView; import javax.inject.Inject; /** * Created by Tony Alpskog in 2013. */ public class GraphicUnitWidget extends AutoRefreshImageView implements View.OnClickListener, View.OnLongClickListener { private GraphicUnit gUnit; private UnitContainerView mUnitContainerView; @Inject IOpenHABSetting mOpenHABSetting; @Inject IApplicationModeProvider mApplicationModeProvider; public GraphicUnitWidget(Context context) { super(context); GraphicUnitComponent component = DaggerGraphicUnitComponent.builder() .appComponent(((HABApplication) context.getApplicationContext()).appComponent()) .build(); component.inject(this); } public GraphicUnitWidget(Context context, GraphicUnit graphicUnit, UnitContainerView unitContainerView) { this(context); gUnit = graphicUnit; mUnitContainerView = unitContainerView; String iconUrl = mOpenHABSetting.getBaseUrl() + "images/" + Uri.encode(gUnit.getOpenHABWidget().getIcon() + ".png"); setImageUrl(iconUrl, R.drawable.openhabiconsmall, mOpenHABSetting.getUsername(), mOpenHABSetting.getPassword()); setOnLongClickListener(this); setOnClickListener(this); } public GraphicUnit getgUnit() { return gUnit; } @Override public boolean onLongClick(View v) { Log.d("G-Click", "Long click detected"); if(mApplicationModeProvider.getAppMode() == ApplicationMode.UnitPlacement) { ClipData clipData = ClipData.newPlainText("label","text"); this.startDrag(clipData, new DragShadow(this), this, 0); } return false; } @Override public void onClick(View v) { Log.d("G-Click", "Short click detected"); if(mApplicationModeProvider.getAppMode() == ApplicationMode.UnitPlacement) { Log.d("G-Click", "View status BEFORE = " + (v.isSelected() ? "Selected" : "Not selected")); gUnit.setSelected(!gUnit.isSelected()); setSelected(gUnit.isSelected()); drawSelection(gUnit.isSelected()); Log.d("G-Click", "View status AFTER = " + (v.isSelected()? "Selected" : "Not selected")); } else if(mApplicationModeProvider.getAppMode() == ApplicationMode.RoomFlipper) { if(gUnit.getOpenHABWidget().getType() == OpenHABWidgetType.Group) { // Get launch intent for application Intent widgetListIntent = new Intent(getContext(), OpenHABMainActivity.class); widgetListIntent.setAction("SHOW_PAGE_AS_LIST");//TODO - Centralize this parameter widgetListIntent.putExtra("pageUrl", "openhab://sitemaps/demo/" + gUnit.getOpenHABWidget().getLinkedPage().getId() /*GF_Kitchen"*/ /*"https://demo.openhab.org:8443/rest/sitemaps/demo/GF_Kitchen"*/); Log.d(HABApplication.getLogTag(), "SHOW_PAGE_AS_LIST Intent for: " + "openhab://sitemaps/demo/" + gUnit.getOpenHABWidget().getLinkedPage().getId()); // Start launch activity getContext().startActivity(widgetListIntent); } else if(gUnit.getOpenHABWidget().getType().HasDynamicControl) mUnitContainerView.drawControlInRoom(gUnit); else Toast.makeText(getContext(), "Unit action is not (yet) supported for this unit type", Toast.LENGTH_SHORT).show(); } } public void drawSelection(boolean selected) { if(selected) { Bitmap bitmap = drawableToBitmap(getDrawable()).copy(Bitmap.Config.ARGB_8888, true); Rect bounds = getDrawable().getBounds(); int width = bounds.width(); int height = bounds.height(); int bitmapWidth = getDrawable().getIntrinsicWidth(); int bitmapHeight = getDrawable().getIntrinsicHeight(); Log.d("Bitmap", "Height = " + bitmapHeight + " Width = " + bitmapWidth); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); Canvas canvas = new Canvas(bitmap); canvas.drawCircle(canvas.getHeight()/2, canvas.getWidth()/2, (float) Math.floor(bitmapHeight/2) - Math.round(paint.getStrokeWidth()/2), paint); setImageBitmap(bitmap); } else { // setImageBitmap(originalBitmap); String iconUrl = mOpenHABSetting.getBaseUrl() + "images/" + Uri.encode(gUnit.getOpenHABWidget().getIcon() + ".png"); setImageUrl(iconUrl, R.drawable.openhabiconsmall, mOpenHABSetting.getUsername(), mOpenHABSetting.getPassword()); } } private Bitmap drawableToBitmap (Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable)drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } }