package com.dm.wallpaper.board.fragments.dialogs;

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.AppCompatRadioButton;
import android.util.Log;
import android.view.View;
import android.widget.NumberPicker;

import com.afollestad.materialdialogs.MaterialDialog;
import com.danimahardhika.android.helpers.core.ColorHelper;
import com.danimahardhika.android.helpers.core.DrawableHelper;
import com.dm.wallpaper.board.R;
import com.dm.wallpaper.board.R2;
import com.dm.wallpaper.board.helpers.TypefaceHelper;
import com.danimahardhika.android.helpers.core.utils.LogUtil;
import com.dm.wallpaper.board.utils.listeners.RefreshDurationListener;

import butterknife.BindView;
import butterknife.ButterKnife;

/*
 * Wallpaper Board
 *
 * Copyright (c) 2017 Dani Mahardhika
 *
 * 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.
 */

public class RefreshDurationFragment extends DialogFragment implements View.OnClickListener {

    @BindView(R2.id.number_picker)
    NumberPicker mNumberPicker;
    @BindView(R2.id.minute)
    AppCompatRadioButton mMinute;
    @BindView(R2.id.hour)
    AppCompatRadioButton mHour;

    private int mRotateTime;
    private boolean mIsMinute;

    private static final String MINUTE = "minute";
    private static final String ROTATE_TIME = "rotate_time";
    private static final String TAG = "com.dm.wallpaper.board.dialog.refresh.duration";

    private static RefreshDurationFragment newInstance(int rotateTime, boolean isMinute) {
        RefreshDurationFragment fragment = new RefreshDurationFragment();
        Bundle bundle = new Bundle();
        bundle.putInt(ROTATE_TIME, rotateTime);
        bundle.putBoolean(MINUTE, isMinute);
        fragment.setArguments(bundle);
        return fragment;
    }

    public static void showRefreshDurationDialog(FragmentManager fm, int rotateTime, boolean isMinute) {
        FragmentTransaction ft = fm.beginTransaction();
        Fragment prev = fm.findFragmentByTag(TAG);
        if (prev != null) {
            ft.remove(prev);
        }

        try {
            DialogFragment dialog = RefreshDurationFragment.newInstance(rotateTime, isMinute);
            dialog.show(ft, TAG);
        } catch (IllegalStateException | IllegalArgumentException ignored) {}
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        MaterialDialog.Builder builder = new MaterialDialog.Builder(getActivity());
        builder.customView(R.layout.fragment_refresh_duration, true);
        builder.typeface(TypefaceHelper.getMedium(getActivity()), TypefaceHelper.getRegular(getActivity()));
        builder.title(R.string.muzei_refresh_duration);
        builder.positiveText(R.string.close);

        MaterialDialog dialog = builder.build();
        dialog.show();

        ButterKnife.bind(this, dialog);
        return dialog;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mRotateTime = getArguments().getInt(ROTATE_TIME, 1);
        mIsMinute = getArguments().getBoolean(MINUTE, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mNumberPicker.setMinValue(1);
        mNumberPicker.setMaxValue(100);
        setDividerColor(mNumberPicker);
        mMinute.setOnClickListener(this);
        mHour.setOnClickListener(this);

        mMinute.setChecked(mIsMinute);
        mHour.setChecked(!mIsMinute);
        mNumberPicker.setValue(mRotateTime);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        RefreshDurationListener listener = (RefreshDurationListener) getActivity();
        listener.onRefreshDurationSet(mNumberPicker.getValue(), mMinute.isChecked());
        super.onDismiss(dialog);
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        if (id == R.id.minute) {
            mMinute.setChecked(true);
            mHour.setChecked(false);
        } else if (id == R.id.hour) {
            mHour.setChecked(true);
            mMinute.setChecked(false);
        }
    }

    private void setDividerColor (NumberPicker picker) {
        java.lang.reflect.Field[] pickerFields = NumberPicker.class.getDeclaredFields();
        for (java.lang.reflect.Field pf : pickerFields) {
            if (pf.getName().equals("mSelectionDivider")) {
                pf.setAccessible(true);
                try {
                    int color = ColorHelper.getAttributeColor(getActivity(), R.attr.colorAccent);
                    pf.set(picker, DrawableHelper.getTintedDrawable(
                            getActivity(), R.drawable.numberpicker_divider, color));
                } catch (Exception e) {
                    LogUtil.e(Log.getStackTraceString(e));
                }
                break;
            }
        }
    }
}

@@ -2954,222 +2954,276 @@
     
-try %7B%0D%0A            DialogFragment dialog = RefreshDurationFragment.newInstance(rotateTime, isMinute);%0D%0A            dialog.show(ft, TAG);%0D%0A        %7D catch (IllegalStateException %7C IllegalArgumentException ignored) %7B
+ft.add(newInstance(rotateTime, isMinute), TAG)%0D%0A                .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE);%0D%0A%0D%0A        try %7B%0D%0A            ft.commit();%0D%0A        %7D catch (IllegalStateException e) %7B%0D%0A            ft.commitAllowingStateLoss();%0D%0A        
 %7D%0D%0A 

Handle after onSaveInstanceState https://github.com/danimahardhika/wallpaperboard/issues/124