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
android:name=".activity.FiltersActivity"
android:label="@string/filters"
android:exported="false"
android:theme="@style/Theme.Twidere.Dark.DialogWhenLarge"
android:windowSoftInputMode="adjustResize">
<intent-filter>

View File

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

View File

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

View File

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

View File

@ -45,9 +45,6 @@ import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.util.Utils;
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>
implements Constants, IDirectMessagesAdapter, OnClickListener {
@ -160,7 +157,7 @@ public class MessageConversationAdapter extends Adapter<ViewHolder>
c.moveToPosition(position);
final long account_id = c.getLong(mIndices.account_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
@ -175,7 +172,7 @@ public class MessageConversationAdapter extends Adapter<ViewHolder>
if (message == null || message.media == null) return;
//TODO open media animation
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.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
@ -248,11 +246,7 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListFragment<A
final AbsStatusesAdapter<Data> adapter = getAdapter();
final ParcelableStatus status = adapter.getStatus(position);
if (status == null) return;
//TODO open media animation
view.buildDrawingCache();
final Bitmap drawingCache = Bitmap.createBitmap(view.getDrawingCache());
final Bundle options = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, drawingCache, 0, 0).toBundle();
view.destroyDrawingCache();
final Bundle options = Utils.createMediaViewerActivityOption(view);
Utils.openMedia(getActivity(), status, media, options);
//spice
SpiceProfilingUtil.log(getActivity(),

View File

@ -26,7 +26,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
@ -38,7 +37,6 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
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) {
final ParcelableStatus status = mStatusAdapter.getStatus(position);
if (status == null) return;
view.buildDrawingCache();
final Bitmap drawingCache = Bitmap.createBitmap(view.getDrawingCache());
final Bundle options = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, drawingCache, 0, 0).toBundle();
view.destroyDrawingCache();
final Bundle options = Utils.createMediaViewerActivityOption(view);
Utils.openMedia(getActivity(), status, media, options);
SpiceProfilingUtil.log(getActivity(),
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) {
final ParcelableStatus status = mStatusAdapter.getStatus();
if (status == null) return;
view.buildDrawingCache();
final Bitmap drawingCache = Bitmap.createBitmap(view.getDrawingCache());
final Bundle options = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, drawingCache, 0, 0).toBundle();
view.destroyDrawingCache();
final Bundle options = Utils.createMediaViewerActivityOption(view);
Utils.openMediaDirectly(getActivity(), accountId, status, media, status.media, options);
//spice
SpiceProfilingUtil.log(getActivity(),

View File

@ -35,6 +35,7 @@ import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class IntentActivitiesLoader extends AsyncTaskLoader<List<ResolveInfo>> implements Constants {
@ -61,6 +62,7 @@ public class IntentActivitiesLoader extends AsyncTaskLoader<List<ResolveInfo>> i
@Override
public List<ResolveInfo> loadInBackground() {
if (mIntent == null) return Collections.emptyList();
final List<ResolveInfo> activities = mPackageManager.queryIntentActivities(mIntent, mFlags);
final List<ResolveInfo> result = new ArrayList<>();
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) {
if (accounts == null) return null;
final int[] colors = new int[accounts.length];
@ -2851,17 +2863,19 @@ public final class Utils implements Constants, TwitterConstants {
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);
}
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);
}
public static String matchTabType(final Uri uri) {
public static String matchTabType(@Nullable final Uri uri) {
return getTabType(matchTabCode(uri));
}

View File

@ -1,21 +1,14 @@
package org.mariotaku.twidere.view;
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.text.SpannableString;
import android.util.AttributeSet;
import android.view.MotionEvent;
import org.mariotaku.twidere.view.iface.IExtendedView;
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 OnFitSystemWindowsListener mOnFitSystemWindowsListener;
public StatusTextView(final Context context) {
super(context);
@ -30,21 +23,6 @@ public class StatusTextView extends ThemedTextView implements IExtendedView {
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) {
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 {
void onSelectionChanged(int selStart, int selEnd);
}

View File

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