diff --git a/app/src/full/java/org/fdroid/fdroid/localrepo/SwapView.java b/app/src/full/java/org/fdroid/fdroid/localrepo/SwapView.java index 9e204ba9e..9404ad14f 100644 --- a/app/src/full/java/org/fdroid/fdroid/localrepo/SwapView.java +++ b/app/src/full/java/org/fdroid/fdroid/localrepo/SwapView.java @@ -6,8 +6,6 @@ import android.content.res.TypedArray; import android.support.annotation.ColorInt; import android.support.annotation.LayoutRes; import android.util.AttributeSet; -import android.view.Menu; -import android.view.MenuInflater; import android.widget.RelativeLayout; import org.fdroid.fdroid.R; import org.fdroid.fdroid.views.swap.SwapWorkflowActivity; @@ -25,6 +23,8 @@ public class SwapView extends RelativeLayout { private int layoutResId; + protected String currentFilterString; + public SwapView(Context context) { this(context, null); } @@ -48,10 +48,6 @@ public class SwapView extends RelativeLayout { a.recycle(); } - @Override - public boolean buildMenu(Menu menu, @NonNull MenuInflater inflater) { - return false; - } @LayoutRes public int getLayoutResId() { return layoutResId; @@ -61,6 +57,14 @@ public class SwapView extends RelativeLayout { this.layoutResId = layoutResId; } + public String getCurrentFilterString() { + return this.currentFilterString; + } + + public void setCurrentFilterString(String currentFilterString) { + this.currentFilterString = currentFilterString; + } + public SwapWorkflowActivity getActivity() { return (SwapWorkflowActivity) getContext(); } diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/JoinWifiView.java b/app/src/full/java/org/fdroid/fdroid/views/swap/JoinWifiView.java index f9e97b74c..ac8454e47 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/JoinWifiView.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/JoinWifiView.java @@ -6,14 +6,9 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.wifi.WifiManager; -import android.support.annotation.NonNull; import android.support.v4.content.LocalBroadcastManager; -import android.support.v4.view.MenuItemCompat; import android.text.TextUtils; import android.util.AttributeSet; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -100,22 +95,6 @@ public class JoinWifiView extends SwapView { getActivity().startActivity(new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK)); } - @Override - public boolean buildMenu(Menu menu, @NonNull MenuInflater inflater) { - inflater.inflate(R.menu.swap_next, menu); - MenuItem next = menu.findItem(R.id.action_next); - MenuItemCompat.setShowAsAction(next, - MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT); - next.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - getActivity().inflateInnerView(R.layout.swap_select_apps); - return true; - } - }); - return true; - } - private final BroadcastReceiver onWifiStateChange = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/NfcView.java b/app/src/full/java/org/fdroid/fdroid/views/swap/NfcView.java index af69cde14..43c8989a0 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/NfcView.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/NfcView.java @@ -2,12 +2,7 @@ package org.fdroid.fdroid.views.swap; import android.annotation.TargetApi; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v4.view.MenuItemCompat; import android.util.AttributeSet; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.widget.CheckBox; import android.widget.CompoundButton; import org.fdroid.fdroid.Preferences; @@ -44,20 +39,4 @@ public class NfcView extends SwapView { } }); } - - @Override - public boolean buildMenu(Menu menu, @NonNull MenuInflater inflater) { - inflater.inflate(R.menu.swap_skip, menu); - MenuItem next = menu.findItem(R.id.action_next); - MenuItemCompat.setShowAsAction(next, - MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT); - next.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - getActivity().inflateInnerView(R.layout.swap_wifi_qr); - return true; - } - }); - return true; - } } diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/SelectAppsView.java b/app/src/full/java/org/fdroid/fdroid/views/swap/SelectAppsView.java index 3e10f4218..9068be658 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/SelectAppsView.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/SelectAppsView.java @@ -13,16 +13,11 @@ import android.support.annotation.Nullable; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; -import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.CursorAdapter; -import android.support.v7.widget.SearchView; import android.text.TextUtils; import android.util.AttributeSet; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -37,9 +32,7 @@ import org.fdroid.fdroid.data.Schema.InstalledAppTable; import org.fdroid.fdroid.localrepo.SwapService; import org.fdroid.fdroid.localrepo.SwapView; -public class SelectAppsView extends SwapView implements - LoaderManager.LoaderCallbacks, - SearchView.OnQueryTextListener { +public class SelectAppsView extends SwapView implements LoaderManager.LoaderCallbacks { public SelectAppsView(Context context) { super(context); @@ -62,11 +55,8 @@ public class SelectAppsView extends SwapView implements return getActivity().getState(); } - private static final int LOADER_INSTALLED_APPS = 253341534; - private ListView listView; private AppListAdapter adapter; - private String currentFilterString; @Override protected void onFinishInflate() { @@ -80,7 +70,7 @@ public class SelectAppsView extends SwapView implements listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // either reconnect with an existing loader or start a new one - getActivity().getSupportLoaderManager().initLoader(LOADER_INSTALLED_APPS, null, this); + getActivity().getSupportLoaderManager().initLoader(R.layout.swap_select_apps, null, this); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { @@ -89,31 +79,6 @@ public class SelectAppsView extends SwapView implements }); } - @Override - public boolean buildMenu(Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.swap_next_search, menu); - MenuItem nextMenuItem = menu.findItem(R.id.action_next); - int flags = MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT; - MenuItemCompat.setShowAsAction(nextMenuItem, flags); - nextMenuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - getActivity().onAppsSelected(); - return true; - } - }); - - SearchView searchView = new SearchView(getActivity()); - - MenuItem searchMenuItem = menu.findItem(R.id.action_search); - MenuItemCompat.setActionView(searchMenuItem, searchView); - MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); - - searchView.setOnQueryTextListener(this); - return true; - } - private void toggleAppSelected(int position) { Cursor c = (Cursor) adapter.getItem(position); String packageName = c.getString(c.getColumnIndex(InstalledAppTable.Cols.Package.NAME)); @@ -165,26 +130,6 @@ public class SelectAppsView extends SwapView implements adapter.swapCursor(null); } - @Override - public boolean onQueryTextChange(String newText) { - String newFilter = !TextUtils.isEmpty(newText) ? newText : null; - if (currentFilterString == null && newFilter == null) { - return true; - } - if (currentFilterString != null && currentFilterString.equals(newFilter)) { - return true; - } - currentFilterString = newFilter; - getActivity().getSupportLoaderManager().restartLoader(LOADER_INSTALLED_APPS, null, this); - return true; - } - - @Override - public boolean onQueryTextSubmit(String query) { - // this is not needed since we respond to every change in text - return true; - } - private class AppListAdapter extends CursorAdapter { @Nullable diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java index e3197dfbb..5fd5ac97d 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapSuccessView.java @@ -18,15 +18,10 @@ import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.content.LocalBroadcastManager; -import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.CursorAdapter; -import android.support.v7.widget.SearchView; import android.text.TextUtils; import android.util.AttributeSet; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; @@ -54,9 +49,8 @@ import java.util.List; import java.util.Timer; import java.util.TimerTask; -public class SwapSuccessView extends SwapView implements - LoaderManager.LoaderCallbacks, - SearchView.OnQueryTextListener { +public class SwapSuccessView extends SwapView implements LoaderManager.LoaderCallbacks { + private static final String TAG = "SwapAppsView"; public SwapSuccessView(Context context) { super(context); @@ -75,9 +69,6 @@ public class SwapSuccessView extends SwapView implements super(context, attrs, defStyleAttr, defStyleRes); } - private static final int LOADER_SWAPABLE_APPS = 759283741; - private static final String TAG = "SwapAppsView"; - private Repo repo; private AppListAdapter adapter; private String currentFilterString; @@ -100,7 +91,7 @@ public class SwapSuccessView extends SwapView implements listView.setAdapter(adapter); // either reconnect with an existing loader or start a new one - getActivity().getSupportLoaderManager().initLoader(LOADER_SWAPABLE_APPS, null, this); + getActivity().getSupportLoaderManager().initLoader(R.layout.swap_success, null, this); LocalBroadcastManager.getInstance(getActivity()).registerReceiver( pollForUpdatesReceiver, new IntentFilter(UpdateService.LOCAL_ACTION_STATUS)); @@ -142,21 +133,6 @@ public class SwapSuccessView extends SwapView implements }, 5000); } - @Override - public boolean buildMenu(Menu menu, @NonNull MenuInflater inflater) { - - inflater.inflate(R.menu.swap_search, menu); - - SearchView searchView = new SearchView(getActivity()); - - MenuItem searchMenuItem = menu.findItem(R.id.action_search); - MenuItemCompat.setActionView(searchMenuItem, searchView); - MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_ALWAYS); - - searchView.setOnQueryTextListener(this); - return true; - } - @Override public CursorLoader onCreateLoader(int id, Bundle args) { Uri uri = TextUtils.isEmpty(currentFilterString) @@ -177,26 +153,6 @@ public class SwapSuccessView extends SwapView implements adapter.swapCursor(null); } - @Override - public boolean onQueryTextChange(String newText) { - String newFilter = !TextUtils.isEmpty(newText) ? newText : null; - if (currentFilterString == null && newFilter == null) { - return true; - } - if (currentFilterString != null && currentFilterString.equals(newFilter)) { - return true; - } - currentFilterString = newFilter; - getActivity().getSupportLoaderManager().restartLoader(LOADER_SWAPABLE_APPS, null, this); - return true; - } - - @Override - public boolean onQueryTextSubmit(String query) { - // this is not needed since we respond to every change in text - return true; - } - private class AppListAdapter extends CursorAdapter { private class ViewHolder { diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java index 870ff9703..3410b5356 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java @@ -20,13 +20,19 @@ import android.provider.Settings; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.StringRes; import android.support.v4.content.LocalBroadcastManager; +import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; +import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -228,9 +234,99 @@ public class SwapWorkflowActivity extends AppCompatActivity { @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.clear(); - boolean parent = super.onPrepareOptionsMenu(menu); - boolean inner = currentView != null && currentView.buildMenu(menu, getMenuInflater()); - return parent || inner; + + MenuInflater menuInflater = getMenuInflater(); + switch (currentView.getLayoutResId()) { + case R.layout.swap_select_apps: + menuInflater.inflate(R.menu.swap_next_search, menu); + setUpNextButton(menu, R.string.next); + setUpSearchView(menu); + return true; + case R.layout.swap_success: + menuInflater.inflate(R.menu.swap_search, menu); + setUpSearchView(menu); + return true; + case R.layout.swap_join_wifi: + menuInflater.inflate(R.menu.swap_next, menu); + setUpNextButton(menu, R.string.next); + return true; + case R.layout.swap_nfc: + menuInflater.inflate(R.menu.swap_next, menu); + setUpNextButton(menu, R.string.skip); + return true; + } + + return super.onPrepareOptionsMenu(menu); + } + + private void setUpNextButton(Menu menu, @StringRes int titleResId) { + MenuItem next = menu.findItem(R.id.action_next); + CharSequence title = getString(titleResId); + next.setTitle(title); + next.setTitleCondensed(title); + MenuItemCompat.setShowAsAction(next, + MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT); + next.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + sendNext(); + return true; + } + }); + } + + void sendNext() { + int currentLayoutResId = currentView.getLayoutResId(); + switch (currentLayoutResId) { + case R.layout.swap_select_apps: + onAppsSelected(); + break; + case R.layout.swap_join_wifi: + inflateSwapView(R.layout.swap_select_apps); + break; + case R.layout.swap_nfc: + inflateSwapView(R.layout.swap_wifi_qr); + break; + } + } + + private void setUpSearchView(Menu menu) { + SearchView searchView = new SearchView(this); + + MenuItem searchMenuItem = menu.findItem(R.id.action_search); + MenuItemCompat.setActionView(searchMenuItem, searchView); + MenuItemCompat.setShowAsAction(searchMenuItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); + + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String newText) { + String currentFilterString = currentView.getCurrentFilterString(); + String newFilter = !TextUtils.isEmpty(newText) ? newText : null; + if (currentFilterString == null && newFilter == null) { + return true; + } + if (currentFilterString != null && currentFilterString.equals(newFilter)) { + return true; + } + currentView.setCurrentFilterString(newFilter); + if (currentView instanceof SelectAppsView) { + getSupportLoaderManager().restartLoader(currentView.getLayoutResId(), null, + (SelectAppsView) currentView); + } else if (currentView instanceof SwapSuccessView) { + getSupportLoaderManager().restartLoader(currentView.getLayoutResId(), null, + (SwapSuccessView) currentView); + } else { + throw new IllegalStateException(currentView.getClass() + " does not have Loader!"); + } + return true; + } + + @Override + public boolean onQueryTextChange(String s) { + return true; + } + }); } @Override diff --git a/app/src/full/res/layout/swap_select_apps.xml b/app/src/full/res/layout/swap_select_apps.xml index 1e36310fa..a422e701a 100644 --- a/app/src/full/res/layout/swap_select_apps.xml +++ b/app/src/full/res/layout/swap_select_apps.xml @@ -5,6 +5,7 @@ xmlns:swap="http://schemas.android.com/apk/res-auto" swap:toolbarColor="@color/swap_bright_blue" swap:toolbarTitle="@string/swap_choose_apps" + android:id="@+id/select_apps" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/app/src/full/res/layout/swap_success.xml b/app/src/full/res/layout/swap_success.xml index e36ea2b43..ffcb3c180 100644 --- a/app/src/full/res/layout/swap_success.xml +++ b/app/src/full/res/layout/swap_success.xml @@ -5,6 +5,7 @@ xmlns:swap="http://schemas.android.com/apk/res-auto" swap:toolbarColor="@color/swap_bright_blue" swap:toolbarTitle="@string/swap_success" + android:id="@+id/swap_success" android:layout_width="match_parent" android:layout_height="match_parent"> diff --git a/app/src/full/res/menu/swap_skip.xml b/app/src/full/res/menu/swap_skip.xml deleted file mode 100644 index 4adcb7942..000000000 --- a/app/src/full/res/menu/swap_skip.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - \ No newline at end of file