com.pixby.texo.EditTools.TextStylesTool.java Source code

Java tutorial

Introduction

Here is the source code for com.pixby.texo.EditTools.TextStylesTool.java

Source

package com.pixby.texo.EditTools;

/*
 * Copyright (c) 2016 David Allen
 *
 * 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.
 *
 */

import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageButton;

import com.pixby.texo.R;
import com.pixby.texo.data.LoaderConstants;
import com.pixby.texo.data.StyleContract;
import com.pixby.texo.watermark.TextStyle;
import com.pixby.texo.watermark.Watermark;

public class TextStylesTool extends ToolFragment {

    private TextStyleAdapter mAdapter;
    private TextStyle mInitialStyle;

    public static TextStylesTool newInstance() {
        TextStylesTool f = new TextStylesTool();
        f.mToolViewId = R.layout.text_styles_tool;
        return f;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAdapter = new TextStyleAdapter(getActivity().getAssets());
        mAdapter.setOnItemClickListener(new TextStyleAdapter.ClickListener() {
            @Override
            public void onItemClick(int position) {
                TextStyle style = mAdapter.getStyleAtPosition(position);
                setTextStyle(style);
            }
        });

        loadStyleData();
    }

    @Override
    public void onStart() {
        super.onStart();
        init();
    }

    private void init() {
        saveInitialStyle(getWatermark());
    }

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

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(),
                LinearLayoutManager.VERTICAL, false);

        ImageButton okButton = (ImageButton) v.findViewById(R.id.save_button);
        ImageButton cancelButton = (ImageButton) v.findViewById(R.id.cancel_button);

        RecyclerView styleList = (RecyclerView) v.findViewById(R.id.styleList);
        styleList.setHasFixedSize(true);
        styleList.setLayoutManager(layoutManager);
        styleList.setAdapter(mAdapter);
        okButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getListener().onSave(getTag());
            }
        });
        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setTextStyle(getInitialStyle());
                getListener().onCancel(getTag());
            }
        });
    }

    private void loadStyleData() {
        getActivity().getSupportLoaderManager().initLoader(LoaderConstants.STYLE_LOADER, new Bundle(),
                stylesLoader);
    }

    private void setTextStyle(TextStyle style) {

        TextStyle tempStyle = TextStyle.getInstance(style);
        TextStyle initialStyle = getInitialStyle();
        tempStyle.typeFaceInfo = style.typeFaceInfo;

        // If style does not set a given property use original watermark values
        // For example if incoming text is translucent, keep it that way
        if (style.alpha == TextStyle.IGNORE) {
            tempStyle.alpha = initialStyle.alpha;
        }
        if (style.color == TextStyle.IGNORE) {
            tempStyle.color = initialStyle.color;
        }
        if (style.backgroundColor == TextStyle.IGNORE) {
            tempStyle.backgroundColor = Color.TRANSPARENT;
        }
        getWatermark().setStyle(tempStyle);
        fitTextToWidth();
        getEditView().invalidate();
    }

    // if text size with new font is > image bounds set to fit otherwise leave alone
    private void fitTextToWidth() {
        float textWidth = getWatermark().getWidth();
        float imageWidth = getEditView().getImageIntrinsicWidth();
        float worldSize;
        if (textWidth > imageWidth) {
            float newSize = getWatermark().calcTextSize(imageWidth);
            getWatermark().setTextSize(newSize);
            worldSize = 1.0f;
        } else {
            worldSize = textWidth / imageWidth;
        }
        getWatermark().setWorldSize(worldSize);
    }

    private void saveInitialStyle(Watermark watermark) {
        mInitialStyle = new TextStyle();
        mInitialStyle.alpha = watermark.getAlpha();
        mInitialStyle.color = watermark.getColor();
        mInitialStyle.typeFaceInfo = watermark.getTypefaceInfo();
        mInitialStyle.backgroundColor = watermark.getBackgroundColor();
    }

    private TextStyle getInitialStyle() {
        return mInitialStyle;
    }

    private final LoaderManager.LoaderCallbacks<Cursor> stylesLoader = new LoaderManager.LoaderCallbacks<Cursor>() {
        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
            return new CursorLoader(getActivity(), StyleContract.StyleTable.CONTENT_URI,
                    StyleContract.StyleTable.PROJECTION_ALL, null, null, null);
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
            mAdapter.swapCursor(data);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
            mAdapter.swapCursor(null);
        }
    };
}