diff --git a/twidere.component.common/src/main/java/com/bluelinelabs/logansquare/ParameterizedTypeTrojan.java b/twidere.component.common/src/main/java/com/bluelinelabs/logansquare/ParameterizedTypeAccessor.java similarity index 96% rename from twidere.component.common/src/main/java/com/bluelinelabs/logansquare/ParameterizedTypeTrojan.java rename to twidere.component.common/src/main/java/com/bluelinelabs/logansquare/ParameterizedTypeAccessor.java index bc32c75c2..75c96fc85 100644 --- a/twidere.component.common/src/main/java/com/bluelinelabs/logansquare/ParameterizedTypeTrojan.java +++ b/twidere.component.common/src/main/java/com/bluelinelabs/logansquare/ParameterizedTypeAccessor.java @@ -24,7 +24,7 @@ import java.lang.reflect.Type; /** * Created by mariotaku on 15/12/13. */ -public class ParameterizedTypeTrojan { +public class ParameterizedTypeAccessor { public static ParameterizedType create(Type type) { return new ParameterizedType.ConcreteParameterizedType<>(type); diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java index c1c88adad..e37b26f60 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java @@ -67,6 +67,8 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst String PROTOCOL_CONTENT = SCHEME_CONTENT + "://"; String PROTOCOL_TWIDERE = SCHEME_TWIDERE + "://"; + String AUTHORITY_TWIDERE_FILE = "twidere.file"; + String AUTHORITY_USER = "user"; String AUTHORITY_HOME = "home"; String AUTHORITY_MENTIONS = "mentions"; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java index 168082d08..2e77079e2 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/api/twitter/util/TwitterConverter.java @@ -23,7 +23,7 @@ import android.support.v4.util.SimpleArrayMap; import com.bluelinelabs.logansquare.LoganSquare; import com.bluelinelabs.logansquare.ParameterizedType; -import com.bluelinelabs.logansquare.ParameterizedTypeTrojan; +import com.bluelinelabs.logansquare.ParameterizedTypeAccessor; import com.fasterxml.jackson.core.JsonParseException; import org.mariotaku.restfu.Converter; @@ -69,7 +69,7 @@ public class TwitterConverter implements Converter { private static T parseOrThrow(RestHttpResponse resp, InputStream stream, Type type) throws IOException, TwitterException { try { - final ParameterizedType parameterizedType = ParameterizedTypeTrojan.create(type); + final ParameterizedType parameterizedType = ParameterizedTypeAccessor.create(type); final T parse = LoganSquare.parse(stream, parameterizedType); if (TwitterException.class == type && parse == null) { throw new TwitterException(); diff --git a/twidere/build.gradle b/twidere/build.gradle index fd6e18230..c2163a89a 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -114,6 +114,7 @@ dependencies { compile fileTree(dir: 'libs/main', include: ['*.jar']) provided 'javax.annotation:jsr250-api:1.0' // googleCompile fileTree(dir: 'libs/google', include: ['*.jar']) + compile 'com.google.android.gms:play-services-appindexing:8.1.0' } task svgToDrawable(type: SvgDrawableTask) { diff --git a/twidere/src/main/AndroidManifest.xml b/twidere/src/main/AndroidManifest.xml index 0a71a935a..518a635ac 100644 --- a/twidere/src/main/AndroidManifest.xml +++ b/twidere/src/main/AndroidManifest.xml @@ -526,6 +526,15 @@ android:name=".provider.RecentSearchProvider" android:authorities="org.mariotaku.twidere.provider.SearchRecentSuggestions" tools:ignore="ExportedContentProvider"/> + + + @@ -558,6 +567,11 @@ + + diff --git a/twidere/src/main/java/android/support/v4/app/BackStackEntryTrojan.java b/twidere/src/main/java/android/support/v4/app/BackStackEntryAccessor.java similarity index 86% rename from twidere/src/main/java/android/support/v4/app/BackStackEntryTrojan.java rename to twidere/src/main/java/android/support/v4/app/BackStackEntryAccessor.java index 497271271..56d5113fe 100755 --- a/twidere/src/main/java/android/support/v4/app/BackStackEntryTrojan.java +++ b/twidere/src/main/java/android/support/v4/app/BackStackEntryAccessor.java @@ -1,6 +1,6 @@ package android.support.v4.app; -public class BackStackEntryTrojan { +public class BackStackEntryAccessor { public static Fragment getFragmentInBackStackRecord(final FragmentManager.BackStackEntry entry) { if (entry instanceof BackStackRecord) return ((BackStackRecord) entry).mHead.fragment; diff --git a/twidere/src/main/java/android/support/v4/app/FragmentTrojan.java b/twidere/src/main/java/android/support/v4/app/FragmentAccessor.java similarity index 83% rename from twidere/src/main/java/android/support/v4/app/FragmentTrojan.java rename to twidere/src/main/java/android/support/v4/app/FragmentAccessor.java index f47c5d39b..a46cfaa9e 100644 --- a/twidere/src/main/java/android/support/v4/app/FragmentTrojan.java +++ b/twidere/src/main/java/android/support/v4/app/FragmentAccessor.java @@ -2,7 +2,7 @@ package android.support.v4.app; import android.os.Bundle; -public class FragmentTrojan { +public class FragmentAccessor { public static Bundle getSavedFragmentState(final Fragment f) { return f.mSavedFragmentState; diff --git a/twidere/src/main/java/android/support/v4/app/FragmentManagerTrojan.java b/twidere/src/main/java/android/support/v4/app/FragmentManagerAccessor.java similarity index 93% rename from twidere/src/main/java/android/support/v4/app/FragmentManagerTrojan.java rename to twidere/src/main/java/android/support/v4/app/FragmentManagerAccessor.java index 12c324aac..4bee2af84 100755 --- a/twidere/src/main/java/android/support/v4/app/FragmentManagerTrojan.java +++ b/twidere/src/main/java/android/support/v4/app/FragmentManagerAccessor.java @@ -2,7 +2,7 @@ package android.support.v4.app; import android.support.v4.view.LayoutInflaterFactory; -public class FragmentManagerTrojan { +public class FragmentManagerAccessor { public static boolean isStateSaved(final FragmentManager fm) { if (fm instanceof FragmentManagerImpl) return ((FragmentManagerImpl) fm).mStateSaved; diff --git a/twidere/src/main/java/android/support/v4/content/LoaderTrojan.java b/twidere/src/main/java/android/support/v4/content/LoaderAccessor.java similarity index 97% rename from twidere/src/main/java/android/support/v4/content/LoaderTrojan.java rename to twidere/src/main/java/android/support/v4/content/LoaderAccessor.java index f4f80eb1c..43e8ed35d 100644 --- a/twidere/src/main/java/android/support/v4/content/LoaderTrojan.java +++ b/twidere/src/main/java/android/support/v4/content/LoaderAccessor.java @@ -22,7 +22,7 @@ package android.support.v4.content; /** * Created by mariotaku on 15/7/5. */ -public class LoaderTrojan { +public class LoaderAccessor { public static boolean isContentChanged(final Loader loader) { return loader.mContentChanged; } diff --git a/twidere/src/main/java/android/support/v4/widget/DrawerLayoutTrojan.java b/twidere/src/main/java/android/support/v4/widget/DrawerLayoutAccessor.java similarity index 96% rename from twidere/src/main/java/android/support/v4/widget/DrawerLayoutTrojan.java rename to twidere/src/main/java/android/support/v4/widget/DrawerLayoutAccessor.java index 62c1c81be..ae8d764be 100644 --- a/twidere/src/main/java/android/support/v4/widget/DrawerLayoutTrojan.java +++ b/twidere/src/main/java/android/support/v4/widget/DrawerLayoutAccessor.java @@ -24,7 +24,7 @@ import android.view.View; /** * Created by mariotaku on 15/7/18. */ -public class DrawerLayoutTrojan { +public class DrawerLayoutAccessor { public static View findDrawerWithGravity(DrawerLayout layout, int gravity) { return layout.findDrawerWithGravity(gravity); diff --git a/twidere/src/main/java/android/support/v7/app/AppCompatDelegateTrojan.java b/twidere/src/main/java/android/support/v7/app/AppCompatDelegateAccessor.java similarity index 97% rename from twidere/src/main/java/android/support/v7/app/AppCompatDelegateTrojan.java rename to twidere/src/main/java/android/support/v7/app/AppCompatDelegateAccessor.java index bd2b1a6e6..20786f88d 100644 --- a/twidere/src/main/java/android/support/v7/app/AppCompatDelegateTrojan.java +++ b/twidere/src/main/java/android/support/v7/app/AppCompatDelegateAccessor.java @@ -24,7 +24,7 @@ import android.support.annotation.Nullable; /** * Created by mariotaku on 15/4/27. */ -public class AppCompatDelegateTrojan { +public class AppCompatDelegateAccessor { @Nullable public static ActionBar peekActionBar(@Nullable AppCompatDelegate delegate) { diff --git a/twidere/src/main/java/android/support/v7/widget/ViewHolderTrojan.java b/twidere/src/main/java/android/support/v7/widget/ViewHolderAccessor.java similarity index 96% rename from twidere/src/main/java/android/support/v7/widget/ViewHolderTrojan.java rename to twidere/src/main/java/android/support/v7/widget/ViewHolderAccessor.java index b78e7f8f0..e3d69f22b 100644 --- a/twidere/src/main/java/android/support/v7/widget/ViewHolderTrojan.java +++ b/twidere/src/main/java/android/support/v7/widget/ViewHolderAccessor.java @@ -24,7 +24,7 @@ import android.support.v7.widget.RecyclerView.ViewHolder; /** * Created by mariotaku on 14/12/6. */ -public class ViewHolderTrojan { +public class ViewHolderAccessor { public static boolean isRemoved(ViewHolder holder) { return holder.isRemoved(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IExtendedActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IExtendedActivity.java new file mode 100644 index 000000000..4ea7accaf --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IExtendedActivity.java @@ -0,0 +1,32 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.activity.iface; + +/** + * Created by mariotaku on 15/12/28. + */ +public interface IExtendedActivity { + + void executeAfterFragmentResumed(Action action); + + interface Action { + void execute(IExtendedActivity activity); + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java index 5fba10e46..5a9d2df01 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java @@ -31,6 +31,7 @@ import com.squareup.otto.Bus; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.activity.iface.IControlBarActivity; +import org.mariotaku.twidere.activity.iface.IExtendedActivity; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; import org.mariotaku.twidere.util.ActivityTracker; @@ -46,13 +47,15 @@ import org.mariotaku.twidere.util.dagger.DaggerGeneralComponent; import org.mariotaku.twidere.view.iface.IExtendedView.OnFitSystemWindowsListener; import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Queue; import javax.inject.Inject; @SuppressLint("Registered") public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Constants, OnFitSystemWindowsListener, SystemWindowsInsetsCallback, IControlBarActivity, - KeyboardShortcutCallback { + KeyboardShortcutCallback, IExtendedActivity { // Utility classes @Inject @@ -78,6 +81,8 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co private boolean mIsVisible; private Rect mSystemWindowsInsets; private int mKeyMetaState; + private boolean mFragmentResumed; + private Queue mActionQueue = new LinkedList<>(); @Override public boolean getSystemWindowsInsets(Rect insets) { @@ -183,6 +188,7 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co @Override protected void onPause() { + mFragmentResumed = false; super.onPause(); } @@ -250,4 +256,24 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co return mKeyMetaState; } + @Override + protected void onResumeFragments() { + super.onResumeFragments(); + mFragmentResumed = true; + executePending(); + } + + @Override + public void executeAfterFragmentResumed(Action action) { + mActionQueue.add(action); + executePending(); + } + + private void executePending() { + if (!mFragmentResumed) return; + Action action; + while ((action = mActionQueue.poll()) != null) { + action.execute(this); + } + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java index 6d9b2d077..ea925d5ad 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java @@ -43,7 +43,7 @@ import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v4.widget.DrawerLayout; -import android.support.v4.widget.DrawerLayoutTrojan; +import android.support.v4.widget.DrawerLayoutAccessor; import android.support.v7.widget.Toolbar; import android.view.Gravity; import android.view.KeyEvent; @@ -257,7 +257,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen switch (action) { case ACTION_NAVIGATION_PREVIOUS_TAB: { final int previous = mViewPager.getCurrentItem() - 1; - if (previous < 0 && DrawerLayoutTrojan.findDrawerWithGravity(mDrawerLayout, Gravity.START) != null) { + if (previous < 0 && DrawerLayoutAccessor.findDrawerWithGravity(mDrawerLayout, Gravity.START) != null) { mDrawerLayout.openDrawer(GravityCompat.START); setControlBarVisibleAnimate(true); } else if (previous < mPagerAdapter.getCount()) { @@ -271,7 +271,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen } case ACTION_NAVIGATION_NEXT_TAB: { final int next = mViewPager.getCurrentItem() + 1; - if (next >= mPagerAdapter.getCount() && DrawerLayoutTrojan.findDrawerWithGravity(mDrawerLayout, Gravity.END) != null) { + if (next >= mPagerAdapter.getCount() && DrawerLayoutAccessor.findDrawerWithGravity(mDrawerLayout, Gravity.END) != null) { mDrawerLayout.openDrawer(GravityCompat.END); setControlBarVisibleAnimate(true); } else if (next >= 0) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java index acd94e9b8..567a1c405 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java @@ -110,7 +110,7 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System @Override public int getThemeResourceId() { - return ThemeUtils.getDialogWhenLargeThemeResource(this); + return ThemeUtils.getNoActionBarThemeResource(this); } @Override diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java index 4ad0b8091..76f8d45fe 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java @@ -17,6 +17,9 @@ package org.mariotaku.twidere.activity.support; import android.Manifest; +import android.app.Activity; +import android.app.DialogFragment; +import android.app.FragmentManager; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; @@ -32,8 +35,10 @@ import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.LoaderManager.LoaderCallbacks; +import android.support.v4.content.FileProvider; import android.support.v4.content.Loader; import android.support.v4.util.Pair; import android.support.v4.view.ViewPager; @@ -58,15 +63,15 @@ import android.widget.Toast; import com.davemorrissey.labs.subscaleview.ImageSource; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; -import com.desmond.asyncmanager.AsyncManager; -import com.desmond.asyncmanager.TaskRunnable; import com.pnikosis.materialishprogress.ProgressWheel; import com.sprylab.android.widget.TextureVideoView; import org.apache.commons.lang3.ArrayUtils; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; +import org.mariotaku.twidere.activity.iface.IExtendedActivity; import org.mariotaku.twidere.adapter.support.SupportFixedFragmentStatePagerAdapter; +import org.mariotaku.twidere.fragment.ProgressDialogFragment; import org.mariotaku.twidere.fragment.support.BaseSupportFragment; import org.mariotaku.twidere.fragment.support.ViewStatusDialogFragment; import org.mariotaku.twidere.loader.support.TileImageLoader; @@ -75,11 +80,13 @@ import org.mariotaku.twidere.loader.support.TileImageLoader.Result; import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia.VideoInfo.Variant; import org.mariotaku.twidere.model.ParcelableStatus; +import org.mariotaku.twidere.task.ProgressSaveFileTask; +import org.mariotaku.twidere.task.SaveFileTask; +import org.mariotaku.twidere.task.SaveImageToGalleryTask; import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.MenuUtils; import org.mariotaku.twidere.util.PermissionUtils; -import org.mariotaku.twidere.util.SaveFileTask; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.VideoLoader.VideoLoadingListener; @@ -258,6 +265,8 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements public static class BaseImagePageFragment extends AbsMediaPageFragment implements DownloadListener, LoaderCallbacks, OnClickListener { + private static final int REQUEST_SHARE_IMAGE = 201; + private SubsamplingScaleImageView mImageView; private ProgressWheel mProgressBar; private boolean mLoaderInitialized; @@ -265,6 +274,7 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements private SaveFileTask mSaveFileTask; private File mImageFile; + private File mShareImageFile; @Override public void onBaseViewCreated(View view, @Nullable Bundle savedInstanceState) { @@ -394,7 +404,7 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements final File file = mImageFile; final boolean hasImage = file != null && file.exists(); if (!hasImage) return; - mSaveFileTask = SaveFileTask.saveImage(getActivity(), file); + mSaveFileTask = SaveImageToGalleryTask.create(getActivity(), file); AsyncTaskUtils.executeTask(mSaveFileTask); } @@ -402,44 +412,10 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); final boolean isLoading = getLoaderManager().hasRunningLoaders(); - final TaskRunnable, Pair> checkState - = new TaskRunnable, Pair>() { - @Override - public Pair doLongOperation(File file) throws InterruptedException { - final boolean hasImage = file != null && file.exists(); - if (!hasImage) { - return Pair.create(false, null); - } - final Intent intent = new Intent(Intent.ACTION_SEND); - final Uri fileUri = Uri.fromFile(file); - final String imageMimeType = Utils.getImageMimeType(file); - intent.setDataAndType(fileUri, imageMimeType); - intent.putExtra(Intent.EXTRA_STREAM, fileUri); - final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); - if (activity.hasStatus()) { - final ParcelableStatus status = activity.getStatus(); - intent.putExtra(Intent.EXTRA_TEXT, Utils.getStatusShareText(activity, status)); - intent.putExtra(Intent.EXTRA_SUBJECT, Utils.getStatusShareSubject(activity, status)); - } - return Pair.create(true, intent); - } - - @Override - public void callback(Pair callback, Pair result) { - if (callback.first.isDetached() || callback.first.getActivity() == null) return; - final Menu menu = callback.second; - final boolean hasImage = result.first; - MenuUtils.setMenuItemAvailability(menu, R.id.refresh, !hasImage && !isLoading); - MenuUtils.setMenuItemAvailability(menu, R.id.share, hasImage && !isLoading); - MenuUtils.setMenuItemAvailability(menu, R.id.save, hasImage && !isLoading); - if (!hasImage) return; - final MenuItem shareItem = menu.findItem(R.id.share); - shareItem.setIntent(Intent.createChooser(result.second, callback.first.getString(R.string.share))); - } - }; - checkState.setParams(mImageFile); - checkState.setResultHandler(Pair.create(this, menu)); - AsyncManager.runBackgroundTask(checkState); + final boolean hasImage = mImageFile != null; + MenuUtils.setMenuItemAvailability(menu, R.id.refresh, !hasImage && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.share, hasImage && !isLoading); + MenuUtils.setMenuItemAvailability(menu, R.id.save, hasImage && !isLoading); } @@ -464,6 +440,65 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements loadImage(); return true; } + case R.id.share: { + final FragmentActivity activity = getActivity(); + final File destination = new File(activity.getCacheDir(), "shared_files"); + final SaveFileTask task = new SaveFileTask(activity, mImageFile, destination, + new SaveImageToGalleryTask.ImageMimeTypeCallback()) { + private static final String PROGRESS_FRAGMENT_TAG = "progress"; + + protected void dismissProgress() { + final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); + if (activity == null) return; + activity.executeAfterFragmentResumed(new IExtendedActivity.Action() { + @Override + public void execute(IExtendedActivity activity) { + final FragmentManager fm = ((Activity) activity).getFragmentManager(); + final DialogFragment fragment = (DialogFragment) fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG); + if (fragment != null) { + fragment.dismiss(); + } + } + }); + } + + protected void showProgress() { + final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); + if (activity == null) return; + activity.executeAfterFragmentResumed(new IExtendedActivity.Action() { + @Override + public void execute(IExtendedActivity activity) { + final DialogFragment fragment = new ProgressDialogFragment(); + fragment.setCancelable(false); + fragment.show(((Activity) activity).getFragmentManager(), PROGRESS_FRAGMENT_TAG); + } + }); + } + + protected void onFileSaved(File savedFile, String mimeType) { + final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); + if (activity == null) return; + + final Uri fileUri = FileProvider.getUriForFile(activity, + AUTHORITY_TWIDERE_FILE, savedFile); + + final Intent intent = new Intent(Intent.ACTION_SEND); + intent.setDataAndType(fileUri, mimeType); + intent.putExtra(Intent.EXTRA_STREAM, fileUri); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + if (activity.hasStatus()) { + final ParcelableStatus status = activity.getStatus(); + intent.putExtra(Intent.EXTRA_TEXT, Utils.getStatusShareText(activity, status)); + intent.putExtra(Intent.EXTRA_SUBJECT, Utils.getStatusShareSubject(activity, status)); + } + startActivityForResult(Intent.createChooser(intent, activity.getString(R.string.share)), + REQUEST_SHARE_IMAGE); + } + + }; + task.execute(); + return true; + } } return super.onOptionsItemSelected(item); } @@ -484,7 +519,18 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements loadImage(); } - + @Override + public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + switch (requestCode) { + case REQUEST_SHARE_IMAGE: { + if (mShareImageFile != null) { + mShareImageFile.delete(); + } + return; + } + } + super.onActivityResult(requestCode, resultCode, data); + } } public static final class ImagePageFragment extends BaseImagePageFragment @@ -840,7 +886,13 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements if (extension == null) return; final File pubDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); final File saveDir = new File(pubDir, "Twidere"); - mSaveFileTask = AsyncTaskUtils.executeTask(new SaveFileTask(getActivity(), file, mimeType, saveDir)); + mSaveFileTask = AsyncTaskUtils.executeTask(new ProgressSaveFileTask(getActivity(), file, saveDir, + new SaveFileTask.StringMimeTypeCallback(mimeType)) { + @Override + protected void onFileSaved(File savedFile, String mimeType) { + + } + }); } @Override @@ -938,6 +990,7 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements final Intent intent = new Intent(Intent.ACTION_SEND); final Uri fileUri = Uri.fromFile(file); intent.setDataAndType(fileUri, linkAndType.second); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.putExtra(Intent.EXTRA_STREAM, fileUri); final MediaViewerActivity activity = (MediaViewerActivity) getActivity(); if (activity.hasStatus()) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/adapter/support/SupportFixedFragmentStatePagerAdapter.java b/twidere/src/main/java/org/mariotaku/twidere/adapter/support/SupportFixedFragmentStatePagerAdapter.java index 2c93384cc..b7822c39d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/adapter/support/SupportFixedFragmentStatePagerAdapter.java +++ b/twidere/src/main/java/org/mariotaku/twidere/adapter/support/SupportFixedFragmentStatePagerAdapter.java @@ -23,7 +23,7 @@ import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.app.FragmentTrojan; +import android.support.v4.app.FragmentAccessor; import android.view.ViewGroup; public abstract class SupportFixedFragmentStatePagerAdapter extends FragmentStatePagerAdapter { @@ -35,7 +35,7 @@ public abstract class SupportFixedFragmentStatePagerAdapter extends FragmentStat @Override public Object instantiateItem(final ViewGroup container, final int position) { final Fragment f = (Fragment) super.instantiateItem(container, position); - final Bundle savedFragmentState = f != null ? FragmentTrojan.getSavedFragmentState(f) : null; + final Bundle savedFragmentState = f != null ? FragmentAccessor.getSavedFragmentState(f) : null; if (savedFragmentState != null) { savedFragmentState.setClassLoader(f.getClass().getClassLoader()); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java index 0e03205c2..28e27434f 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/BaseSupportFragment.java @@ -30,7 +30,7 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManagerTrojan; +import android.support.v4.app.FragmentManagerAccessor; import android.support.v4.view.LayoutInflaterCompat; import android.support.v4.view.LayoutInflaterFactory; import android.view.LayoutInflater; @@ -193,7 +193,7 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons } final LayoutInflater inflater = activity.getLayoutInflater().cloneInContext(getThemedContext()); getChildFragmentManager(); // Init if needed; use raw implementation below. - final LayoutInflaterFactory delegate = FragmentManagerTrojan.getLayoutInflaterFactory(getChildFragmentManager()); + final LayoutInflaterFactory delegate = FragmentManagerAccessor.getLayoutInflaterFactory(getChildFragmentManager()); LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory((IThemedActivity) activity, delegate)); return inflater; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java index 40777b1b1..7dbbe01d1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/StatusFragment.java @@ -43,7 +43,7 @@ import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentManagerTrojan; +import android.support.v4.app.FragmentManagerAccessor; import android.support.v4.app.FragmentTransaction; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.AsyncTaskLoader; @@ -1167,7 +1167,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac } final Fragment cardFragment = TwitterCardUtils.createCardFragment(status); final FragmentManager fm = fragment.getChildFragmentManager(); - if (cardFragment != null && !FragmentManagerTrojan.isStateSaved(fm)) { + if (cardFragment != null && !FragmentManagerAccessor.isStateSaved(fm)) { final FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.twitter_card, cardFragment); ft.commit(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ObjectCursorLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ObjectCursorLoader.java index f37a45100..af48be068 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/ObjectCursorLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/ObjectCursorLoader.java @@ -24,7 +24,7 @@ import android.database.Cursor; import android.net.Uri; import android.support.annotation.NonNull; import android.support.v4.content.AsyncTaskLoader; -import android.support.v4.content.LoaderTrojan; +import android.support.v4.content.LoaderAccessor; import org.mariotaku.library.objectcursor.ObjectCursor; @@ -247,7 +247,7 @@ public class ObjectCursorLoader extends AsyncTaskLoader> { writer.println(mObjects); writer.print(prefix); writer.print("mContentChanged="); - writer.println(LoaderTrojan.isContentChanged(this)); + writer.println(LoaderAccessor.isContentChanged(this)); } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/task/ProgressSaveFileTask.java b/twidere/src/main/java/org/mariotaku/twidere/task/ProgressSaveFileTask.java new file mode 100644 index 000000000..ba32bd300 --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/task/ProgressSaveFileTask.java @@ -0,0 +1,69 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.task; + +import android.app.Activity; +import android.app.DialogFragment; +import android.app.FragmentManager; +import android.content.Context; + +import org.mariotaku.twidere.activity.iface.IExtendedActivity; +import org.mariotaku.twidere.fragment.ProgressDialogFragment; + +import java.io.File; + +/** + * Created by mariotaku on 15/12/28. + */ +public abstract class ProgressSaveFileTask extends SaveFileTask { + private static final String PROGRESS_FRAGMENT_TAG = "progress"; + + public ProgressSaveFileTask(Context context, File source, File destination, MimeTypeCallback getMimeType) { + super(context, source, destination, getMimeType); + } + + protected void showProgress() { + final Context context = getContext(); + if (context == null) return; + ((IExtendedActivity) context).executeAfterFragmentResumed(new IExtendedActivity.Action() { + @Override + public void execute(IExtendedActivity activity) { + final DialogFragment fragment = new ProgressDialogFragment(); + fragment.setCancelable(false); + fragment.show(((Activity) activity).getFragmentManager(), PROGRESS_FRAGMENT_TAG); + } + }); + } + + protected void dismissProgress() { + final Context context = getContext(); + if (context == null) return; + ((IExtendedActivity) context).executeAfterFragmentResumed(new IExtendedActivity.Action() { + @Override + public void execute(IExtendedActivity activity) { + final FragmentManager fm = ((Activity) activity).getFragmentManager(); + final DialogFragment fragment = (DialogFragment) fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG); + if (fragment != null) { + fragment.dismiss(); + } + } + }); + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/task/SaveFileTask.java b/twidere/src/main/java/org/mariotaku/twidere/task/SaveFileTask.java new file mode 100644 index 000000000..262e6065a --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/task/SaveFileTask.java @@ -0,0 +1,171 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2014 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.task; + +import android.content.Context; +import android.os.AsyncTask; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; +import android.webkit.MimeTypeMap; + +import org.mariotaku.twidere.Constants; +import org.mariotaku.twidere.util.Utils; + +import java.io.File; +import java.io.IOException; +import java.lang.ref.WeakReference; + +import okio.BufferedSink; +import okio.Okio; +import okio.Source; + +import static android.text.TextUtils.isEmpty; + +public abstract class SaveFileTask extends AsyncTask implements Constants { + + private final WeakReference contextRef; + + @NonNull + private final File source, destination; + @NonNull + private final MimeTypeCallback getMimeType; + + public SaveFileTask(@NonNull final Context context, @NonNull final File source, + @NonNull final File destination, @NonNull final MimeTypeCallback getMimeType) { + this.contextRef = new WeakReference<>(context); + this.source = source; + this.getMimeType = getMimeType; + this.destination = destination; + } + + @Nullable + public static SaveFileResult saveFile(@NonNull final Context context, @NonNull final File source, + @NonNull final MimeTypeCallback mimeTypeCallback, + @NonNull final File destinationDir) { + Source ioSrc = null; + BufferedSink sink = null; + try { + final String name = source.getName(); + if (isEmpty(name)) return null; + final String mimeType = mimeTypeCallback.getMimeType(source); + final String extension = mimeTypeCallback.getExtension(mimeType); + if (extension == null) return null; + final String nameToSave = getFileNameWithExtension(name, extension); + if (!destinationDir.isDirectory() && !destinationDir.mkdirs()) return null; + final File saveFile = new File(destinationDir, nameToSave); + ioSrc = Okio.source(source); + sink = Okio.buffer(Okio.sink(saveFile)); + sink.writeAll(ioSrc); + sink.flush(); + return new SaveFileResult(saveFile, mimeType); + } catch (final IOException e) { + Log.w(LOGTAG, "Failed to save file", e); + return null; + } finally { + Utils.closeSilently(sink); + Utils.closeSilently(ioSrc); + } + } + + @Override + protected final SaveFileResult doInBackground(final Object... args) { + final Context context = contextRef.get(); + if (context == null) return null; + return saveFile(context, source, getMimeType, destination); + } + + @Override + protected void onCancelled() { + dismissProgress(); + } + + @Override + protected final void onPreExecute() { + showProgress(); + } + + @Override + protected final void onPostExecute(@Nullable final SaveFileResult result) { + dismissProgress(); + if (result != null) { + onFileSaved(result.savedFile, result.mimeType); + } + } + + protected abstract void onFileSaved(File savedFile, String mimeType); + + protected abstract void showProgress(); + + protected abstract void dismissProgress(); + + + protected final Context getContext() { + return contextRef.get(); + } + + private static String getFileNameWithExtension(String name, String extension) { + int lastDotIdx = name.lastIndexOf('.'); + if (lastDotIdx < 0) return name + "." + extension; + return name.substring(0, lastDotIdx) + "." + extension; + } + + public interface MimeTypeCallback { + String getMimeType(File source); + + String getExtension(String mimeType); + } + + public static final class SaveFileResult { + File savedFile; + String mimeType; + + public SaveFileResult(File savedFile, String mimeType) { + this.savedFile = savedFile; + this.mimeType = mimeType; + } + + public File getSavedFile() { + return savedFile; + } + + public String getMimeType() { + return mimeType; + } + } + + public static class StringMimeTypeCallback implements MimeTypeCallback { + private final String mimeType; + + public StringMimeTypeCallback(String mimeType) { + this.mimeType = mimeType; + } + + @Override + public String getMimeType(File source) { + return mimeType; + } + + @Override + public String getExtension(String mimeType) { + return MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); + } + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/task/SaveImageToGalleryTask.java b/twidere/src/main/java/org/mariotaku/twidere/task/SaveImageToGalleryTask.java new file mode 100644 index 000000000..5c85638af --- /dev/null +++ b/twidere/src/main/java/org/mariotaku/twidere/task/SaveImageToGalleryTask.java @@ -0,0 +1,73 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2015 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.task; + +import android.app.Activity; +import android.content.Context; +import android.media.MediaScannerConnection; +import android.os.Environment; +import android.support.annotation.NonNull; +import android.webkit.MimeTypeMap; +import android.widget.Toast; + +import org.mariotaku.twidere.R; +import org.mariotaku.twidere.util.Utils; + +import java.io.File; + +/** + * Created by mariotaku on 15/12/28. + */ +public class SaveImageToGalleryTask extends ProgressSaveFileTask { + + public SaveImageToGalleryTask(@NonNull Activity activity, @NonNull File source, @NonNull File destination) { + super(activity, source, destination, new ImageMimeTypeCallback()); + } + + public static SaveFileTask create(final Activity activity, final File source) { + final File pubDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); + final File saveDir = new File(pubDir, "Twidere"); + return new SaveImageToGalleryTask(activity, source, saveDir); + } + + protected void onFileSaved(File savedFile, String mimeType) { + final Context context = getContext(); + if (context == null) return; + if (savedFile != null && savedFile.exists()) { + MediaScannerConnection.scanFile(context, new String[]{savedFile.getPath()}, + new String[]{mimeType}, null); + Toast.makeText(context, R.string.saved_to_gallery, Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(context, R.string.error_occurred, Toast.LENGTH_SHORT).show(); + } + } + + public static final class ImageMimeTypeCallback implements MimeTypeCallback { + @Override + public String getMimeType(File source) { + return Utils.getImageMimeType(source); + } + + @Override + public String getExtension(String mimeType) { + return MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); + } + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/SaveFileTask.java b/twidere/src/main/java/org/mariotaku/twidere/util/SaveFileTask.java deleted file mode 100644 index 331054ebc..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/util/SaveFileTask.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.mariotaku.twidere.util; - -import android.app.Activity; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.content.Context; -import android.media.MediaScannerConnection; -import android.os.AsyncTask; -import android.os.Environment; -import android.system.ErrnoException; -import android.system.OsConstants; -import android.util.Log; -import android.webkit.MimeTypeMap; -import android.widget.Toast; - -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.fragment.ProgressDialogFragment; - -import java.io.File; -import java.io.IOException; - -import okio.BufferedSink; -import okio.Okio; -import okio.Source; - -import static android.text.TextUtils.isEmpty; - -public class SaveFileTask extends AsyncTask implements Constants { - - private static final String PROGRESS_FRAGMENT_TAG = "progress"; - - private final File source, destination; - private final Activity activity; - private final String mimeType; - - public SaveFileTask(final Activity activity, final File source, final String mimeType, final File destination) { - this.activity = activity; - this.source = source; - this.mimeType = mimeType; - this.destination = destination; - } - - public static SaveFileTask saveImage(final Activity activity, final File source) { - final String mimeType = Utils.getImageMimeType(source); - final MimeTypeMap map = MimeTypeMap.getSingleton(); - final String extension = map.getExtensionFromMimeType(mimeType); - if (extension == null) return null; - final File pubDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); - final File saveDir = new File(pubDir, "Twidere"); - return new SaveFileTask(activity, source, mimeType, saveDir); - } - - public static File saveFile(final Context context, final File source, final String mimeType, final File destination) { - if (context == null && source == null) return null; - Source ioSrc = null; - BufferedSink sink = null; - try { - final String name = source.getName(); - if (isEmpty(name)) return null; - final MimeTypeMap map = MimeTypeMap.getSingleton(); - final String extension = map.getExtensionFromMimeType(mimeType); - if (extension == null) return null; - final String nameToSave = getFileNameWithExtension(name, extension); - if (!destination.isDirectory() && !destination.mkdirs()) return null; - final File saveFile = new File(destination, nameToSave); - ioSrc = Okio.source(source); - sink = Okio.buffer(Okio.sink(saveFile)); - sink.writeAll(ioSrc); - sink.flush(); - if (mimeType != null) { - MediaScannerConnection.scanFile(context, new String[]{saveFile.getPath()}, - new String[]{mimeType}, null); - } - return saveFile; - } catch (final IOException e) { - final int errno = Utils.getErrorNo(e.getCause()); - Log.w(LOGTAG, "Failed to save file", e); - return null; - } finally { - Utils.closeSilently(sink); - Utils.closeSilently(ioSrc); - } - } - - private static String getFileNameWithExtension(String name, String extension) { - int lastDotIdx = name.lastIndexOf('.'); - if (lastDotIdx < 0) return name + "." + extension; - return name.substring(0, lastDotIdx) + "." + extension; - } - - @Override - protected File doInBackground(final Object... args) { - if (source == null) return null; - return saveFile(activity, source, mimeType, destination); - } - - @Override - protected void onCancelled() { - final FragmentManager fm = activity.getFragmentManager(); - final DialogFragment fragment = (DialogFragment) fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG); - if (fragment != null && fragment.isVisible()) { - fragment.dismiss(); - } - super.onCancelled(); - } - - @Override - protected void onPostExecute(final File result) { - final FragmentManager fm = activity.getFragmentManager(); - final DialogFragment fragment = (DialogFragment) fm.findFragmentByTag(PROGRESS_FRAGMENT_TAG); - if (fragment != null) { - fragment.dismiss(); - } - super.onPostExecute(result); - if (result != null && result.exists()) { - Toast.makeText(activity, R.string.saved_to_gallery, Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(activity, R.string.error_occurred, Toast.LENGTH_SHORT).show(); - } - } - - @Override - protected void onPreExecute() { - final DialogFragment fragment = new ProgressDialogFragment(); - fragment.setCancelable(false); - fragment.show(activity.getFragmentManager(), PROGRESS_FRAGMENT_TAG); - super.onPreExecute(); - } - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java index 6a979cb92..12c15b496 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java @@ -34,7 +34,7 @@ import android.support.v4.view.ViewCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatDelegate; -import android.support.v7.app.AppCompatDelegateTrojan; +import android.support.v7.app.AppCompatDelegateAccessor; import android.support.v7.view.ContextThemeWrapper; import android.support.v7.widget.TwidereToolbar; import android.util.AttributeSet; @@ -257,13 +257,13 @@ public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory { Context actionBarContext = null; if (activity instanceof AppCompatActivity) { final AppCompatDelegate delegate = ((AppCompatActivity) activity).getDelegate(); - final ActionBar actionBar = AppCompatDelegateTrojan.peekActionBar(delegate); + final ActionBar actionBar = AppCompatDelegateAccessor.peekActionBar(delegate); if (actionBar != null) { actionBarContext = actionBar.getThemedContext(); } } else if (activity instanceof AppCompatPreferenceActivity) { final AppCompatDelegate delegate = ((AppCompatPreferenceActivity) activity).getDelegate(); - final ActionBar actionBar = AppCompatDelegateTrojan.peekActionBar(delegate); + final ActionBar actionBar = AppCompatDelegateAccessor.peekActionBar(delegate); if (actionBar != null) { actionBarContext = actionBar.getThemedContext(); } diff --git a/twidere/src/main/res/values-large/bools.xml b/twidere/src/main/res/values-large/bools.xml index 1f576d5b0..ad0b8c086 100644 --- a/twidere/src/main/res/values-large/bools.xml +++ b/twidere/src/main/res/values-large/bools.xml @@ -2,7 +2,6 @@ false - true false diff --git a/twidere/src/main/res/values/bools.xml b/twidere/src/main/res/values/bools.xml index abed40e43..c089f1397 100644 --- a/twidere/src/main/res/values/bools.xml +++ b/twidere/src/main/res/values/bools.xml @@ -3,7 +3,6 @@ false false - false true true false diff --git a/twidere/src/main/res/xml/file_paths.xml b/twidere/src/main/res/xml/file_paths.xml new file mode 100644 index 000000000..05bf2e3f7 --- /dev/null +++ b/twidere/src/main/res/xml/file_paths.xml @@ -0,0 +1,25 @@ + + + + + + \ No newline at end of file