Now search is working. Prepare to add localizations

This commit is contained in:
Vladislav Khorev 2015-06-26 09:07:18 +00:00
parent 8e393dc2bf
commit 82a58794a1
9 changed files with 418 additions and 128 deletions

View File

@ -36,7 +36,7 @@
</EditText>
<Button
android:id="@+id/button"
android:id="@+id/searchButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"

View File

@ -11,22 +11,23 @@
<ImageButton
android:id="@+id/imageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="40dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_margin="6dp"
android:adjustViewBounds="true"
android:background="@drawable/transparent"
android:src="@drawable/transparent_button"
android:contentDescription="@string/news_content_description" />
android:contentDescription="@string/news_content_description"
android:scaleType="centerInside" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/transparent_button"
android:gravity="left|center_vertical"
@ -36,7 +37,7 @@
<TextView
android:id="@+id/dateTextView"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

View File

@ -8,6 +8,15 @@
android:paddingRight="20dp"
tools:context="fishrungames.bashgid.SearchFragment" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:textSize="18sp"
android:textStyle="bold" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"

View File

@ -16,6 +16,7 @@ import fishrungames.bashgid.core.BookManager.BookRecord;
import fishrungames.bashgid.core.AlbumManager.AlbumFullData;
import fishrungames.bashgid.core.ArticleManager.ArticleFullData;
import fishrungames.bashgid.core.ArticleManager.ArticleShortData;
import fishrungames.bashgid.core.ChannelManager.ChannelFullData;
import fishrungames.bashgid.core.DatabaseDownloadTask;
import fishrungames.bashgid.core.HtmlDownloadManager.TextFileRecord;
@ -109,6 +110,10 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
public static final int DATABASE_GET_JOURNAL_LIST_STATE_UPDATE = 26;
public static final int DATABASE_GET_JOURNAL_LIST_STATE_FINISHED = 27;
public static final int DATABASE_SEARCH_ARTICLE_STATE_UPDATE = 28;
public static final int DATABASE_SEARCH_ARTICLE_STATE_FINISHED = 29;
MainPageFragment mainPageFragment = null;
@ -126,6 +131,8 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
VideoRecordFragment videoRecordFragment = null;
OsmMapHolderFragment mapHolderFragment = null;
SearchFragment searchFragment = null;
CatalogFragment catalogFragment = null;
static MainActivity instance = null;
@ -179,6 +186,7 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
channelDataSource = new ChannelDataSource(this, dbHelper);
journalDataSource = new JournalDataSource(this, dbHelper);
mHandler = new Handler(Looper.getMainLooper())
{
@ -235,7 +243,11 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
break;
case DATABASE_SEARCH_ARTICLE_STATE_UPDATE:
case DATABASE_SEARCH_ARTICLE_STATE_FINISHED:
UpdateOnArticleSearchPerformed((ArrayList<ArticleShortData>) inputMessage.obj);
break;
default:
@ -399,6 +411,7 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
videoRecordFragment = null;
mapHolderFragment = null;
searchFragment = null;
catalogFragment = null;
}
@ -517,8 +530,6 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
mapHolderFragment.SetJournal(journal);
}
}
@ -553,6 +564,44 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
}
public void UpdateOnArticleSearchPerformed(ArrayList<ArticleShortData> articleArr)
{
if (searchFragment != null)
{
searchFragment.SetSearchResult(articleArr);
}
}
public void OnSearchPressed()
{
if (searchFragment != null)
{
return;
}
if (newsListFragment != null || newsRecordFragment != null)
{
OpenSearchScreen("news", "News");
return;
}
if (journalFragment != null)
{
if (journalFragment.journal == null)
{
OpenSearchScreen(journalFragment.journalName, "");
}
else
{
OpenSearchScreen(journalFragment.journalName, journalFragment.journal.title);
}
return;
}
OpenSearchScreen();
}
public void OnSelectEnglish(View view)
@ -664,22 +713,38 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
public void OpenSearchScreen()
{
ClearAllFragmentLinks();
searchFragment = new SearchFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SearchFragment(), TAG_TO_SEARCHFRAGMENT).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, searchFragment, TAG_TO_MAINFRAGMENT).commit();
mNavigationDrawerFragment.EnableDrawer();
}
public void OpenSearchScreen(String journalName, String journalTitle)
{
ClearAllFragmentLinks();
searchFragment = new SearchFragment(journalName, journalTitle);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, searchFragment, TAG_TO_MAINFRAGMENT).commit();
mNavigationDrawerFragment.EnableDrawer();
}
public void OpenSearchScreen(boolean restorePreviousSearch)
/*
public void OpenSearchScreen()
{
ClearAllFragmentLinks();
SearchFragment
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SearchFragment(restorePreviousSearch), TAG_TO_SEARCHFRAGMENT)
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SearchFragment(), TAG_TO_SEARCHFRAGMENT)
.commit();
mNavigationDrawerFragment.EnableDrawer();
}
}*/
public void OpenLinkContentScreen(TextFileRecord contentRecord)
{
@ -880,6 +945,7 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
mainPageFragment.RefreshJournal();
}
}
@Override
public void onAttachFragment(Fragment fragment)
@ -920,11 +986,7 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
if (id == R.id.action_search)
{
if (getSupportFragmentManager().findFragmentByTag(TAG_TO_SEARCHFRAGMENT) == null
&& getSupportFragmentManager().findFragmentByTag(TAG_TO_WELCOMEFRAGMENT) == null)
{
OpenSearchScreen();
}
OnSearchPressed();
return true;
}
@ -1007,7 +1069,7 @@ public class MainActivity extends ActionBarActivity implements NavigationDrawerF
if (getSupportFragmentManager().findFragmentByTag(TAG_FROM_SEARCHFRAGMENT_TO_NEWSRECORDFRAGMENT) != null)
{
OpenSearchScreen(true);
OpenSearchScreen();
return;
}

