/*
 * Copyright (C) 2010 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.settings.fuelgauge;

import android.content.Context;
import android.content.Intent;
import android.os.BatteryStats;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.R;
import com.android.settings.SettingsActivity;

/**
 * Custom preference for displaying power consumption as a bar and an icon on the left for the
 * subsystem/app type.
 *
 */
public class BatteryHistoryPreference extends Preference {

    protected static final String BATTERY_HISTORY_FILE = "tmp_bat_history.bin";
    protected static final String DOCK_BATTERY_HISTORY_FILE = "tmp_dock_bat_history.bin";

    private BatteryStats mStats;
    private BatteryStats mDockStats;
    private Intent mBatteryBroadcast;

    private BatteryHistoryChart mChart;
    private BatteryStatsHelper mHelper;

    public BatteryHistoryPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void performClick(PreferenceScreen preferenceScreen) {
        if (!isEnabled()) {
            return;
        }
        mHelper.storeStatsHistoryInFile(BATTERY_HISTORY_FILE);
        Bundle args = new Bundle();
        args.putString(BatteryHistoryDetail.EXTRA_STATS, BATTERY_HISTORY_FILE);
        if (mDockStats != null) {
                mHelper.storeDockStatsHistoryInFile(DOCK_BATTERY_HISTORY_FILE);
                args.putString(BatteryHistoryDetail.EXTRA_DOCK_STATS, DOCK_BATTERY_HISTORY_FILE);
            }

        args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST,
                mHelper.getBatteryBroadcast());
        if (getContext() instanceof SettingsActivity) {
            SettingsActivity sa = (SettingsActivity) getContext();
            sa.startPreferencePanel(BatteryHistoryDetail.class.getName(), args,
                    R.string.history_details_title, null, null, 0);
        }
    }

    public void setStats(BatteryStatsHelper batteryStats) {
        // Clear out the chart to receive new data.
        mChart = null;
        mHelper = batteryStats;
        mStats = batteryStats.getStats();
        mDockStats = batteryStats.getDockStats();
        mBatteryBroadcast = batteryStats.getBatteryBroadcast();
        if (getLayoutResource() != R.layout.battery_history_chart) {
            // Now we should have some data, set the layout we want.
            setLayoutResource(R.layout.battery_history_chart);
        }
        notifyChanged();
    }

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);

        if (mStats == null) {
            return;
        }
        BatteryHistoryChart chart = (BatteryHistoryChart) view.findViewById(
                R.id.battery_history_chart);
        if (mChart == null) {
            // First time: use and initialize this chart.
            chart.setStats(mStats, mBatteryBroadcast);
            chart.setDockStats(mDockStats, mBatteryBroadcast);
            mChart = chart;
        } else {
            // All future times: forget the newly inflated chart, re-use the
            // already initialized chart from last time.
            ViewGroup parent = (ViewGroup) chart.getParent();
            int index = parent.indexOfChild(chart);
            parent.removeViewAt(index);
            if (mChart.getParent() != null) {
                ((ViewGroup) mChart.getParent()).removeView(mChart);
            }
            parent.addView(mChart, index);
        }
    }
}
