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

import static android.content.Intent.EXTRA_USER;

import android.accounts.Account;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;

import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceClickListener;

import com.android.settings.Utils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.widget.AppPreference;

public class AccountTypePreference extends AppPreference implements OnPreferenceClickListener {
    /**
     * Title of the tile that is shown to the user.
     *
     * @attr ref android.R.styleable#PreferenceHeader_title
     */
    private final CharSequence mTitle;

    /**
     * Packange name used to resolve the resources of the title shown to the user in the new
     * fragment.
     */
    private final String mTitleResPackageName;

    /**
     * Resource id of the title shown to the user in the new fragment.
     */
    private final int mTitleResId;

    /**
     * Summary of the tile that is shown to the user.
     */
    private final CharSequence mSummary;

    /**
     * Full class name of the fragment to display when this tile is
     * selected.
     *
     * @attr ref android.R.styleable#PreferenceHeader_fragment
     */
    private final String mFragment;

    /**
     * Optional arguments to supply to the fragment when it is
     * instantiated.
     */
    private final Bundle mFragmentArguments;

    private final int mMetricsCategory;

    public AccountTypePreference(Context context, int metricsCategory, Account account,
            String titleResPackageName, int titleResId, CharSequence summary, String fragment,
            Bundle fragmentArguments, Drawable icon) {
        super(context);
        mTitle = account.name;
        mTitleResPackageName = titleResPackageName;
        mTitleResId = titleResId;
        mSummary = summary;
        mFragment = fragment;
        mFragmentArguments = fragmentArguments;
        mMetricsCategory = metricsCategory;

        setKey(buildKey(account));
        setTitle(mTitle);
        setSingleLineTitle(true);
        setSummary(summary);
        setIcon(icon);

        setOnPreferenceClickListener(this);
    }

    @Override
    public boolean onPreferenceClick(Preference preference) {
        if (mFragment != null) {
            UserManager userManager =
                    (UserManager) getContext().getSystemService(Context.USER_SERVICE);
            UserHandle user = mFragmentArguments.getParcelable(EXTRA_USER);
            if (user != null && Utils.startQuietModeDialogIfNecessary(getContext(), userManager,
                    user.getIdentifier())) {
                return true;
            } else if (user != null && Utils.unlockWorkProfileIfNecessary(getContext(),
                    user.getIdentifier())) {
                return true;
            }
            new SubSettingLauncher(getContext())
                    .setDestination(mFragment)
                    .setArguments(mFragmentArguments)
                    .setTitleRes(mTitleResPackageName, mTitleResId)
                    .setSourceMetricsCategory(mMetricsCategory)
                    .launch();
            return true;
        }
        return false;
    }

    /**
     * Build a unique preference key based on account.
     */
    public static String buildKey(Account account) {
        return String.valueOf(account.hashCode());
    }

    public CharSequence getTitle() {
        return mTitle;
    }

    public CharSequence getSummary() {
        return mSummary;
    }
}
