OSDN Git Service

SetInitialUnreadStateメソッドをTwitterPostFactoryクラスに移動
authorKimura Youichi <kim.upsilon@bucyou.net>
Sat, 4 May 2024 15:32:05 +0000 (00:32 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 4 May 2024 15:33:08 +0000 (00:33 +0900)
OpenTween.Tests/Api/GraphQL/TimelineTweetTest.cs
OpenTween.Tests/Models/TwitterPostFactoryTest.cs
OpenTween/Models/TwitterPostFactory.cs
OpenTween/SocialProtocol/Twitter/TwitterAccount.cs
OpenTween/Twitter.cs

index a4ccdac..38e6ace 100644 (file)
@@ -72,8 +72,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_SimpleTweet.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1613784711020826626", post.StatusId.Id);
             Assert.Equal(40480664L, post.UserId);
@@ -86,8 +86,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_TweetWithMedia.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1614587968567783424", post.StatusId.Id);
             Assert.Equal(40480664L, post.UserId);
@@ -104,8 +104,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_RetweetedTweet.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1617128268548964354", post.StatusId.Id);
             Assert.Equal(40480664L, post.RetweetedByUserId);
@@ -119,8 +119,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_TweetWithVisibility.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1602775353088524288", post.StatusId.Id);
             Assert.Equal(357750891L, post.UserId);
@@ -132,8 +132,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_SelfThread.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1511751702684499968", post.StatusId.Id);
             Assert.Equal(40480664L, post.UserId);
@@ -145,8 +145,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_QuotedTweet.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1588614645866147840", post.StatusId.Id);
             var quotedPostId = Assert.Single(post.QuoteStatusIds);
@@ -159,8 +159,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_QuotedTweet_Tombstone.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1614653321310253057", post.StatusId.Id);
             var quotedPostId = Assert.Single(post.QuoteStatusIds);
@@ -173,8 +173,8 @@ namespace OpenTween.Api.GraphQL
             var rootElm = this.LoadResponseDocument("TimelineTweet_PromotedTweet.json");
             var timelineTweet = new TimelineTweet(rootElm);
             var status = timelineTweet.ToTwitterStatus();
-            var postFactory = new TwitterPostFactory(this.CreateTabInfo());
-            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>());
+            var postFactory = new TwitterPostFactory(this.CreateTabInfo(), new());
+            var post = postFactory.CreateFromStatus(status, selfUserId: 1L, new HashSet<long>(), firstLoad: false);
 
             Assert.Equal("1674737917363888129", post.StatusId.Id);
             Assert.Equal(2941313791L, post.UserId);
index 6a31f01..9c74484 100644 (file)
@@ -72,9 +72,9 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_Test()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
             var status = this.CreateStatus();
-            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet, firstLoad: false);
 
             Assert.Equal(new TwitterStatusId(status.IdStr), post.StatusId);
             Assert.Equal(new DateTimeUtc(2022, 1, 1, 0, 0, 0), post.CreatedAt);
@@ -114,15 +114,17 @@ namespace OpenTween.Models
             Assert.False(post.IsProtect);
             Assert.False(post.IsOwl);
             Assert.False(post.IsMe);
+
+            Assert.False(post.IsRead);
         }
 
         [Fact]
         public void CreateFromStatus_AuthorTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
             var status = this.CreateStatus();
             var selfUserId = status.User.Id;
-            var post = factory.CreateFromStatus(status, selfUserId, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(status, selfUserId, followerIds: EmptyIdSet, firstLoad: false);
 
             Assert.True(post.IsMe);
         }
@@ -130,10 +132,10 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_FollowerTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
             var status = this.CreateStatus();
             var followerIds = new HashSet<long> { status.User.Id };
-            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds);
+            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds, firstLoad: false);
 
             Assert.False(post.IsOwl);
         }
@@ -141,10 +143,10 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_NotFollowerTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
             var status = this.CreateStatus();
             var followerIds = new HashSet<long> { 30000L };
-            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds);
+            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds, firstLoad: false);
 
             Assert.True(post.IsOwl);
         }
@@ -152,14 +154,14 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_RetweetTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
             var originalStatus = this.CreateStatus();
 
             var retweetStatus = this.CreateStatus();
             retweetStatus.RetweetedStatus = originalStatus;
             retweetStatus.Source = """<a href="https://mobile.twitter.com" rel="nofollow">Twitter Web App</a>""";
 
