| /* | |
| * 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.text.TextUtils; | |
| 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.settings.R; | |
| import java.util.Locale; | |
| 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(); | |
| // Locale Persian & Urdu are RTL languages but request LTR graph direction layout. | |
| final String defaultLanguageCode = Locale.getDefault().getLanguage(); | |
| if (TextUtils.equals(defaultLanguageCode, new Locale("fa").getLanguage()) | |
| || TextUtils.equals(defaultLanguageCode, new Locale("ur").getLanguage())) { | |
| findViewById(R.id.graph_label_group).setLayoutDirection(View.LAYOUT_DIRECTION_LTR); | |
| findViewById(R.id.bottom_label_group).setLayoutDirection(View.LAYOUT_DIRECTION_LTR); | |
| } | |
| } | |
| 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]); | |
| } | |
| } | |
| } |