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          */
onOptionClicked(View v)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      */
setOnOptionClickListener(OnOptionClickListener listener)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      */
RadioOptions(Context context, AttributeSet attrs)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
onFinishInflate()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      */
updateListeners()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      */
setSelectedOptionByTag(Object tag)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      */
setSeletedOptionById(int id)111     public void setSeletedOptionById(int id) {
112         View button = findViewById(id);
113         setSelectedOptionByView(button);
114     }
115 
setSelectedOptionByView(View view)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 }