/* * Copyright (C) 2016 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.settings.widget; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.SparseIntArray; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; import com.android.settingslib.R; public class UsageView extends FrameLayout { private final UsageGraph mUsageGraph; private final TextView[] mLabels; private final TextView[] mBottomLabels; public UsageView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.usage_view, this); mUsageGraph = findViewById(R.id.usage_graph); mLabels = new TextView[] { findViewById(R.id.label_bottom), findViewById(R.id.label_middle), findViewById(R.id.label_top), }; mBottomLabels = new TextView[] { findViewById(R.id.label_start), findViewById(R.id.label_end), }; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.UsageView, 0, 0); if (a.hasValue(R.styleable.UsageView_sideLabels)) { setSideLabels(a.getTextArray(R.styleable.UsageView_sideLabels)); } if (a.hasValue(R.styleable.UsageView_bottomLabels)) { setBottomLabels(a.getTextArray(R.styleable.UsageView_bottomLabels)); } if (a.hasValue(R.styleable.UsageView_textColor)) { int color = a.getColor(R.styleable.UsageView_textColor, 0); for (TextView v : mLabels) { v.setTextColor(color); } for (TextView v : mBottomLabels) { v.setTextColor(color); } } if (a.hasValue(R.styleable.UsageView_android_gravity)) { int gravity = a.getInt(R.styleable.UsageView_android_gravity, 0); if (gravity == Gravity.END) { LinearLayout layout = findViewById(R.id.graph_label_group); LinearLayout labels = findViewById(R.id.label_group); // Swap the children order. layout.removeView(labels); layout.addView(labels); // Set gravity. labels.setGravity(Gravity.END); // Swap the bottom space order. LinearLayout bottomLabels = findViewById(R.id.bottom_label_group); View bottomSpace = bottomLabels.findViewById(R.id.bottom_label_space); bottomLabels.removeView(bottomSpace); bottomLabels.addView(bottomSpace); } else if (gravity != Gravity.START) { throw new IllegalArgumentException("Unsupported gravity " + gravity); } } mUsageGraph.setAccentColor(a.getColor(R.styleable.UsageView_android_colorAccent, 0)); a.recycle(); } public void clearPaths() { mUsageGraph.clearPaths(); } public void addPath(SparseIntArray points) { mUsageGraph.addPath(points); } public void addProjectedPath(SparseIntArray points) { mUsageGraph.addProjectedPath(points); } public void configureGraph(int maxX, int maxY) { mUsageGraph.setMax(maxX, maxY); } public void setAccentColor(int color) { mUsageGraph.setAccentColor(color); } public void setDividerLoc(int dividerLoc) { mUsageGraph.setDividerLoc(dividerLoc); } public void setDividerColors(int middleColor, int topColor) { mUsageGraph.setDividerColors(middleColor, topColor); } public void setSideLabelWeights(float before, float after) { setWeight(R.id.space1, before); setWeight(R.id.space2, after); } private void setWeight(int id, float weight) { View v = findViewById(id); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams(); params.weight = weight; v.setLayoutParams(params); } public void setSideLabels(CharSequence[] labels) { if (labels.length != mLabels.length) { throw new IllegalArgumentException("Invalid number of labels"); } for (int i = 0; i < mLabels.length; i++) { mLabels[i].setText(labels[i]); } } public void setBottomLabels(CharSequence[] labels) { if (labels.length != mBottomLabels.length) { throw new IllegalArgumentException("Invalid number of labels"); } for (int i = 0; i < mBottomLabels.length; i++) { mBottomLabels[i].setText(labels[i]); } } }