content: /*
   * Copyright (C) 2018 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.powermodel;
  
  /**
   * Identifiers for well-known apps that have unique characteristics.
   *
   * @more
   * This includes three categories:
   * <ul>
   *   <li><b>Built-in system components</b> – These have predefined UIDs that are
   *   always the same. For example, the system UID is always 1000.</li>
   *   <li><b>Well known apps with shared UIDs</b> – These do not have predefined
   *   UIDs (i.e. are different on each device), but since they have shared UIDs
   *   with varying sets of package names (GmsCore is the canonical example), we
   *   have special logic to capture these into a single entity with a well defined
   *   key. These have the {@link #uid uid} field set to
   *   {@link Uid#UID_VARIES Uid.UID_VARIES}.</li>
   *   <li><b>Synthetic remainder app</b> – The {@link #REMAINDER REMAINDER} app doesn't
   *   represent a real app. It contains accounting for usage which is not attributed
   *   to any UID. This app has the {@link #uid uid} field set to
   *   {@link Uid#UID_SYNTHETIC Uid.UID_SYNTHETIC}.</li>
   * </ul>
   */
  public enum SpecialApp {
  
      /**
       * Synthetic app that accounts for the remaining amount of resources used
       * that is unaccounted for by apps, or overcounted because of inaccuracies
       * in the model.
       */
      REMAINDER(Uid.UID_SYNTHETIC),
  
      /**
       * Synthetic app that holds system-wide numbers, for example the total amount
       * of various resources used, device-wide.
       */
      GLOBAL(Uid.UID_SYNTHETIC),
  
      SYSTEM(1000),
  
      GOOGLE_SERVICES(Uid.UID_VARIES);
  
      /**
       * Constants for SpecialApps where the uid is not actually a UID.
       */
      public static class Uid {
          /**
           * Constant to indicate that this special app does not have a fixed UID.
           */
          public static final int UID_VARIES = -1;
  
          /**
           * Constant to indicate that this special app is not actually an app with a UID.
           * 
           * @see SpecialApp#REMAINDER
           * @see SpecialApp#GLOBAL
           */
          public static final int UID_SYNTHETIC = -2;
      }
  
      /**
       * The fixed UID value of this special app, or {@link #UID_VARIES} if there
       * isn't one.
       */
      public final int uid;
  
      private SpecialApp(int uid) {
          this.uid = uid;
      }
  }
  