View File

@ -80,6 +80,19 @@ public class MainPageFragment extends Fragment {
}
}
);
Button searchButton = (Button) header.findViewById(R.id.searchButton);
searchButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
MainActivity.getInstance().OpenSearchScreen();
}
}
);
return rootView;
}
@ -197,7 +210,6 @@ public class MainPageFragment extends Fragment {
@SuppressLint("InflateParams")
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) { // if it's not recycled, initialize some attributes

View File

@ -3,6 +3,10 @@ package fishrungames.bashgid;
import java.util.ArrayList;
import fishrungames.bashgid.core.ArticleManager;
import fishrungames.bashgid.core.ArticleManager.ArticleShortData;
import fishrungames.bashgid.core.DatabaseGetJournalTask;
import fishrungames.bashgid.core.DatabaseSearchArticleTask;
import fishrungames.bashgid.core.NewsManager;
import fishrungames.bashgid.core.NewsManager.NewsRecord;
import fishrungames.bashgid.core.db.NewsDataSource;
@ -28,7 +32,7 @@ import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
public class SearchFragment extends Fragment implements UpdateAndFinishCallbackInterface
public class SearchFragment extends Fragment
{
ListView listView;
@ -37,48 +41,60 @@ public class SearchFragment extends Fragment implements UpdateAndFinishCallbackI
EditText searchEditText;
ArrayList<NewsRecord> searchResultArr = new ArrayList<NewsRecord>();
volatile boolean searchIsPerformingNow = false;
ArrayList<ArticleShortData> searchResultArr = new ArrayList<ArticleShortData>();
//NewsSearchRunnable nextSearchRunnable = null;
String journalName;
String journalTitle;
boolean restorePreviousSearch = false;
RemoveCallbackInterface removeCallback = null;
Object removeCallbackSynchronizer = new Object();
DatabaseSearchArticleTask databaseSearchArticleTask = null;
public SearchFragment()
{
this.journalName = "";
this.journalTitle = "";
}
public SearchFragment(boolean restorePreviousSearch)
public SearchFragment(String journalName, String journalTitle)
{
this.restorePreviousSearch = restorePreviousSearch;
this.journalName = journalName;
this.journalTitle = journalTitle;
}
@Override
public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("journalName", journalName);
outState.putString("journalTitle", journalTitle);
}
@SuppressLint("InflateParams") @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
journalName = savedInstanceState.getString("journalName");
journalTitle = savedInstanceState.getString("journalTitle");
}
View rootView = inflater.inflate(R.layout.fragment_search_page, container, false);
listView = (ListView) rootView.findViewById(R.id.listView);
listAdapter = new ListAdapter(getActivity());
listView.setAdapter(listAdapter);
View header = inflater.inflate(R.layout.search_page_list_header, null);
searchEditText = (EditText) header.findViewById(R.id.editText);
TextView textView = (TextView) header.findViewById(R.id.textView);
if (restorePreviousSearch)
if (journalTitle == null || journalTitle.length() == 0)
{
searchEditText.setText(NewsManager.getInstance().getLastSearchQuery());
searchResultArr = NewsManager.getInstance().getSearchResultNews();
textView.setText("Search everywhere");
}
else
{
textView.setText("Search in: " + journalTitle);
}
searchEditText = (EditText) header.findViewById(R.id.editText);
searchEditText.addTextChangedListener(new TextWatcher(){
public void afterTextChanged(Editable s) {
@ -93,28 +109,25 @@ public class SearchFragment extends Fragment implements UpdateAndFinishCallbackI
public void onTextChanged(CharSequence s, int start, int before, int count){}
});
listView.addHeaderView(header);
listAdapter = new ListAdapter(getActivity());
listView.setAdapter(listAdapter);
return rootView;
}
@Override
public void onDestroyView()
public void SetSearchResult(ArrayList<ArticleShortData> articleArr)
{
synchronized (removeCallbackSynchronizer)
{
if (removeCallback != null)
{
removeCallback.RemoveCallback();
removeCallback = null;
}
}
super.onDestroyView();
searchResultArr = articleArr;
listAdapter.notifyDataSetChanged();
}
public class ListAdapter extends BaseAdapter {
private Context mContext;
@ -154,76 +167,78 @@ public class SearchFragment extends Fragment implements UpdateAndFinishCallbackI
TextView textView = (TextView) view.findViewById(R.id.dateTextView);
ImageManager.getInstance().ApplyImageToImageView(imageButton, searchResultArr.get(position).imageId);
ImageManager.getInstance().ApplyImageToImageView(imageButton, searchResultArr.get(position).previewImageUrl);
button.setText(searchResultArr.get(position).title);
textView.setText(NewsDataSource.iso8601Format.format(searchResultArr.get(position).pubDate));
textView.setText(NewsDataSource.iso8601Format.format(searchResultArr.get(position).dateTime));
button.setOnClickListener(new ButtonOnClickListener(searchResultArr.get(position)));
imageButton.setOnClickListener(new ButtonOnClickListener(searchResultArr.get(position)));
button.setOnClickListener(new ButtonOnClickListener(searchResultArr.get(position).name, searchResultArr.get(position).type));
imageButton.setOnClickListener(new ButtonOnClickListener(searchResultArr.get(position).name, searchResultArr.get(position).type));
return view;
}
}
@Override
public void OnFinished()
{
synchronized (removeCallbackSynchronizer)
{
removeCallback = null;
}
}
@Override
public void OnUpdated(Bundle result)
{
getActivity().runOnUiThread(new RefreshSearchListRunnable());
}
public void CallUpdateNews(String text)
{
Bundle query = new Bundle();
query.putString("query", text);
removeCallback = UniversalActionWithCallback.PerformAction(new NewsSearchRunnable(), query, this, "NewsSearchRunnable");
}
private class RefreshSearchListRunnable implements Runnable
{
@Override
public void run()
if (text.length() >= 3)
{
searchResultArr = NewsManager.getInstance().getSearchResultNews();
listAdapter.notifyDataSetChanged();
if (databaseSearchArticleTask != null)
{
databaseSearchArticleTask.cancel(false);
}
databaseSearchArticleTask = new DatabaseSearchArticleTask();
databaseSearchArticleTask.mHandler = MainActivity.getInstance().mHandler;
Bundle bundle = new Bundle();
bundle.putString("journalName", journalName);
bundle.putString("query", text);
databaseSearchArticleTask.execute(bundle);
}
else
{
searchResultArr.clear();
listAdapter.notifyDataSetChanged();
}
}
public static class ButtonOnClickListener implements OnClickListener
{
NewsRecord newsRecord;
//NewsRecord newsRecord;
String articleName;
int articleType;
public ButtonOnClickListener(NewsRecord newsRecord)
public ButtonOnClickListener(String articleName, int articleType)
{
this.newsRecord = newsRecord;
this.articleName = articleName;
this.articleType = articleType;
//this.newsRecord = newsRecord;
}
@Override
public void onClick(View v)
{
//MainActivity.getInstance().OpenNewsRecordScreen(newsRecord, MainActivity.TAG_FROM_SEARCHFRAGMENT_TO_NEWSRECORDFRAGMENT);
if (articleType == ArticleManager.ARTICLE_TYPE_NEWS)
{
MainActivity.getInstance().OpenNewsRecordScreen(articleName, MainActivity.TAG_TO_MAINFRAGMENT);
}
else
{
MainActivity.getInstance().OpenArticleScreen(articleName, MainActivity.TAG_TO_MAINFRAGMENT);
}
}
}

