[Android] [PATCH] Search in Toolbar, dropped for Android Eclair

Geoffrey Métais geoffrey.metais at gmail.com
Wed Mar 4 12:51:03 CET 2015


---
 vlc-android/AndroidManifest.xml                    |   3 +
 vlc-android/res/menu/media_library.xml             |   3 +-
 vlc-android/res/values/strings.xml                 |   1 +
 vlc-android/res/xml/searchable.xml                 |   4 +
 .../src/org/videolan/vlc/MediaDatabase.java        |  32 +--
 .../src/org/videolan/vlc/gui/MainActivity.java     |  63 +++---
 .../src/org/videolan/vlc/gui/SearchFragment.java   | 229 ---------------------
 .../org/videolan/vlc/gui/SearchHistoryAdapter.java |  58 ------
 .../org/videolan/vlc/gui/SearchResultAdapter.java  |  67 ------
 .../videolan/vlc/gui/SearchSuggestionsAdapter.java |  71 +++++++
 10 files changed, 133 insertions(+), 398 deletions(-)
 create mode 100644 vlc-android/res/xml/searchable.xml
 delete mode 100644 vlc-android/src/org/videolan/vlc/gui/SearchFragment.java
 delete mode 100644 vlc-android/src/org/videolan/vlc/gui/SearchHistoryAdapter.java
 delete mode 100644 vlc-android/src/org/videolan/vlc/gui/SearchResultAdapter.java
 create mode 100644 vlc-android/src/org/videolan/vlc/gui/SearchSuggestionsAdapter.java

diff --git a/vlc-android/AndroidManifest.xml b/vlc-android/AndroidManifest.xml
index e0d1d7d..6e3ca29 100644
--- a/vlc-android/AndroidManifest.xml
+++ b/vlc-android/AndroidManifest.xml
@@ -55,6 +55,9 @@
 
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
+            <meta-data android:name="android.app.searchable"
+                android:resource="@xml/searchable" />
+
         </activity>
         <activity android:name=".gui.CompatErrorActivity" />
         <activity android:name=".gui.PreferencesActivity"
diff --git a/vlc-android/res/menu/media_library.xml b/vlc-android/res/menu/media_library.xml
index 24086f0..d8d7d9f 100644
--- a/vlc-android/res/menu/media_library.xml
+++ b/vlc-android/res/menu/media_library.xml
@@ -20,9 +20,10 @@
     <item
         android:id="@+id/ml_menu_search"
         android:icon="@drawable/ic_menu_search"
+        vlc:actionViewClass="android.support.v7.widget.SearchView"
         android:title="@string/searchable_hint"
         android:nextFocusDown="@id/ml_menu_search"
-        vlc:showAsAction="ifRoom" />
+        vlc:showAsAction="always|collapseActionView"/>
     <item
         android:title="@string/sortby"
         android:icon="@drawable/ic_menu_sortby"
diff --git a/vlc-android/res/values/strings.xml b/vlc-android/res/values/strings.xml
index caa5192..9a5f437 100644
--- a/vlc-android/res/values/strings.xml
+++ b/vlc-android/res/values/strings.xml
@@ -318,6 +318,7 @@
     <string name="network_shares_discovery">Looking for network shares...</string>
     <string name="network_empty">This directory is empty.</string>
     <string name="network_connection_needed">No connection to local network.</string>
+    <string name="search_hint">Search media</string>
 
     <string-array name="hardware_acceleration_list">
         <item>@string/automatic</item>
diff --git a/vlc-android/res/xml/searchable.xml b/vlc-android/res/xml/searchable.xml
new file mode 100644
index 0000000..443afb5
--- /dev/null
+++ b/vlc-android/res/xml/searchable.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<searchable xmlns:android="http://schemas.android.com/apk/res/android"
+    android:label="@string/app_name"
+    android:hint="@string/search_hint" />
\ No newline at end of file
diff --git a/vlc-android/src/org/videolan/vlc/MediaDatabase.java b/vlc-android/src/org/videolan/vlc/MediaDatabase.java
index 0912abe..375477c 100644
--- a/vlc-android/src/org/videolan/vlc/MediaDatabase.java
+++ b/vlc-android/src/org/videolan/vlc/MediaDatabase.java
@@ -50,19 +50,19 @@ public class MediaDatabase {
 
     private SQLiteDatabase mDb;
     private static final String DB_NAME = "vlc_database";
-    private static final int DB_VERSION = 15;
+    private static final int DB_VERSION = 16;
     private static final int CHUNK_SIZE = 50;
 
     private static final String DIR_TABLE_NAME = "directories_table";
     private static final String DIR_ROW_PATH = "path";
 
     private static final String MEDIA_TABLE_NAME = "media_table";
-    private static final String MEDIA_LOCATION = "location";
+    public static final String MEDIA_LOCATION = "_id"; //standard key for primary key, needed for search suggestions
     private static final String MEDIA_TIME = "time";
     private static final String MEDIA_LENGTH = "length";
     private static final String MEDIA_TYPE = "type";
     private static final String MEDIA_PICTURE = "picture";
-    private static final String MEDIA_TITLE = "title";
+    public static final String MEDIA_TITLE = "title";
     private static final String MEDIA_ARTIST = "artist";
     private static final String MEDIA_GENRE = "genre";
     private static final String MEDIA_ALBUM = "album";
@@ -571,21 +571,23 @@ public class MediaDatabase {
         return files;
     }
 
-    public synchronized ArrayList<String> searchMedia(String filter, int type){
-
-        ArrayList<String> mediaList = new ArrayList<String>();
-
+    public synchronized Cursor queryMedia(String query, int type){
         String[] queryColumns = new String[]{MEDIA_LOCATION, MEDIA_TITLE, MEDIA_ALBUM, MEDIA_ARTIST, MEDIA_TYPE};
         String queryString = MEDIA_TITLE+" LIKE ? OR "+MEDIA_ALBUM+" LIKE ? OR "+MEDIA_ARTIST+" LIKE ?";
         String [] queryArgs;
         if (type != MediaWrapper.TYPE_ALL) {
             queryString = "( " + queryString + " ) AND " + MEDIA_TYPE + "=?";
-            queryArgs = new String[]{"%"+filter+"%", "%"+filter+"%", "%"+filter+"%", String.valueOf(type)};
+            queryArgs = new String[]{"%"+query+"%", "%"+query+"%", "%"+query+"%", String.valueOf(type)};
         } else
-            queryArgs = new String[]{"%"+filter+"%", "%"+filter+"%", "%"+filter+"%"};
+            queryArgs = new String[]{"%"+query+"%", "%"+query+"%", "%"+query+"%"};
 
-        Cursor cursor = mDb.query(MEDIA_TABLE_NAME,
-                queryColumns, queryString, queryArgs, null, null, null, null);
+        return mDb.query(MEDIA_TABLE_NAME, queryColumns, queryString, queryArgs, null, null, null, null);
+    }
+
+    public synchronized ArrayList<String> searchMedia(String filter, int type){
+
+        ArrayList<String> mediaList = new ArrayList<String>();
+        Cursor cursor = queryMedia(filter, type);
         if (cursor.moveToFirst()){
             do {
                 mediaList.add(cursor.getString(0));
@@ -830,7 +832,7 @@ public class MediaDatabase {
             default:
                 return;
         }
-        mDb.update(MEDIA_TABLE_NAME, values, MEDIA_LOCATION + "=?", new String[] { location });
+        mDb.update(MEDIA_TABLE_NAME, values, MEDIA_LOCATION + "=?", new String[]{location});
     }
 
     /**
@@ -852,7 +854,7 @@ public class MediaDatabase {
      * @param path
      */
     public synchronized void removeDir(String path) {
-        mDb.delete(DIR_TABLE_NAME, DIR_ROW_PATH + "=?", new String[] { path });
+        mDb.delete(DIR_TABLE_NAME, DIR_ROW_PATH + "=?", new String[]{path});
     }
 
     /**
@@ -924,7 +926,7 @@ public class MediaDatabase {
         ArrayList<String> history = new ArrayList<String>();
 
         Cursor cursor = mDb.query(SEARCHHISTORY_TABLE_NAME,
-                new String[] { SEARCHHISTORY_KEY },
+                new String[]{SEARCHHISTORY_KEY},
                 null, null, null, null,
                 SEARCHHISTORY_DATE + " DESC",
                 Integer.toString(size));
@@ -970,7 +972,7 @@ public class MediaDatabase {
     }
 
     public synchronized void deleteMrlUri(String uri) {
-        mDb.delete(MRL_TABLE_NAME, MRL_URI + "=?", new String[] { uri });
+        mDb.delete(MRL_TABLE_NAME, MRL_URI + "=?", new String[]{uri});
     }
 
     public synchronized void clearMrlHistory() {
diff --git a/vlc-android/src/org/videolan/vlc/gui/MainActivity.java b/vlc-android/src/org/videolan/vlc/gui/MainActivity.java
index fdd1520..7619544 100644
--- a/vlc-android/src/org/videolan/vlc/gui/MainActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/MainActivity.java
@@ -21,12 +21,14 @@
 package org.videolan.vlc.gui;
 
 import android.annotation.TargetApi;
+import android.app.SearchManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
+import android.database.Cursor;
 import android.graphics.Color;
 import android.os.Build;
 import android.os.Bundle;
@@ -38,10 +40,12 @@ import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v4.view.GravityCompat;
+import android.support.v4.view.MenuItemCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.ActionBarActivity;
 import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.widget.SearchView;
 import android.support.v7.widget.Toolbar;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -63,6 +67,7 @@ import org.videolan.libvlc.LibVlcUtil;
 import org.videolan.vlc.BuildConfig;
 import org.videolan.vlc.MediaDatabase;
 import org.videolan.vlc.MediaLibrary;
+import org.videolan.vlc.MediaWrapper;
 import org.videolan.vlc.R;
 import org.videolan.vlc.VLCApplication;
 import org.videolan.vlc.audio.AudioService;
@@ -87,7 +92,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 
-public class MainActivity extends ActionBarActivity implements OnItemClickListener {
+public class MainActivity extends ActionBarActivity implements OnItemClickListener, SearchView.OnQueryTextListener {
     public final static String TAG = "VLC/MainActivity";
 
     protected static final String ACTION_SHOW_PROGRESSBAR = "org.videolan.vlc.gui.ShowProgressBar";
@@ -132,6 +137,7 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
     private int mFocusedPrior = 0;
     private int mActionBarIconId = -1;
     Menu mMenu;
+    private SearchView mSearchView;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -486,8 +492,6 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
             f = new EqualizerFragment();
         } else if(id.equals("about")) {
             f = new AboutFragment();
-        } else if(id.equals("search")) {
-            f = new SearchFragment();
         } else if(id.equals("mediaInfo")) {
             f = new MediaInfoFragment();
         } else if(id.equals("videoGroupList")) {
@@ -533,6 +537,7 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
 
     /** Create menu from XML
      */
+    @TargetApi(Build.VERSION_CODES.FROYO)
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         mMenu = menu;
@@ -542,6 +547,16 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
          */
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.media_library, menu);
+
+        if (LibVlcUtil.isFroyoOrLater()) {
+            SearchManager searchManager =
+                    (SearchManager) getSystemService(Context.SEARCH_SERVICE);
+            mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.ml_menu_search));
+            mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
+            mSearchView.setOnQueryTextListener(this);
+            mSearchView.setSuggestionsAdapter(new SearchSuggestionsAdapter(this, null));
+        } else
+            menu.findItem(R.id.ml_menu_search).setVisible(false);
         return super.onCreateOptionsMenu(menu);
     }
 
