com.antew.redditinpictures.library.dialog.AddSubredditDialogFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.antew.redditinpictures.library.dialog.AddSubredditDialogFragment.java

Source

/*
 * Copyright (C) 2014 Antew
 *
 * 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.antew.redditinpictures.library.dialog;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
import butterknife.ButterKnife;
import butterknife.InjectView;
import com.antew.redditinpictures.library.Constants;
import com.antew.redditinpictures.library.preferences.SharedPreferencesHelper;
import com.antew.redditinpictures.library.service.RedditService;
import com.antew.redditinpictures.library.util.Ln;
import com.antew.redditinpictures.library.util.Strings;
import com.antew.redditinpictures.pro.R;
import java.util.ArrayList;

public class AddSubredditDialogFragment extends DialogFragment {
    /**
     * Poor mans check to reduce network calls. Based on the the Reddit source code the minimum length for a subreddit is 3 characters. See
     * https://github.com/reddit/reddit/blob/master/r2/r2/lib/validator/validator.py#L512
     */
    private static final int MIN_SEARCH_LENGTH = 3;
    private TextWatcher mSubredditWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            return;
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s == null) {
                return;
            } else if (s.length() >= MIN_SEARCH_LENGTH) {
                searchForSubreddits(s.toString());
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
            return;
        }
    };
    @InjectView(R.id.et_subreddit)
    protected AutoCompleteTextView mSubreddit;
    private TextView.OnEditorActionListener mSubredditSearchEditorActionListener = new TextView.OnEditorActionListener() {

        /**
         * Called when an action is being performed.
         *
         * @param v The view that was clicked.
         * @param actionId Identifier of the action.  This will be either the
         * identifier you supplied, or {@link android.view.inputmethod.EditorInfo#IME_NULL
         * EditorInfo.IME_NULL} if being called due to the enter key
         * being pressed.
         * @param event If triggered by an enter key, this is the event;
         * otherwise, this is null.
         * @return Return true if you have consumed the action, else false.
         */
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_GO && mSubreddit != null) {
                ((AddSubredditDialogListener) getActivity()).onAddSubreddit(mSubreddit.getText().toString());
                dismiss();
            }
            return false;
        }
    };
    protected ArrayAdapter<String> mSubredditSearchResultsAdapter;
    private AdapterView.OnItemClickListener mSubredditSearchResponseListener = new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (mSubredditSearchResultsAdapter != null) {
                ((AddSubredditDialogListener) getActivity())
                        .onAddSubreddit(mSubredditSearchResultsAdapter.getItem(position));
                InputMethodManager imm = (InputMethodManager) getActivity()
                        .getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(mSubreddit.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
                dismiss();
            }
        }
    };
    private DialogInterface.OnClickListener mAddSubredditListener = new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            ((AddSubredditDialogListener) getActivity()).onAddSubreddit(mSubreddit.getText().toString());
        }
    };
    private DialogInterface.OnClickListener mDialogCancelListener = new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    };
    private BroadcastReceiver mSubredditsSearch = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.hasExtra(Constants.Extra.EXTRA_SUBREDDIT_NAMES)) {
                Ln.d("Got Back Subreddit Search Result");
                final ArrayList<String> subredditNames = intent
                        .getStringArrayListExtra(Constants.Extra.EXTRA_SUBREDDIT_NAMES);

                if (subredditNames != null) {
                    handleSubredditSearchResults(subredditNames);
                }
            }
        }
    };

    public static AddSubredditDialogFragment newInstance() {
        return new AddSubredditDialogFragment();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater lf = LayoutInflater.from(getActivity());
        View dialogView = lf.inflate(R.layout.add_subreddit_dialog, null);
        ButterKnife.inject(this, dialogView);

        mSubreddit.addTextChangedListener(mSubredditWatcher);
        mSubreddit.setOnEditorActionListener(mSubredditSearchEditorActionListener);
        mSubreddit.setOnItemClickListener(mSubredditSearchResponseListener);

        final AlertDialog dialog = new AlertDialog.Builder(getActivity()).setView(dialogView)
                .setTitle(R.string.add_subreddit).setPositiveButton(R.string.add_subreddit, mAddSubredditListener)
                .setNegativeButton(R.string.cancel, mDialogCancelListener).create();

        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mSubredditsSearch,
                new IntentFilter(Constants.Broadcast.BROADCAST_SUBREDDIT_SEARCH));
        return dialog;
    }

    /**
     * Remove dialog.
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mSubredditsSearch);
    }

    protected void searchForSubreddits(String queryText) {
        if (Strings.notEmpty(queryText)) {
            RedditService.searchSubreddits(getActivity(), queryText,
                    SharedPreferencesHelper.getShowNsfwImages(getActivity()));
        }
    }

    private void handleSubredditSearchResults(ArrayList<String> subredditNameList) {
        if (mSubreddit != null && subredditNameList != null && subredditNameList.size() > 0
                && getActivity() != null) {
            mSubredditSearchResultsAdapter = new ArrayAdapter<String>(getActivity(),
                    android.R.layout.simple_dropdown_item_1line, subredditNameList);
            mSubreddit.setAdapter(mSubredditSearchResultsAdapter);
            mSubreddit.showDropDown();
        }
    }

    public interface AddSubredditDialogListener {
        void onAddSubreddit(String subreddit);
    }
}