fixed crashes when calling from malformed intent

This commit is contained in:
Mariotaku Lee 2015-04-19 15:14:08 +08:00
parent 86ec5e3f4f
commit d8eb58d3a2
11 changed files with 33 additions and 87 deletions

View File

@ -233,6 +233,7 @@
<activity <activity
android:name=".activity.FiltersActivity" android:name=".activity.FiltersActivity"
android:label="@string/filters" android:label="@string/filters"
android:exported="false"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge" android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<intent-filter> <intent-filter>

View File

@ -855,6 +855,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements TextWatch
private boolean handleIntent(final Intent intent) { private boolean handleIntent(final Intent intent) {
final String action = intent.getAction(); final String action = intent.getAction();
if (action == null) return false;
mShouldSaveAccounts = false; mShouldSaveAccounts = false;
mMentionUser = intent.getParcelableExtra(EXTRA_USER); mMentionUser = intent.getParcelableExtra(EXTRA_USER);
mInReplyToStatus = intent.getParcelableExtra(EXTRA_STATUS); mInReplyToStatus = intent.getParcelableExtra(EXTRA_STATUS);

View File

@ -156,7 +156,7 @@ public class LinkHandlerActivity extends BaseActionBarActivity implements System
setStatusBarColor(linkId, data); setStatusBarColor(linkId, data);
setTaskInfo(linkId, data); setTaskInfo(linkId, data);
setSupportProgressBarIndeterminateVisibility(false); setSupportProgressBarIndeterminateVisibility(false);
if (data == null || !showFragment(linkId, data)) { if (!showFragment(linkId, data)) {
finish(); finish();
} }
} }

View File

@ -184,7 +184,8 @@ public class SignInActivity extends BaseActionBarActivity implements TwitterCons
break; break;
} }
case R.id.sign_in_method_introduction: { case R.id.sign_in_method_introduction: {
new SignInMethodIntroductionDialogFragment().show(getSupportFragmentManager(), final FragmentManager fm = getSupportFragmentManager();
new SignInMethodIntroductionDialogFragment().show(fm.beginTransaction(),
"sign_in_method_introduction"); "sign_in_method_introduction");
break; break;
} }

View File

@ -45,9 +45,6 @@ import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.holder.MessageConversationViewHolder; import org.mariotaku.twidere.view.holder.MessageConversationViewHolder;
import static org.mariotaku.twidere.util.Utils.findDirectMessageInDatabases;
import static org.mariotaku.twidere.util.Utils.openMedia;
public class MessageConversationAdapter extends Adapter<ViewHolder> public class MessageConversationAdapter extends Adapter<ViewHolder>
implements Constants, IDirectMessagesAdapter, OnClickListener { implements Constants, IDirectMessagesAdapter, OnClickListener {
@ -160,7 +157,7 @@ public class MessageConversationAdapter extends Adapter<ViewHolder>
c.moveToPosition(position); c.moveToPosition(position);
final long account_id = c.getLong(mIndices.account_id); final long account_id = c.getLong(mIndices.account_id);
final long message_id = c.getLong(mIndices.message_id); final long message_id = c.getLong(mIndices.message_id);
return findDirectMessageInDatabases(mContext, account_id, message_id); return Utils.findDirectMessageInDatabases(mContext, account_id, message_id);
} }
@Override @Override
@ -175,7 +172,7 @@ public class MessageConversationAdapter extends Adapter<ViewHolder>
if (message == null || message.media == null) return; if (message == null || message.media == null) return;
//TODO open media animation //TODO open media animation
Bundle options = null; Bundle options = null;
openMedia(mContext, message, null, options); Utils.openMedia(mContext, message, null, options);
} }
} }
} }

View File

@ -3,11 +3,9 @@ package org.mariotaku.twidere.fragment.support;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
@ -248,11 +246,7 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListFragment<A
final AbsStatusesAdapter<Data> adapter = getAdapter(); final AbsStatusesAdapter<Data> adapter = getAdapter();
final ParcelableStatus status = adapter.getStatus(position); final ParcelableStatus status = adapter.getStatus(position);
if (status == null) return; if (status == null) return;
//TODO open media animation final Bundle options = Utils.createMediaViewerActivityOption(view);
view.buildDrawingCache();
final Bitmap drawingCache = Bitmap.createBitmap(view.getDrawingCache());
final Bundle options = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, drawingCache, 0, 0).toBundle();
view.destroyDrawingCache();
Utils.openMedia(getActivity(), status, media, options); Utils.openMedia(getActivity(), status, media, options);
//spice //spice
SpiceProfilingUtil.log(getActivity(), SpiceProfilingUtil.log(getActivity(),

View File

@ -26,7 +26,6 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
@ -38,7 +37,6 @@ import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
@ -297,10 +295,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
public void onMediaClick(StatusViewHolder holder, View view, ParcelableMedia media, int position) { public void onMediaClick(StatusViewHolder holder, View view, ParcelableMedia media, int position) {
final ParcelableStatus status = mStatusAdapter.getStatus(position); final ParcelableStatus status = mStatusAdapter.getStatus(position);
if (status == null) return; if (status == null) return;
view.buildDrawingCache(); final Bundle options = Utils.createMediaViewerActivityOption(view);
final Bitmap drawingCache = Bitmap.createBitmap(view.getDrawingCache());
final Bundle options = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, drawingCache, 0, 0).toBundle();
view.destroyDrawingCache();
Utils.openMedia(getActivity(), status, media, options); Utils.openMedia(getActivity(), status, media, options);
SpiceProfilingUtil.log(getActivity(), SpiceProfilingUtil.log(getActivity(),
status.id + ",Clicked," + status.account_id + "," + status.user_id + "," + status.text_plain.length() status.id + ",Clicked," + status.account_id + "," + status.user_id + "," + status.text_plain.length()
@ -384,10 +379,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
public void onMediaClick(View view, ParcelableMedia media, long accountId) { public void onMediaClick(View view, ParcelableMedia media, long accountId) {
final ParcelableStatus status = mStatusAdapter.getStatus(); final ParcelableStatus status = mStatusAdapter.getStatus();
if (status == null) return; if (status == null) return;
view.buildDrawingCache(); final Bundle options = Utils.createMediaViewerActivityOption(view);
final Bitmap drawingCache = Bitmap.createBitmap(view.getDrawingCache());
final Bundle options = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, drawingCache, 0, 0).toBundle();
view.destroyDrawingCache();
Utils.openMediaDirectly(getActivity(), accountId, status, media, status.media, options); Utils.openMediaDirectly(getActivity(), accountId, status, media, status.media, options);
//spice //spice
SpiceProfilingUtil.log(getActivity(), SpiceProfilingUtil.log(getActivity(),

View File

@ -35,6 +35,7 @@ import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public class IntentActivitiesLoader extends AsyncTaskLoader<List<ResolveInfo>> implements Constants { public class IntentActivitiesLoader extends AsyncTaskLoader<List<ResolveInfo>> implements Constants {
@ -61,6 +62,7 @@ public class IntentActivitiesLoader extends AsyncTaskLoader<List<ResolveInfo>> i
@Override @Override
public List<ResolveInfo> loadInBackground() { public List<ResolveInfo> loadInBackground() {
if (mIntent == null) return Collections.emptyList();
final List<ResolveInfo> activities = mPackageManager.queryIntentActivities(mIntent, mFlags); final List<ResolveInfo> activities = mPackageManager.queryIntentActivities(mIntent, mFlags);
final List<ResolveInfo> result = new ArrayList<>(); final List<ResolveInfo> result = new ArrayList<>();
for (final ResolveInfo activity : activities) { for (final ResolveInfo activity : activities) {

View File

@ -711,6 +711,18 @@ public final class Utils implements Constants, TwitterConstants {
} }
} }
public static Bundle createMediaViewerActivityOption(View view) {
view.buildDrawingCache();
try {
final Bitmap viewDrawingCache = view.getDrawingCache();
if (viewDrawingCache == null) return null;
final Bitmap drawingCache = Bitmap.createBitmap(viewDrawingCache);
return ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, drawingCache, 0, 0).toBundle();
} finally {
view.destroyDrawingCache();
}
}
public static int[] getAccountColors(@Nullable final ParcelableAccount[] accounts) { public static int[] getAccountColors(@Nullable final ParcelableAccount[] accounts) {
if (accounts == null) return null; if (accounts == null) return null;
final int[] colors = new int[accounts.length]; final int[] colors = new int[accounts.length];
@ -2851,17 +2863,19 @@ public final class Utils implements Constants, TwitterConstants {
return false; return false;
} }
public static int matchLinkId(final Uri uri) { public static int matchLinkId(@Nullable final Uri uri) {
if (uri == null) return UriMatcher.NO_MATCH;
return LINK_HANDLER_URI_MATCHER.match(uri); return LINK_HANDLER_URI_MATCHER.match(uri);
} }
public static int matchTabCode(final Uri uri) { public static int matchTabCode(@Nullable final Uri uri) {
if (uri == null) return UriMatcher.NO_MATCH;
return HOME_TABS_URI_MATCHER.match(uri); return HOME_TABS_URI_MATCHER.match(uri);
} }
public static String matchTabType(final Uri uri) { public static String matchTabType(@Nullable final Uri uri) {
return getTabType(matchTabCode(uri)); return getTabType(matchTabCode(uri));
} }

View File

@ -1,21 +1,14 @@
package org.mariotaku.twidere.view; package org.mariotaku.twidere.view;
import android.content.Context; import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.text.SpannableString; import android.text.SpannableString;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MotionEvent;
import org.mariotaku.twidere.view.iface.IExtendedView;
import org.mariotaku.twidere.view.themed.ThemedTextView; import org.mariotaku.twidere.view.themed.ThemedTextView;
public class StatusTextView extends ThemedTextView implements IExtendedView { public class StatusTextView extends ThemedTextView {
private TouchInterceptor mTouchInterceptor;
private OnSizeChangedListener mOnSizeChangedListener;
private OnSelectionChangeListener mOnSelectionChangeListener; private OnSelectionChangeListener mOnSelectionChangeListener;
private OnFitSystemWindowsListener mOnFitSystemWindowsListener;
public StatusTextView(final Context context) { public StatusTextView(final Context context) {
super(context); super(context);
@ -30,21 +23,6 @@ public class StatusTextView extends ThemedTextView implements IExtendedView {
super(context, attrs, defStyle); super(context, attrs, defStyle);
} }
@Override
public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) {
mOnFitSystemWindowsListener = listener;
}
@Override
public final void setOnSizeChangedListener(final OnSizeChangedListener listener) {
mOnSizeChangedListener = listener;
}
@Override
public final void setTouchInterceptor(final TouchInterceptor listener) {
mTouchInterceptor = listener;
}
public void setOnSelectionChangeListener(final OnSelectionChangeListener l) { public void setOnSelectionChangeListener(final OnSelectionChangeListener l) {
mOnSelectionChangeListener = l; mOnSelectionChangeListener = l;
} }
@ -66,40 +44,6 @@ public class StatusTextView extends ThemedTextView implements IExtendedView {
} }
} }
@Override
public final boolean onTouchEvent(@NonNull final MotionEvent event) {
if (mTouchInterceptor != null) {
final boolean ret = mTouchInterceptor.onTouchEvent(this, event);
if (ret) return true;
}
return super.onTouchEvent(event);
}
@Override
protected boolean fitSystemWindows(@NonNull Rect insets) {
if (mOnFitSystemWindowsListener != null) {
mOnFitSystemWindowsListener.onFitSystemWindows(insets);
}
return super.fitSystemWindows(insets);
}
@Override
public final boolean dispatchTouchEvent(@NonNull final MotionEvent event) {
if (mTouchInterceptor != null) {
final boolean ret = mTouchInterceptor.dispatchTouchEvent(this, event);
if (ret) return true;
}
return super.dispatchTouchEvent(event);
}
@Override
protected final void onSizeChanged(final int w, final int h, final int oldw, final int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (mOnSizeChangedListener != null) {
mOnSizeChangedListener.onSizeChanged(this, w, h, oldw, oldh);
}
}
public interface OnSelectionChangeListener { public interface OnSelectionChangeListener {
void onSelectionChanged(int selStart, int selEnd); void onSelectionChanged(int selStart, int selEnd);
} }

View File

@ -226,9 +226,9 @@
<style name="Theme.Twidere.Viewer" parent="Theme.AppCompat"> <style name="Theme.Twidere.Viewer" parent="Theme.AppCompat">
<!-- Window attributes --> <!-- Window attributes -->
<item name="android:windowBackground">@color/bg_color_media_viewer</item> <item name="android:windowBackground">@android:color/black</item>
<item name="android:windowIsTranslucent">true</item> <!--<item name="android:windowIsTranslucent">true</item>-->
<item name="android:colorBackgroundCacheHint">@null</item> <!--<item name="android:colorBackgroundCacheHint">@null</item>-->
<item name="windowActionBarOverlay">true</item> <item name="windowActionBarOverlay">true</item>
<item name="actionBarStyle">@style/Widget.Twidere.Viewer.ActionBar</item> <item name="actionBarStyle">@style/Widget.Twidere.Viewer.ActionBar</item>
<item name="actionModeShareDrawable">@drawable/ic_action_share</item> <item name="actionModeShareDrawable">@drawable/ic_action_share</item>