-            var post = factory.CreateFromStatus(retweetStatus, selfUserId: 20000L, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(retweetStatus, selfUserId: 20000L, followerIds: EmptyIdSet, firstLoad: false);
 
             Assert.Equal(new TwitterStatusId(retweetStatus.IdStr), post.StatusId);
             Assert.Equal(retweetStatus.User.Id, post.RetweetedByUserId);
@@ -170,6 +172,68 @@ namespace OpenTween.Models
             Assert.Equal("https://www.opentween.org/", post.SourceUri?.OriginalString);
         }
 
+        [Fact]
+        public void CreateFromStatus_FirstLoadNotUnreadTest()
+        {
+            var settingCommon = new SettingCommon
+            {
+                Read = true, // 起動時の読み込み分を既読扱いにする
+            };
+
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), settingCommon);
+            var status = this.CreateStatus();
+            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet, firstLoad: true);
+
+            Assert.True(post.IsRead); // 既読
+        }
+
+        [Fact]
+        public void CreateFromStatus_FirstLoadUnreadTest()
+        {
+            var settingCommon = new SettingCommon
+            {
+                Read = false, // 起動時の読み込み分を既読扱いにしない
+            };
+
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), settingCommon);
+            var status = this.CreateStatus();
+            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet, firstLoad: true);
+
+            Assert.False(post.IsRead); // 未読
+        }
+
+        [Fact]
+        public void CreateFromStatus_SelfPostUnreadTest()
+        {
+            var settingCommon = new SettingCommon
+            {
+                ReadOwnPost = false, // 自分自身の発言を既読扱いにしない
+            };
+
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), settingCommon);
+            var status = this.CreateStatus();
+            status.User.Id = 20000L;
+            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet, firstLoad: false);
+
+            Assert.False(post.IsRead); // 未読
+        }
+
+        [Fact]
+        public void CreateFromStatus_SelfPostNotUnreadTest()
+        {
+            var settingCommon = new SettingCommon
+            {
+                ReadOwnPost = true, // 自分自身の発言を既読扱いにする
+            };
+
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), settingCommon);
+            var status = this.CreateStatus();
+            status.User.Id = 20000L;
+            var post = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet, firstLoad: false);
+
+            Assert.True(post.IsRead); // 既読
+        }
+
         private TwitterMessageEvent CreateDirectMessage(string senderId, string recipientId)
         {
             var messageId = this.random.Next(10000);
@@ -212,7 +276,7 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromDirectMessageEvent_Test()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
 
             var selfUser = this.CreateUser();
             var otherUser = this.CreateUser();
@@ -223,7 +287,7 @@ namespace OpenTween.Models
                 [otherUser.IdStr] = otherUser,
             };
             var apps = this.CreateApps();
-            var post = factory.CreateFromDirectMessageEvent(eventItem, users, apps, selfUserId: selfUser.Id);
+            var post = factory.CreateFromDirectMessageEvent(eventItem, users, apps, selfUserId: selfUser.Id, firstLoad: false);
 
             Assert.Equal(new TwitterDirectMessageId(eventItem.Id), post.StatusId);
             Assert.Equal(new DateTimeUtc(2022, 1, 1, 0, 0, 0), post.CreatedAt);
@@ -263,12 +327,14 @@ namespace OpenTween.Models
             Assert.False(post.IsProtect);
             Assert.True(post.IsOwl);
             Assert.False(post.IsMe);
+
+            Assert.False(post.IsRead);
         }
 
         [Fact]
         public void CreateFromDirectMessageEvent_SenderTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
 
             var selfUser = this.CreateUser();
             var otherUser = this.CreateUser();
@@ -279,7 +345,7 @@ namespace OpenTween.Models
                 [otherUser.IdStr] = otherUser,
             };
             var apps = this.CreateApps();
-            var post = factory.CreateFromDirectMessageEvent(eventItem, users, apps, selfUserId: selfUser.Id);
+            var post = factory.CreateFromDirectMessageEvent(eventItem, users, apps, selfUserId: selfUser.Id, firstLoad: false);
 
             Assert.Equal(otherUser.Id, post.UserId);
             Assert.False(post.IsOwl);