View File

@ -0,0 +1,60 @@
package fishrungames.bashgid.core;
import java.util.ArrayList;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import fishrungames.bashgid.MainActivity;
import fishrungames.bashgid.core.ArticleManager.ArticleShortData;
import fishrungames.bashgid.core.JournalManager.JournalSemiFullData;
public class DatabaseSearchArticleTask extends AsyncTask<Bundle, Integer, Long>
{
public Handler mHandler;
ArrayList<ArticleShortData> articleArr = new ArrayList<ArticleShortData>();
protected Long doInBackground(Bundle... queryArr)
{
String query = queryArr[0].getString("query");
String journalName = queryArr[0].getString("journalName");
if (journalName != null && journalName.length() > 0)
{
articleArr = MainActivity.getInstance().articleDataSource.SearchArticleByQueryAndJournal(query, journalName);
}
else
{
articleArr = MainActivity.getInstance().articleDataSource.SearchArticleByQuery(query);
}
//articleArr.addAll(journal.articleArr);
return (long) 0;
}
protected void onProgressUpdate(Integer... progress)
{
Message completeMessage = mHandler.obtainMessage(MainActivity.DATABASE_SEARCH_ARTICLE_STATE_UPDATE, articleArr);
completeMessage.sendToTarget();
}
protected void onPostExecute(Long result)
{
Message completeMessage = mHandler.obtainMessage(MainActivity.DATABASE_SEARCH_ARTICLE_STATE_FINISHED, articleArr);
completeMessage.sendToTarget();
}
}

