com.appsimobile.appsii.hotspotmanager.HotspotSettingsFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.appsimobile.appsii.hotspotmanager.HotspotSettingsFragment.java

Source

/*
 * Copyright 2015. Appsi Mobile
 *
 * 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.appsimobile.appsii.hotspotmanager;

import android.app.DialogFragment;
import android.app.LoaderManager;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Loader;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.app.AlertDialog;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.appsimobile.appsii.HotspotPageEntry;
import com.appsimobile.appsii.R;
import com.appsimobile.appsii.module.home.provider.HomeContract;
import com.mobeta.android.dslv.DragSortListView;

import java.util.ArrayList;

/**
 * A dialog that shows the general options for a hotspot. The user
 * can select and re-order the pages for the hotspot, change the
 * title and set the remember last page switch.
 * Any changes are saved instantly
 * <p/>
 * Created by nick on 31/01/15.
 */
public class HotspotSettingsFragment extends DialogFragment
        implements View.OnClickListener, CompoundButton.OnCheckedChangeListener, TextWatcher {

    /**
     * A handler used to save the title of the hotspot with a delay
     */
    final Handler mHandler;

    /**
     * The listview used to change the order of the pages with
     */
    DragSortListView mDragSortListView;

    /**
     * The title edit-text
     */
    EditText mHotspotTitleView;

    /**
     * ok button to close the dialog.
     */
    View mOkButton;

    /**
     * The id of the hotspot that is being edited
     */
    long mHotspotId;

    /**
     * The name of the hotspot
     */
    String mHotspotName;

    /**
     * True when the fragment state was restored from the instance state.
     * This allows us not to initialize the values of some fields
     */
    boolean mRestoredInstanceState;

    /**
     * A query-handler to perform the operations on
     */
    QueryHandlerImpl mQueryHandler;

    ReorderController mReorderController;

    View mDefaultPage;

    ImageView mDefaultPageIconView;

    TextView mDefaultPageValueView;

    long mDefaultPageId;

    ArrayList<HotspotPageEntry> mHotspotPages;

    public HotspotSettingsFragment() {
        setStyle(DialogFragment.STYLE_NO_TITLE, 0);
        mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                onHandleMessage(msg);
                return true;
            }
        });
    }

    void onHandleMessage(Message msg) {
        String title = (String) msg.obj;
        mQueryHandler.saveHotspotTitle(mHotspotId, title);
    }

    /**
     * Creates an instance of the fragment with the arguments properly initialized
     *
     * @param hotspotId The hotspot id to edit
     * @param hotspotName The original name of the hotspot
     * @param defaultPageId The id of the default page
     */
    static HotspotSettingsFragment createEditInstance(long hotspotId, String hotspotName, long defaultPageId) {

        HotspotSettingsFragment result = new HotspotSettingsFragment();
        Bundle args = new Bundle();
        args.putLong("hotspot_id", hotspotId);
        args.putString("hotspot_name", hotspotName);
        args.putLong("default_page_id", defaultPageId);
        result.setArguments(args);
        return result;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle args = getArguments();
        if (args == null) {
            mHotspotId = -1L;
        } else {
            // get the default values from the arguments
            mHotspotId = args.getLong("hotspot_id", -1L);
            mHotspotName = args.getString("hotspot_name");
            mDefaultPageId = args.getLong("default_page_id");
        }
        // track if the state was restored
        if (savedInstanceState != null) {
            mRestoredInstanceState = true;
            mDefaultPageId = savedInstanceState.getLong("default_page_id");
        }

        mQueryHandler = new QueryHandlerImpl(getActivity().getContentResolver());
        mReorderController = new ReorderController(getActivity(), mHotspotId);

        getLoaderManager().initLoader(1, null, new HotspotPagesLoaderCallbacks());
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putLong("default_page_id", mDefaultPageId);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_hotspot_options, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        mOkButton = view.findViewById(R.id.ok_button);
        mHotspotTitleView = (EditText) view.findViewById(R.id.hotspot_title);

        mDragSortListView = (DragSortListView) view.findViewById(R.id.sort_list_view);
        mReorderController.configure(mDragSortListView);

        mDefaultPage = view.findViewById(R.id.default_page);
        mDefaultPageIconView = (ImageView) view.findViewById(R.id.default_page_icon);
        mDefaultPageValueView = (TextView) view.findViewById(R.id.default_page_value);

        Drawable drawable = DrawableCompat.wrap(mDefaultPageIconView.getDrawable());
        DrawableCompat.setTint(drawable, 0xFF666666);
        mDefaultPageIconView.setImageDrawable(drawable);

        mOkButton.setOnClickListener(this);
        mDefaultPage.setOnClickListener(this);
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!mRestoredInstanceState) {
            // When we were not restored from the instance state, we can initialize
            // the values provided by the callee (from the args).
            mHotspotTitleView.setText(mHotspotName);
        }
        // Next register the listeners. This is done after setting the values
        // to make sure the event is not triggered before it should
        //
        // make sure to remove the listener before adding it again
        mHotspotTitleView.removeTextChangedListener(this);
        mHotspotTitleView.addTextChangedListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        mHotspotTitleView.removeTextChangedListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.default_page) {
            showDefaultPageSelector();
        } else if (id == R.id.ok_button) {
            dismiss();
        }
    }

    private void showDefaultPageSelector() {
        int selection = 0;

        int len = getEnabledCount(mHotspotPages);

        String[] choices = new String[len + 1];
        final long[] pageIds = new long[len + 1];

        choices[0] = getString(R.string.reopen_last_plugin);
        pageIds[0] = -1L;

        int N = mHotspotPages.size();
        int pos = 0;
        for (int i = 0; i < N; i++) {
            HotspotPageEntry page = mHotspotPages.get(i);
            if (!page.mEnabled)
                continue;

            pos++;
            choices[pos] = page.mPageName;
            pageIds[pos] = page.mPageId;

            if (page.mPageId == mDefaultPageId) {
                selection = pos;
            }
        }

        new AlertDialog.Builder(getActivity())
                .setSingleChoiceItems(choices, selection, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        long id = pageIds[which];
                        onDefaultPageSelected(id);
                        dialog.dismiss();
                    }
                }).show();
        // TODO: add boolean that the dialog was showing for orientation changes
    }

    private static int getEnabledCount(ArrayList<HotspotPageEntry> hotspotPages) {
        int result = 0;
        for (int i = 0; i < hotspotPages.size(); i++) {
            HotspotPageEntry e = hotspotPages.get(i);
            if (e.mEnabled)
                result++;
        }
        return result;
    }

    void onDefaultPageSelected(long id) {
        if (mDefaultPageId != id) {
            mDefaultPageId = id;
            notifyDefaultPageChanged();
        }
    }

    private void notifyDefaultPageChanged() {
        updateSelectedPageText(mDefaultPageId, mHotspotPages);
        mQueryHandler.updateDefaultPage(mHotspotId, mDefaultPageId);
    }

    private void updateSelectedPageText(long defaultPageId, ArrayList<HotspotPageEntry> pages) {
        String text = getString(R.string.reopen_last_plugin);
        for (int i = 0; i < pages.size(); i++) {
            HotspotPageEntry page = pages.get(i);
            if (page.mEnabled && page.mPageId == defaultPageId) {
                text = page.mPageName;
                break;
            }
        }

        mDefaultPageValueView.setText(text);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        mQueryHandler.updateHotspotRemembersLast(mHotspotId, isChecked);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        mHandler.removeMessages(0);
        Message message = mHandler.obtainMessage(0, s.toString());
        mHandler.sendMessageDelayed(message, 500);
    }

    void onHotspotPagesLoaded(ArrayList<HotspotPageEntry> pages) {
        mHotspotPages = pages;
        mReorderController.setHotspotPages(pages);
        validateSelectedDefaultPage(mDefaultPageId, pages);
        updateSelectedPageText(mDefaultPageId, pages);
    }

    private void validateSelectedDefaultPage(long defaultPageId, ArrayList<HotspotPageEntry> pages) {
        boolean found = false;
        for (int i = 0; i < pages.size(); i++) {
            HotspotPageEntry page = pages.get(i);
            if (page.mPageId == defaultPageId) {
                found = true;
                break;
            }
        }

        if (!found && mDefaultPageId != -1L) {
            mDefaultPageId = -1L;
            notifyDefaultPageChanged();
        }
    }

    static class QueryHandlerImpl extends AsyncQueryHandler {

        public QueryHandlerImpl(ContentResolver cr) {
            super(cr);
        }

        public void saveHotspotTitle(long hotspotId, String title) {
            Uri uri = ContentUris.withAppendedId(HomeContract.Hotspots.CONTENT_URI, hotspotId);
            ContentValues values = new ContentValues(1);
            values.put(HomeContract.Hotspots.NAME, title);
            startUpdate(0, null, uri, values, null, null);
        }

        public void updateHotspotRemembersLast(long hotspotId, boolean alwaysOpenLast) {
            Uri uri = ContentUris.withAppendedId(HomeContract.Hotspots.CONTENT_URI, hotspotId);
            ContentValues values = new ContentValues(1);
            values.put(HomeContract.Hotspots.ALWAYS_OPEN_LAST, alwaysOpenLast);
            startUpdate(0, null, uri, values, null, null);
        }

        public void updateDefaultPage(long hotspotId, long defaultPageId) {
            Uri uri = ContentUris.withAppendedId(HomeContract.Hotspots.CONTENT_URI, hotspotId);
            if (defaultPageId != -1L) {
                ContentValues values = new ContentValues(1);
                values.put(HomeContract.Hotspots._DEFAULT_PAGE, defaultPageId);
                startUpdate(0, null, uri, values, null, null);
            } else {
                ContentValues values = new ContentValues(1);
                values.putNull(HomeContract.Hotspots._DEFAULT_PAGE);
                startUpdate(0, null, uri, values, null, null);

            }

        }
    }

    private class HotspotPagesLoaderCallbacks
            implements LoaderManager.LoaderCallbacks<ArrayList<HotspotPageEntry>> {

        HotspotPagesLoaderCallbacks() {

        }

        @Override
        public Loader<ArrayList<HotspotPageEntry>> onCreateLoader(int id, Bundle args) {
            return new HotspotsPagesLoader(getActivity(), mHotspotId);
        }

        @Override
        public void onLoadFinished(Loader<ArrayList<HotspotPageEntry>> loader, ArrayList<HotspotPageEntry> data) {
            onHotspotPagesLoaded(data);
        }

        @Override
        public void onLoaderReset(Loader<ArrayList<HotspotPageEntry>> loader) {

        }
    }

}