/* * Copyright © 2016 TIBCO Software,Inc.All rights reserved. * http://community.jaspersoft.com/project/jaspermobile-android * * Unless you have purchased a commercial license agreement from TIBCO Jaspersoft, * the following license terms apply: * * This program is part of TIBCO Jaspersoft Mobile for Android. * * TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation,either version 3of the License,or * (at your option)any later version. * * TIBCO Jaspersoft Mobile is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY;without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with TIBCO Jaspersoft Mobile for Android.If not,see * <http://www.gnu.org/licenses/lgpl>. */ package com.jaspersoft.android.jaspermobile.widget; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Checkable; import android.widget.RelativeLayout; public class CheckedRelativeLayout extends RelativeLayout implements Checkable { private boolean mChecked; private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; public CheckedRelativeLayout(Context context) { super(context); } public CheckedRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public CheckedRelativeLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @SuppressLint("NewApi") @SuppressWarnings("deprecation") public void setSupportBackground(Drawable background) { int sdk = android.os.Build.VERSION.SDK_INT; if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { setBackgroundDrawable(background); } else { setBackground(background); } } public void setSupportBackground(int id) { setSupportBackground(getContext().getResources().getDrawable(id)); } /**********************/ /** Handle clicks **/ /**********************/ @Override public boolean performClick() { toggle(); return super.performClick(); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return onTouchEvent(ev); } /**************************/ /** Checkable **/ /**************************/ @Override public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); setCheckedRecursive(this, checked); } } private void setCheckedRecursive(ViewGroup parent, boolean checked) { int count = parent.getChildCount(); for (int i = 0; i < count; i++) { View v = parent.getChildAt(i); if (v instanceof Checkable) { ((Checkable) v).setChecked(checked); } if (v instanceof ViewGroup) { setCheckedRecursive((ViewGroup) v, checked); } } } @Override public boolean isChecked() { return mChecked; } @Override public void toggle() { setChecked(!mChecked); } /**************************/ /** Drawable States **/ /**************************/ @Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } @Override protected void drawableStateChanged() { super.drawableStateChanged(); Drawable drawable = getBackground(); if (drawable != null) { int[] myDrawableState = getDrawableState(); drawable.setState(myDrawableState); invalidate(); } } @Override protected Parcelable onSaveInstanceState() { SavedState result = new SavedState(super.onSaveInstanceState()); result.checked = mChecked; return result; } @Override protected void onRestoreInstanceState(Parcelable state) { if (!(state instanceof SavedState)) { super.onRestoreInstanceState(state); return; } SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); setChecked(ss.checked); } protected static class SavedState extends BaseSavedState { protected boolean checked; protected SavedState(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(checked ? 1 : 0); } public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; private SavedState(Parcel in) { super(in); checked = in.readInt() == 1; } } }