blob: c521f1560d7c80ba53cd2d91f6b79e3fc0639d6c [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.testingcamera2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ToggleButton;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
/**
* A base control pane, with standard abilities to collapse or remove itself.
*/
public class ControlPane extends LinearLayout {
private final StatusListener mStatusListener;
private String mPaneName = "unnamed";
protected final PaneTracker mPaneTracker;
private View[] mHeaderViews;
private OnClickListener mRemoveButtonListener = new OnClickListener() {
@Override
public void onClick(View v) {
remove();
}
};
private OnClickListener mCollapseButtonListener = new OnClickListener() {
private boolean mCollapsed = false;
@Override
public void onClick(View v) {
if (mCollapsed) {
mCollapsed = false;
// Unhide all pane items
for (int i = 0; i < ControlPane.this.getChildCount(); i++) {
ControlPane.this.getChildAt(i).setVisibility(VISIBLE);
}
} else {
mCollapsed = true;
// Hide all pane items
for (int i = 0; i < ControlPane.this.getChildCount(); i++) {
ControlPane.this.getChildAt(i).setVisibility(GONE);
}
// Except for the header
for (int i = 0; i < mHeaderViews.length; i++) {
mHeaderViews[i].setVisibility(VISIBLE);
}
}
}
};
public ControlPane(Context context, AttributeSet attrs, StatusListener listener,
PaneTracker paneTracker) {
super(context, attrs);
mStatusListener = listener;
mPaneTracker = paneTracker; // Parent takes care of adding pane to tracking
this.setOrientation(VERTICAL);
LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.control_pane_header, this);
// Add all header views into list to manage collapsing pane correctly
mHeaderViews = new View[getChildCount()];
for (int i = 0; i < getChildCount(); i++) {
mHeaderViews[i] = getChildAt(i);
}
// Set up the header controls
ToggleButton collapseButton = (ToggleButton)
findViewById(R.id.control_pane_collapse_button);
collapseButton.setOnClickListener(mCollapseButtonListener);
Button removeButton = (Button) findViewById(R.id.control_pane_remove_button);
removeButton.setOnClickListener(mRemoveButtonListener);
}
/**
* Add to pane tracking when the pane becomes part of the UI
*/
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
if (mPaneTracker != null) {
mPaneTracker.addPane(this);
}
}
/**
* Remove this pane from its list and clean up its state
*/
public void remove() {
if (mStatusListener != null) {
mStatusListener.onRemoveRequested(ControlPane.this);
}
if (mPaneTracker != null ) {
mPaneTracker.removePane(this);
}
}
/**
* Get a nice name for this pane.
*/
public String getPaneName() {
return mPaneName;
}
/**
* Listener to be implemented by an application service that handles removing this
* pane from the UI. Called when the pane is ready to be destroyed.
*/
public interface StatusListener {
public void onRemoveRequested(ControlPane p);
}
/**
* Set the name for this pane, also used as the header title.
*/
protected void setName(String name) {
mPaneName = name;
((TextView) findViewById(R.id.control_pane_title_text)).setText(name);
}
/**
* Get an XML attribute as a integer; if the attribute does not exist, return the default value.
*
* @throws XmlPullParserException if parser not at a START_TAG event, or the attribute is not
* formatted as a string.
*/
protected static int getAttributeInt(XmlPullParser configParser,
String attributeName, int defaultValue) throws XmlPullParserException {
String value = configParser.getAttributeValue(null, attributeName);
if (value == null ) return defaultValue;
try {
int v = Integer.parseInt(value);
return v;
} catch (NumberFormatException e) {
throw new XmlPullParserException("Expected integer attribute",
configParser, e);
}
}
/**
* Get an XML attribute as a String; if the attribute does not exist, return the default value.
*
* @throws XmlPullParserException if parser not at a START_TAG event.
*/
protected static String getAttributeString(
XmlPullParser configParser,
String attributeName, String defaultValue) throws XmlPullParserException {
String value = configParser.getAttributeValue(null, attributeName);
return (value == null) ? defaultValue : value;
}
/**
* Called when other panes want to inform the rest of the app of interesting events
*
* @param sourcePane the source pane of the event
* @param event the type of event
*/
public void notifyPaneEvent(ControlPane sourcePane, PaneTracker.PaneEvent event) {
// Default empty implementation
}
/**
* Called when the app's UI orientation changes.
*
* @param orientation one of the Surface.ROTATION_* constants
*/
public void onOrientationChange(int orientation) {
// Default empty implementation
}
}