1 /* 2 * Copyright (C) 2019 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.car.developeroptions.widget; 18 19 import android.content.Context; 20 import android.content.res.TypedArray; 21 import android.util.AttributeSet; 22 import android.util.SparseIntArray; 23 import android.view.Gravity; 24 import android.view.LayoutInflater; 25 import android.view.View; 26 import android.widget.FrameLayout; 27 import android.widget.LinearLayout; 28 import android.widget.TextView; 29 30 import com.android.settingslib.R; 31 32 public class UsageView extends FrameLayout { 33 34 private final UsageGraph mUsageGraph; 35 private final TextView[] mLabels; 36 private final TextView[] mBottomLabels; 37 UsageView(Context context, AttributeSet attrs)38 public UsageView(Context context, AttributeSet attrs) { 39 super(context, attrs); 40 LayoutInflater.from(context).inflate(R.layout.usage_view, this); 41 mUsageGraph = findViewById(R.id.usage_graph); 42 mLabels = new TextView[] { 43 findViewById(R.id.label_bottom), 44 findViewById(R.id.label_middle), 45 findViewById(R.id.label_top), 46 }; 47 mBottomLabels = new TextView[] { 48 findViewById(R.id.label_start), 49 findViewById(R.id.label_end), 50 }; 51 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.UsageView, 0, 0); 52 if (a.hasValue(R.styleable.UsageView_sideLabels)) { 53 setSideLabels(a.getTextArray(R.styleable.UsageView_sideLabels)); 54 } 55 if (a.hasValue(R.styleable.UsageView_bottomLabels)) { 56 setBottomLabels(a.getTextArray(R.styleable.UsageView_bottomLabels)); 57 } 58 if (a.hasValue(R.styleable.UsageView_textColor)) { 59 int color = a.getColor(R.styleable.UsageView_textColor, 0); 60 for (TextView v : mLabels) { 61 v.setTextColor(color); 62 } 63 for (TextView v : mBottomLabels) { 64 v.setTextColor(color); 65 } 66 } 67 if (a.hasValue(R.styleable.UsageView_android_gravity)) { 68 int gravity = a.getInt(R.styleable.UsageView_android_gravity, 0); 69 if (gravity == Gravity.END) { 70 LinearLayout layout = findViewById(R.id.graph_label_group); 71 LinearLayout labels = findViewById(R.id.label_group); 72 // Swap the children order. 73 layout.removeView(labels); 74 layout.addView(labels); 75 // Set gravity. 76 labels.setGravity(Gravity.END); 77 // Swap the bottom space order. 78 LinearLayout bottomLabels = findViewById(R.id.bottom_label_group); 79 View bottomSpace = bottomLabels.findViewById(R.id.bottom_label_space); 80 bottomLabels.removeView(bottomSpace); 81 bottomLabels.addView(bottomSpace); 82 } else if (gravity != Gravity.START) { 83 throw new IllegalArgumentException("Unsupported gravity " + gravity); 84 } 85 } 86 mUsageGraph.setAccentColor(a.getColor(R.styleable.UsageView_android_colorAccent, 0)); 87 a.recycle(); 88 } 89 clearPaths()90 public void clearPaths() { 91 mUsageGraph.clearPaths(); 92 } 93 addPath(SparseIntArray points)94 public void addPath(SparseIntArray points) { 95 mUsageGraph.addPath(points); 96 } 97 addProjectedPath(SparseIntArray points)98 public void addProjectedPath(SparseIntArray points) { 99 mUsageGraph.addProjectedPath(points); 100 } 101 configureGraph(int maxX, int maxY)102 public void configureGraph(int maxX, int maxY) { 103 mUsageGraph.setMax(maxX, maxY); 104 } 105 setAccentColor(int color)106 public void setAccentColor(int color) { 107 mUsageGraph.setAccentColor(color); 108 } 109 setDividerLoc(int dividerLoc)110 public void setDividerLoc(int dividerLoc) { 111 mUsageGraph.setDividerLoc(dividerLoc); 112 } 113 setDividerColors(int middleColor, int topColor)114 public void setDividerColors(int middleColor, int topColor) { 115 mUsageGraph.setDividerColors(middleColor, topColor); 116 } 117 setSideLabelWeights(float before, float after)118 public void setSideLabelWeights(float before, float after) { 119 setWeight(R.id.space1, before); 120 setWeight(R.id.space2, after); 121 } 122 setWeight(int id, float weight)123 private void setWeight(int id, float weight) { 124 View v = findViewById(id); 125 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams(); 126 params.weight = weight; 127 v.setLayoutParams(params); 128 } 129 setSideLabels(CharSequence[] labels)130 public void setSideLabels(CharSequence[] labels) { 131 if (labels.length != mLabels.length) { 132 throw new IllegalArgumentException("Invalid number of labels"); 133 } 134 for (int i = 0; i < mLabels.length; i++) { 135 mLabels[i].setText(labels[i]); 136 } 137 } 138 setBottomLabels(CharSequence[] labels)139 public void setBottomLabels(CharSequence[] labels) { 140 if (labels.length != mBottomLabels.length) { 141 throw new IllegalArgumentException("Invalid number of labels"); 142 } 143 for (int i = 0; i < mBottomLabels.length; i++) { 144 mBottomLabels[i].setText(labels[i]); 145 } 146 } 147 148 } 149