diff --git a/MyTracks/res/menu/track_detail.xml b/MyTracks/res/menu/track_detail.xml
index 17f2003dd..5daf92fbd 100644
--- a/MyTracks/res/menu/track_detail.xml
+++ b/MyTracks/res/menu/track_detail.xml
@@ -103,9 +103,14 @@ limitations under the License.
android:id="@+id/track_detail_settings"
android:orderInCategory="14"
android:title="@string/menu_settings"/>
+
\ No newline at end of file
diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java
index c66403ce4..be9536eee 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java
@@ -38,6 +38,7 @@ import com.google.android.apps.mytracks.io.sendtogoogle.SendRequest;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
import com.google.android.apps.mytracks.settings.SettingsActivity;
import com.google.android.apps.mytracks.util.AnalyticsUtils;
+import com.google.android.apps.mytracks.util.GoogleFeedbackUtils;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.StringUtils;
@@ -104,6 +105,7 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity
private MenuItem saveMenuItem;
private MenuItem voiceFrequencyMenuItem;
private MenuItem splitFrequencyMenuItem;
+ private MenuItem feedbackMenuItem;
private final Runnable bindChangedCallback = new Runnable() {
@Override
@@ -309,7 +311,9 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity
saveMenuItem = menu.findItem(R.id.track_detail_save);
voiceFrequencyMenuItem = menu.findItem(R.id.track_detail_voice_frequency);
splitFrequencyMenuItem = menu.findItem(R.id.track_detail_split_frequency);
-
+ feedbackMenuItem = menu.findItem(R.id.track_detail_split_frequency);
+ feedbackMenuItem.setVisible(GoogleFeedbackUtils.isAvailable(this));
+
updateMenuItems(trackId == recordingTrackId, recordingTrackPaused);
return true;
}
@@ -407,6 +411,9 @@ public class TrackDetailActivity extends AbstractSendToGoogleActivity
intent = IntentUtils.newIntent(this, SettingsActivity.class);
startActivity(intent);
return true;
+ case R.id.track_detail_feedback:
+ GoogleFeedbackUtils.bindFeedback(this);
+ return true;
case R.id.track_detail_help:
intent = IntentUtils.newIntent(this, HelpActivity.class);
startActivity(intent);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
index 733c6a201..174928878 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
@@ -45,6 +45,7 @@ import com.google.android.apps.mytracks.settings.SettingsActivity;
import com.google.android.apps.mytracks.util.AnalyticsUtils;
import com.google.android.apps.mytracks.util.ApiAdapterFactory;
import com.google.android.apps.mytracks.util.EulaUtils;
+import com.google.android.apps.mytracks.util.GoogleFeedbackUtils;
import com.google.android.apps.mytracks.util.GoogleLocationUtils;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.ListItemUtils;
@@ -55,27 +56,17 @@ import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtil
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.maps.mytracks.R;
-import com.google.userfeedback.android.api.UserFeedback;
-import com.google.userfeedback.android.api.UserFeedbackSpec;
import android.app.Dialog;
-import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.location.Location;
-import android.os.Binder;
import android.os.Bundle;
-import android.os.IBinder;
-import android.os.Parcel;
import android.os.Parcelable;
-import android.os.RemoteException;
import android.provider.Settings;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
@@ -97,7 +88,6 @@ import android.widget.ListView;
import android.widget.Toast;
import java.util.EnumSet;
-import java.util.List;
import java.util.Locale;
/**
@@ -362,6 +352,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
private MenuItem saveAllMenuItem;
private MenuItem deleteAllMenuItem;
private MenuItem syncNowMenuItem;
+ private MenuItem feedbackMenuItem;
private boolean startNewRecording = false; // true to start a new recording
private boolean startGps = false;
@@ -556,6 +547,8 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
saveAllMenuItem = menu.findItem(R.id.track_list_save_all);
deleteAllMenuItem = menu.findItem(R.id.track_list_delete_all);
syncNowMenuItem = menu.findItem(R.id.track_list_sync_now);
+ feedbackMenuItem = menu.findItem(R.id.track_list_feedback);
+ feedbackMenuItem.setVisible(GoogleFeedbackUtils.isAvailable(this));
ApiAdapterFactory.getApiAdapter().configureSearchWidget(this, searchMenuItem);
updateMenuItems(recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT);
@@ -619,30 +612,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
startActivity(intent);
return true;
case R.id.track_list_feedback:
- if (isFeedbackAvailable()) {
- intent = new Intent(Intent.ACTION_BUG_REPORT);
- ServiceConnection conn = new ServiceConnection() {
-
- public void onServiceDisconnected(ComponentName name) {}
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- try {
- service.transact(Binder.FIRST_CALL_TRANSACTION, Parcel.obtain(), null, 0);
- } catch (RemoteException e) {
- // TODO(jshih): Auto-generated catch block
- e.printStackTrace();
- }
- }
- };
- // Bind to the service after creating it if necessary
- bindService(intent, conn, BIND_AUTO_CREATE);
- } else {
- UserFeedbackSpec spec = new UserFeedbackSpec(this, "com.google.android.maps.mytracks:V *:S",
- "com.google.android.maps.mytracks.USER_INITIATED_FEEDBACK_REPORT");
- UserFeedback userFeedback = new UserFeedback();
- userFeedback.startFeedback(spec);
- }
+ GoogleFeedbackUtils.bindFeedback(this);
return true;
case R.id.track_list_help:
intent = IntentUtils.newIntent(this, HelpActivity.class);
@@ -652,18 +622,6 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
return super.onOptionsItemSelected(item);
}
}
-
- private boolean isFeedbackAvailable() {
- List infos = getPackageManager().queryIntentServices(
- new Intent(Intent.ACTION_BUG_REPORT), PackageManager.MATCH_DEFAULT_ONLY);
- for (ResolveInfo info : infos) {
- if (info.serviceInfo != null && info.serviceInfo.packageName != null
- && info.serviceInfo.packageName.equals("com.google.android.feedback")) {
- return true;
- }
- }
- return false;
- }
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/GoogleFeedbackUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/GoogleFeedbackUtils.java
new file mode 100644
index 000000000..71f2b50b2
--- /dev/null
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/GoogleFeedbackUtils.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2013 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.
+ */
+
+package com.google.android.apps.mytracks.util;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Utilities for Google Feedback.
+ *
+ * @author Jimmy Shih
+ */
+public class GoogleFeedbackUtils {
+
+ private static final String GOOGLE_FEEDBACK_PACKAGE_NAME = "com.google.android.feedback";
+ private static final String TAG = GoogleFeedbackUtils.class.getSimpleName();
+
+ private static Boolean available = null;
+
+ /**
+ * Returns true if the Google Feedback is available.
+ *
+ * @param context the context
+ */
+ public static boolean isAvailable(Context context) {
+ if (available == null) {
+ List infos = context.getPackageManager().queryIntentServices(
+ new Intent(Intent.ACTION_BUG_REPORT), PackageManager.MATCH_DEFAULT_ONLY);
+ for (ResolveInfo info : infos) {
+ if (info.serviceInfo != null && info.serviceInfo.packageName != null
+ && info.serviceInfo.packageName.equals(GOOGLE_FEEDBACK_PACKAGE_NAME)) {
+ available = true;
+ break;
+ }
+ }
+ if (available == null) {
+ available = false;
+ }
+ }
+ return available;
+ }
+
+ /**
+ * Binds the Google Feedback service.
+ *
+ * @param context the context
+ */
+ public static void bindFeedback(Context context) {
+ Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
+ ServiceConnection serviceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ try {
+ service.transact(Binder.FIRST_CALL_TRANSACTION, Parcel.obtain(), null, 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException", e);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {}
+ };
+ // Bind to the service after creating it if necessary
+ context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
+ }
+}