View File

@ -237,6 +237,79 @@ public class ArticleDataSource
return result;
}
public ArrayList<ArticleShortData> SearchArticleByQuery(String query)
{
ArrayList<ArticleShortData> result = new ArrayList<ArticleShortData>();
SQLiteDatabase database = dbHelper.getWritableDatabase();
if (database != null)
{
try
{
result = InnerSearchArticleByQuery(query, database);
} finally
{
dbHelper.close();
}
}
return result;
}
public ArrayList<ArticleShortData> SearchArticleByQueryAndJournal(String query, String journalName)
{
ArrayList<ArticleShortData> result = new ArrayList<ArticleShortData>();
SQLiteDatabase database = dbHelper.getWritableDatabase();
if (database != null)
{
try
{
ArrayList<ArticleShortData> intermediateResult = InnerSearchArticleByQuery(query, database);
for (ArticleShortData article : intermediateResult)
{
if (MainActivity.getInstance().journalDataSource.InnerArticleJournalRelationAlreadyExist(article.name, journalName, database))
{
result.add(article);
}
}
} finally
{
dbHelper.close();
}
}
return result;
}
public ArrayList<ArticleShortData> InnerSearchArticleByQuery(String query, SQLiteDatabase database)
{
ArrayList<ArticleShortData> result = new ArrayList<ArticleShortData>();
ArrayList<ArticleRecordData> recordDataArr = innerGetArticlesByQuery(query, database);
for (int i = 0; i < recordDataArr.size(); i++)
{
ArticleShortData article = new ArticleShortData(recordDataArr.get(i));
article.previewImageUrl = getPreviewImageUrlForArticle(recordDataArr.get(i).name, database);
result.add(article);
}
return result;
}
public ArticleShortData InnerGetArticleShortData(String name, SQLiteDatabase database)
@ -251,35 +324,8 @@ public class ArticleDataSource
result = new ArticleShortData(recordData);
ArrayList<String> albumNameArr = innerGetAlbumNameArrInArticle(name, database);
result.previewImageUrl = "R.drawable.no_picture";
if (albumNameArr.size() > 0)
{
AlbumFullData album = MainActivity.getInstance().albumDataSource.InnerGetAlbumFullData(albumNameArr.get(0), database);
if (album.photoRecordArr.size() > 0)
{
result.previewImageUrl = album.photoRecordArr.get(0).imageUrl;
}
}
if (result.previewImageUrl.equals("R.drawable.no_picture"))
{
ArrayList<String> channelNameArr = innerGetChannelNameArrInArticle(name, database);
if (channelNameArr.size() > 0)
{
ChannelFullData channelFullData = MainActivity.getInstance().channelDataSource.InnerGetChannelFullData(channelNameArr.get(0), database);
if (channelFullData.videoRecordArr.size() > 0)
{
result.previewImageUrl = channelFullData.videoRecordArr.get(0).previewImageUrl;
}
}
}
result.previewImageUrl = getPreviewImageUrlForArticle(name, database);
}
@ -287,6 +333,41 @@ public class ArticleDataSource
return result;
}
private String getPreviewImageUrlForArticle(String name, SQLiteDatabase database)
{
String result = "R.drawable.no_picture";
ArrayList<String> albumNameArr = innerGetAlbumNameArrInArticle(name, database);
if (albumNameArr.size() > 0)
{
AlbumFullData album = MainActivity.getInstance().albumDataSource.InnerGetAlbumFullData(albumNameArr.get(0), database);
if (album.photoRecordArr.size() > 0)
{
result = album.photoRecordArr.get(0).imageUrl;
}
}
if (result.equals("R.drawable.no_picture"))
{
ArrayList<String> channelNameArr = innerGetChannelNameArrInArticle(name, database);
if (channelNameArr.size() > 0)
{
ChannelFullData channelFullData = MainActivity.getInstance().channelDataSource.InnerGetChannelFullData(channelNameArr.get(0), database);
if (channelFullData.videoRecordArr.size() > 0)
{
result = channelFullData.videoRecordArr.get(0).previewImageUrl;
}
}
}
return result;
}
private boolean innerIsArticleAlreadyExist(String name, SQLiteDatabase database)
{
boolean result = false;
@ -396,6 +477,56 @@ public class ArticleDataSource
}
private ArrayList<ArticleRecordData> innerGetArticlesByQuery(String query, SQLiteDatabase database)
{
ArrayList<ArticleRecordData> result = new ArrayList<ArticleRecordData>();
Cursor cursor = database.query(BashgidSqliteHelper.TABLE_ARTICLE, new String[] {
BashgidSqliteHelper.COLUMN_NAME, BashgidSqliteHelper.COLUMN_TYPE, BashgidSqliteHelper.COLUMN_TITLE, BashgidSqliteHelper.COLUMN_CONTENT, BashgidSqliteHelper.COLUMN_GEOLAT, BashgidSqliteHelper.COLUMN_GEOLON, BashgidSqliteHelper.COLUMN_EXTERNAL_LINK,BashgidSqliteHelper.COLUMN_DATE_TIME },
BashgidSqliteHelper.COLUMN_TITLE + " LIKE ?", new String[] { "%" + query + "%" }, null, null, null, null);
if (cursor != null)
{
if (cursor.moveToFirst())
{
do
{
Date d = new Date();
try
{
d = ArticleManager.iso8601Format.parse(cursor.getString(7));
}
catch(ParseException e)
{
Log.e("aaa", "aaa!!!!!");
}
result.add(new ArticleRecordData(
cursor.getString(0),
cursor.getInt(1),
cursor.getString(2),
cursor.getString(3),
cursor.getDouble(4),
cursor.getDouble(5),
cursor.getString(6),
d
));
}
while (cursor.moveToNext());
}
cursor.close();
}
return result;
}
public ArrayList<String> innerGetAlbumNameArrInArticle(String name, SQLiteDatabase database)
{
ArrayList<String> result = new ArrayList<String>();

View File

@ -101,7 +101,7 @@ public class JournalDataSource
values.put(BashgidSqliteHelper.COLUMN_ARTICLE_NAME, articleName);
values.put(BashgidSqliteHelper.COLUMN_JOURNAL_NAME, journalName);
if (!innerArticleJournalRelationAlreadyExist(articleName, journalName, database))
if (!InnerArticleJournalRelationAlreadyExist(articleName, journalName, database))
{
//Log.e("a", "aaa1");
database.insert(BashgidSqliteHelper.TABLE_ARTICLE_JOURNAL_RELATION, null, values);
@ -346,7 +346,7 @@ public class JournalDataSource
}
private boolean innerArticleJournalRelationAlreadyExist(String articleName, String journalName, SQLiteDatabase database)
public boolean InnerArticleJournalRelationAlreadyExist(String articleName, String journalName, SQLiteDatabase database)
{
boolean result = false;