fixed crashes when calling from malformed intent
This commit is contained in:
parent
86ec5e3f4f
commit
d8eb58d3a2
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue