From 720aa263ab21ca19fa391fad6e160b0360f34c66 Mon Sep 17 00:00:00 2001 From: Michael Merg Date: Thu, 30 Jun 2011 22:04:57 +0200 Subject: [PATCH] UI: enable search (only for video) --- vlc-android/AndroidManifest.xml | 3 +- .../video_list_title.xml} | 0 .../res/drawable/expander_ic_maximized.9.png | Bin 2081 -> 0 bytes vlc-android/res/drawable/ic_next.9.png | Bin 0 -> 334 bytes vlc-android/res/drawable/ml_path_color.xml | 6 - .../res/drawable/video_list_length_bg.xml | 5 + vlc-android/res/layout/list_header.xml | 14 ++ vlc-android/res/layout/media_library.xml | 2 +- vlc-android/res/layout/video_list_item.xml | 11 +- vlc-android/res/values/strings.xml | 1 + .../org/videolan/vlc/android/MediaItem.java | 5 +- .../vlc/android/MediaLibraryActivity.java | 2 +- .../videolan/vlc/android/SearchActivity.java | 157 +++++++++++++++++- .../vlc/android/SearchHistoryAdapter.java | 5 - .../vlc/android/SearchResultAdapter.java | 44 ++++- .../vlc/android/VideoListActivity.java | 1 - .../vlc/android/VideoListAdapter.java | 3 +- 17 files changed, 232 insertions(+), 27 deletions(-) rename vlc-android/res/{drawable/ml_title_color.xml => color/video_list_title.xml} (100%) delete mode 100644 vlc-android/res/drawable/expander_ic_maximized.9.png create mode 100644 vlc-android/res/drawable/ic_next.9.png delete mode 100644 vlc-android/res/drawable/ml_path_color.xml create mode 100644 vlc-android/res/drawable/video_list_length_bg.xml create mode 100644 vlc-android/res/layout/list_header.xml delete mode 100644 vlc-android/src/org/videolan/vlc/android/SearchHistoryAdapter.java diff --git a/vlc-android/AndroidManifest.xml b/vlc-android/AndroidManifest.xml index 17b014001..55249bd0c 100644 --- a/vlc-android/AndroidManifest.xml +++ b/vlc-android/AndroidManifest.xml @@ -20,7 +20,8 @@ + android:theme="@android:style/Theme.NoTitleBar" + android:configChanges="orientation"> diff --git a/vlc-android/res/drawable/ml_title_color.xml b/vlc-android/res/color/video_list_title.xml similarity index 100% rename from vlc-android/res/drawable/ml_title_color.xml rename to vlc-android/res/color/video_list_title.xml diff --git a/vlc-android/res/drawable/expander_ic_maximized.9.png b/vlc-android/res/drawable/expander_ic_maximized.9.png deleted file mode 100644 index bad4b82026559d9e8aa7825101a83a15207c23e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2081 zcmV++2;TRJP)tdT-6oEe|w+HcoKW;n3Ry%5p4MHKN_g7qY+3F>IdG_oWyLSDJW5C?Q-9gDYuA%N3OJ>dU+Ae|5pW^Uwt4gB zCp#*gzZdVLjT<-8-``Jrd&fnCs=d9P4I4Hves-MU;bEKB(R4RWIk*-^By_JU_e)wCbWZ(KeM#n}ue&TolvaY+kdw67Ih&en$>!a0X^4(B}9gLA%dUfj3mp1TX)-@0`x^?Ds^&0W`AbIlznwndl()bW_oH0V-42iIOn+e=9{V2=E!q%eE}pA5!K2-(>1!d zE@xS`&S=e=HEYQ891uhlQ&W>1J$jV=`}cFtJ@^u|R}_pmlBCYj zqet1hcQ09%@$$({U6%{SkqTCL)o?q=; zF&}y45v;Xjxj`$1$uqq7t#*UOg0-17fwgYdImf9}BUo#3&SI^lqtd}se|m~2ib#@# zBuN+?9Ax|Ur_Ws{Ny4^mzhl!)n+U@I?<~d`M*efU5%9*$79f_)8UUQLV+edQ^a;+I zCZ%LaN}x2)Jo5~39DmJtnkJ-a%A=1y%5AsZ4qh5=wGQVjLqkK2EE7MrSWRga(H?N# z`;&t3*1osM3J~5qtZSs`{Cu6k!9mL9HqtaLX2#=>|A9O2ypuf7ao*v*V67p~4F?V! zKt%A)pKK|9vKSBtSYyol-uvwE;lrFbegg4=cmV{ssdB18m;>3$iptYmL_GYdU4;&Yb{QYln<6?}|v?6itg2y%31P zFkBWzQ8^64Ym+1?)oL|1Y`B3S42YtbIEsm)h%gGt^PE+yR$)v|6h*{QL=c8FNf{Uz z;Jx?$$?R-(&RV-W%d(F|WD2Mk8bubXzM=O%%Cc-)2YR)Ltec&gQAwK8*S8+6HE|RX zmr8_TOcaGErHG>ltu#t&tg!&R_~MJ~-Mg1FXGVRRrUz=Z+AinZI4}du7p$Deh-z_{ z1|nn3$uJ0e(k$y49UWEU6BGRK^2@1IDg;^=ZfH!U6kZyca{A0^o_%&Ff8X;er_Y@6 zwOZ}nYPI@T5jhJ?0&_st8Y96H5>jg&gvR8@lQiwD)oQCg|NQgly(35Xa%Kim(5zW` zmN79o$xpCkvfG#&8Xk13@VvLTB}#fC6as)R@=%SQ>)j>^V}wBa?)D+jzS&q-j4#K1sk&k z8*V8eUz3VJC(sRC3j6@*4uaqYt@X9m+BHECbb2psN`d!21!k2}r@hE0h#Uc?feB!| zIG-(at6iwjE-IdtQXL}FRRCI1fNL*+#w}ZbFR~y7YK74+mD1B9ex`_vbTK6#wlp&+ zRI{IHE=;9y!vIO~vJPN5P%eNpNK$-#TExS*Z?KA&o?{6Sr5Zh>UeN1?EmgG1qAQHrf<@a>Q)Gdm zq6~b)-nRvqS|As60Z_HnDp5*%5${n-3PbXh>%VGEm;4Xw`vLqHK&yo~LHPY500000 LNkvXXu0mjf?-J+_ diff --git a/vlc-android/res/drawable/ic_next.9.png b/vlc-android/res/drawable/ic_next.9.png new file mode 100644 index 0000000000000000000000000000000000000000..43cab11628463bd604bb03e93bca9bfdeebd47bd GIT binary patch literal 334 zcmV-U0kQsxP)fRu0t4xU>F9NrU@v$B@;!FBn->4U>FA2wvAsV%Q6WV zwr#^Wj`w9KU^tFLHQV={U#2Ju2^gN|!934!90$KlRaFu&eBY5WInz zVcobySfe(^b07*qoM6N<$g3Ab%D*ylh literal 0 HcmV?d00001 diff --git a/vlc-android/res/drawable/ml_path_color.xml b/vlc-android/res/drawable/ml_path_color.xml deleted file mode 100644 index cae4a30f9..000000000 --- a/vlc-android/res/drawable/ml_path_color.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/vlc-android/res/drawable/video_list_length_bg.xml b/vlc-android/res/drawable/video_list_length_bg.xml new file mode 100644 index 000000000..ea8a541df --- /dev/null +++ b/vlc-android/res/drawable/video_list_length_bg.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/vlc-android/res/layout/list_header.xml b/vlc-android/res/layout/list_header.xml new file mode 100644 index 000000000..5c3e34fb5 --- /dev/null +++ b/vlc-android/res/layout/list_header.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/vlc-android/res/layout/media_library.xml b/vlc-android/res/layout/media_library.xml index f5e70bb6e..1af143de9 100644 --- a/vlc-android/res/layout/media_library.xml +++ b/vlc-android/res/layout/media_library.xml @@ -27,7 +27,7 @@ android:visibility="invisible"/> diff --git a/vlc-android/res/layout/video_list_item.xml b/vlc-android/res/layout/video_list_item.xml index 36e6012e1..60f2c27e9 100644 --- a/vlc-android/res/layout/video_list_item.xml +++ b/vlc-android/res/layout/video_list_item.xml @@ -22,7 +22,7 @@ android:id="@+id/ml_item_length" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="#77000000" + android:background="@drawable/video_list_length_bg" android:textSize="12dip" android:textColor="#CCCCCC" /> @@ -35,12 +35,13 @@ android:ellipsize="end" android:maxLines="2" android:textSize="17dip" - android:textColor="@drawable/ml_title_color" + android:textColor="@color/video_list_title" android:paddingLeft="12dip"/> + android:layout_height="match_parent" + android:src="@drawable/ic_next" + android:paddingRight="12dip" + android:paddingLeft="5dip" /> \ No newline at end of file diff --git a/vlc-android/res/values/strings.xml b/vlc-android/res/values/strings.xml index 2238cda31..801e204ef 100644 --- a/vlc-android/res/values/strings.xml +++ b/vlc-android/res/values/strings.xml @@ -14,4 +14,5 @@ Length Search... VLC media player + History diff --git a/vlc-android/src/org/videolan/vlc/android/MediaItem.java b/vlc-android/src/org/videolan/vlc/android/MediaItem.java index 14b7c0fd6..e0b7796a9 100644 --- a/vlc-android/src/org/videolan/vlc/android/MediaItem.java +++ b/vlc-android/src/org/videolan/vlc/android/MediaItem.java @@ -4,7 +4,6 @@ package org.videolan.vlc.android; import java.io.File; import android.graphics.Bitmap; -import android.util.Log; public class MediaItem implements Comparable { @@ -22,9 +21,11 @@ public class MediaItem implements Comparable { ".mp1", ".mp2", ".mp3", ".mpc", ".oga", ".ogg", ".oma", ".rmi", ".s3m", ".spx", ".tta", ".voc", ".vqf", ".w64", ".wav", ".wma", ".wv", ".xa", ".xm"}; + + public final static int TYPE_ALL = -1; public final static int TYPE_VIDEO = 0; public final static int TYPE_AUDIO = 1; - + private String mName; private File mFile; private long mTime = 0; diff --git a/vlc-android/src/org/videolan/vlc/android/MediaLibraryActivity.java b/vlc-android/src/org/videolan/vlc/android/MediaLibraryActivity.java index a50c77105..d836a95e9 100644 --- a/vlc-android/src/org/videolan/vlc/android/MediaLibraryActivity.java +++ b/vlc-android/src/org/videolan/vlc/android/MediaLibraryActivity.java @@ -36,7 +36,7 @@ public class MediaLibraryActivity extends TabActivity { private static MediaLibraryActivity mInstance; private DatabaseManager mDBManager; private final CyclicBarrier mBarrier = new CyclicBarrier(2); - protected List mItemList = new ArrayList(); + protected ArrayList mItemList = new ArrayList(); private ProgressBar mProgressBar; private TabHost mTabHost; private int mCurrentState = 0; diff --git a/vlc-android/src/org/videolan/vlc/android/SearchActivity.java b/vlc-android/src/org/videolan/vlc/android/SearchActivity.java index faa7de1ce..74cc38655 100644 --- a/vlc-android/src/org/videolan/vlc/android/SearchActivity.java +++ b/vlc-android/src/org/videolan/vlc/android/SearchActivity.java @@ -1,30 +1,181 @@ package org.videolan.vlc.android; +import java.util.ArrayList; + import android.app.ListActivity; import android.app.SearchManager; +import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; public class SearchActivity extends ListActivity { public final static String TAG = "VLC/SearchActivit"; private EditText mSearchText; + private String[] mSearchHistory; + private ArrayAdapter mHistoryAdapter; + private SearchResultAdapter mResultAdapter; + private LinearLayout mListHeader; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); + // TODO: create layout + mResultAdapter = new SearchResultAdapter(this, android.R.layout.simple_list_item_1); + mSearchText = (EditText)findViewById(R.id.search_text); + mSearchText.setOnEditorActionListener(searchTextListener); + mSearchText.addTextChangedListener(searchTextWatcher); final Intent queryIntent = getIntent(); final String queryAction = queryIntent.getAction(); if (Intent.ACTION_SEARCH.equals(queryAction)) { - mSearchText.setText(queryIntent.getStringExtra(SearchManager.QUERY)); - mSearchText.requestFocus(); + String query = queryIntent.getStringExtra(SearchManager.QUERY); + mSearchText.setText(query); + mSearchText.setSelection(query.length()); + } else { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(mSearchText, InputMethodManager.RESULT_SHOWN); } - + + mSearchText.requestFocus(); + showSearchHistory(); + + } + + private void search(CharSequence key, int type) { + + // set result adapter to the list + removeListHeader(); + setListAdapter(null); + mResultAdapter.clear(); + ArrayList allItems = MediaLibraryActivity.getInstance().mItemList; + for (int i = 0; i < allItems.size(); i++) { + MediaItem item = allItems.get(i); + if ((type == MediaItem.TYPE_VIDEO || // Only video by now! + type == item.getType()) && + item.getName().contains(key) || + item.getPath().contains(key)) { + mResultAdapter.add(item); + } + } + mResultAdapter.sort(); + setListAdapter(mResultAdapter); } + + + + private void addListHeader(int resid) { + ListView lv = getListView(); + + if (mListHeader == null) { + LayoutInflater infalter = getLayoutInflater(); + mListHeader = (LinearLayout) infalter.inflate(R.layout.list_header, lv, false); + } + + TextView headerText = (TextView)mListHeader.findViewById(R.id.list_header_text); + headerText.setText(R.string.search_history); + getListView().addHeaderView(mListHeader, null, false); + } + + private void removeListHeader() { + if (mListHeader != null) + getListView().removeHeaderView(mListHeader); + } + + private void showSearchHistory() { + setListAdapter(null); + // Add header to the history + addListHeader(R.string.search_history); + + if (mSearchHistory == null) + loadSearchHistory(); + if (mHistoryAdapter == null) + mHistoryAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, mSearchHistory); + setListAdapter(mHistoryAdapter); + } + + private void loadSearchHistory() { + // TODO: load real history from database + mSearchHistory = new String[]{ "test0", "test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8", "test9" }; + } + + private TextWatcher searchTextWatcher = new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (s.length() > 0) { + search(s, MediaItem.TYPE_ALL); + } else { + showSearchHistory(); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, + int after) { + + } + + @Override + public void afterTextChanged(Editable s) { + + } + }; + + + + private OnEditorActionListener searchTextListener = new OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(mSearchText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + return false; + } + }; + + protected 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) { + MediaItem item = (MediaItem) getListAdapter().getItem(position); + Intent intent = new Intent(this, VideoPlayerActivity.class); + intent.putExtra("filePath", item.getPath()); + startActivity(intent); + super.onListItemClick(l, v, position, id); + } + }; + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_SEARCH) { + mSearchText.requestFocus(); + mSearchText.setSelection(mSearchText.getText().length()); + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(mSearchText, InputMethodManager.RESULT_SHOWN); + return true; + } + + return super.onKeyDown(keyCode, event); + } + + } diff --git a/vlc-android/src/org/videolan/vlc/android/SearchHistoryAdapter.java b/vlc-android/src/org/videolan/vlc/android/SearchHistoryAdapter.java deleted file mode 100644 index 3c434b81f..000000000 --- a/vlc-android/src/org/videolan/vlc/android/SearchHistoryAdapter.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.videolan.vlc.android; - -public class SearchHistoryAdapter { - -} diff --git a/vlc-android/src/org/videolan/vlc/android/SearchResultAdapter.java b/vlc-android/src/org/videolan/vlc/android/SearchResultAdapter.java index 3a1715a0c..a86465fa2 100644 --- a/vlc-android/src/org/videolan/vlc/android/SearchResultAdapter.java +++ b/vlc-android/src/org/videolan/vlc/android/SearchResultAdapter.java @@ -1,5 +1,47 @@ package org.videolan.vlc.android; -public class SearchResultAdapter { +import java.util.Comparator; + +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 + implements Comparator { + + public SearchResultAdapter(Context context, int textViewResourceId) { + super(context, textViewResourceId); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = convertView; + if (v == null){ + LayoutInflater inflater = (LayoutInflater) + getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + v = inflater.inflate(android.R.layout.simple_list_item_1, + parent, false); + } + + MediaItem item = getItem(position); + TextView textView = (TextView)v.findViewById(android.R.id.text1); + textView.setText(item.getName()); + + return v; + } + + @Override + public int compare(MediaItem object1, MediaItem object2) { + return object1.getName().compareToIgnoreCase(object2.getName()); + } + + public void sort() { + super.sort(this); + } + + } diff --git a/vlc-android/src/org/videolan/vlc/android/VideoListActivity.java b/vlc-android/src/org/videolan/vlc/android/VideoListActivity.java index 87c7aa8ac..af0d975ab 100644 --- a/vlc-android/src/org/videolan/vlc/android/VideoListActivity.java +++ b/vlc-android/src/org/videolan/vlc/android/VideoListActivity.java @@ -6,7 +6,6 @@ import java.util.concurrent.CyclicBarrier; import android.app.ListActivity; import android.content.Intent; -import android.graphics.LightingColorFilter; import android.os.Bundle; import android.os.Handler; import android.os.Message; diff --git a/vlc-android/src/org/videolan/vlc/android/VideoListAdapter.java b/vlc-android/src/org/videolan/vlc/android/VideoListAdapter.java index 77c6d8f42..8147a5a5c 100644 --- a/vlc-android/src/org/videolan/vlc/android/VideoListAdapter.java +++ b/vlc-android/src/org/videolan/vlc/android/VideoListAdapter.java @@ -130,7 +130,8 @@ public class VideoListAdapter extends ArrayAdapter @Override public void onClick(View v) { MediaItem item = (MediaItem)v.getTag(); - Util.toaster(item.getName() + " submenu"); + // TODO: show details + Util.toaster("show details for: " + item.getName()); } };