live filtering of InstalledApps for setting up Local Repo
This implements live filtering in a SearchView so that it is easy to search for the apps you want to include in your Local Repo. This requires some newer stuff, so I switched it to the android-11 Activity until appcompat-v7 is included. All this functionality will work fine with appcompat-v7.
This commit is contained in:
parent
a6de6b2932
commit
914149aad2
@ -1,5 +1,10 @@
|
|||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_search"
|
||||||
|
android:icon="@android:drawable/ic_menu_search"
|
||||||
|
android:showAsAction="ifRoom"
|
||||||
|
android:title="@string/menu_search"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_update_repo"
|
android:id="@+id/action_update_repo"
|
||||||
android:icon="@android:drawable/ic_input_add"
|
android:icon="@android:drawable/ic_input_add"
|
||||||
|
@ -1,10 +1,15 @@
|
|||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_search"
|
||||||
|
android:actionViewClass="android.widget.SearchView"
|
||||||
|
android:icon="@android:drawable/ic_menu_search"
|
||||||
|
android:showAsAction="collapseActionView|ifRoom"
|
||||||
|
android:title="@string/menu_search"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_settings"
|
android:id="@+id/action_settings"
|
||||||
android:orderInCategory="100"
|
|
||||||
android:showAsAction="never"
|
|
||||||
android:icon="@android:drawable/ic_menu_preferences"
|
android:icon="@android:drawable/ic_menu_preferences"
|
||||||
|
android:showAsAction="never"
|
||||||
android:title="@string/menu_preferences"/>
|
android:title="@string/menu_preferences"/>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
@ -2,13 +2,11 @@
|
|||||||
package org.fdroid.fdroid.views;
|
package org.fdroid.fdroid.views;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.FragmentActivity;
|
import android.view.*;
|
||||||
import android.view.ActionMode;
|
import android.widget.SearchView;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
|
|
||||||
import org.fdroid.fdroid.PreferencesActivity;
|
import org.fdroid.fdroid.PreferencesActivity;
|
||||||
import org.fdroid.fdroid.R;
|
import org.fdroid.fdroid.R;
|
||||||
@ -16,9 +14,10 @@ import org.fdroid.fdroid.views.fragments.SelectLocalAppsFragment;
|
|||||||
|
|
||||||
@TargetApi(11)
|
@TargetApi(11)
|
||||||
// TODO replace with appcompat-v7
|
// TODO replace with appcompat-v7
|
||||||
public class SelectLocalAppsActivity extends FragmentActivity {
|
public class SelectLocalAppsActivity extends Activity {
|
||||||
private static final String TAG = "SelectLocalAppsActivity";
|
private static final String TAG = "SelectLocalAppsActivity";
|
||||||
private SelectLocalAppsFragment selectLocalAppsFragment = null;
|
private SelectLocalAppsFragment selectLocalAppsFragment = null;
|
||||||
|
private SearchView searchView;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@ -30,13 +29,15 @@ public class SelectLocalAppsActivity extends FragmentActivity {
|
|||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
if (selectLocalAppsFragment == null)
|
if (selectLocalAppsFragment == null)
|
||||||
selectLocalAppsFragment = (SelectLocalAppsFragment) getSupportFragmentManager().findFragmentById(
|
selectLocalAppsFragment = (SelectLocalAppsFragment) getFragmentManager()
|
||||||
R.id.fragment_app_list);
|
.findFragmentById(R.id.fragment_app_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
getMenuInflater().inflate(R.menu.select_local_apps_activity, menu);
|
getMenuInflater().inflate(R.menu.select_local_apps_activity, menu);
|
||||||
|
searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
|
||||||
|
searchView.setOnQueryTextListener(selectLocalAppsFragment);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,6 +48,10 @@ public class SelectLocalAppsActivity extends FragmentActivity {
|
|||||||
setResult(RESULT_CANCELED);
|
setResult(RESULT_CANCELED);
|
||||||
finish();
|
finish();
|
||||||
return true;
|
return true;
|
||||||
|
case R.id.action_search:
|
||||||
|
SearchView searchView = (SearchView) item.getActionView();
|
||||||
|
searchView.setIconified(false);
|
||||||
|
return true;
|
||||||
case R.id.action_settings:
|
case R.id.action_settings:
|
||||||
startActivity(new Intent(this, PreferencesActivity.class));
|
startActivity(new Intent(this, PreferencesActivity.class));
|
||||||
return true;
|
return true;
|
||||||
@ -60,6 +65,7 @@ public class SelectLocalAppsActivity extends FragmentActivity {
|
|||||||
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
||||||
MenuInflater inflater = mode.getMenuInflater();
|
MenuInflater inflater = mode.getMenuInflater();
|
||||||
inflater.inflate(R.menu.select_local_apps_action_mode, menu);
|
inflater.inflate(R.menu.select_local_apps_action_mode, menu);
|
||||||
|
menu.findItem(R.id.action_search).setActionView(searchView);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,17 +15,19 @@ limitations under the License.
|
|||||||
package org.fdroid.fdroid.views.fragments;
|
package org.fdroid.fdroid.views.fragments;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
|
import android.app.ListFragment;
|
||||||
|
import android.app.LoaderManager.LoaderCallbacks;
|
||||||
|
import android.content.CursorLoader;
|
||||||
|
import android.content.Loader;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.ListFragment;
|
|
||||||
import android.support.v4.app.LoaderManager.LoaderCallbacks;
|
|
||||||
import android.support.v4.content.CursorLoader;
|
|
||||||
import android.support.v4.content.Loader;
|
|
||||||
import android.support.v4.widget.SimpleCursorAdapter;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.ActionMode;
|
import android.view.ActionMode;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
|
import android.widget.SearchView.OnQueryTextListener;
|
||||||
|
import android.widget.SimpleCursorAdapter;
|
||||||
|
|
||||||
import org.fdroid.fdroid.FDroidApp;
|
import org.fdroid.fdroid.FDroidApp;
|
||||||
import org.fdroid.fdroid.R;
|
import org.fdroid.fdroid.R;
|
||||||
@ -35,18 +37,20 @@ import org.fdroid.fdroid.views.SelectLocalAppsActivity;
|
|||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
public class SelectLocalAppsFragment extends ListFragment implements LoaderCallbacks<Cursor> {
|
//TODO replace with appcompat-v7
|
||||||
|
@TargetApi(11)
|
||||||
|
public class SelectLocalAppsFragment extends ListFragment
|
||||||
|
implements LoaderCallbacks<Cursor>, OnQueryTextListener {
|
||||||
|
|
||||||
private SelectLocalAppsActivity selectLocalAppsActivity;
|
private SelectLocalAppsActivity selectLocalAppsActivity;
|
||||||
private ActionMode mActionMode = null;
|
private ActionMode mActionMode = null;
|
||||||
|
private String mCurrentFilterString;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(11)
|
|
||||||
// TODO replace with appcompat-v7
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
@ -69,7 +73,7 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
|
|||||||
},
|
},
|
||||||
0);
|
0);
|
||||||
setListAdapter(adapter);
|
setListAdapter(adapter);
|
||||||
setListShown(false);
|
setListShown(false); // start out with a progress indicator
|
||||||
|
|
||||||
// either reconnect with an existing loader or start a new one
|
// either reconnect with an existing loader or start a new one
|
||||||
getLoaderManager().initLoader(0, null, this);
|
getLoaderManager().initLoader(0, null, this);
|
||||||
@ -86,8 +90,6 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(11)
|
|
||||||
// TODO replace with appcompat-v7
|
|
||||||
@Override
|
@Override
|
||||||
public void onListItemClick(ListView l, View v, int position, long id) {
|
public void onListItemClick(ListView l, View v, int position, long id) {
|
||||||
if (mActionMode == null)
|
if (mActionMode == null)
|
||||||
@ -104,9 +106,15 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CursorLoader onCreateLoader(int id, Bundle args) {
|
public CursorLoader onCreateLoader(int id, Bundle args) {
|
||||||
|
Uri baseUri;
|
||||||
|
if (TextUtils.isEmpty(mCurrentFilterString)) {
|
||||||
|
baseUri = InstalledAppProvider.getContentUri();
|
||||||
|
} else {
|
||||||
|
baseUri = InstalledAppProvider.getSearchUri(mCurrentFilterString);
|
||||||
|
}
|
||||||
CursorLoader loader = new CursorLoader(
|
CursorLoader loader = new CursorLoader(
|
||||||
this.getActivity(),
|
this.getActivity(),
|
||||||
InstalledAppProvider.getContentUri(),
|
baseUri,
|
||||||
InstalledAppProvider.DataColumns.ALL,
|
InstalledAppProvider.DataColumns.ALL,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
@ -146,4 +154,28 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
|
|||||||
public void onLoaderReset(Loader<Cursor> loader) {
|
public void onLoaderReset(Loader<Cursor> loader) {
|
||||||
((SimpleCursorAdapter) this.getListAdapter()).swapCursor(null);
|
((SimpleCursorAdapter) this.getListAdapter()).swapCursor(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
|
||||||
|
if (mCurrentFilterString == null && newFilter == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (mCurrentFilterString != null && mCurrentFilterString.equals(newFilter)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
mCurrentFilterString = newFilter;
|
||||||
|
getLoaderManager().restartLoader(0, null, this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
// this is not needed since we respond to every change in text
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCurrentFilterString() {
|
||||||
|
return mCurrentFilterString;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user