/*
 * Copyright (C) 2015 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.tv.analytics;

import android.app.Application;
import android.content.Context;

/** An implementation of {@link Analytics} that returns a {@link StubTracker}. */
public final class StubAnalytics implements Analytics {
    public static StubAnalytics getInstance(Application application) {
        return new StubAnalytics(application);
    }

    private final Tracker mTracker = new StubTracker();
    private boolean mOptOut = true;

    private StubAnalytics(Context context) {}

    @Override
    public Tracker getDefaultTracker() {
        return mTracker;
    }

    @Override
    public boolean isAppOptOut() {
        return mOptOut;
    }

    @Override
    public void setAppOptOut(boolean optOut) {
        mOptOut = optOut;
    }
}
