1d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk/*
2d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk * Copyright (C) 2016 The Android Open Source Project
3d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk *
4d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk * except in compliance with the License. You may obtain a copy of the License at
6d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk *
7d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
8d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk *
9d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
10d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk * KIND, either express or implied. See the License for the specific language governing
12d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk * permissions and limitations under the License.
13d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk */
14d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
15d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monkpackage com.android.settings.fuelgauge;
16d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
17d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monkimport android.os.BatteryStats.HistoryItem;
18d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monkimport android.util.SparseBooleanArray;
19d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monkimport android.util.SparseIntArray;
20d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monkimport com.android.settings.fuelgauge.BatteryActiveView.BatteryActiveProvider;
21d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monkimport com.android.settingslib.BatteryInfo;
22d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
23d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monkpublic class BatteryFlagParser implements BatteryInfo.BatteryDataParser, BatteryActiveProvider {
24d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
25d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private final SparseBooleanArray mData = new SparseBooleanArray();
26d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private final int mFlag;
27d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private final boolean mState2;
28d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private final int mAccentColor;
29d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
30d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private boolean mLastSet;
31d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private long mLength;
32d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private long mLastTime;
33d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
34d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public BatteryFlagParser(int accent, boolean state2, int flag) {
35d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        mAccentColor = accent;
36d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        mFlag = flag;
37d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        mState2 = state2;
38d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
39d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
40d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    protected boolean isSet(HistoryItem record) {
41d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        return ((mState2 ? record.states2 : record.states) & mFlag) != 0;
42d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
43d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
44d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    @Override
45d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public void onParsingStarted(long startTime, long endTime) {
46d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        mLength = endTime - startTime;
47d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
48d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
49d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    @Override
50d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public void onDataPoint(long time, HistoryItem record) {
51d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        boolean isSet = isSet(record);
52d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        if (isSet != mLastSet) {
53d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            mData.put((int) time, isSet);
54d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            mLastSet = isSet;
55d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        }
56d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        mLastTime = time;
57d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
58d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
59d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    @Override
60d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public void onDataGap() {
61d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        if (mLastSet) {
62d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            mData.put((int) mLastTime, false);
63d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            mLastSet = false;
64d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        }
65d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
66d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
67d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    @Override
68d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public void onParsingDone() {
69d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        if (mLastSet) {
70d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            mData.put((int) mLastTime, false);
71d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            mLastSet = false;
72d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        }
73d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
74d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
75d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    @Override
76d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public long getPeriod() {
77d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        return mLength;
78d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
79d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
80d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    @Override
81d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public boolean hasData() {
82d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        return mData.size() > 1;
83d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
84d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
85d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    @Override
86d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    public SparseIntArray getColorArray() {
87d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        SparseIntArray ret = new SparseIntArray();
88d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        for (int i = 0; i < mData.size(); i++) {
89d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            ret.put(mData.keyAt(i), getColor(mData.valueAt(i)));
90d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        }
91d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        return ret;
92d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
93d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk
94d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    private int getColor(boolean b) {
95d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        if (b) {
96d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk            return mAccentColor;
97d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        }
98d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk        return 0;
99d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk    }
100d1ea8a05b089714955e1523c40cdd1263b447a1aJason Monk}
101