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.content.TracksColumns;
|
||||||
import com.google.android.apps.mytracks.fragments.DeleteAllTrackDialogFragment;
|
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.fragments.EulaDialogFragment;
|
||||||
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
|
import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
|
||||||
import com.google.android.apps.mytracks.services.ITrackRecordingService;
|
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.content.Loader;
|
||||||
import android.support.v4.widget.ResourceCursorAdapter;
|
import android.support.v4.widget.ResourceCursorAdapter;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.view.ContextMenu;
|
||||||
|
import android.view.ContextMenu.ContextMenuInfo;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.AdapterView.AdapterContextMenuInfo;
|
||||||
import android.widget.AdapterView.OnItemClickListener;
|
import android.widget.AdapterView.OnItemClickListener;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
@@ -122,6 +126,15 @@ public class TrackListActivity extends FragmentActivity {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 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 TrackRecordingServiceConnection trackRecordingServiceConnection;
|
||||||
private SharedPreferences sharedPreferences;
|
private SharedPreferences sharedPreferences;
|
||||||
private boolean metricUnits;
|
private boolean metricUnits;
|
||||||
@@ -202,6 +215,8 @@ public class TrackListActivity extends FragmentActivity {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
listView.setAdapter(adapter);
|
listView.setAdapter(adapter);
|
||||||
|
ApiAdapterFactory.getApiAdapter().configureContextualMenu(
|
||||||
|
this, listView, R.menu.track_list_context_menu, contextualActionModeCallback);
|
||||||
|
|
||||||
getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() {
|
getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() {
|
||||||
@Override
|
@Override
|
||||||
@@ -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}.
|
* Starts {@link TrackDetailActivity}.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -16,12 +16,19 @@
|
|||||||
|
|
||||||
package com.google.android.apps.mytracks.util;
|
package com.google.android.apps.mytracks.util;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.ContextualActionModeCallback;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.app.ActionBar;
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.SearchManager;
|
import android.app.SearchManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.view.ActionMode;
|
||||||
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
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;
|
import android.widget.SearchView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,6 +49,45 @@ public class Api11Adapter extends Api10Adapter {
|
|||||||
activity.getActionBar().setDisplayHomeAsUpEnabled(true);
|
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
|
@Override
|
||||||
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
|
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
|
||||||
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
|
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
package com.google.android.apps.mytracks.util;
|
package com.google.android.apps.mytracks.util;
|
||||||
|
|
||||||
import com.google.android.apps.mytracks.Constants;
|
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.io.backup.BackupPreferencesListener;
|
||||||
import com.google.android.apps.mytracks.services.sensors.BluetoothConnectionManager;
|
import com.google.android.apps.mytracks.services.sensors.BluetoothConnectionManager;
|
||||||
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
|
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
|
||||||
@@ -32,6 +33,7 @@ import android.content.SharedPreferences.Editor;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
|
import android.widget.ListView;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
@@ -113,6 +115,12 @@ public class Api7Adapter implements ApiAdapter {
|
|||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configureContextualMenu(Activity activity, ListView listView, int menuId,
|
||||||
|
ContextualActionModeCallback contextualActionModeCallback) {
|
||||||
|
activity.registerForContextMenu(listView);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
|
public void configureSearchWidget(Activity activity, MenuItem menuItem) {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.google.android.apps.mytracks.util;
|
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.io.backup.BackupPreferencesListener;
|
||||||
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
|
import com.google.android.apps.mytracks.services.tasks.PeriodicTask;
|
||||||
import com.google.api.client.http.HttpTransport;
|
import com.google.api.client.http.HttpTransport;
|
||||||
@@ -25,6 +26,7 @@ import android.bluetooth.BluetoothSocket;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.widget.ListView;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -123,6 +125,20 @@ public interface ApiAdapter {
|
|||||||
*/
|
*/
|
||||||
public void configureActionBarHomeAsUp(Activity activity);
|
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.
|
* Configures the search widget.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user