package com.duckduckgo.mobile.android.dialogs; import android.app.Dialog; import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatDialogFragment; import android.text.SpannableStringBuilder; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.transition.TransitionManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.duckduckgo.mobile.android.R; import com.duckduckgo.mobile.android.util.OnboardingHelper; /** * Created by fgei on 4/7/17. */ public class InstructionDialogFragment extends AppCompatDialogFragment { public static final String TAG = "instruction_dialog_fragment"; public static InstructionDialogFragment newInstance(int instructionType) { return newInstance(instructionType, false); } public static InstructionDialogFragment newInstance(int instructionType, boolean disableDismissButton) { InstructionDialogFragment fragment = new InstructionDialogFragment(); Bundle args = new Bundle(); args.putInt(EXTRA_INSTRUCTION_TYPE, instructionType); args.putBoolean(EXTRA_DISABLE_DISMISS_BUTTON, disableDismissButton); fragment.setArguments(args); return fragment; } public static final int EXTRA_INSTRUCTION_FIREFOX = 0; public static final int EXTRA_INSTRUCTION_CHROME = 1; private static final String EXTRA_INSTRUCTION_TYPE = "instruction_type"; private static final String EXTRA_DISABLE_DISMISS_BUTTON = "disable_dismiss_button"; private static final int INITIAL_DISABLE_TIME = 1000; private View firefoxInstructionContainer, chromeInstructionContainer; private View toggleInstructionContainer; private TextView toggleInstructionTextView; private ImageView toggleInstructionImageView; private TextView titleTextView; private TextView doneButton; private ViewGroup transitionRoot; private OnboardingHelper onboardingHelper; private boolean isInstructionChromeType = true; private boolean disableDismissButton = false; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(STYLE_NO_TITLE, 0); Bundle args = getArguments(); if(args.containsKey(EXTRA_INSTRUCTION_TYPE)) { isInstructionChromeType = args.getInt(EXTRA_INSTRUCTION_TYPE) == EXTRA_INSTRUCTION_CHROME; } if(args.containsKey(EXTRA_DISABLE_DISMISS_BUTTON)) { disableDismissButton = args.getBoolean(EXTRA_DISABLE_DISMISS_BUTTON); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.dialog_onboarding_instruction, container, false); init(getContext(), rootView); return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(disableDismissButton && savedInstanceState == null) { disableViewForTime(doneButton, INITIAL_DISABLE_TIME ); } } @Override public void onStart() { super.onStart(); if(getDialog() != null) { getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent); } } @Override public void dismiss() { onboardingHelper.setOnboardingDismissed(); super.dismiss(); } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new Dialog(getContext(), getTheme()) { @Override public void onBackPressed() { onboardingHelper.setOnboardingDismissed(); super.onBackPressed(); } }; } private void init(Context context, final View rootView) { onboardingHelper = new OnboardingHelper(context); transitionRoot = (ViewGroup) rootView; TextView instruction1TextView = (TextView) rootView.findViewById(R.id.instruction_1_text_view); instruction1TextView.setText(getStyledString(getContext(), R.string.instruction_firefox_1_a, R.string.instruction_firefox_1_b)); TextView instruction2TextView = (TextView) rootView.findViewById(R.id.instruction_2_text_view); instruction2TextView.setText(getStyledString(getContext(), R.string.instruction_firefox_2_a, R.string.instruction_firefox_2_b)); TextView instruction3TextView = (TextView) rootView.findViewById(R.id.instruction_3_text_view); instruction3TextView.setText(getStyledString(getContext(), R.string.instruction_firefox_3_a, R.string.instruction_firefox_3_b)); TextView instruction4TextView = (TextView) rootView.findViewById(R.id.instruction_4_text_view); instruction4TextView.setText(getStyledString(getContext(), R.string.instruction_firefox_4_a, R.string.instruction_firefox_4_b)); doneButton = (TextView) rootView.findViewById(R.id.done_button); doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); firefoxInstructionContainer = rootView.findViewById(R.id.instruction_container); chromeInstructionContainer = rootView.findViewById(R.id.add_to_home_screen_button); chromeInstructionContainer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onboardingHelper.addToHomeScreen(); dismiss(); } }); toggleInstructionImageView = (ImageView) rootView.findViewById(R.id.add_to_image_view); toggleInstructionTextView = (TextView) rootView.findViewById(R.id.add_to_text_view); toggleInstructionContainer = rootView.findViewById(R.id.add_to_container); toggleInstructionContainer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isInstructionChromeType = !isInstructionChromeType; initInstructionType(isInstructionChromeType, true); } }); titleTextView = (TextView) rootView.findViewById(R.id.instruction_title_text_view); initInstructionType(isInstructionChromeType, false); } private void initInstructionType(boolean isChromeType, boolean withAnimation) { if(withAnimation) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { TransitionManager.beginDelayedTransition(transitionRoot); } } chromeInstructionContainer.setVisibility(isChromeType ? View.VISIBLE : View.GONE); firefoxInstructionContainer.setVisibility(isChromeType ? View.GONE : View.VISIBLE); toggleInstructionImageView.setImageResource(isChromeType ? R.drawable.firefox: R.drawable.chrome); toggleInstructionTextView.setText( String.format( getString(R.string.add_to), getString(isChromeType ? R.string.browser_firefox : R.string.browser_chrome))); titleTextView.setText( String.format(getString(R.string.add_to), getString(isChromeType ? R.string.browser_chrome : R.string.browser_firefox))); } private void disableViewForTime(final TextView textView, int millis) { final int textColor = textView.getCurrentTextColor(); textView.setEnabled(false); textView.setTextColor(Color.GRAY); new Handler().postDelayed(new Runnable() { @Override public void run() { textView.setEnabled(true); textView.setTextColor(textColor); } }, millis); } private static SpannableStringBuilder getStyledString(Context context, int textResId, int textBoldResId) { String text = context.getString(textResId); String textPrimary = context.getString(textBoldResId); SpannableStringBuilder builder = new SpannableStringBuilder(text + " " + textPrimary); int startPrimaryIndex = text.length() + 1; int endPrimaryIndex = startPrimaryIndex + textPrimary.length(); builder.setSpan( new ForegroundColorSpan(ContextCompat.getColor(context, R.color.onboarding_primary_text)), startPrimaryIndex, endPrimaryIndex, 0); builder.setSpan(new StyleSpan(Typeface.BOLD), startPrimaryIndex, endPrimaryIndex, 0); return builder; } }