added status view inside media viewer

improved media share
This commit is contained in:
Mariotaku Lee 2015-03-12 23:04:45 +08:00
parent 40a2e9a5b7
commit 0961ba2d44
14 changed files with 145 additions and 101 deletions

View File

@ -140,6 +140,7 @@ public interface IntentConstants {
public static final String EXTRA_IDS = "ids";
public static final String EXTRA_IS_SHARE = "is_share";
public static final String EXTRA_STATUS = "status";
public static final String EXTRA_MESSAGE = "message";
public static final String EXTRA_STATUS_JSON = "status_json";
public static final String EXTRA_STATUSES = "statuses";
public static final String EXTRA_DRAFT = "draft";

View File

@ -485,8 +485,20 @@ public class ComposeActivity extends ThemedActionBarActivity implements TextWatc
@Override
public void onLocationChanged(final Location location) {
if (mRecentLocation == null) {
mRecentLocation = location != null ? new ParcelableLocation(location) : null;
if (location != null) {
mRecentLocation = new ParcelableLocation(location);
} else {
mRecentLocation = null;
}
updateLocationText();
}
private void updateLocationText() {
if (mRecentLocation != null) {
mLocationText.setText(String.format("%.3f, %.3f", mRecentLocation.latitude,
mRecentLocation.longitude));
} else {
mLocationText.setText(R.string.unknown_location);
}
}
@ -1094,19 +1106,24 @@ public class ComposeActivity extends ThemedActionBarActivity implements TextWatc
mEditText.setError(getString(R.string.error_message_no_content));
return;
}
final boolean attach_location = mPreferences.getBoolean(KEY_ATTACH_LOCATION, false);
if (mRecentLocation == null && attach_location) {
final boolean attachLocation = mPreferences.getBoolean(KEY_ATTACH_LOCATION, false);
if (mRecentLocation == null && attachLocation) {
final Location location;
if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
} else {
location = null;
}
mRecentLocation = location != null ? new ParcelableLocation(location) : null;
if (location != null) {
mRecentLocation = new ParcelableLocation(location);
} else {
mRecentLocation = null;
}
updateLocationText();
}
final long[] accountIds = mAccountsAdapter.getSelectedAccountIds();
final boolean isQuote = INTENT_ACTION_QUOTE.equals(getIntent().getAction());
final ParcelableLocation statusLocation = attach_location ? mRecentLocation : null;
final ParcelableLocation statusLocation = attachLocation ? mRecentLocation : null;
final boolean linkToQuotedTweet = mPreferences.getBoolean(KEY_LINK_TO_QUOTED_TWEET, true);
final long inReplyToStatusId = !isQuote || linkToQuotedTweet ? mInReplyToStatusId : -1;
final boolean isPossiblySensitive = hasMedia && mIsPossiblySensitive;

View File

@ -23,13 +23,13 @@ import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.OnMenuVisibilityListener;
import android.support.v7.widget.ShareActionProvider;
import android.view.LayoutInflater;
import android.view.Menu;
@ -47,12 +47,14 @@ import com.diegocarloslima.byakugallery.lib.TileBitmapDrawable.OnInitializeListe
import org.apache.commons.lang3.ArrayUtils;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ComposeActivity.ViewStatusDialogFragment;
import org.mariotaku.twidere.adapter.support.SupportFixedFragmentStatePagerAdapter;
import org.mariotaku.twidere.fragment.support.BaseSupportFragment;
import org.mariotaku.twidere.loader.support.TileImageLoader;
import org.mariotaku.twidere.loader.support.TileImageLoader.DownloadListener;
import org.mariotaku.twidere.loader.support.TileImageLoader.Result;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.SaveImageTask;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
@ -71,6 +73,8 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement
private ViewPager mViewPager;
private MediaPagerAdapter mAdapter;
private ActionBar mActionBar;
private View mMediaStatusContainer;
@Override
public int getThemeColor() {
@ -112,6 +116,7 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement
public void onSupportContentChanged() {
super.onSupportContentChanged();
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mMediaStatusContainer = findViewById(R.id.media_status_container);
}
@Override
@ -133,6 +138,18 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement
if (currentIndex != -1) {
mViewPager.setCurrentItem(currentIndex, false);
}
if (intent.hasExtra(EXTRA_STATUS)) {
mMediaStatusContainer.setVisibility(View.VISIBLE);
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
final Fragment f = new ViewStatusDialogFragment();
final Bundle args = new Bundle();
args.putParcelable(EXTRA_STATUS, intent.getParcelableExtra(EXTRA_STATUS));
f.setArguments(args);
ft.replace(R.id.media_status, f);
ft.commit();
} else {
mMediaStatusContainer.setVisibility(View.GONE);
}
}
private boolean isBarShowing() {
@ -148,13 +165,17 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement
mActionBar.hide();
}
findViewById(R.id.media_status).setVisibility(visible ? View.VISIBLE : View.GONE);
mMediaStatusContainer.setVisibility(visible ? View.VISIBLE : View.GONE);
}
private void toggleBar() {
setBarVisibility(!isBarShowing());
}
public boolean hasStatus() {
return getIntent().hasExtra(EXTRA_STATUS);
}
public static final class ImagePageFragment extends BaseSupportFragment
implements DownloadListener, LoaderCallbacks<Result>, OnLayoutChangeListener, OnClickListener, ZoomListener {
@ -266,6 +287,12 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement
final Uri fileUri = Uri.fromFile(file);
intent.setDataAndType(fileUri, Utils.getImageMimeType(file));
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));
}
shareProvider.setShareIntent(intent);
}
}
@ -408,6 +435,10 @@ public final class MediaViewerActivity extends ThemedActionBarActivity implement
}
}
private ParcelableStatus getStatus() {
return getIntent().getParcelableExtra(EXTRA_STATUS);
}
private static class MediaPagerAdapter extends SupportFixedFragmentStatePagerAdapter {
private final MediaViewerActivity mActivity;

View File

@ -172,7 +172,7 @@ public class MessageConversationAdapter extends Adapter<ViewHolder>
case R.id.media_preview: {
final ParcelableDirectMessage message = getDirectMessage(position);
if (message == null || message.media == null) return;
openMedia(mContext, message.account_id, false, null, message.media);
openMedia(mContext, message.account_id, false, message, null, message.media);
}
}
}

