forked from upstream-mirrors/OpenTracks
Add contextual menu.
API < 11, use floating context menu. API >=11, use contextual action mode.
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2012 Google Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
<item
|
||||
android:icon="@drawable/menu_edit"
|
||||
android:id="@+id/track_list_context_menu_edit"
|
||||
android:showAsAction="always"
|
||||
android:title="@string/menu_edit"/>
|
||||
<item
|
||||
android:icon="@drawable/menu_delete"
|
||||
android:id="@+id/track_list_context_menu_delete"
|
||||
android:showAsAction="always"
|
||||
android:title="@string/menu_delete"/>
|
||||
</menu>
|
||||
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks;
|
||||
|
||||
import com.google.android.apps.mytracks.content.TracksColumns;
|
||||
import com.google.android.apps.mytracks.fragments.DeleteAllTrackDialogFragment;
|
||||
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment;
|
||||
import com.google.android.apps.mytracks.fragments.EulaDialogFragment;
|
||||
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
|
||||
import com.google.android.apps.mytracks.services.ITrackRecordingService;
|
||||
@@ -43,11 +44,14 @@ import android.support.v4.content.CursorLoader;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v4.widget.ResourceCursorAdapter;
|
||||
import android.util.Log;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.ContextMenu.ContextMenuInfo;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AdapterView.AdapterContextMenuInfo;
|
||||
import android.widget.AdapterView.OnItemClickListener;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
@@ -121,7 +125,16 @@ public class TrackListActivity extends FragmentActivity {
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Callback when an item is selected in the contextual action mode
|
||||
private ContextualActionModeCallback contextualActionModeCallback =
|
||||
new ContextualActionModeCallback() {
|
||||
@Override
|
||||
public boolean onClick(int itemId, long id) {
|
||||
return handleContextItem(itemId, id);
|
||||
}
|
||||
};
|
||||
|
||||
private TrackRecordingServiceConnection trackRecordingServiceConnection;
|
||||
private SharedPreferences sharedPreferences;
|
||||
private boolean metricUnits;
|
||||
@@ -202,7 +215,9 @@ public class TrackListActivity extends FragmentActivity {
|
||||
}
|
||||
};
|
||||
listView.setAdapter(adapter);
|
||||
|
||||
ApiAdapterFactory.getApiAdapter().configureContextualMenu(
|
||||
this, listView, R.menu.track_list_context_menu, contextualActionModeCallback);
|
||||
|
||||
getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() {
|
||||
@Override
|
||||
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
|
||||
@@ -354,6 +369,42 @@ public class TrackListActivity extends FragmentActivity {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
|
||||
super.onCreateContextMenu(menu, v, menuInfo);
|
||||
getMenuInflater().inflate(R.menu.track_list_context_menu, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onContextItemSelected(MenuItem item) {
|
||||
if (handleContextItem(item.getItemId(), ((AdapterContextMenuInfo) item.getMenuInfo()).id)) {
|
||||
return true;
|
||||
}
|
||||
return super.onContextItemSelected(item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a context item selection.
|
||||
*
|
||||
* @param itemId the menu item id
|
||||
* @param trackId the track id
|
||||
* @return true if handled.
|
||||
*/
|
||||
private boolean handleContextItem(int itemId, long trackId) {
|
||||
switch (itemId) {
|
||||
case R.id.track_list_context_menu_edit:
|
||||
startActivity(new Intent(this, TrackEditActivity.class).putExtra(
|
||||
TrackEditActivity.EXTRA_TRACK_ID, trackId));
|
||||
return true;
|
||||
case R.id.track_list_context_menu_delete:
|
||||
DeleteOneTrackDialogFragment.newInstance(trackId).show(
|
||||
getSupportFragmentManager(), DeleteOneTrackDialogFragment.DELETE_ONE_TRACK_DIALOG_TAG);
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts {@link TrackDetailActivity}.
|
||||
*
|
||||
|
||||
@@ -16,12 +16,19 @@
|
||||
|
||||
package com.google.android.apps.mytracks.util;
|
||||
|
||||
import com.google.android.apps.mytracks.ContextualActionModeCallback;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.app.SearchManager;
|
||||
import android.content.Context;
|
||||
import android.view.ActionMode;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.AdapterView.OnItemLongClickListener;
|
||||
import android.widget.ListView;
|
||||
import android.widget.SearchView;
|
||||
|
||||
/**
|
||||
@@ -42,6 +49,45 @@ public class Api11Adapter extends Api10Adapter {
|
||||
activity.getActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureContextualMenu(final Activity activity, ListView listView, final int menuId,
|
||||
final ContextualActionModeCallback contextualActionModeCallback) {
|
||||
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
|
||||
ActionMode actionMode;
|
||||
|
||||
@Override
|
||||
public boolean onItemLongClick(
|
||||
AdapterView<?> parent, View view, int position, final long id) {
|
||||
if (actionMode != null) { return false; }
|
||||
actionMode = activity.startActionMode(new ActionMode.Callback() {
|
||||
@Override
|
||||
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
||||
mode.getMenuInflater().inflate(menuId, menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
||||
// Return false to indicate no change.
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyActionMode(ActionMode mode) {
|
||||
actionMode = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
||||
return contextualActionModeCallback.onClick(item.getItemId(), id);
|
||||
}
|
||||
});
|
||||
view.setSelected(true);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@Override
|
||||
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
|
||||
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.google.android.apps.mytracks.util;
|
||||
|
||||
import com.google.android.apps.mytracks.Constants;
|
||||
import com.google.android.apps.mytracks.ContextualActionModeCallback;
|
||||
import com.google.android.apps.mytracks.io.backup.BackupPreferencesListener;
|
||||
import com.google.android.apps.mytracks.services.sensors.BluetoothConnectionManager;
|
||||
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
|
||||
@@ -32,6 +33,7 @@ import android.content.SharedPreferences.Editor;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.Window;
|
||||
import android.widget.ListView;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
@@ -113,6 +115,12 @@ public class Api7Adapter implements ApiAdapter {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureContextualMenu(Activity activity, ListView listView, int menuId,
|
||||
ContextualActionModeCallback contextualActionModeCallback) {
|
||||
activity.registerForContextMenu(listView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
|
||||
// Do nothing
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.google.android.apps.mytracks.util;
|
||||
|
||||
import com.google.android.apps.mytracks.ContextualActionModeCallback;
|
||||
import com.google.android.apps.mytracks.io.backup.BackupPreferencesListener;
|
||||
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
|
||||
import com.google.api.client.http.HttpTransport;
|
||||
@@ -25,6 +26,7 @@ import android.bluetooth.BluetoothSocket;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.ListView;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -123,6 +125,20 @@ public interface ApiAdapter {
|
||||
*/
|
||||
public void configureActionBarHomeAsUp(Activity activity);
|
||||
|
||||
/**
|
||||
* Configures the context menu.
|
||||
* <p>
|
||||
* Due to changes in API level 11.
|
||||
*
|
||||
* @param activity the activity
|
||||
* @param listView the list view
|
||||
* @param menuId the menu resource id
|
||||
* @param contextualActionModeCallback the callback when an item is selected
|
||||
* in the contextual action mode
|
||||
*/
|
||||
public void configureContextualMenu(Activity activity, ListView listView, int menuId,
|
||||
ContextualActionModeCallback contextualActionModeCallback);
|
||||
|
||||
/**
|
||||
* Configures the search widget.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user