fixed activity unread count
This commit is contained in:
parent
e2c79d7438
commit
0db5471e03
|
@ -45,7 +45,7 @@ dependencies {
|
|||
compile 'org.apache.commons:commons-lang3:3.4'
|
||||
compile 'com.github.mariotaku.RestFu:library:0.9.8'
|
||||
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'
|
||||
compile 'com.github.mariotaku.SQLiteQB:library:0.9.2'
|
||||
compile 'com.github.mariotaku.SQLiteQB:library:0.9.3'
|
||||
compile 'com.github.mariotaku.ObjectCursor:core:0.9.3'
|
||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ buildscript {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'io.fabric.tools:gradle:1.+'
|
||||
classpath 'io.fabric.tools:gradle:1.21.2'
|
||||
}
|
||||
}
|
||||
import fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask
|
||||
|
@ -44,12 +44,14 @@ android {
|
|||
debug {
|
||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm")
|
||||
versionNameSuffix String.format(" (dev %s)", format.format(new Date()))
|
||||
resValue("bool", "debug", "true")
|
||||
}
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd")
|
||||
versionNameSuffix String.format(" (dev %s)", format.format(new Date()))
|
||||
resValue("bool", "debug", "false")
|
||||
}
|
||||
}
|
||||
sourceSets {
|
||||
|
@ -100,7 +102,7 @@ dependencies {
|
|||
compile 'commons-primitives:commons-primitives:1.0'
|
||||
compile 'com.bluelinelabs:logansquare:1.3.4'
|
||||
compile 'org.jraf:android-switch-backport:2.0.1'
|
||||
compile 'com.github.FasterXML:jackson-jr-trees:5baf62567e'
|
||||
compile 'com.github.mariotaku:jackson-jr-trees:7fe682ee09'
|
||||
compile 'com.makeramen:roundedimageview:2.1.1'
|
||||
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
|
||||
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'
|
||||
|
|
|
@ -949,7 +949,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
|||
result.put(spec, DataStoreUtils.getStatusesCount(mContext, Statuses.CONTENT_URI, position, accountIds));
|
||||
break;
|
||||
}
|
||||
case TAB_TYPE_NOTIFICATIONS_TIMELINE: {
|
||||
case TAB_TYPE_ACTIVITIES_ABOUT_ME: {
|
||||
final long[] accountIds = Utils.getAccountIds(spec.args);
|
||||
final String tagWithAccounts = Utils.getReadPositionTagWithAccounts(mContext, true, spec.tag, accountIds);
|
||||
final long position = mReadStateManager.getPosition(tagWithAccounts);
|
||||
|
|
|
@ -20,12 +20,14 @@ import android.Manifest;
|
|||
import android.app.Activity;
|
||||
import android.app.DialogFragment;
|
||||
import android.app.FragmentManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.media.MediaPlayer.OnCompletionListener;
|
||||
import android.media.MediaPlayer.OnErrorListener;
|
||||
import android.media.MediaPlayer.OnPreparedListener;
|
||||
import android.media.MediaScannerConnection;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask.Status;
|
||||
import android.os.Build;
|
||||
|
@ -890,7 +892,15 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements
|
|||
new SaveFileTask.StringMimeTypeCallback(mimeType)) {
|
||||
@Override
|
||||
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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -985,20 +995,6 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements
|
|||
MenuUtils.setMenuItemAvailability(menu, R.id.refresh, !hasVideo && !isLoading);
|
||||
MenuUtils.setMenuItemAvailability(menu, R.id.share, hasVideo && !isLoading);
|
||||
MenuUtils.setMenuItemAvailability(menu, R.id.save, hasVideo && !isLoading);
|
||||
if (!hasVideo) return;
|
||||
final MenuItem shareItem = menu.findItem(R.id.share);
|
||||
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()) {
|
||||
final ParcelableStatus status = activity.getStatus();
|
||||
intent.putExtra(Intent.EXTRA_TEXT, Utils.getStatusShareText(activity, status));
|
||||
intent.putExtra(Intent.EXTRA_SUBJECT, Utils.getStatusShareSubject(activity, status));
|
||||
}
|
||||
shareItem.setIntent(Intent.createChooser(intent, getString(R.string.share)));
|
||||
}
|
||||
|
||||
|
||||
|
@ -1019,6 +1015,21 @@ public final class MediaViewerActivity extends BaseAppCompatActivity implements
|
|||
loadVideo(true);
|
||||
return true;
|
||||
}
|
||||
case R.id.share: {
|
||||
if (mVideoFile == null || mVideoUrlAndType == null) return true;
|
||||
final Intent intent = new Intent(Intent.ACTION_SEND);
|
||||
final Uri fileUri = Uri.fromFile(mVideoFile);
|
||||
intent.setDataAndType(fileUri, mVideoUrlAndType.second);
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
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));
|
||||
}
|
||||
Intent.createChooser(intent, getString(R.string.share));
|
||||
}
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
|
|
@ -340,7 +340,9 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
|
|||
|
||||
protected abstract void bindTitleSummaryViewHolder(ActivityTitleSummaryViewHolder holder, int position);
|
||||
|
||||
protected abstract String getActivityAction(int position);
|
||||
public abstract String getActivityAction(int position);
|
||||
|
||||
public abstract long getTimestamp(int position);
|
||||
|
||||
@Override
|
||||
public boolean isMediaPreviewEnabled() {
|
||||
|
@ -364,6 +366,10 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
|
|||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public boolean isActivity(int position) {
|
||||
return position < getActivityCount();
|
||||
}
|
||||
|
||||
|
||||
public interface ActivityAdapterListener {
|
||||
void onGapClick(GapViewHolder holder, int position);
|
||||
|
|
|
@ -21,7 +21,9 @@ package org.mariotaku.twidere.adapter;
|
|||
|
||||
import android.content.Context;
|
||||
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor;
|
||||
import org.mariotaku.twidere.model.ParcelableActivity;
|
||||
import org.mariotaku.twidere.model.ParcelableActivityCursorIndices;
|
||||
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -46,10 +48,23 @@ public class ParcelableActivitiesAdapter extends AbsActivitiesAdapter<List<Parce
|
|||
|
||||
|
||||
@Override
|
||||
protected String getActivityAction(int position) {
|
||||
public String getActivityAction(int position) {
|
||||
if (mData instanceof ObjectCursor) {
|
||||
final ParcelableActivityCursorIndices indices = (ParcelableActivityCursorIndices) ((ObjectCursor) mData).getIndices();
|
||||
return ((ObjectCursor) mData).getCursor(position).getString(indices.action);
|
||||
}
|
||||
return mData.get(position).action;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTimestamp(int position) {
|
||||
if (mData instanceof ObjectCursor) {
|
||||
final ParcelableActivityCursorIndices indices = (ParcelableActivityCursorIndices) ((ObjectCursor) mData).getIndices();
|
||||
return ((ObjectCursor) mData).getCursor(position).getLong(indices.timestamp);
|
||||
}
|
||||
return mData.get(position).timestamp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParcelableActivity getActivity(int position) {
|
||||
if (position == getActivityCount()) return null;
|
||||
|
|
|
@ -23,7 +23,7 @@ import android.util.Log;
|
|||
|
||||
import com.bluelinelabs.logansquare.LoganSquare;
|
||||
import com.fasterxml.jackson.core.TreeNode;
|
||||
import com.fasterxml.jackson.simple.tree.SimpleTreeCodec;
|
||||
import com.fasterxml.jackson.jr.tree.JacksonJrSimpleTreeCodec;
|
||||
|
||||
import org.mariotaku.restfu.callback.RawCallback;
|
||||
import org.mariotaku.restfu.http.RestHttpResponse;
|
||||
|
@ -56,7 +56,7 @@ public abstract class UserStreamCallback implements RawCallback {
|
|||
onException(cause);
|
||||
return;
|
||||
}
|
||||
final SimpleTreeCodec mapper = new SimpleTreeCodec();
|
||||
final JacksonJrSimpleTreeCodec mapper = new JacksonJrSimpleTreeCodec();
|
||||
final CRLFLineReader reader = new CRLFLineReader(new InputStreamReader(response.getBody().stream(), "UTF-8"));
|
||||
try {
|
||||
for (String line; (line = reader.readLine()) != null && !disconnected; ) {
|
||||
|
|
|
@ -183,7 +183,7 @@ public class TwidereApplication extends MultiDexApplication implements Constants
|
|||
|
||||
private void initBugReport() {
|
||||
final SharedPreferences preferences = getSharedPreferences();
|
||||
if (!preferences.getBoolean(KEY_BUG_REPORTS, true)) return;
|
||||
if (!preferences.getBoolean(KEY_BUG_REPORTS, BuildConfig.DEBUG)) return;
|
||||
BugReporter.setImplementation(new TwidereBugReporter());
|
||||
BugReporter.init(this);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,6 @@ import com.squareup.otto.Subscribe;
|
|||
import org.mariotaku.twidere.R;
|
||||
import org.mariotaku.twidere.adapter.AbsActivitiesAdapter;
|
||||
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
|
||||
import org.mariotaku.twidere.api.twitter.model.Activity;
|
||||
import org.mariotaku.twidere.loader.iface.IExtendedLoader;
|
||||
import org.mariotaku.twidere.model.ParcelableActivity;
|
||||
import org.mariotaku.twidere.model.ParcelableMedia;
|
||||
|
@ -61,8 +60,10 @@ import org.mariotaku.twidere.view.holder.GapViewHolder;
|
|||
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import edu.tsinghua.hotmobi.HotMobiLogger;
|
||||
import edu.tsinghua.hotmobi.model.MediaEvent;
|
||||
|
@ -76,7 +77,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
private final OnScrollListener mHotMobiScrollTracker = new OnScrollListener() {
|
||||
|
||||
public List<ScrollRecord> mRecords;
|
||||
private long mFirstVisibleId = -1, mFirstVisibleAccountId = -1;
|
||||
private long mFirstVisibleTimestamp = -1, mFirstVisibleAccountId = -1;
|
||||
private int mFirstVisiblePosition = -1;
|
||||
private int mScrollState;
|
||||
|
||||
|
@ -89,15 +90,15 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
final AbsActivitiesAdapter<Data> adapter = (AbsActivitiesAdapter<Data>) recyclerView.getAdapter();
|
||||
final ParcelableActivity activity = adapter.getActivity(firstVisiblePosition);
|
||||
if (activity != null) {
|
||||
// final long id = activity.id, accountId = activity.account_id;
|
||||
// if (id != mFirstVisibleId || accountId != mFirstVisibleAccountId) {
|
||||
// if (mRecords == null) mRecords = new ArrayList<>();
|
||||
// final long time = System.currentTimeMillis();
|
||||
// mRecords.add(ScrollRecord.create(id, accountId, time,
|
||||
// TimeZone.getDefault().getOffset(time), mScrollState));
|
||||
// }
|
||||
// mFirstVisibleId = id;
|
||||
// mFirstVisibleAccountId = accountId;
|
||||
final long timestamp = activity.timestamp, accountId = activity.account_id;
|
||||
if (timestamp != mFirstVisibleTimestamp || accountId != mFirstVisibleAccountId) {
|
||||
if (mRecords == null) mRecords = new ArrayList<>();
|
||||
final long time = System.currentTimeMillis();
|
||||
mRecords.add(ScrollRecord.create(timestamp, accountId, time,
|
||||
TimeZone.getDefault().getOffset(time), mScrollState));
|
||||
}
|
||||
mFirstVisibleTimestamp = timestamp;
|
||||
mFirstVisibleAccountId = accountId;
|
||||
}
|
||||
}
|
||||
mFirstVisiblePosition = firstVisiblePosition;
|
||||
|
@ -256,7 +257,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
lastVisiblePos = layoutManager.findFirstVisibleItemPosition();
|
||||
}
|
||||
if (lastVisiblePos != RecyclerView.NO_POSITION && lastVisiblePos < adapter.getItemCount()) {
|
||||
// lastReadId = adapter.getStatusId(lastVisiblePos);
|
||||
lastReadId = adapter.getTimestamp(lastVisiblePos);
|
||||
final View positionView = layoutManager.findViewByPosition(lastVisiblePos);
|
||||
lastVisibleTop = positionView != null ? positionView.getTop() : 0;
|
||||
} else if (rememberPosition && tag != null) {
|
||||
|
@ -271,20 +272,20 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
if (!(loader instanceof IExtendedLoader) || ((IExtendedLoader) loader).isFromUser()) {
|
||||
adapter.setLoadMoreSupported(hasMoreData(data));
|
||||
int pos = -1;
|
||||
// for (int i = 0, j = adapter.getItemCount(); i < j; i++) {
|
||||
// if (lastReadId != -1 && lastReadId == adapter.getStatusId(i)) {
|
||||
// pos = i;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if (pos != -1 && adapter.isStatus(pos) && (readFromBottom || lastVisiblePos != 0)) {
|
||||
// if (layoutManager.getHeight() == 0) {
|
||||
// // RecyclerView has not currently laid out, ignore padding.
|
||||
// layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop);
|
||||
// } else {
|
||||
// layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop - layoutManager.getPaddingTop());
|
||||
// }
|
||||
// }
|
||||
for (int i = 0, j = adapter.getItemCount(); i < j; i++) {
|
||||
if (lastReadId != -1 && lastReadId == adapter.getTimestamp(i)) {
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (pos != -1 && adapter.isActivity(pos) && (readFromBottom || lastVisiblePos != 0)) {
|
||||
if (layoutManager.getHeight() == 0) {
|
||||
// RecyclerView has not currently laid out, ignore padding.
|
||||
layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop);
|
||||
} else {
|
||||
layoutManager.scrollToPositionWithOffset(pos, lastVisibleTop - layoutManager.getPaddingTop());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (loader instanceof IExtendedLoader) {
|
||||
((IExtendedLoader) loader).setFromUser(false);
|
||||
|
|
|
@ -176,18 +176,11 @@ public class CustomTabUtils implements Constants {
|
|||
@Nullable
|
||||
private static String getTagByType(@NonNull String tabType) {
|
||||
switch (getTabTypeAlias(tabType)) {
|
||||
case TAB_TYPE_HOME_TIMELINE: {
|
||||
return TAB_TYPE_HOME_TIMELINE;
|
||||
}
|
||||
case "mentions_timeline": {
|
||||
return "mentions_timeline";
|
||||
}
|
||||
case TAB_TYPE_NOTIFICATIONS_TIMELINE: {
|
||||
return TAB_TYPE_NOTIFICATIONS_TIMELINE;
|
||||
}
|
||||
case TAB_TYPE_DIRECT_MESSAGES: {
|
||||
return TAB_TYPE_DIRECT_MESSAGES;
|
||||
}
|
||||
case TAB_TYPE_HOME_TIMELINE:
|
||||
case TAB_TYPE_NOTIFICATIONS_TIMELINE:
|
||||
case TAB_TYPE_ACTIVITIES_ABOUT_ME:
|
||||
case TAB_TYPE_DIRECT_MESSAGES:
|
||||
return tabType;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -49,7 +49,6 @@ public class TwidereBugReporter extends BugReporter implements Constants {
|
|||
if (BuildConfig.DEBUG) {
|
||||
Log.w(LOGTAG, message, throwable);
|
||||
}
|
||||
|
||||
handleSilentException(new Exception(message, throwable));
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
android:title="@string/usage_statistics"/>
|
||||
|
||||
<org.mariotaku.twidere.preference.AutoFixCheckBoxPreference
|
||||
android:defaultValue="true"
|
||||
android:defaultValue="@bool/debug"
|
||||
android:key="bug_reports"
|
||||
android:order="12"
|
||||
android:summary="@string/bug_reports_summary"
|
||||
|
|
Loading…
Reference in New Issue