/*
 * Copyright (C) 2016 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.systemui;

import android.annotation.Nullable;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.plugins.ViewProvider;

/**
 * Define an interface or abstract class as follows that includes the
 * version and action.
 *
 * public interface MyInterface {
 *     public static final String ACTION =
 *             "com.android.systemui.action.PLUGIN_MYINTERFACE";
 *
 *     public static final int VERSION = 1;
 *
 *     void myImportantInterface();
 * }
 *
 * Then put in a PluginInflateContainer to use and specify the interface
 * or class that will be implemented as viewType.  The layout specified
 * will be used by default and whenever a plugin is not present.
 *
 * <com.android.systemui.PluginInflateContainer
 *     android:id="@+id/some_id"
 *     android:layout_width="match_parent"
 *     android:layout_height="match_parent"
 *     android:layout="@layout/my_default_component"
 *     systemui:viewType="com.android.systemui.plugins.MyInterface" />
 */
public class PluginInflateContainer extends AutoReinflateContainer
        implements PluginListener<ViewProvider> {

    private static final String TAG = "PluginInflateContainer";

    private String mAction;
    private int mVersion;
    private View mPluginView;

    public PluginInflateContainer(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PluginInflateContainer);
        String viewType = a.getString(R.styleable.PluginInflateContainer_viewType);
        try {
            Class c = Class.forName(viewType);
            mAction = (String) c.getDeclaredField("ACTION").get(null);
            mVersion = (int) c.getDeclaredField("VERSION").get(null);
        } catch (Exception e) {
            Log.d(TAG, "Problem getting class info " + viewType, e);
            mAction = null;
            mVersion = 0;
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mAction != null) {
            PluginManager.getInstance(getContext()).addPluginListener(mAction, this, mVersion);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mAction != null) {
            PluginManager.getInstance(getContext()).removePluginListener(this);
        }
    }

    @Override
    protected void inflateLayoutImpl() {
        if (mPluginView != null) {
            addView(mPluginView);
        } else {
            super.inflateLayoutImpl();
        }
    }

    @Override
    public void onPluginConnected(ViewProvider plugin, Context context) {
        mPluginView = plugin.getView();
        inflateLayout();
    }

    @Override
    public void onPluginDisconnected(ViewProvider plugin) {
        mPluginView = null;
        inflateLayout();
    }
}