@@ -557,9 +572,6 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
             menu.findItem(R.id.ml_menu_sortby).setEnabled(true);
             menu.findItem(R.id.ml_menu_sortby).setVisible(true);
         }
-        // Enable the clear search history function for the search fragment.
-        if (mCurrentFragment != null && mCurrentFragment.equals("search"))
-            menu.findItem(R.id.search_clear_history).setVisible(true);
 
         boolean networkSave = current instanceof NetworkFragment && !((NetworkFragment)current).isRootDirectory();
         if (networkSave) {
@@ -576,15 +588,9 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
         menu.findItem(R.id.ml_menu_clean).setVisible(SidebarEntry.ID_MRL.equals(mCurrentFragment));
         menu.findItem(R.id.ml_menu_last_playlist).setVisible(SidebarEntry.ID_AUDIO.equals(mCurrentFragment));
 
-        return super.onPrepareOptionsMenu(menu);
-    }
 
-    @Override
-    public boolean onSearchRequested() {
-        if (mCurrentFragment != null && mCurrentFragment.equals("search"))
-            ((SearchFragment)fetchSecondaryFragment("search")).onSearchKeyPressed();
-        showSecondaryFragment("search");
-        return true;
+
+        return super.onPrepareOptionsMenu(menu);
     }
 
     /**
@@ -622,9 +628,6 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
                 Intent i = new Intent(AudioService.ACTION_REMOTE_LAST_PLAYLIST);
                 sendBroadcast(i);
                 break;
-            case R.id.ml_menu_search:
-                onSearchRequested();
-                break;
             case android.R.id.home:
                 // Slide down the audio player.
                 if (slideDownAudioPlayer())
@@ -644,9 +647,6 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
                 if (getFragment(mCurrentFragment) instanceof MRLPanelFragment)
                     ((MRLPanelFragment)getFragment(mCurrentFragment)).clearHistory();
                 break;
-            case R.id.search_clear_history:
-                MediaDatabase.getInstance().clearSearchHistory();
-                break;
             case R.id.ml_menu_save:
                 if (current == null)
                     break;
@@ -785,14 +785,6 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
         mCurrentFragment = sharedPrefs.getString("fragment", "video");
     }
 
-    /**
-     * onClick event from xml
-     * @param view
-     */
-    public void searchClick(View view) {
-        onSearchRequested();
-    }
-
     private final BroadcastReceiver messageReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -831,6 +823,20 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
         }
     };
 
