/* * Copyright (C) 2012 The CyanogenMod Project * * 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.cyanogenmod.filemanager.ui.widgets; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import com.cyanogenmod.filemanager.util.CommandHelper; import com.cyanogenmod.filemanager.util.FileHelper; import java.io.File; import java.util.List; /** * A widget based on {@link InlineAutocompleteTextView} for autocomplete * directories like a bash console do (with tab key). */ public class DirectoryInlineAutocompleteTextView extends InlineAutocompleteTextView implements InlineAutocompleteTextView.OnTextChangedListener { /** * An interface to communicate validation events. */ public interface OnValidationListener { /** * Method invoked when the value is void. */ void onVoidValue(); /** * Method invoked when the value is a valid value. */ void onValidValue(); /** * Method invoked when the value is a invalid value. */ void onInvalidValue(); } private static final String TAG = "DirectoryInlineAutocompleteTextView"; //$NON-NLS-1$ private OnValidationListener mOnValidationListener; private String mLastParent; /** * Constructor of <code>DirectoryInlineAutocompleteTextView</code>. * * @param context The current context */ public DirectoryInlineAutocompleteTextView(Context context) { super(context); init(); } /** * Constructor of <code>DirectoryInlineAutocompleteTextView</code>. * * @param context The current context * @param attrs The attributes of the XML tag that is inflating the view. */ public DirectoryInlineAutocompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } /** * Constructor of <code>DirectoryInlineAutocompleteTextView</code>. * * @param context The current 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 DirectoryInlineAutocompleteTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } /** * Method that initializes the view. This method loads all the necessary * information and create an appropriate layout for the view */ private void init() { //Sets last parent this.mLastParent = ""; //$NON-NLS-1$ //Set the listener setOnTextChangedListener(this); setCompletionString(File.separator); } /** * Method that set the listener for retrieve validation events. * * @param onValidationListener The listener for retrieve validation events */ public void setOnValidationListener(OnValidationListener onValidationListener) { this.mOnValidationListener = onValidationListener; } /** * {@inheritDoc} */ @Override public void onTextChanged(String newValue, List<String> currentFilterData) { String value = newValue; //Check if directory is valid if (value.length() == 0) { if (this.mOnValidationListener != null) { this.mOnValidationListener.onVoidValue(); } } else { boolean relative = FileHelper.isRelativePath(value); if (relative) { if (this.mOnValidationListener != null) { this.mOnValidationListener.onInvalidValue(); } } else { if (this.mOnValidationListener != null) { this.mOnValidationListener.onValidValue(); } } } //Ensure data if (!value.startsWith(File.separator)) { currentFilterData.clear(); this.mLastParent = ""; //$NON-NLS-1$ return; } //Get the new parent String newParent = FileHelper.getParentDir(new File(value)); if (!newParent.endsWith(File.separator)) { newParent += File.separator; } if (value.compareTo(File.separator) == 0) { newParent = File.separator; currentFilterData.clear(); } else if (value.endsWith(File.separator)) { //Force the change of parent newParent = new File(value, "a").getParent(); //$NON-NLS-1$ if (!newParent.endsWith(File.separator)) { newParent += File.separator; } currentFilterData.clear(); } else { value = newParent; } //If a new path is detected, then load the new data if (newParent.compareTo(this.mLastParent) != 0 || currentFilterData.isEmpty()) { this.mLastParent = newParent; currentFilterData.clear(); try { List<String> newData = CommandHelper.quickFolderSearch(getContext(), value, null); currentFilterData.addAll(newData); } catch (Throwable ex) { Log.e(TAG, "Quick folder search failed", ex); //$NON-NLS-1$ currentFilterData.clear(); } } } }