blob: 8525f9419f36cdaf56d2282dfd14c4a0ef4075c4 [file] [log] [blame]
/*
* Copyright (C) 2013 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.loganalysis.item;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* An {@link IItem} used to store the battery info part of the dumpsys output.
*/
public class DumpsysBatteryInfoItem implements IItem {
/** Constant for JSON output */
public static final String WAKELOCKS = "WAKELOCKS";
/**
* Enum for describing the type of wakelock
*/
public enum WakeLockCategory {
LAST_CHARGE_WAKELOCK,
LAST_CHARGE_KERNEL_WAKELOCK,
LAST_UNPLUGGED_WAKELOCK,
LAST_UNPLUGGED_KERNEL_WAKELOCK;
}
/**
* A class designed to store information related to wake locks and kernel wake locks.
*/
public static class WakeLock extends GenericItem {
/** Constant for JSON output */
public static final String NAME = "NAME";
/** Constant for JSON output */
public static final String NUMBER = "NUMBER";
/** Constant for JSON output */
public static final String HELD_TIME = "HELD_TIME";
/** Constant for JSON output */
public static final String LOCKED_COUNT = "LOCKED_COUNT";
/** Constant for JSON output */
public static final String CATEGORY = "CATEGORY";
private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
NAME, NUMBER, HELD_TIME, LOCKED_COUNT, CATEGORY));
/**
* The constructor for {@link WakeLock}
*
* @param name The name of the wake lock
* @param heldTime The amount of time held in milliseconds
* @param lockedCount The number of times the wake lock was locked
* @param category The {@link WakeLockCategory} of the wake lock
*/
public WakeLock(String name, long heldTime, int lockedCount, WakeLockCategory category) {
this(name, null, heldTime, lockedCount, category);
}
/**
* The constructor for {@link WakeLock}
*
* @param name The name of the wake lock
* @param number The number of the wake lock
* @param heldTime The amount of time held in milliseconds
* @param lockedCount The number of times the wake lock was locked
* @param category The {@link WakeLockCategory} of the wake lock
*/
public WakeLock(String name, Integer number, long heldTime, int lockedCount,
WakeLockCategory category) {
super(ATTRIBUTES);
setAttribute(NAME, name);
setAttribute(NUMBER, number);
setAttribute(HELD_TIME, heldTime);
setAttribute(LOCKED_COUNT, lockedCount);
setAttribute(CATEGORY, category);
}
/**
* Get the name of the wake lock.
*/
public String getName() {
return (String) getAttribute(NAME);
}
/**
* Get the number of the wake lock.
*/
public Integer getNumber() {
return (Integer) getAttribute(NUMBER);
}
/**
* Get the time the wake lock was held in milliseconds.
*/
public long getHeldTime() {
return (Long) getAttribute(HELD_TIME);
}
/**
* Get the number of times the wake lock was locked.
*/
public int getLockedCount() {
return (Integer) getAttribute(LOCKED_COUNT);
}
/**
* Get the {@link WakeLockCategory} of the wake lock.
*/
public WakeLockCategory getCategory() {
return (WakeLockCategory) getAttribute(CATEGORY);
}
}
private Collection<WakeLock> mWakeLocks = new LinkedList<WakeLock>();
/**
* Add a wakelock from the battery info section.
*
* @param name The name of the wake lock.
* @param number The number of the wake lock.
* @param heldTime The held time of the wake lock.
* @param timesCalled The number of times the wake lock has been called.
* @param category The {@link WakeLockCategory} of the wake lock.
*/
public void addWakeLock(String name, Integer number, long heldTime, int timesCalled,
WakeLockCategory category) {
mWakeLocks.add(new WakeLock(name, number, heldTime, timesCalled, category));
}
/**
* Add a wakelock from the battery info section.
*
* @param name The name of the wake lock.
* @param heldTime The held time of the wake lock.
* @param timesCalled The number of times the wake lock has been called.
* @param category The {@link WakeLockCategory} of the wake lock.
*/
public void addWakeLock(String name, long heldTime, int timesCalled,
WakeLockCategory category) {
addWakeLock(name, null, heldTime, timesCalled, category);
}
/**
* Get a list of {@link WakeLock} objects matching a given {@link WakeLockCategory}.
*/
public List<WakeLock> getWakeLocks(WakeLockCategory category) {
LinkedList<WakeLock> wakeLocks = new LinkedList<WakeLock>();
if (category == null) {
return wakeLocks;
}
for (WakeLock wakeLock : mWakeLocks) {
if (category.equals(wakeLock.getCategory())) {
wakeLocks.add(wakeLock);
}
}
return wakeLocks;
}
/**
* {@inheritDoc}
*/
@Override
public IItem merge(IItem other) throws ConflictingItemException {
throw new ConflictingItemException("Dumpsys battery info items cannot be merged");
}
/**
* {@inheritDoc}
*/
@Override
public boolean isConsistent(IItem other) {
return false;
}
/**
* {@inheritDoc}
*/
@Override
public JSONObject toJson() {
JSONObject object = new JSONObject();
try {
JSONArray wakeLocks = new JSONArray();
for (WakeLock wakeLock : mWakeLocks) {
wakeLocks.put(wakeLock.toJson());
}
object.put(WAKELOCKS, wakeLocks);
} catch (JSONException e) {
// Ignore
}
return object;
}
}