+    @Override
+    public boolean onQueryTextSubmit(String query) {
+        return false;
+    }
+
+    @Override
+    public boolean onQueryTextChange(String newText) {
+        if (newText.length() < 3)
+            return false;
+        Cursor cursor = MediaDatabase.getInstance().queryMedia(newText, MediaWrapper.TYPE_ALL);
+        mSearchView.getSuggestionsAdapter().changeCursor(cursor);
+        return true;
+    }
+
     private static class MainActivityHandler extends WeakHandler<MainActivity> {
         public MainActivityHandler(MainActivity owner) {
             super(owner);
@@ -878,6 +884,7 @@ public class MainActivity extends ActionBarActivity implements OnItemClickListen
      * Show the audio player.
      */
     public void showAudioPlayer() {
+        mActionBar.collapseActionView();
         // Open the pane only if is entirely opened.
         if (mSlidingPane.getState() == mSlidingPane.STATE_OPENED_ENTIRELY)
             mSlidingPane.openPane();
diff --git a/vlc-android/src/org/videolan/vlc/gui/SearchFragment.java b/vlc-android/src/org/videolan/vlc/gui/SearchFragment.java
deleted file mode 100644
index 88c773e..0000000
--- a/vlc-android/src/org/videolan/vlc/gui/SearchFragment.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*****************************************************************************
- * SearchFragment.java
- *****************************************************************************
- * Copyright © 2011-2012 VLC authors and VideoLAN
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-package org.videolan.vlc.gui;
-
-import java.util.ArrayList;
-
-import org.videolan.vlc.MediaWrapper;
-import org.videolan.vlc.MediaDatabase;
-import org.videolan.vlc.MediaLibrary;
-import org.videolan.vlc.R;
-import org.videolan.vlc.audio.AudioServiceController;
-import org.videolan.vlc.gui.video.VideoPlayerActivity;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.v4.app.ListFragment;
-import android.support.v7.app.ActionBarActivity;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
-
-public class SearchFragment extends ListFragment {
-
-    public final static String TAG = "VLC/SearchActivity";
-
-    private EditText mSearchText;
-    private SearchHistoryAdapter mHistoryAdapter;
-    private SearchResultAdapter mResultAdapter;
-    private LinearLayout mListHeader;
-
-    final private Handler mHandler = new Handler();
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle(R.string.search);
-
-        View v = inflater.inflate(R.layout.search, container, false);
-
-        // TODO: create layout
-        mHistoryAdapter = new SearchHistoryAdapter(getActivity());
-        mResultAdapter = new SearchResultAdapter(getActivity());
-
-        return v;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        View v = getView();
-
-        mSearchText = (EditText) v.findViewById(R.id.search_text);
-        mSearchText.setOnEditorActionListener(searchTextListener);
-        mSearchText.addTextChangedListener(searchTextWatcher);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        mSearchText.requestFocus();
-
-        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
-        imm.showSoftInput(mSearchText, InputMethodManager.SHOW_IMPLICIT);
-
-        showSearchHistory();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-
-        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
-        imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
-    }
-
-    private void search(final String key, final int type) {
-        mResultAdapter.clear();
-        new Thread(new Runnable() {
-            public void run() {
-                final ArrayList<MediaWrapper> mediaList = MediaLibrary.getInstance().searchMedia(key, type);
-                mHandler.post(new Runnable() {
-                    public void run() {
-                        int count = mediaList.size();
-                        for (int i = 0 ; i < count ; ++i)
-                            mResultAdapter.add(mediaList.get(i));
-                        mResultAdapter.sort();
-
-                        String headerText = getResources().getQuantityString(R.plurals.search_found_results_quantity, mediaList.size(), mediaList.size());
-                        showListHeader(headerText);
-
-                        setListAdapter(mResultAdapter);
-                    }
-                });
-            }
-        }).start();
-
-    }
-
-    private void showListHeader(String text) {
-        ListView lv = getListView();
-
-        // Create a new header if it doesn't already exist
-        if (mListHeader == null) {
-            LayoutInflater infalter =  (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            mListHeader = (LinearLayout) infalter.inflate(R.layout.list_header, lv, false);
-            lv.addHeaderView(mListHeader, null, false);
-        }
-
-        // Set header text
-        TextView headerText = (TextView) mListHeader.findViewById(R.id.text);
-        headerText.setText(text);
-    }
-
-    private void showSearchHistory() {
-        // Add header to the history
-        String headerText = getString(R.string.search_history);
-        showListHeader(headerText);
-
-        MediaDatabase db = MediaDatabase.getInstance();
-        mHistoryAdapter.clear();
-        ArrayList<String> history = db.getSearchhistory(20);
-        for (String s : history)
-            mHistoryAdapter.add(s);
-        mHistoryAdapter.notifyDataSetChanged();
-        setListAdapter(mHistoryAdapter);
-    }
-
-    private final TextWatcher searchTextWatcher = new TextWatcher() {
-
-        @Override
-        public void onTextChanged(CharSequence s, int start, int before, int count) {
-            if (s.length() > 0) {
-                search(s.toString(), MediaWrapper.TYPE_ALL);
-            } else {
-                showSearchHistory();
-            }
-        }
-
-        @Override
-        public void beforeTextChanged(CharSequence s, int start, int count,
-                int after) {
-
-        }
-
-        @Override
-        public void afterTextChanged(Editable s) {
-
-        }
-    };
-
-    private final OnEditorActionListener searchTextListener = new OnEditorActionListener() {
-        @Override
-        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
-            imm.hideSoftInputFromWindow(mSearchText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
-            return false;
-        }
-    };
-
-    @Override
-    public void onListItemClick(ListView l, View v, int position, long id) {
-        if (getListAdapter() == mHistoryAdapter) {
-            String selection = ((TextView) v.findViewById(android.R.id.text1)).getText().toString();
-            mSearchText.setText(selection);
-            mSearchText.setSelection(selection.length());
-            mSearchText.requestFocus();
-        } else if (getListAdapter() == mResultAdapter) {
-            // add search text to the database (history)
-            MediaDatabase db = MediaDatabase.getInstance();
-            db.addSearchhistoryItem(mSearchText.getText().toString());
-
-            // open media in the player
-            MediaWrapper item = (MediaWrapper) getListView().getItemAtPosition(position);
-            if (item != null) {
-                if (item.getType() == MediaWrapper.TYPE_VIDEO) {
-                    VideoPlayerActivity.start(getActivity(), item.getLocation());
-                } else {
-                    ArrayList<String> arr = new ArrayList<String>();
-                    for (int i = 0; i < getListAdapter().getCount(); i++) {
-                        MediaWrapper audioItem = (MediaWrapper) getListAdapter().getItem(i);
-                        if (audioItem.getType() == MediaWrapper.TYPE_AUDIO)
-                            arr.add(audioItem.getLocation());
-                    }
-                    AudioServiceController.getInstance().load(arr, arr.indexOf(item.getLocation()));
-                    return;
-                }
-            }
-            super.onListItemClick(l, v, position, id);
-
-        }
-    };
-
-    public void onSearchKeyPressed() {
-        if (mSearchText == null)
-            return;
-        mSearchText.requestFocus();
-        mSearchText.setSelection(mSearchText.getText().length());
-        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
-        imm.showSoftInput(mSearchText, InputMethodManager.RESULT_SHOWN);
-    }
-}
diff --git a/vlc-android/src/org/videolan/vlc/gui/SearchHistoryAdapter.java b/vlc-android/src/org/videolan/vlc/gui/SearchHistoryAdapter.java
deleted file mode 100644
index a288f69..0000000
--- a/vlc-android/src/org/videolan/vlc/gui/SearchHistoryAdapter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*****************************************************************************
- * SearchResultAdapter.java
- *****************************************************************************
- * Copyright © 2011-2012 VLC authors and VideoLAN
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-package org.videolan.vlc.gui;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-
-public class SearchHistoryAdapter extends ArrayAdapter<String> {
-
-    public SearchHistoryAdapter(Context context) {
-        super(context, 0);
-    }
-
-    @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
-        ViewHolder holder;
-        View view = convertView;
-        if (view == null) {
-            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            view = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
-            holder = new ViewHolder();
-            holder.text = (TextView) view.findViewById(android.R.id.text1);
-            view.setTag(holder);
-        } else
-            holder = (ViewHolder) view.getTag();
-
-        String item = getItem(position);
-        holder.text.setText(item);
-
-        return view;
-    }
-
-    static class ViewHolder {
-        TextView text;
-    }
-}
diff --git a/vlc-android/src/org/videolan/vlc/gui/SearchResultAdapter.java b/vlc-android/src/org/videolan/vlc/gui/SearchResultAdapter.java
deleted file mode 100644
index cf177f1..0000000
--- a/vlc-android/src/org/videolan/vlc/gui/SearchResultAdapter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*****************************************************************************
- * SearchResultAdapter.java
- *****************************************************************************
- * Copyright © 2011-2012 VLC authors and VideoLAN
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-package org.videolan.vlc.gui;
-
-import java.util.Comparator;
-
-import org.videolan.vlc.MediaWrapper;
-import org.videolan.vlc.gui.audio.MediaComparators;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-
-public class SearchResultAdapter extends ArrayAdapter<MediaWrapper> {
-
-    public SearchResultAdapter(Context context) {
-        super(context, 0);
-    }
-
-    @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
-        ViewHolder holder;
-        View view = convertView;
-        if (view == null) {
-            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            view = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
-            holder = new ViewHolder();
-            holder.text = (TextView) view.findViewById(android.R.id.text1);
-            view.setTag(holder);
-        } else
-            holder = (ViewHolder) view.getTag();
-
-        MediaWrapper item = getItem(position);
-        holder.text.setText(item.getTitle());
-
-        return view;
-    }
-
-    public void sort() {
-        super.sort(MediaComparators.byName);
-    }
-
-    static class ViewHolder {
-        TextView text;
-    }
-}
diff --git a/vlc-android/src/org/videolan/vlc/gui/SearchSuggestionsAdapter.java b/vlc-android/src/org/videolan/vlc/gui/SearchSuggestionsAdapter.java
new file mode 100644
index 0000000..d0217fb
--- /dev/null
+++ b/vlc-android/src/org/videolan/vlc/gui/SearchSuggestionsAdapter.java
@@ -0,0 +1,71 @@
+/*
+ * *************************************************************************
+ *  SearchSuggestionsAdapter.java
+ * **************************************************************************
+ *  Copyright © 2015 VLC authors and VideoLAN
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *  ***************************************************************************
+ */
+
+package org.videolan.vlc.gui;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.support.v4.widget.CursorAdapter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.videolan.vlc.MediaDatabase;
+import org.videolan.vlc.MediaLibrary;
+import org.videolan.vlc.MediaWrapper;
+import org.videolan.vlc.R;
+import org.videolan.vlc.util.Util;
+
+public class SearchSuggestionsAdapter extends CursorAdapter {
+
+    public final static String TAG = "VLC/SearchSuggestionsAdapter";
+
+    MediaLibrary mMediaLibrary = MediaLibrary.getInstance();
+
+    public SearchSuggestionsAdapter(Context context, Cursor cursor){
+        super(context, cursor, false);
+    }
+
+    @Override
+    public View newView(Context context, Cursor cursor, ViewGroup parent) {
+        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        View view = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
+        return view;
+    }
+
+    @Override
+    public void bindView(View view, final Context context, final Cursor cursor) {
+        final int position = cursor.getPosition();
+        TextView tv = (TextView) view.findViewById(android.R.id.text1);
+        tv.setText(cursor.getString(cursor.getColumnIndex(MediaDatabase.MEDIA_TITLE)));
+        tv.setBackgroundColor(Util.getColorFromAttribute(context, R.attr.background_menu));
+        tv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                cursor.moveToPosition(position);
+                MediaWrapper media = mMediaLibrary.getMediaItem(cursor.getString(cursor.getColumnIndex(MediaDatabase.MEDIA_LOCATION)));
+                Util.openMedia(context, media);
+            }
+        });
+    }
+}
-- 
2.1.0



More information about the Android mailing list