Home | History | Annotate | Download | only in item
      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.Collection;
     24 import java.util.HashSet;
     25 import java.util.LinkedList;
     26 import java.util.List;
     27 import java.util.Set;
     28 
     29 /**
     30  * An {@link IItem} used to store information related to wake locks and kernel wake locks
     31  */
     32 public class WakelockItem implements IItem {
     33 
     34     /** Constant for JSON output */
     35     public static final String WAKELOCKS = "WAKELOCKS_INFO";
     36 
     37     private Collection<WakelockInfoItem> mWakeLocks = new LinkedList<WakelockInfoItem>();
     38 
     39     /**
     40      * Enum for describing the type of wakelock
     41      */
     42     public enum WakeLockCategory {
     43         KERNEL_WAKELOCK,
     44         PARTIAL_WAKELOCK,
     45     }
     46 
     47     public static class WakelockInfoItem extends GenericItem {
     48         /** Constant for JSON output */
     49         public static final String NAME = "NAME";
     50         /** Constant for JSON output */
     51         public static final String PROCESS_UID = "PROCESS_UID";
     52         /** Constant for JSON output */
     53         public static final String PROCESS_NAME = "PROCESS_NAME";
     54         /** Constant for JSON output */
     55         public static final String HELD_TIME = "HELD_TIME";
     56         /** Constant for JSON output */
     57         public static final String LOCKED_COUNT = "LOCKED_COUNT";
     58         /** Constant for JSON output */
     59         public static final String CATEGORY = "CATEGORY";
     60 
     61         private static final Set<String> ATTRIBUTES = new HashSet<String>(Arrays.asList(
     62                 NAME, PROCESS_UID, PROCESS_NAME, HELD_TIME, LOCKED_COUNT, CATEGORY));
     63 
     64         /**
     65          * The constructor for {@link WakelockItem}
     66          *
     67          * @param name The name of the wake lock
     68          * @param heldTime The amount of time held in milliseconds
     69          * @param lockedCount The number of times the wake lock was locked
     70          * @param category The {@link WakeLockCategory} of the wake lock
     71          */
     72         public WakelockInfoItem(String name, long heldTime, int lockedCount, WakeLockCategory category) {
     73             this(name, null, heldTime, lockedCount, category);
     74         }
     75 
     76         /**
     77          * The constructor for {@link WakelockItem}
     78          *
     79          * @param name The name of the wake lock
     80          * @param processUID The number of the wake lock
     81          * @param heldTime The amount of time held in milliseconds
     82          * @param lockedCount The number of times the wake lock was locked
     83          * @param category The {@link WakeLockCategory} of the wake lock
     84          */
     85         public WakelockInfoItem(String name, String processUID, long heldTime, int lockedCount,
     86                 WakeLockCategory category) {
     87             super(ATTRIBUTES);
     88 
     89             setAttribute(NAME, name);
     90             setAttribute(PROCESS_UID, processUID);
     91             setAttribute(HELD_TIME, heldTime);
     92             setAttribute(LOCKED_COUNT, lockedCount);
     93             setAttribute(CATEGORY, category);
     94         }
     95 
     96         /**
     97          * Get the name of the wake lock.
     98          */
     99         public String getName() {
    100             return (String) getAttribute(NAME);
    101         }
    102 
    103         /**
    104          * Get the process UID holding the wake lock.
    105          */
    106         public String getProcessUID() {
    107             return (String) getAttribute(PROCESS_UID);
    108         }
    109 
    110         /**
    111          * Get the time the wake lock was held in milliseconds.
    112          */
    113         public long getHeldTime() {
    114             return (Long) getAttribute(HELD_TIME);
    115         }
    116 
    117         /**
    118          * Get the number of times the wake lock was locked.
    119          */
    120         public int getLockedCount() {
    121             return (Integer) getAttribute(LOCKED_COUNT);
    122         }
    123 
    124         /**
    125          * Get the {@link WakeLockCategory} of the wake lock.
    126          */
    127         public WakeLockCategory getCategory() {
    128             return (WakeLockCategory) getAttribute(CATEGORY);
    129         }
    130 
    131         /**
    132          * Set the process name holding the wake lock
    133          */
    134         public void setWakelockProcessName(String processName) {
    135             setAttribute(PROCESS_NAME, processName);
    136         }
    137     }
    138 
    139     /**
    140      * Add a wakelock from the battery stats section.
    141      *
    142      * @param name The name of the wake lock.
    143      * @param processUID The number of the wake lock.
    144      * @param heldTime The held time of the wake lock.
    145      * @param timesCalled The number of times the wake lock has been called.
    146      * @param category The {@link WakeLockCategory} of the wake lock.
    147      */
    148     public void addWakeLock(String name, String processUID, long heldTime, int timesCalled,
    149             WakeLockCategory category) {
    150         mWakeLocks.add(new WakelockInfoItem(name, processUID, heldTime, timesCalled, category));
    151     }
    152 
    153     /**
    154      * Add a wakelock from the battery stats section.
    155      *
    156      * @param name The name of the wake lock.
    157      * @param heldTime The held time of the wake lock.
    158      * @param timesCalled The number of times the wake lock has been called.
    159      * @param category The {@link WakeLockCategory} of the wake lock.
    160      */
    161     public void addWakeLock(String name, long heldTime, int timesCalled,
    162             WakeLockCategory category) {
    163         addWakeLock(name, null, heldTime, timesCalled, category);
    164     }
    165 
    166     /**
    167      * Get a list of {@link WakelockInfoItem} objects matching a given {@link WakeLockCategory}.
    168      */
    169     public List<WakelockInfoItem> getWakeLocks(WakeLockCategory category) {
    170         LinkedList<WakelockInfoItem> wakeLocks = new LinkedList<WakelockInfoItem>();
    171         if (category == null) {
    172             return wakeLocks;
    173         }
    174 
    175         for (WakelockInfoItem wakeLock : mWakeLocks) {
    176             if (category.equals(wakeLock.getCategory())) {
    177                 wakeLocks.add(wakeLock);
    178             }
    179         }
    180         return wakeLocks;
    181     }
    182 
    183     /**
    184      * Get a list of {@link WakelockInfoItem} .
    185      */
    186     public List<WakelockInfoItem> getWakeLocks() {
    187         LinkedList<WakelockInfoItem> wakeLocks = new LinkedList<WakelockInfoItem>();
    188 
    189         for (WakelockInfoItem wakeLock : mWakeLocks) {
    190             wakeLocks.add(wakeLock);
    191         }
    192         return wakeLocks;
    193     }
    194 
    195     /**
    196      * {@inheritDoc}
    197      */
    198     @Override
    199     public IItem merge(IItem other) throws ConflictingItemException {
    200         throw new ConflictingItemException("Wakelock items cannot be merged");
    201     }
    202 
    203     /**
    204      * {@inheritDoc}
    205      */
    206     @Override
    207     public boolean isConsistent(IItem other) {
    208         return false;
    209     }
    210 
    211     /**
    212      * {@inheritDoc}
    213      */
    214     @Override
    215     public JSONObject toJson() {
    216         JSONObject object = new JSONObject();
    217         if (mWakeLocks != null) {
    218             try {
    219                 JSONArray wakeLocks = new JSONArray();
    220                 for (WakelockInfoItem wakeLock : mWakeLocks) {
    221                     wakeLocks.put(wakeLock.toJson());
    222                 }
    223                 object.put(WAKELOCKS, wakeLocks);
    224             } catch (JSONException e) {
    225                 // Ignore
    226             }
    227         }
    228         return object;
    229     }
    230 }
    231