Skip to content

Commit 355d71e

Browse files
committed
Merge branch 'master' of github.com:studyplus/Studyplus-Android-SDK into abolish-local-maven
Conflicts: build.gradle
2 parents af2eebf + 3954fe9 commit 355d71e

File tree

12 files changed

+212
-12
lines changed

12 files changed

+212
-12
lines changed

README.md

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Studyplus SDK for Android
1212

1313
Graddle Project
1414

15-
```
15+
```groovy
1616
repositories {
1717
maven { url 'http://raw.github.com/studyplus/Studyplus-Android-SDK/master/repository' }
1818
}
@@ -21,10 +21,58 @@ dependencies {
2121
}
2222
```
2323

24-
##Usage
24+
## Usage
25+
26+
### Authenticate
27+
28+
Open an Activity to connect with Studyplus.
29+
30+
```java
31+
try {
32+
AuthTransit.from(activity).startActivity(
33+
context.getString("app_consumer_key"),
34+
context.getString("app_consumer_key_secret")
35+
);
36+
} catch (ActivityNotFoundException e) {
37+
e.printStackTrace();
38+
Toast.makeText(context, "Need for Studyplus 2.14.0+", Toast.LENGTH_SHORT).show();
39+
}
40+
```
41+
42+
Then save its result.
43+
44+
```java
45+
@Override
46+
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
47+
CertificationStore.create(context).update(data);
48+
}
49+
```
50+
51+
### Post a record to Studyplus
52+
53+
Create ApiRequest and send it with ApiClient.
54+
55+
```java
56+
ApiRequest request = StudyRecordPostRequest.of(
57+
new StudyRecordBuilder()
58+
.setComment("perfect!")
59+
.setAmountTotal(30)
60+
.setDurationSeconds(2 * 60)
61+
.build()
62+
);
63+
64+
try {
65+
StudyplusApi.getClient(context).send(request);
66+
} catch (AccessTokenNotFound e) {
67+
e.printStackTrace();
68+
Toast.makeText(context, "Access token not exists", Toast.LENGTH_SHORT).show();
69+
}
70+
```
71+
72+
### More
2573

26-
Coming Soon
74+
* See also [actual examples](https://github.com/studyplus/Studyplus-Android-SDK/blob/master/SDKExample/src/main/java/jp/studyplus/android/sdk/example/ExampleActivity.java).
2775

28-
##License
76+
## License
2977

3078
* [MIT License](http://opensource.org/licenses/MIT)

SDKExample/src/main/java/jp/studyplus/android/sdk/example/ExampleActivity.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package jp.studyplus.android.sdk.example;
22

33
import android.app.Activity;
4+
import android.content.ActivityNotFoundException;
45
import android.content.Context;
56
import android.content.Intent;
67
import android.os.Bundle;
@@ -16,6 +17,7 @@
1617
import jp.studyplus.android.sdk.service.api.StudyplusApi;
1718
import jp.studyplus.android.sdk.service.api.response.ErrorResponse;
1819
import jp.studyplus.android.sdk.service.api.response.SuccessfulResponse;
20+
import jp.studyplus.android.sdk.service.auth.AccessTokenNotFound;
1921
import jp.studyplus.android.sdk.service.auth.AuthTransit;
2022
import jp.studyplus.android.sdk.service.auth.CertificationStore;
2123
import jp.studyplus.android.sdk.service.studyrecord.StudyRecordBuilder;
@@ -57,7 +59,13 @@ public void onClick(View v) {
5759
.setDurationSeconds(2 * 60)
5860
.build());
5961

60-
StudyplusApi.getClient(context).send(request.with(this));
62+
try {
63+
StudyplusApi.getClient(context).send(request.with(this));
64+
} catch (AccessTokenNotFound e) {
65+
e.printStackTrace();
66+
Toast.makeText(context, R.string. sample_certification_no_access_token, Toast.LENGTH_SHORT)
67+
.show();
68+
}
6169
}
6270

6371
@Subscribe @SuppressWarnings("unused")
@@ -84,10 +92,16 @@ private OnClickToAuth(Activity activity) {
8492
}
8593
@Override
8694
public void onClick(View v) {
87-
AuthTransit.from(activity).startActivity(
88-
context.getString(R.string.sample_consumer_key),
89-
context.getString(R.string.sample_consumer_key_secret)
90-
);
95+
try {
96+
AuthTransit.from(activity).startActivity(
97+
context.getString(R.string.sample_consumer_key),
98+
context.getString(R.string.sample_consumer_key_secret)
99+
);
100+
} catch (ActivityNotFoundException e) {
101+
e.printStackTrace();
102+
Toast.makeText(context, R.string.sample_certification_studyplus_not_found, Toast.LENGTH_SHORT)
103+
.show();
104+
}
91105
}
92106
}
93107

SDKExample/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
<string name="app_name">SDK Example</string>
55
<string name="hello_world">Hello world!!!</string>
66

7+
<string name="sample_certification_no_access_token">アクセストークンがありません。先に認証をしてください。</string>
8+
<string name="sample_certification_studyplus_not_found">Studyplus 2.14.0 以上のインストールが必要です。</string>
79
</resources>

StudyplusAndroidSDK/build.gradle

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
12
apply plugin: 'android-library'
3+
apply plugin: 'android-test'
24

35
android {
46
compileSdkVersion 19
@@ -10,11 +12,26 @@ android {
1012
versionCode 1
1113
versionName "1.0"
1214
}
15+
sourceSets {
16+
instrumentTest.setRoot('src/test')
17+
}
18+
}
19+
20+
tasks.withType(Test) {
21+
systemProperty "robolectric.logging", "stdout"
1322
}
1423

1524
dependencies {
1625
compile 'com.android.support:appcompat-v7:19.0.1'
1726
compile 'com.google.guava:guava:16.0'
27+
28+
def forTesting = [
29+
'junit:junit:4.11',
30+
'org.robolectric:robolectric:2.3-SNAPSHOT',
31+
'com.squareup:fest-android:1.0.7',
32+
]
33+
forTesting.each{ testCompile it }
34+
forTesting.each{ instrumentTestCompile it }
1835
}
1936

2037
if (gradle.startParameter.taskNames.contains('uploadArchives')) {

StudyplusAndroidSDK/src/main/java/jp/studyplus/android/sdk/service/api/StudyplusApi.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.content.Context;
44

5+
import jp.studyplus.android.sdk.service.auth.AccessTokenNotFound;
56
import jp.studyplus.android.sdk.service.auth.CertificationStore;
67

78

@@ -10,7 +11,12 @@
1011
*/
1112
public class StudyplusApi {
1213

13-
public static ApiClient getClient(Context context){
14+
/**
15+
* @param context Specifies application context.
16+
* @return client for StudyplusAPI
17+
* @throws AccessTokenNotFound
18+
*/
19+
public static ApiClient getClient(Context context) {
1420
ApiCertification certification = CertificationStore.create(context).getDefault();
1521
return new ApiClient(certification);
1622
}

StudyplusAndroidSDK/src/main/java/jp/studyplus/android/sdk/service/auth/AuthTransit.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package jp.studyplus.android.sdk.service.auth;
22

33
import android.app.Activity;
4+
import android.content.ActivityNotFoundException;
45
import android.content.Intent;
56
import android.net.Uri;
67

@@ -24,7 +25,14 @@ public AuthTransit setRequestCode(int requestCode){
2425
return new AuthTransit(activity, requestCode);
2526
}
2627

27-
public void startActivity(String consumerKey, String consumerSecret){
28+
/**
29+
* Start the certification {@link Activity} for API.
30+
*
31+
* @param consumerKey for API
32+
* @param consumerSecret for API
33+
* @throws ActivityNotFoundException when not installed Studyplus application or un-supported version.
34+
*/
35+
public void startActivity(String consumerKey, String consumerSecret) {
2836
Intent intent = new Intent();
2937
intent.setAction(Intent.ACTION_VIEW);
3038
intent.putExtra("consumer_key", consumerKey);

StudyplusAndroidSDK/src/main/java/jp/studyplus/android/sdk/service/auth/CertificationStore.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,13 @@ private Optional<String> findAccessToken(){
4646
return Optional.fromNullable(preferences.getString(KEY_ACCESS_TOKEN, null));
4747
}
4848

49-
public ApiCertification getDefault(){
49+
/**
50+
* Return the basic {@link ApiCertification} instance for API.
51+
*
52+
* @return certification instance for API.
53+
* @throws AccessTokenNotFound
54+
*/
55+
public ApiCertification getDefault() {
5056
Optional<String> token = findAccessToken();
5157
if (!token.isPresent()){
5258
throw new AccessTokenNotFound();
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package jp.studyplus.android.sdk.test;
2+
3+
import org.junit.runner.notification.RunNotifier;
4+
import org.junit.runners.model.FrameworkMethod;
5+
import org.junit.runners.model.InitializationError;
6+
import org.robolectric.AndroidManifest;
7+
import org.robolectric.RobolectricTestRunner;
8+
import org.robolectric.annotation.Config;
9+
import org.robolectric.res.Fs;
10+
11+
public class RobolectricGradleTestRunner extends RobolectricTestRunner {
12+
13+
public RobolectricGradleTestRunner(Class<?> testClass) throws InitializationError {
14+
super(testClass);
15+
}
16+
17+
@Override
18+
protected void runChild(FrameworkMethod method, RunNotifier notifier) {
19+
super.runChild(method, notifier);
20+
}
21+
22+
@Override
23+
protected AndroidManifest getAppManifest(Config config) {
24+
String manifestProperty = System.getProperty("android.manifest");
25+
if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) {
26+
String resProperty = System.getProperty("android.resources");
27+
String assetsProperty = System.getProperty("android.assets");
28+
return new AndroidManifest(
29+
Fs.fileFromPath(manifestProperty),
30+
Fs.fileFromPath(resProperty),
31+
Fs.fileFromPath(assetsProperty));
32+
}
33+
return super.getAppManifest(config);
34+
}
35+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package jp.studyplus.android.sdk.test;
2+
3+
import android.app.Activity;
4+
5+
import org.junit.Before;
6+
import org.junit.Ignore;
7+
import org.junit.runner.RunWith;
8+
import org.robolectric.Robolectric;
9+
10+
@Ignore
11+
@RunWith(RobolectricGradleTestRunner.class)
12+
public class RobolectricTest {
13+
14+
@Before
15+
public void setUp(){
16+
Robolectric.checkActivities(true);
17+
}
18+
19+
protected Activity getActivity(){
20+
return Robolectric.buildActivity(Activity.class).create().get();
21+
}
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package jp.studyplus.android.sdk.test.auth;
2+
3+
import android.content.ActivityNotFoundException;
4+
5+
import org.junit.Test;
6+
7+
import jp.studyplus.android.sdk.service.auth.AuthTransit;
8+
import jp.studyplus.android.sdk.test.RobolectricTest;
9+
10+
public class AuthTransitTest extends RobolectricTest {
11+
12+
@Test(expected = ActivityNotFoundException.class)
13+
public void shouldThrowActivityNotFound() {
14+
AuthTransit.from(getActivity()).startActivity("dummy_key", "dummy_key_secret");
15+
}
16+
}

0 commit comments

Comments
 (0)