/*
 * 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;

class AppInfo {
    private AttributionKey mAttribution;

    protected AppInfo() {
    }

    public boolean hasPackage(String pkg) {
        return mAttribution.hasPackage(pkg);
    }

    public AttributionKey getAttribution() {
        return mAttribution;
    }

    abstract static class Builder<APP extends AppInfo> {
        private AttributionKey mAttribution;

        public Builder() {
        }

        public abstract APP build();

        protected void init(AppInfo app) {
            if (mAttribution == null) {
                throw new RuntimeException("setAttribution(AttributionKey attribution) not called");
            }
            app.mAttribution = mAttribution;
        }

        public void setAttribution(AttributionKey attribution) {
            mAttribution = attribution;
        }

        public AttributionKey getAttribution() {
            return mAttribution;
        }
    }
}