View File

@ -28,6 +28,7 @@ import android.support.annotation.NonNull;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
@ -45,9 +46,10 @@ public class SensitiveContentWarningDialogFragment extends BaseSupportDialogFrag
if (args == null || context == null) return;
final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1);
final ParcelableMedia current = args.getParcelable(EXTRA_CURRENT_MEDIA);
final ParcelableStatus status = args.getParcelable(EXTRA_STATUS);
final ParcelableMedia[] media = Utils.newParcelableArray(args.getParcelableArray(EXTRA_MEDIA),
ParcelableMedia.CREATOR);
openMediaDirectly(context, accountId, current, media);
openMediaDirectly(context, accountId, status, current, media);
break;
}
}

View File

@ -288,7 +288,7 @@ public class StatusFragment extends BaseSupportFragment
public void onMediaClick(View view, ParcelableMedia media, long accountId) {
final ParcelableStatus status = mStatusAdapter.getStatus();
if (status == null) return;
Utils.openMediaDirectly(getActivity(), accountId, media, status.media);
Utils.openMediaDirectly(getActivity(), accountId, status, media, status.media);
//spice
SpiceProfilingUtil.log(getActivity(),
status.id + ",Clicked," + accountId + "," + status.user_id + "," + status.text_plain.length() + "," + media.media_url + "," + TypeMapingUtil.getMediaType(media.type) + "," + status.timestamp);

View File

@ -35,7 +35,7 @@ public class StatusLinkClickHandler extends OnLinkClickHandler {
protected void openMedia(long account_id, boolean sensitive, String link, int start, int end) {
final ParcelableStatus status = mStatus;
final ParcelableMedia current = findByLink(status.media, link);
Utils.openMedia(context, account_id, sensitive, current, status.media);
Utils.openMedia(context, account_id, sensitive, status, current, status.media);
}
private ParcelableMedia findByLink(ParcelableMedia[] media, String link) {

View File

@ -1094,19 +1094,25 @@ public final class Utils implements Constants, TwitterConstants {
public static Intent createStatusShareIntent(final Context context, final ParcelableStatus status) {
final Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
final String timeString = formatToLongTimeString(context, status.timestamp);
final String link = String.format(Locale.ROOT, "https://twitter.com/%s/status/%d",
status.user_screen_name, status.id);
final String text = context.getString(R.string.status_share_text_format_with_link,
status.text_plain, link);
final String subject = context.getString(R.string.status_share_subject_format_with_time,
status.user_name, status.user_screen_name, timeString);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, text);
intent.putExtra(Intent.EXTRA_SUBJECT, getStatusShareText(context, status));
intent.putExtra(Intent.EXTRA_TEXT, getStatusShareSubject(context, status));
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
return intent;
}
public static String getStatusShareText(final Context context, final ParcelableStatus status) {
final String link = String.format(Locale.ROOT, "https://twitter.com/%s/status/%d",
status.user_screen_name, status.id);
return context.getString(R.string.status_share_text_format_with_link,
status.text_plain, link);
}
public static String getStatusShareSubject(final Context context, ParcelableStatus status) {
final String timeString = formatToLongTimeString(context, status.timestamp);
return context.getString(R.string.status_share_subject_format_with_time,
status.user_name, status.user_screen_name, timeString);
}
public static Intent createTakePhotoIntent(final Uri uri) {
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
@ -2925,6 +2931,24 @@ public final class Utils implements Constants, TwitterConstants {
}
public static void openMedia(final Context context, final long accountId, final boolean isPossiblySensitive,
final ParcelableDirectMessage message, final ParcelableMedia current,
final ParcelableMedia[] media) {
openMedia(context, accountId, isPossiblySensitive, null, message, current, media);
}
public static void openMedia(final Context context, final long accountId, final boolean isPossiblySensitive,
final ParcelableStatus status, final ParcelableMedia current,
final ParcelableMedia[] media) {
openMedia(context, accountId, isPossiblySensitive, status, null, current, media);
}
public static void openMedia(final Context context, final long accountId, final boolean isPossiblySensitive,
final ParcelableMedia current, final ParcelableMedia[] media) {
openMedia(context, accountId, isPossiblySensitive, null, null, current, media);
}
public static void openMedia(final Context context, final long accountId, final boolean isPossiblySensitive,
final ParcelableStatus status, final ParcelableDirectMessage message,
final ParcelableMedia current, final ParcelableMedia[] media) {
if (context == null || media == null) return;
final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
@ -2936,11 +2960,13 @@ public final class Utils implements Constants, TwitterConstants {
final Bundle args = new Bundle();
args.putLong(EXTRA_ACCOUNT_ID, accountId);
args.putParcelable(EXTRA_CURRENT_MEDIA, current);
args.putParcelable(EXTRA_STATUS, status);
args.putParcelable(EXTRA_MESSAGE, message);
args.putParcelableArray(EXTRA_MEDIA, media);
fragment.setArguments(args);
fragment.show(fm, "sensitive_content_warning");
} else {
openMediaDirectly(context, accountId, current, media);
openMediaDirectly(context, accountId, status, message, current, media);
}
}
@ -2952,13 +2978,28 @@ public final class Utils implements Constants, TwitterConstants {
return result;
}
public static void openMediaDirectly(final Context context, final long accountId,
final ParcelableStatus status, final ParcelableMedia current,
final ParcelableMedia[] media) {
openMediaDirectly(context, accountId, status, null, current, media);
}
public static void openMediaDirectly(final Context context, final long accountId,
final ParcelableDirectMessage message, final ParcelableMedia current,
final ParcelableMedia[] media) {
openMediaDirectly(context, accountId, null, message, current, media);
}
public static void openMediaDirectly(final Context context, final long accountId,
final ParcelableStatus status, final ParcelableDirectMessage message,
final ParcelableMedia current, final ParcelableMedia[] media) {
if (context == null || media == null) return;
final Intent intent = new Intent(INTENT_ACTION_VIEW_MEDIA);
intent.putExtra(EXTRA_ACCOUNT_ID, accountId);
intent.putExtra(EXTRA_CURRENT_MEDIA, current);
intent.putExtra(EXTRA_MEDIA, media);
intent.putExtra(EXTRA_STATUS, status);
intent.setClass(context, MediaViewerActivity.class);
context.startActivity(intent);
}

View File

@ -37,6 +37,9 @@ import twitter4j.TranslationResult;
import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
/**
*
* IDE gives me warning if I don't change default comment, so I write this XD
*
* Created by mariotaku on 14/11/19.
*/
public class StatusViewHolder extends RecyclerView.ViewHolder implements OnClickListener {

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<android.support.v7.widget.ActionMenuView
android:id="@+id/menu_bar"
style="?android:actionBarSplitStyle"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?android:actionBarSize"/>

View File

@ -22,19 +22,31 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
tools:menu="menu_media_viewer_image_page"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:animateLayoutChanges="true"
tools:menu="menu_media_viewer_image_page">
<org.mariotaku.twidere.view.MediaViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<View
android:id="@+id/media_status"
android:layout_gravity="bottom"
<LinearLayout
android:id="@+id/media_status_container"
android:layout_width="match_parent"
android:layout_height="128dp"
android:background="#f00"/>
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/element_spacing_small"
android:background="@drawable/shadow_top"/>
<FrameLayout
android:id="@+id/media_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#80000000"/>
</LinearLayout>
</FrameLayout>

View File

@ -30,7 +30,8 @@
android:layout_height="wrap_content"
android:background="?android:selectableItemBackground"
android:orientation="vertical"
android:paddingTop="@dimen/element_spacing_small">
android:paddingTop="@dimen/element_spacing_small"
app:ignorePadding="true">
<Space
android:id="@+id/reply_retweet_space"
@ -198,11 +199,11 @@
<LinearLayout
android:layout_below="@+id/text"
android:layout_alignLeft="@+id/profile_container"
android:id="@+id/action_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/profile_container"
android:layout_below="@+id/text"
android:gravity="center_vertical|left"
android:orientation="horizontal">
@ -247,13 +248,13 @@
<org.mariotaku.twidere.view.ActionIconView
android:id="@+id/extra_type"
android:layout_width="@dimen/element_size_small"
android:layout_below="@+id/text"
android:layout_height="@dimen/element_size_small"
android:layout_gravity="center|right"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:layout_alignBottom="@+id/action_buttons"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/action_buttons"
android:layout_alignBottom="@+id/action_buttons"
android:layout_below="@+id/text"
android:layout_gravity="center|right"
android:layout_marginLeft="@dimen/element_spacing_normal"
android:layout_marginRight="@dimen/element_spacing_normal"
android:layout_weight="0"
android:color="?android:textColorSecondary"

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ 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 <http://www.gnu.org/licenses/>.
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<com.diegocarloslima.byakugallery.lib.TouchImageView
android:id="@+id/image_viewer"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="32dp"/>
<org.mariotaku.twidere.view.ActionBarSplitThemedContainer
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout="@layout/activity_image_viewer_bottombar"/>
</merge>

View File

@ -725,5 +725,6 @@
<string name="usage_statistics">Usage statistics</string>
<string name="research_ucdavis_earlybird">UCDavis Earlybird</string>
<string name="research_tsinghua_spice">Tsinghua Spice</string>
<string name="unknown_location">Unknown location</string>
</resources>