/*
 * 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.settings.vpn2;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.os.Bundle;

import com.android.settings.R;

/**
 * UI for managing the connection controlled by an app.
 *
 * Among the actions available are (depending on context):
 * <ul>
 *   <li><strong>Forget</strong>: revoke the managing app's VPN permission</li>
 *   <li><strong>Dismiss</strong>: continue to use the VPN</li>
 * </ul>
 *
 * {@see ConfigDialog}
 */
class AppDialog extends AlertDialog implements DialogInterface.OnClickListener {
    private final Listener mListener;
    private final PackageInfo mPackageInfo;
    private final String mLabel;

    AppDialog(Context context, Listener listener, PackageInfo pkgInfo, String label) {
        super(context);

        mListener = listener;
        mPackageInfo = pkgInfo;
        mLabel = label;
    }

    public final PackageInfo getPackageInfo() {
        return mPackageInfo;
    }

    @Override
    protected void onCreate(Bundle savedState) {
        setTitle(mLabel);
        setMessage(getContext().getString(R.string.vpn_version, mPackageInfo.versionName));

        createButtons();
        super.onCreate(savedState);
    }

    protected void createButtons() {
        Context context = getContext();

        // Forget the network
        setButton(DialogInterface.BUTTON_NEGATIVE,
                context.getString(R.string.vpn_forget), this);

        // Dismiss
        setButton(DialogInterface.BUTTON_POSITIVE,
                context.getString(R.string.vpn_done), this);
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if (which == DialogInterface.BUTTON_NEGATIVE) {
            mListener.onForget(dialog);
        }
        dismiss();
    }

    public interface Listener {
        public void onForget(DialogInterface dialog);
    }
}
