1 /*
2  * Copyright (C) 2015 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 package com.android.loganalysis.item;
17 
18 import org.json.JSONArray;
19 import org.json.JSONException;
20 import org.json.JSONObject;
21 
22 import java.util.Arrays;
23 import java.util.Calendar;
24 import java.util.Collection;
25 import java.util.HashSet;
26 import java.util.LinkedList;
27 import java.util.Set;
28 
29 /**
30  * An {@link IItem} used to store information related to Battery discharge
31  */
32 public class BatteryDischargeItem implements IItem {
33 
34     /** Constant for JSON output */
35     public static final String BATTERY_DISCHARGE = "BATTERY_DISCHARGE";
36 
37     private Collection<BatteryDischargeInfoItem> mBatteryDischargeInfo =
38             new LinkedList<BatteryDischargeInfoItem>();
39 
40     public static class BatteryDischargeInfoItem extends GenericItem {
41         /** Constant for JSON output */
42         public static final String CLOCK_TIME_OF_DISCHARGE = "CLOCK_TIME_OF_DISCHARGE";
43         /** Constant for JSON output */
44         public static final String DISCHARGE_ELAPSED_TIME = "DISCHARGE_ELAPSED_TIME";
45         /** Constant for JSON output */
46         public static final String BATTERY_LEVEL = "BATTERY_LEVEL";
47 
48         private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
49                 CLOCK_TIME_OF_DISCHARGE, DISCHARGE_ELAPSED_TIME, BATTERY_LEVEL));
50 
51         /**
52          * The constructor for {@link BatteryDischargeInfoItem}
53          *
54          * @param clockTime Clock time when the battery discharge happened
55          * @param elapsedTime Time it took to discharge to the current battery level
56          * @param batteryLevel Current battery level
57          */
BatteryDischargeInfoItem(Calendar clockTime, long elapsedTime, int batteryLevel)58         public BatteryDischargeInfoItem(Calendar clockTime, long elapsedTime, int batteryLevel) {
59             super(ATTRIBUTES);
60 
61             setAttribute(CLOCK_TIME_OF_DISCHARGE, clockTime);
62             setAttribute(DISCHARGE_ELAPSED_TIME, elapsedTime);
63             setAttribute(BATTERY_LEVEL, batteryLevel);
64         }
65 
66         /**
67          * Get the clock time when the battery level dropped
68          */
getClockTime()69         public Calendar getClockTime() {
70             return (Calendar) getAttribute(CLOCK_TIME_OF_DISCHARGE);
71         }
72 
73         /**
74          * Get the time elapsed to discharge to the current battery level
75          */
getElapsedTime()76         public long getElapsedTime() {
77             return (long) getAttribute(DISCHARGE_ELAPSED_TIME);
78         }
79 
80         /**
81          * Get the current battery level
82          */
getBatteryLevel()83         public int getBatteryLevel() {
84             return (int) getAttribute(BATTERY_LEVEL);
85         }
86     }
87 
88     /**
89      * Add a battery discharge step from battery stats
90      *
91      * @param clockTime Clock time when the battery discharge happened
92      * @param elapsedTime Time it took to discharge to the current battery level
93      * @param batteryLevel Current battery level
94      */
addBatteryDischargeInfo(Calendar clockTime, long elapsedTime, int batteryLevel)95     public void addBatteryDischargeInfo(Calendar clockTime, long elapsedTime, int batteryLevel) {
96         mBatteryDischargeInfo.add(new BatteryDischargeInfoItem(clockTime,
97                 elapsedTime, batteryLevel));
98     }
99 
getDischargeStepsInfo()100     public Collection<BatteryDischargeInfoItem> getDischargeStepsInfo() {
101         return mBatteryDischargeInfo;
102     }
103 
104     /**
105      * {@inheritDoc}
106      */
107     @Override
merge(IItem other)108     public IItem merge(IItem other) throws ConflictingItemException {
109         throw new ConflictingItemException("Wakelock items cannot be merged");
110     }
111 
112     /**
113      * {@inheritDoc}
114      */
115     @Override
isConsistent(IItem other)116     public boolean isConsistent(IItem other) {
117         return false;
118     }
119 
120     /**
121      * {@inheritDoc}
122      */
123     @Override
toJson()124     public JSONObject toJson() {
125         JSONObject object = new JSONObject();
126         try {
127             JSONArray batteryDischargeSteps = new JSONArray();
128             for (BatteryDischargeInfoItem batteryDischargeStep : mBatteryDischargeInfo) {
129                 batteryDischargeSteps.put(batteryDischargeStep.toJson());
130             }
131             object.put(BATTERY_DISCHARGE, batteryDischargeSteps);
132         } catch (JSONException e) {
133             // Ignore
134         }
135         return object;
136     }
137 }
138