1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.camera.ui; 18 19 import android.content.Context; 20 import android.content.res.TypedArray; 21 import android.graphics.drawable.Drawable; 22 import android.util.AttributeSet; 23 import android.view.View; 24 25 import com.android.camera2.R; 26 27 /** 28 * A LienearLayout for a set of {@link android.view.View}s, 29 * one of which can be selected at any time. 30 */ 31 public class RadioOptions extends TopRightWeightedLayout { 32 /** 33 * Listener for responding to {@link android.view.View} click events. 34 */ 35 public interface OnOptionClickListener { 36 /** 37 * Override to respond to {@link android.view.View} click events. 38 * @param v {@link android.view.View} that was clicked. 39 */ 40 public void onOptionClicked(View v); 41 } 42 43 private Drawable mBackground; 44 private OnOptionClickListener mOnOptionClickListener; 45 46 /** 47 * Set the OnOptionClickListener. 48 * @params listener The listener to set. 49 */ 50 public void setOnOptionClickListener(OnOptionClickListener listener) { 51 mOnOptionClickListener = listener; 52 } 53 54 /** 55 * Constructor that is called when inflating a view from XML. 56 * @params context The Context the view is running in, through which it can access the current theme, resources, etc. 57 * @params attrs The attributes of the XML tag that is inflating the view. 58 */ 59 public RadioOptions(Context context, AttributeSet attrs) { 60 super(context, attrs); 61 62 TypedArray a = context.getTheme().obtainStyledAttributes( 63 attrs, 64 R.styleable.RadioOptions, 65 0, 0); 66 int drawableId = a.getResourceId(R.styleable.RadioOptions_selected_drawable, 0); 67 if (drawableId > 0) { 68 mBackground = context.getResources() 69 .getDrawable(drawableId); 70 } 71 } 72 73 @Override 74 public void onFinishInflate() { 75 super.onFinishInflate(); 76 updateListeners(); 77 } 78 79 /** 80 * Update each child {@link android.view.View}'s {@link android.view.View.OnClickListener}. 81 * Call this if the child views are added after the OnOptionClickListener, 82 * e.g. if the child views are added programatically. 83 */ 84 public void updateListeners() { 85 View.OnClickListener onClickListener = new View.OnClickListener() { 86 @Override 87 public void onClick(View button) { 88 setSelectedOptionByView(button); 89 } 90 }; 91 92 for (int i = 0; i < getChildCount(); i++) { 93 View button = getChildAt(i); 94 button.setOnClickListener(onClickListener); 95 } 96 } 97 98 /** 99 * Sets a child {@link android.view.View} as selected by tag. 100 * @param tag Tag that identifies a child {@link android.view.View}. No effect if view not found. 101 */ 102 public void setSelectedOptionByTag(Object tag) { 103 View button = findViewWithTag(tag); 104 setSelectedOptionByView(button); 105 } 106 107 /** 108 * Sets a child {@link android.view.View} as selected by id. 109 * @param id Resource ID that identifies a child {@link android.view.View}. No effect if view not found. 110 */ 111 public void setSeletedOptionById(int id) { 112 View button = findViewById(id); 113 setSelectedOptionByView(button); 114 } 115 116 private void setSelectedOptionByView(View view) { 117 if (view != null) { 118 // Reset all button states. 119 for (int i = 0; i < getChildCount(); i++) { 120 getChildAt(i).setBackground(null); 121 } 122 123 // Highlight the appropriate button. 124 view.setBackground(mBackground); 125 if (mOnOptionClickListener != null) { 126 mOnOptionClickListener.onOptionClicked(view); 127 } 128 } 129 } 130 }