package com.simplecity.amp_library.ui.views; import android.content.Context; import android.graphics.LightingColorFilter; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.RelativeLayout; import com.simplecity.amp_library.R; import com.simplecity.amp_library.interfaces.Breadcrumb; import com.simplecity.amp_library.interfaces.BreadcrumbListener; import com.simplecity.amp_library.utils.FileHelper; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * A view that holds the navigation breadcrumb pattern */ public class BreadcrumbView extends RelativeLayout implements Breadcrumb, OnClickListener { HorizontalScrollView mScrollView; private ViewGroup mBreadcrumbBar; private int mTextColor = -1; private List<BreadcrumbListener> mBreadcrumbListeners; /** * Constructor of <code>BreadcrumbView</code> * * @param context */ public BreadcrumbView(Context context) { super(context); init(); } /** * Constructor of <code>BreadcrumbView</code> * * @param context * @param attrs The attributes of the XML tag that is inflating the view */ public BreadcrumbView(Context context, AttributeSet attrs) { super(context, attrs); init(); } /** * Constructor of <code>BreadcrumbView</code> * * @param context * @param attrs The attributes of the XML tag that is inflating the view. * @param defStyle The default style to apply to this view. If 0, no style * will be applied (beyond what is included in the theme). This may * either be an attribute resource, whose value will be retrieved * from the current theme, or an explicit style resource. */ public BreadcrumbView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } /** * Initialises the view. Loads all necessary * information and creates an appropriate layout for the view */ private void init() { //Initialise the listeners this.mBreadcrumbListeners = Collections.synchronizedList(new ArrayList<BreadcrumbListener>()); //Add the view of the breadcrumb addView(inflate(getContext(), R.layout.breadcrumb_view, null)); //Recover all views this.mScrollView = (HorizontalScrollView) findViewById(R.id.breadcrumb_scrollview); this.mBreadcrumbBar = (ViewGroup) findViewById(R.id.breadcrumb); } @Override public void addBreadcrumbListener(BreadcrumbListener listener) { this.mBreadcrumbListeners.add(listener); } @Override public void removeBreadcrumbListener(BreadcrumbListener listener) { this.mBreadcrumbListeners.remove(listener); } @Override public void setTextColor(int textColor) { mTextColor = textColor; } @Override public void changeBreadcrumbPath(final String newPath) { if (TextUtils.isEmpty(newPath)) { return; } //Remove all views this.mBreadcrumbBar.removeAllViews(); this.mBreadcrumbBar.addView(createBreadcrumbItem(new File(FileHelper.ROOT_DIRECTORY))); //Add the rest of the path String[] dirs = newPath.split(File.separator); int cc = dirs.length; for (int i = 1; i < cc; i++) { this.mBreadcrumbBar.addView(createItemDivider()); this.mBreadcrumbBar.addView(createBreadcrumbItem(createFile(dirs, i))); } //Set scrollbar at the end this.mScrollView.post(() -> BreadcrumbView.this.mScrollView.fullScroll(View.FOCUS_RIGHT)); } /** * Creates a new path divider * * @return View divider icon */ private ImageView createItemDivider() { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); ImageView imageView = (ImageView) inflater.inflate(R.layout.breadcrumb_item_divider, this.mBreadcrumbBar, false); imageView.setColorFilter(new LightingColorFilter(mTextColor, 0)); return imageView; } /** * Creates a new split path * * @param dir The path * @return BreadcrumbItem The view to create */ private BreadcrumbItem createBreadcrumbItem(File dir) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); BreadcrumbItem item = (BreadcrumbItem) inflater.inflate(R.layout.breadcrumb_item, this.mBreadcrumbBar, false); item.setText(dir.getName().length() != 0 ? dir.getName() : dir.getPath()); item.setItemPath(dir.getPath()); item.setOnClickListener(this); item.setTextColor(mTextColor); return item; } /** * Creates the a new file reference for a partial breadcrumb item. * * @param dirs The split strings directory * @param pos The position up to which to create * @return File The file reference */ private File createFile(String[] dirs, int pos) { File parent = new File(FileHelper.ROOT_DIRECTORY); for (int i = 1; i < pos; i++) { parent = new File(parent, dirs[i]); } return new File(parent, dirs[pos]); } @Override public void onClick(View v) { BreadcrumbItem item = (BreadcrumbItem) v; int cc = this.mBreadcrumbListeners.size(); for (int i = 0; i < cc; i++) { this.mBreadcrumbListeners.get(i).onBreadcrumbItemClick(item); } } }