@@ -289,7 +355,7 @@ namespace OpenTween.Models
         [Fact]
         public void GetReceivedHashtags_Test()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
             var status = this.CreateStatus();
             status.FullText = "hoge #OpenTween";
             status.Entities.Hashtags = new[]
@@ -301,7 +367,7 @@ namespace OpenTween.Models
                 },
             };
 
-            _ = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet);
+            _ = factory.CreateFromStatus(status, selfUserId: 20000L, followerIds: EmptyIdSet, firstLoad: false);
 
             Assert.Equal(new[] { "#OpenTween" }, factory.GetReceivedHashtags());
             Assert.Empty(factory.GetReceivedHashtags());
@@ -310,7 +376,7 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_MediaAltTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
 
             var status = this.CreateStatus();
             status.FullText = "https://t.co/hoge";
@@ -329,7 +395,7 @@ namespace OpenTween.Models
                 },
             };
 
-            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet, firstLoad: false);
 
             var accessibleText = string.Format(Properties.Resources.ImageAltText, "代替テキスト");
             Assert.Equal(accessibleText, post.AccessibleText);
@@ -341,7 +407,7 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_MediaNoAltTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
 
             var status = this.CreateStatus();
             status.FullText = "https://t.co/hoge";
@@ -360,7 +426,7 @@ namespace OpenTween.Models
                 },
             };
 
-            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet, firstLoad: false);
 
             Assert.Equal("pic.twitter.com/hoge", post.AccessibleText);
             Assert.Equal("""<a href="https://t.co/hoge" title="https://twitter.com/hoge/status/1234567890/photo/1">pic.twitter.com/hoge</a>""", post.Text);
@@ -371,7 +437,7 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_QuotedUrlTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
 
             var status = this.CreateStatus();
             status.FullText = "https://t.co/hoge";
@@ -401,7 +467,7 @@ namespace OpenTween.Models
                 FullText = "test",
             };
 
-            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet, firstLoad: false);
 
             var accessibleText = string.Format(Properties.Resources.QuoteStatus_AccessibleText, "foo", "test");
             Assert.Equal(accessibleText, post.AccessibleText);
@@ -413,7 +479,7 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_QuotedUrlWithPermelinkTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
 
             var status = this.CreateStatus();
             status.FullText = "hoge";
@@ -436,7 +502,7 @@ namespace OpenTween.Models
                 Expanded = "https://twitter.com/hoge/status/1234567890",
             };
 
-            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet, firstLoad: false);
 
             var accessibleText = "hoge " + string.Format(Properties.Resources.QuoteStatus_AccessibleText, "foo", "test");
             Assert.Equal(accessibleText, post.AccessibleText);
@@ -448,7 +514,7 @@ namespace OpenTween.Models
         [Fact]
         public void CreateFromStatus_QuotedUrlNoReferenceTest()
         {
-            var factory = new TwitterPostFactory(this.CreateTabinfo());
+            var factory = new TwitterPostFactory(this.CreateTabinfo(), new());
 
             var status = this.CreateStatus();
             status.FullText = "https://t.co/hoge";
@@ -467,7 +533,7 @@ namespace OpenTween.Models
             };
             status.QuotedStatus = null;
 
-            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet);
+            var post = factory.CreateFromStatus(status, selfUserId: 100L, followerIds: EmptyIdSet, firstLoad: false);
 
             var accessibleText = "twitter.com/hoge/status/1…";
             Assert.Equal(accessibleText, post.AccessibleText);
index b540d2a..5a4efce 100644 (file)
@@ -28,6 +28,7 @@ using System.Linq;
 using System.Net;
 using System.Text.RegularExpressions;
 using OpenTween.Api.DataModel;
