Skip to content

Commit 1ede44f

Browse files
committed
Handoff
1 parent a73169f commit 1ede44f

File tree

7 files changed

+177
-3
lines changed

7 files changed

+177
-3
lines changed

Coding_iOS/Controllers/RootControllers/BaseViewController.m

Lines changed: 166 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,19 @@
3535
#import "EACodeReleaseViewController.h"
3636
#import "Ease_2FA.h"
3737

38+
#import "Project_RootViewController.h"
39+
#import "MyTask_RootViewController.h"
40+
#import "Tweet_RootViewController.h"
41+
#import "Message_RootViewController.h"
42+
#import "Me_RootViewController.h"
43+
#import "ProjectViewController.h"
44+
#import "EACodeReleaseListViewController.h"
45+
#import "EACodeBranchListViewController.h"
46+
#import "MRPRListViewController.h"
47+
#import "ProjectSettingViewController.h"
48+
#import "CodeListViewController.h"
49+
#import "FileListViewController.h"
50+
3851
#import "UnReadManager.h"
3952

4053
typedef NS_ENUM(NSInteger, AnalyseMethodType) {
@@ -56,6 +69,7 @@ - (void)dismissModalVC{
5669
#pragma mark - BaseViewController
5770

5871
@interface BaseViewController ()
72+
@property (nonatomic ,strong) NSUserActivity *userActivity;
5973

6074
@end
6175

@@ -78,6 +92,7 @@ - (void)viewWillDisappear:(BOOL)animated
7892
[super viewWillDisappear:animated];
7993

8094
[MobClick endLogPageView:[NSString stringWithUTF8String:object_getClassName(self)]];
95+
[_userActivity resignCurrent];
8196
}
8297

8398
- (void)viewDidLoad{
@@ -91,6 +106,151 @@ - (void)viewDidLoad{
91106
}
92107
}
93108

109+
- (void)viewDidAppear:(BOOL)animated{
110+
[super viewDidAppear:animated];
111+
//Handoff
112+
[self p_setupUserActivity];
113+
}
114+
115+
- (void)p_setupUserActivity{
116+
NSString *webStr = nil;
117+
118+
// 主 Tab
119+
if ([self isKindOfClass:Project_RootViewController.class]) {//Project
120+
webStr = @"/user/projects";
121+
}else if ([self isKindOfClass:MyTask_RootViewController.class]){//Task
122+
webStr = [NSString stringWithFormat:@"/user/tasks?owner=%@&status=1", [Login curLoginUser].id];
123+
}else if ([self isKindOfClass:Tweet_RootViewController.class]){//Tweet
124+
Tweet_RootViewControllerType type = ((Tweet_RootViewController *)self).type;
125+
webStr = [NSString stringWithFormat:@"/pp%@", (type == Tweet_RootViewControllerTypeHot? @"/hot":
126+
type == Tweet_RootViewControllerTypeFriend? @"/friends":
127+
@"")];
128+
}else if ([self isKindOfClass:Message_RootViewController.class]){//Message
129+
webStr = @"/user/messages/basic";
130+
}else if ([self isKindOfClass:Me_RootViewController.class]){//User
131+
webStr = @"/user/account";
132+
133+
// Project
134+
}else if ([self isKindOfClass:NProjectViewController.class]){
135+
Project *curPro = ((NProjectViewController *)self).myProject;
136+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@", curPro.owner_user_name, curPro.name];
137+
}else if ([self isKindOfClass:ProjectViewController.class]){
138+
Project *curPro = ((ProjectViewController *)self).myProject;
139+
ProjectViewType type = ((ProjectViewController *)self).curType;
140+
NSString *sufStr = (type == ProjectViewTypeTasks? @"/tasks":
141+
type == ProjectViewTypeFiles? @"/attachment":
142+
type == ProjectViewTypeTopics? @"/topics":
143+
type == ProjectViewTypeCodes? @"/git":
144+
type == ProjectViewTypeMembers? @"/setting/member":
145+
type == ProjectViewTypeActivities? @"":@"");
146+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@%@", curPro.owner_user_name, curPro.name, sufStr];
147+
}else if ([self isKindOfClass:EACodeBranchListViewController.class]){
148+
Project *curPro = ((EACodeBranchListViewController *)self).myProject;
149+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/git/branches", curPro.owner_user_name, curPro.name];
150+
}else if ([self isKindOfClass:EACodeReleaseListViewController.class]){
151+
Project *curPro = ((EACodeReleaseListViewController *)self).myProject;
152+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/git/releases", curPro.owner_user_name, curPro.name];
153+
}else if ([self isKindOfClass:MRPRListViewController.class]){
154+
Project *curPro = ((MRPRListViewController *)self).curProject;
155+
BOOL isMR = ((MRPRListViewController *)self).isMR;
156+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/git/%@", curPro.owner_user_name, curPro.name, isMR? @"merges": @"pulls/open"];
157+
}else if ([self isKindOfClass:UserOrProjectTweetsViewController.class]){
158+
Tweets *curTweets = ((UserOrProjectTweetsViewController *)self).curTweets;
159+
if (curTweets.tweetType == TweetTypeProject) {
160+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/setting/notice", curTweets.curPro.owner_user_name, curTweets.curPro.name];
161+
}else if (curTweets.tweetType == TweetTypeUserSingle){
162+
webStr = [NSString stringWithFormat:@"/u/%@/bubble", curTweets.curUser.global_key];
163+
}
164+
}else if ([self isKindOfClass:ProjectSettingViewController.class]){
165+
Project *curPro = ((ProjectSettingViewController *)self).project;
166+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/setting", curPro.owner_user_name, curPro.name];
167+
168+
// Task
169+
}else if ([self isKindOfClass:EditTaskViewController.class]){
170+
Task *curTask = ((EditTaskViewController *)self).myTask;
171+
NSString *project_path = curTask.backend_project_path.copy;
172+
project_path = [[project_path stringByReplacingOccurrencesOfString:@"/user/" withString:@"/u/"] stringByReplacingOccurrencesOfString:@"/project/" withString:@"/p/"];
173+
webStr = [NSString stringWithFormat:@"%@/task/%@", project_path, curTask.id];
174+
175+
// Tweet
176+
}else if ([self isKindOfClass:TweetDetailViewController.class]){
177+
Tweet *curTweet = ((TweetDetailViewController *)self).curTweet;
178+
if (curTweet.isProjectTweet) {
179+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/setting/notice/%@", curTweet.project.owner_user_name, curTweet.project.name, curTweet.id];
180+
}else{
181+
webStr = [NSString stringWithFormat:@"/u/%@/pp/%@", curTweet.user_global_key ?: curTweet.owner.global_key, curTweet.id];
182+
}
183+
184+
// Message
185+
}else if ([self isKindOfClass:ConversationViewController.class]){
186+
PrivateMessages *curPriMs = ((ConversationViewController *)self).myPriMsgs;
187+
webStr = [NSString stringWithFormat:@"/user/messages/history/%@", curPriMs.curFriend.global_key];
188+
189+
// User
190+
}else if ([self isKindOfClass:UserInfoViewController.class]){
191+
User *curU = ((UserInfoViewController *)self).curUser;
192+
webStr = [NSString stringWithFormat:@"/u/%@", curU.global_key];
193+
194+
// Topic/File/MR/Code/Wiki/Release
195+
}else if ([self isKindOfClass:TopicDetailViewController.class]){
196+
ProjectTopic *curTopic = ((TopicDetailViewController *)self).curTopic;
197+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/topic/%@", curTopic.project.owner_user_name, curTopic.project.name, curTopic.id];
198+
}else if ([self isKindOfClass:FileViewController.class]){
199+
ProjectFile *curFile = ((FileViewController *)self).curFile;
200+
if (curFile.project_owner_name && curFile.project_name) {
201+
webStr = curFile.owner_preview;
202+
}else if (curFile.owner_preview){
203+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/attachment/default/preview/%@", curFile.project_owner_name, curFile.project_name, curFile.file_id];
204+
}
205+
}else if ([self isKindOfClass:MRDetailViewController.class] || [self isKindOfClass:PRDetailViewController.class]){
206+
MRPR *curMRPR = [self valueForKey:@"curMRPR"];
207+
webStr = curMRPR.path;
208+
}else if ([self isKindOfClass:CodeViewController.class]){
209+
Project *curPro = ((CodeViewController *) self).myProject;
210+
CodeFile *curCF = ((CodeViewController *) self).myCodeFile;
211+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/git/blob/%@/%@", curPro.owner_user_name, curPro.name, curCF.ref, curCF.path];
212+
}else if ([self isKindOfClass:WikiViewController.class]){
213+
WikiViewController *vc = (WikiViewController *)self;
214+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/wiki", vc.myProject.owner_user_name, vc.myProject.name];
215+
if (vc.iid) {
216+
webStr = [webStr stringByAppendingFormat:@"/%@", vc.iid];
217+
if (vc.version.integerValue > 0) {
218+
webStr = [webStr stringByAppendingFormat:@"?version=%@", vc.version];
219+
}
220+
}
221+
}else if ([self isKindOfClass:EACodeReleaseViewController.class]){
222+
EACodeRelease *curR = ((EACodeReleaseViewController *)self).curRelease;
223+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/git/releases/%@", curR.project.owner_user_name, curR.project.name, curR.tag_name];
224+
225+
// CodeList/FileList/Webview
226+
}else if ([self isKindOfClass:CodeListViewController.class]){
227+
Project *curPro = ((CodeListViewController *) self).myProject;
228+
CodeTree *curCT = ((CodeListViewController *) self).myCodeTree;
229+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/git/tree/%@/%@", curPro.owner_user_name, curPro.name, curCT.ref, curCT.path];
230+
}else if ([self isKindOfClass:FileListViewController.class]){
231+
Project *curPro = ((FileListViewController *) self).curProject;
232+
ProjectFolder *curPF = ((FileListViewController *) self).curFolder;
233+
webStr = [NSString stringWithFormat:@"/u/%@/p/%@/attachment/%@", curPro.owner_user_name, curPro.name, curPF.file_id];
234+
}else if ([self isKindOfClass:WebViewController.class]){
235+
webStr = ((WebViewController *)self).request.URL.absoluteString;
236+
}
237+
238+
if (webStr) {
239+
NSURL *webURL = nil;
240+
if (![webStr hasPrefix:@"http"]) {
241+
webURL = [NSURL URLWithString:webStr relativeToURL:[NSURL URLWithString:[NSObject baseURLStr]]];
242+
}else{
243+
webURL = [NSURL URLWithString:webStr];
244+
}
245+
if (!_userActivity) {
246+
_userActivity = [[NSUserActivity alloc]initWithActivityType:@"com.alex.handoffdemo"];
247+
_userActivity.title = @"CODING";
248+
}
249+
[_userActivity setWebpageURL:webURL];
250+
[_userActivity becomeCurrent];
251+
}
252+
}
253+
94254
- (void)tabBarItemClicked{
95255
DebugLog(@"\ntabBarItemClicked : %@", NSStringFromClass([self class]));
96256
}
@@ -275,7 +435,12 @@ + (UIViewController *)analyseVCFromLinkStr:(NSString *)linkStr analyseMethod:(An
275435
}
276436
if (!analyseVC) {
277437
TopicDetailViewController *vc = [[TopicDetailViewController alloc] init];
278-
vc.curTopic = [ProjectTopic topicWithId:[NSNumber numberWithInteger:topic_id.integerValue]];
438+
ProjectTopic *curTopic = [ProjectTopic topicWithId:[NSNumber numberWithInteger:topic_id.integerValue]];
439+
Project *curPro = [[Project alloc] init];
440+
curPro.owner_user_name = matchedCaptures[1];
441+
curPro.name = matchedCaptures[2];
442+
curTopic.project = curPro;
443+
vc.curTopic = curTopic;
279444
analyseVC = vc;
280445
}
281446
}else if ((matchedCaptures = [linkStr captureComponentsMatchedByRegex:taskRegexStr]).count > 0){

Coding_iOS/Controllers/RootControllers/Tweet_RootViewController.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ typedef NS_ENUM(NSUInteger, Tweet_RootViewControllerType){
2020

2121

2222
@interface Tweet_RootViewController : BaseViewController<UITableViewDataSource, UITableViewDelegate, UIScrollViewDelegate, UIMessageInputViewDelegate>
23+
24+
@property (assign, nonatomic, readonly) Tweet_RootViewControllerType type;
25+
2326
+ (instancetype)newTweetVCWithType:(Tweet_RootViewControllerType)type;
2427

2528
- (void)refresh;

Coding_iOS/Controllers/RootControllers/Tweet_RootViewController.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ + (instancetype)newTweetVCWithType:(Tweet_RootViewControllerType)type{
5959
return vc;
6060
}
6161

62+
- (Tweet_RootViewControllerType)type{
63+
return _curIndex;
64+
}
65+
6266
- (instancetype)init
6367
{
6468
self = [super init];

Coding_iOS/Controllers/WikiViewController.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
@interface WikiViewController : BaseViewController
1414
@property (nonatomic, strong) Project *myProject;
15+
@property (strong, nonatomic, readonly) NSNumber *iid, *version;
1516
- (void)setWikiIid:(NSNumber *)iid version:(NSNumber *)version;
1617
@end
1718

Coding_iOS/Controllers/WikiViewController.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ @interface WikiViewController ()<UIWebViewDelegate, UIScrollViewDelegate>
2323
@property (strong, nonatomic) UIActivityIndicatorView *activityIndicator;
2424
@property (nonatomic, strong) ODRefreshControl *myRefreshControl;
2525

26-
@property (strong, nonatomic) NSNumber *iid, *version;
26+
@property (strong, nonatomic, readwrite) NSNumber *iid, *version;
2727
@property (strong, nonatomic) EAWiki *curWiki;
2828
@property (strong, nonatomic) NSArray *wikiList;
2929

Coding_iOS/Models/ProjectFile.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ typedef NS_ENUM(NSInteger, DownloadState){
2727
@property (readwrite, nonatomic, strong) User *owner;
2828
@property (readwrite, nonatomic, strong) FileShare *share, *share_ea;
2929
@property (strong, nonatomic, readonly) NSString *diskFileName, *storage_key_for_disk;
30+
@property (strong, nonatomic, readonly) NSString *project_name, *project_owner_name;
3031

3132
+ (ProjectFile *)fileWithFileId:(NSNumber *)fileId andProjectId:(NSNumber *)project_id;
3233
- (instancetype)initWithFileId:(NSNumber *)fileId inProject:(NSString *)project_name ofUser:(NSString *)project_owner_name;

Coding_iOS/Models/ProjectFile.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#import "Coding_FileManager.h"
1111

1212
@interface ProjectFile ()
13-
@property (strong, nonatomic) NSString *project_name, *project_owner_name;
13+
@property (strong, nonatomic, readwrite) NSString *project_name, *project_owner_name;
1414
@property (strong, nonatomic, readwrite) NSString *diskFileName;
1515
@end
1616

0 commit comments

Comments
 (0)