/* * Copyright (c) 2012 Socialize Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.socialize.ui.view; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.LayerDrawable; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.socialize.i18n.LocalizationService; import com.socialize.ui.util.Colors; import com.socialize.ui.util.CompatUtils; import com.socialize.util.DisplayUtils; import com.socialize.util.Drawables; import com.socialize.util.StringUtils; /** * @author Jason Polites * */ public abstract class ClickableSectionCell extends LinearLayout { protected LocalizationService localizationService; protected Drawables drawables; protected Colors colors; protected DisplayUtils displayUtils; private String displayTextKey; private TextView textView; private ImageView imageView; private String backgroundColor; private String textColor; private OnToggleListener onToggleListener; private int bgColor; private int txtColor; private int strokeColor = -1; private int bgAlpha = 128; private Drawable imageOn; private Drawable imageOff; private String toggledDrawableName = null; private String untoggledDrawableName = null; private float topLeftRadius = 6.0f; private float topRightRadius = 6.0f; private float bottomLeftRadius = 6.0f; private float bottomRightRadius = 6.0f; private boolean canClick = true; private boolean toggled = true; private int topStroke = 1; private int rightStroke = 1; private int bottomStroke = 1; private int leftStroke = 1; private int strokeCornerOffset = 2; private float[] radii; private float[] strokeRadii; private GradientDrawable background; private GradientDrawable stroke; private LayerDrawable bgLayer; private ImageView arrowIcon; private int cellWidth = -1; public ClickableSectionCell(Context context) { super(context); } public void init() { if(strokeColor < 0 && colors != null) { strokeColor = colors.getColor(Colors.CLICKABLE_CELL_STROKE); } if(displayUtils != null) { topLeftRadius= displayUtils.getDIP(topLeftRadius); topRightRadius= displayUtils.getDIP(topRightRadius); bottomRightRadius= displayUtils.getDIP(bottomRightRadius); bottomLeftRadius= displayUtils.getDIP(bottomLeftRadius); } radii = new float[]{ topLeftRadius, topLeftRadius, topRightRadius, topRightRadius, bottomRightRadius, bottomRightRadius, bottomLeftRadius, bottomLeftRadius }; if(!StringUtils.isEmpty(backgroundColor)) { bgColor = Colors.parseColor(backgroundColor); } else if(colors != null) { bgColor = colors.getColor(Colors.ACTIVITY_BG); } if(!StringUtils.isEmpty(textColor)) { txtColor = Colors.parseColor(textColor); } else if(colors != null) { txtColor = colors.getColor(Colors.BODY); } if(cellWidth < 0) { cellWidth = LayoutParams.FILL_PARENT; } LinearLayout master = new LinearLayout(getContext()); LinearLayout.LayoutParams masterParams = new LayoutParams(cellWidth, LayoutParams.WRAP_CONTENT); LinearLayout.LayoutParams textParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); LinearLayout.LayoutParams iconParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); textParams.weight = 1.0f; textParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; iconParams.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; int margin = 0; if(displayUtils != null) { margin = displayUtils.getDIP(4); } textParams.setMargins(margin*2, 0, margin, 0); iconParams.setMargins(margin, 0, margin, 0); View text = makeDisplayText(); text.setLayoutParams(textParams); imageView = makeImage(); if(imageOn != null) { imageView.setImageDrawable(imageOn); } master.setLayoutParams(masterParams); setBackground(); if(imageView != null) { master.addView(imageView); } master.addView(text); if(canClick && toggledDrawableName != null) { arrowIcon = new ImageView(getContext()); arrowIcon.setImageDrawable(drawables.getDrawable(toggledDrawableName)); arrowIcon.setLayoutParams(iconParams); master.addView(arrowIcon); } addView(master); } protected View makeDisplayText() { textView = new TextView(getContext()); textView.setText(localizationService.getString(displayTextKey)); textView.setTextColor(txtColor); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); return textView; } protected abstract ImageView makeImage(); protected void setBackground() { if(background == null) background = makeGradient(bgColor, bgColor); if(stroke == null) stroke = makeGradient(strokeColor, strokeColor); if(bgLayer == null) bgLayer = new LayerDrawable(new Drawable[]{stroke, background}); strokeRadii = new float[8]; initBackground(); } protected void initBackground() { if(background != null) { background.setCornerRadii(radii); background.setAlpha(bgAlpha); } if(bgLayer != null) { bgLayer.setLayerInset(1, leftStroke, topStroke, rightStroke, bottomStroke); } if(stroke != null) { int pixel = displayUtils.getDIP(strokeCornerOffset); for (int i = 0; i < strokeRadii.length; i++) { if(radii[i] > 0) { strokeRadii[i] = radii[i] + pixel; } else { strokeRadii[i] = 0.0f; } } stroke.setCornerRadii(strokeRadii); stroke.setAlpha(bgAlpha); } CompatUtils.setBackgroundDrawable(this, bgLayer); if(displayUtils != null) { int padding = displayUtils.getDIP(8); setPadding(padding, padding, padding, padding); } } public void setDrawables(Drawables drawables) { this.drawables = drawables; } public void setColors(Colors colors) { this.colors = colors; } public void setDisplayUtils(DisplayUtils displayUtils) { this.displayUtils = displayUtils; } public void setDisplayTextKey(String displayTextKey) { this.displayTextKey = displayTextKey; if(textView != null) { textView.setText(localizationService.getString(displayTextKey)); } } public void setImageOn(Drawable image) { this.imageOn = image; } public Drawable getImageOff() { return imageOff; } public void setImageOff(Drawable imageOff) { this.imageOff = imageOff; } public Drawable getImageOn() { return imageOn; } public void setBackgroundData(float [] radii, int[] strokes, int strokeColor) { this.strokeColor = strokeColor; topStroke = strokes[0]; rightStroke = strokes[1]; bottomStroke = strokes[2]; leftStroke = strokes[3]; this.radii = radii; initBackground(); } public void setBackgroundColor(String backgroundColor) { this.backgroundColor = backgroundColor; } public void setBgAlpha(int bgAlpha) { this.bgAlpha = bgAlpha; } public void setCanClick(boolean clickable) { this.canClick = clickable; } public void setStrokeCornerOffset(int strokeCornerOffset) { this.strokeCornerOffset = strokeCornerOffset; } public void setStrokeColor(int strokeColor) { this.strokeColor = strokeColor; } public void setToggledDrawableName(String toggledDrawableName) { this.toggledDrawableName = toggledDrawableName; } public void setUntoggledDrawableName(String untoggledDrawableName) { this.untoggledDrawableName = untoggledDrawableName; } public static interface OnToggleListener { public void onToggle(boolean on); } // So we can mock protected GradientDrawable makeGradient(int bottom, int top) { return new GradientDrawable( GradientDrawable.Orientation.BOTTOM_TOP, new int[] { bottom, top }); } public boolean isToggled() { return toggled; } public void setOnToggleListener(OnToggleListener onToggleListener) { this.onToggleListener = onToggleListener; } public void setToggled(boolean toggled) { this.toggled = toggled; if(toggled) { if(imageOn != null) { imageView.setImageDrawable(imageOn); } if(arrowIcon != null && toggledDrawableName != null) { arrowIcon.setImageDrawable(drawables.getDrawable(toggledDrawableName)); } } else { if(imageOff != null) { imageView.setImageDrawable(imageOff); } if(arrowIcon != null && untoggledDrawableName != null) { arrowIcon.setImageDrawable(drawables.getDrawable(untoggledDrawableName)); } } if(onToggleListener != null) { onToggleListener.onToggle(toggled); } } public int getCellWidth() { return cellWidth; } public void setCellWidth(int cellWidth) { this.cellWidth = cellWidth; } public void setLocalizationService(LocalizationService localizationService) { this.localizationService = localizationService; } }