+using OpenTween.Setting;
 
 namespace OpenTween.Models
 {
@@ -36,10 +37,14 @@ namespace OpenTween.Models
         private static readonly Uri SourceUriBase = new("https://twitter.com/");
 
         private readonly TabInformations tabinfo;
+        private readonly SettingCommon settingCommon;
         private readonly HashSet<string> receivedHashTags = new();
 
-        public TwitterPostFactory(TabInformations tabinfo)
-            => this.tabinfo = tabinfo;
+        public TwitterPostFactory(TabInformations tabinfo, SettingCommon settingCommon)
+        {
+            this.tabinfo = tabinfo;
+            this.settingCommon = settingCommon;
+        }
 
         public string[] GetReceivedHashtags()
         {
@@ -55,6 +60,7 @@ namespace OpenTween.Models
             TwitterStatus status,
             long selfUserId,
             ISet<long> followerIds,
+            bool firstLoad,
             bool favTweet = false
         )
         {
@@ -189,6 +195,8 @@ namespace OpenTween.Models
                 // retweeterUser から生成
                 RetweetedBy = retweeterUser != null ? string.Intern(retweeterUser.ScreenName) : null,
                 RetweetedByUserId = retweeterUser?.Id,
+
+                IsRead = this.DetermineUnreadState(isMe, firstLoad),
             };
         }
 
@@ -196,7 +204,8 @@ namespace OpenTween.Models
             TwitterMessageEvent eventItem,
             IReadOnlyDictionary<string, TwitterUser> users,
             IReadOnlyDictionary<string, TwitterMessageEventList.App> apps,
-            long selfUserId
+            long selfUserId,
+            bool firstLoad
         )
         {
             var timestamp = long.Parse(eventItem.CreatedTimestamp);
@@ -291,9 +300,22 @@ namespace OpenTween.Models
                 IsProtect = displayUser.Protected,
                 IsMe = senderIsMe,
                 IsOwl = !senderIsMe,
+
+                IsRead = this.DetermineUnreadState(senderIsMe, firstLoad),
             };
         }
 
+        private bool DetermineUnreadState(bool isMe, bool firstLoad)
+        {
+            if (isMe && this.settingCommon.ReadOwnPost)
+                return true;
+
+            if (firstLoad && this.settingCommon.Read)
+                return true;
+
+            return false;
+        }
+
         private string ReplaceTextFromApi(string text, TwitterEntities? entities, TwitterQuotedStatusPermalink? quotedStatusLink)
         {
             if (entities?.Urls != null)
index b2bade4..b9c012c 100644 (file)
@@ -60,7 +60,6 @@ namespace OpenTween.SocialProtocol.Twitter
             var credential = accountSettings.GetTwitterCredential();
             this.twLegacy.Initialize(credential, accountSettings.Username, accountSettings.UserId);
             this.twLegacy.RestrictFavCheck = settingCommon.RestrictFavCheck;
-            this.twLegacy.ReadOwnPost = settingCommon.ReadOwnPost;
         }
 
         public void Dispose()
index f65816e..257a0d8 100644 (file)
@@ -180,7 +180,7 @@ namespace OpenTween
 
         public Twitter(TwitterApi api)
         {
-            this.postFactory = new(TabInformations.GetInstance());
+            this.postFactory = new(TabInformations.GetInstance(), SettingManager.Instance.Common);
             this.urlExpander = new(ShortUrl.Instance);
 
             this.Api = api;
@@ -283,8 +283,7 @@ namespace OpenTween
             this.previousStatusId = status.IdStr;
 
             // 投稿したものを返す
-            var post = this.CreatePostsFromStatusData(status);
-            this.SetInitialUnreadState(post, firstLoad: false);
+            var post = this.CreatePostsFromStatusData(status, firstLoad: false);
 
             return post;
         }
@@ -426,8 +425,7 @@ namespace OpenTween
                 throw new WebApiException("Invalid Json!");
 
             // Retweetしたものを返す
-            var retweetPost = this.CreatePostsFromStatusData(status);
-            this.SetInitialUnreadState(retweetPost, firstLoad: false);
+            var retweetPost = this.CreatePostsFromStatusData(status, firstLoad: false);
 
             return retweetPost;
         }
@@ -532,8 +530,6 @@ namespace OpenTween
 
         public bool RestrictFavCheck { get; set; }
 
-        public bool ReadOwnPost { get; set; }
-
         public int FollowersCount { get; private set; }
 
         public int FriendsCount { get; private set; }
@@ -816,18 +812,17 @@ namespace OpenTween
                     .ConfigureAwait(false);
             }
 
-            var item = this.CreatePostsFromStatusData(status);
-            this.SetInitialUnreadState(item, firstLoad);
+            var item = this.CreatePostsFromStatusData(status, firstLoad);
 
             return item;
         }
 
