Signed-off-by: hmz007 <hmz007@gmail.com> Change-Id: Ib87fdbe7a0be7dc961af3500fe9ea4589a127f9f
201 lines
6.5 KiB
Java
201 lines
6.5 KiB
Java
/*
|
|
* 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
|
|
}
|
|
|
|
}
|