From ec6402f5f91ffb6a882f7183357cd8c8b0e9576d Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Wed, 31 Jul 2013 19:15:46 +0200 Subject: [PATCH 1/2] merge gmaps and geo intents... map links should work as with gmaps < v7 again --- mobile/AndroidManifest.xml | 4 +- .../iitc_mobile/share/IntentFragment.java | 8 +- .../iitc_mobile/share/IntentListView.java | 90 ++++++++++++------- .../iitc_mobile/share/ShareActivity.java | 24 ++++- 4 files changed, 85 insertions(+), 41 deletions(-) diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 7b00ac51..6b67a11c 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="33" + android:versionName="0.5.2"> mIntents; private IntentListView mListView; private int mScrollIndex, mScrollTop; @@ -28,9 +30,9 @@ public class IntentFragment extends Fragment implements OnScrollListener, OnItem public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle args = getArguments(); - mIntent = args.getParcelable("intent"); + mIntents = args.getParcelableArrayList("intents"); mListView = new IntentListView(getActivity()); - mListView.setIntent(mIntent); + mListView.setIntents(mIntents); if (mScrollIndex != -1 && mScrollTop != -1) mListView.setSelectionFromTop(mScrollIndex, mScrollTop); mListView.setOnScrollListener(this); diff --git a/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java b/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java index dd063e11..920b4123 100644 --- a/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java +++ b/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java @@ -1,5 +1,7 @@ package com.cradle.iitc_mobile.share; +import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -73,8 +75,8 @@ public class IntentListView extends ListView { } private IntentAdapter mAdapter; - private Intent mIntent = null; private PackageManager mPackageManager; + HashMap mActivities = new HashMap(); public IntentListView(Context context) { super(context); @@ -106,60 +108,84 @@ public class IntentListView extends ListView { public Intent getTargetIntent(int position) { ActivityInfo activity = mAdapter.getItem(position).activityInfo; - Intent intent = new Intent(mIntent) - .setComponent(new ComponentName(activity.packageName, activity.name)) + ComponentName activityId = new ComponentName(activity.packageName, activity.name); + + Intent intentType = mActivities.get(activityId); + + Intent intent = new Intent(intentType) + .setComponent(activityId) .setPackage(activity.packageName); return intent; } - public void setIntent(Intent intent) - { - mIntent = intent; + // wrapper method for single intents + public void setIntent(Intent intent) { + ArrayList intentList = new ArrayList(1); + setIntents(intentList); + } + public void setIntents(ArrayList intents) + { mAdapter.setNotifyOnChange(false); mAdapter.clear(); String packageName = getContext().getPackageName(); - List activities = mPackageManager.queryIntentActivities(intent, 0); - ResolveInfo defaultTarget = mPackageManager.resolveActivity(intent, 0); + ArrayList allActivities = new ArrayList(); - boolean hasCopyIntent = false; - for (ResolveInfo resolveInfo : activities) { // search for "Copy to clipboard" handler - CopyHandler handler = new CopyHandler(resolveInfo); + for (Intent intent : intents) { + List activityList = mPackageManager.queryIntentActivities(intent, 0); - if (KNOWN_COPY_HANDLERS.contains(handler)) - hasCopyIntent = true; - } + ResolveInfo defaultTarget = mPackageManager.resolveActivity(intent, 0); - // use traditional loop since list may change during iteration - for (int i = 0; i < activities.size(); i++) { - ResolveInfo info = activities.get(i); - ActivityInfo activity = info.activityInfo; + boolean hasCopyIntent = false; + for (ResolveInfo resolveInfo : activityList) { // search for "Copy to clipboard" handler + CopyHandler handler = new CopyHandler(resolveInfo); - // remove all IITCm intents, except for SendToClipboard in case Drive is not installed - if (activity.packageName.equals(packageName)) - { - if (hasCopyIntent || !activity.name.equals(SendToClipboard.class.getCanonicalName())) + if (KNOWN_COPY_HANDLERS.contains(handler)) + hasCopyIntent = true; + } + + // use traditional loop since list may change during iteration + for (int i = 0; i < activityList.size(); i++) { + ResolveInfo info = activityList.get(i); + ActivityInfo activity = info.activityInfo; + + // remove all IITCm intents, except for SendToClipboard in case Drive is not installed + if (activity.packageName.equals(packageName)) { - activities.remove(i); - i--; - continue; + if (hasCopyIntent || !activity.name.equals(SendToClipboard.class.getCanonicalName())) + { + activityList.remove(i); + i--; + continue; + } + } + + // move default Intent to top + if (info.activityInfo.packageName.equals(defaultTarget.activityInfo.packageName) + && info.activityInfo.name.equals(defaultTarget.activityInfo.name)) + { + activityList.remove(i); + activityList.add(0, info); } } - // move default Intent to top - if (info.activityInfo.packageName.equals(defaultTarget.activityInfo.packageName) - && info.activityInfo.name.equals(defaultTarget.activityInfo.name)) - { - activities.remove(i); - activities.add(0, info); + // add to activity hash map if they doesn't exist + for (ResolveInfo resolveInfo : activityList) { + ActivityInfo activity = resolveInfo.activityInfo; + ComponentName activityId = new ComponentName(activity.packageName, activity.name); + if (!mActivities.containsKey(activityId)) { + mActivities.put(activityId, intent); + allActivities.add(resolveInfo); + } } } - mAdapter.addAll(activities); + mAdapter.addAll(allActivities); mAdapter.setNotifyOnChange(true); mAdapter.notifyDataSetChanged(); } + } diff --git a/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java b/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java index 494e9c82..a30a173f 100644 --- a/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java +++ b/mobile/src/com/cradle/iitc_mobile/share/ShareActivity.java @@ -14,6 +14,8 @@ import android.view.MenuItem; import com.cradle.iitc_mobile.R; +import java.util.ArrayList; + public class ShareActivity extends FragmentActivity implements ActionBar.TabListener { private boolean mIsPortal; private String mLl; @@ -24,10 +26,17 @@ public class ShareActivity extends FragmentActivity implements ActionBar.TabList ViewPager mViewPager; private void addTab(Intent intent, int label, int icon) + { + ArrayList intents = new ArrayList(1); + intents.add(intent); + addTab(intents, label, icon); + } + + private void addTab(ArrayList intents, int label, int icon) { IntentFragment fragment = new IntentFragment(); Bundle args = new Bundle(); - args.putParcelable("intent", intent); + args.putParcelableArrayList("intents", intents); args.putString("title", getString(label)); args.putInt("icon", icon); fragment.setArguments(args); @@ -60,9 +69,16 @@ public class ShareActivity extends FragmentActivity implements ActionBar.TabList intent.putExtra(Intent.EXTRA_SUBJECT, mTitle); addTab(intent, R.string.tab_share, R.drawable.share); - String geoUri = "http://maps.google.com/maps?q=loc:" + mLl + " (" + mTitle + ")"; - intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(geoUri)); - addTab(intent, R.string.tab_map, R.drawable.location_map); + // we merge gmaps intents with geo intents since it is not possible + // anymore to set a labeled marker on geo intents + ArrayList intents = new ArrayList(); + String gMapsUri = "http://maps.google.com/maps?q=loc:" + mLl + " (" + mTitle + ")"; + Intent gMapsIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(gMapsUri)); + String geoUri = "geo:" + mLl; + Intent geoIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(geoUri)); + intents.add(gMapsIntent); + intents.add(geoIntent); + addTab(intents, R.string.tab_map, R.drawable.location_map); intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getUrl())); addTab(intent, R.string.tab_browser, R.drawable.browser); From 00d95b6b3efe7d2045847431399b3967ed4b6be4 Mon Sep 17 00:00:00 2001 From: Philipp Schaefer Date: Wed, 31 Jul 2013 19:55:11 +0200 Subject: [PATCH 2/2] set default intent activity back to top --- .../iitc_mobile/share/IntentListView.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java b/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java index 920b4123..84da68fa 100644 --- a/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java +++ b/mobile/src/com/cradle/iitc_mobile/share/IntentListView.java @@ -162,24 +162,26 @@ public class IntentListView extends ListView { continue; } } - - // move default Intent to top - if (info.activityInfo.packageName.equals(defaultTarget.activityInfo.packageName) - && info.activityInfo.name.equals(defaultTarget.activityInfo.name)) - { - activityList.remove(i); - activityList.add(0, info); - } } // add to activity hash map if they doesn't exist for (ResolveInfo resolveInfo : activityList) { + ActivityInfo activity = resolveInfo.activityInfo; ComponentName activityId = new ComponentName(activity.packageName, activity.name); + if (!mActivities.containsKey(activityId)) { mActivities.put(activityId, intent); - allActivities.add(resolveInfo); + // move default Intent to top + if (resolveInfo.activityInfo.packageName.equals(defaultTarget.activityInfo.packageName) + && resolveInfo.activityInfo.name.equals(defaultTarget.activityInfo.name)) { + allActivities.add(0, resolveInfo); + } + else { + allActivities.add(resolveInfo); + } } + } }