-        private PostClass CreatePostsFromStatusData(TwitterStatus status)
-            => this.CreatePostsFromStatusData(status, favTweet: false);
+        private PostClass CreatePostsFromStatusData(TwitterStatus status, bool firstLoad)
+            => this.CreatePostsFromStatusData(status, firstLoad, favTweet: false);
 
-        private PostClass CreatePostsFromStatusData(TwitterStatus status, bool favTweet)
+        private PostClass CreatePostsFromStatusData(TwitterStatus status, bool firstLoad, bool favTweet)
         {
-            var post = this.postFactory.CreateFromStatus(status, this.UserId, this.followerId, favTweet);
+            var post = this.postFactory.CreateFromStatus(status, this.UserId, this.followerId, firstLoad, favTweet);
             _ = this.urlExpander.Expand(post);
 
             return post;
@@ -835,7 +830,7 @@ namespace OpenTween
 
         private void CreatePostsFromJson(TwitterStatus[] items, MyCommon.WORKERTYPE gType, TabModel? tab, bool firstLoad)
         {
-            var posts = items.Select(x => this.CreatePostsFromStatusData(x)).ToArray();
+            var posts = items.Select(x => this.CreatePostsFromStatusData(x, firstLoad)).ToArray();
 
             TwitterPostFactory.AdjustSortKeyForPromotedPost(posts);
 
@@ -859,8 +854,6 @@ namespace OpenTween
                 if (gType != MyCommon.WORKERTYPE.UserTimeline &&
                     post.RetweetedByUserId != null && this.noRTId.Contains(post.RetweetedByUserId.Value)) continue;
 
-                this.SetInitialUnreadState(post, firstLoad);
-
                 if (tab != null && tab is InternalStorageTabModel)
                     tab.AddPostQueue(post);
                 else
@@ -870,7 +863,7 @@ namespace OpenTween
 
         private void CreatePostsFromSearchJson(TwitterStatus[] statuses, PublicSearchTabModel tab, bool firstLoad)
         {
-            var posts = statuses.Select(x => this.CreatePostsFromStatusData(x)).ToArray();
+            var posts = statuses.Select(x => this.CreatePostsFromStatusData(x, firstLoad)).ToArray();
 
             TwitterPostFactory.AdjustSortKeyForPromotedPost(posts);
 
@@ -883,8 +876,6 @@ namespace OpenTween
                         continue;
                 }
 
-                this.SetInitialUnreadState(post, firstLoad);
-
                 tab.AddPostQueue(post);
             }
         }
@@ -904,27 +895,12 @@ namespace OpenTween
                         continue;
                 }
 
-                var post = this.CreatePostsFromStatusData(status, true);
-
-                this.SetInitialUnreadState(post, firstLoad);
+                var post = this.CreatePostsFromStatusData(status, firstLoad, favTweet: true);
 
                 TabInformations.GetInstance().AddPost(post);
             }
         }
 
-        private void SetInitialUnreadState(PostClass post, bool firstLoad)
-        {
-            bool isRead;
-            if (post.IsMe && this.ReadOwnPost)
-                isRead = true;
-            else if (firstLoad && SettingManager.Instance.Common.Read)
-                isRead = true;
-            else
-                isRead = false;
-
-            post.IsRead = isRead;
-        }
-
         public async Task GetListStatus(ListTimelineTabModel tab, bool more, bool firstLoad)
         {
             var count = GetApiResultCount(MyCommon.WORKERTYPE.List, more, firstLoad);
@@ -1141,7 +1117,7 @@ namespace OpenTween
                 statuses = response.Statuses;
             }
 
-            return statuses.Select(x => this.CreatePostsFromStatusData(x)).ToArray();
+            return statuses.Select(x => this.CreatePostsFromStatusData(x, firstLoad: false)).ToArray();
         }
 
         public async Task GetSearch(PublicSearchTabModel tab, bool more, bool firstLoad)
@@ -1275,8 +1251,7 @@ namespace OpenTween
 
             foreach (var eventItem in events)
             {
-                var post = this.postFactory.CreateFromDirectMessageEvent(eventItem, users, apps, this.UserId);
-                this.SetInitialUnreadState(post, firstLoad);
+                var post = this.postFactory.CreateFromDirectMessageEvent(eventItem, users, apps, this.UserId, firstLoad);
 
                 _ = this.urlExpander.Expand(post);