diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ee8b52254466712d04dac4eef2fcc9cb3929510c..d90e09d3fe41f0cc1d257f489dc3a67469a41834 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,18 +1,32 @@
-image: hafiyyan94/androidsdk25gitlabci:newSet
-
-before_script:
-  - chmod +x ./gradlew
+image: hafiyyan94/androidsdk25gitlabci:newTry
 
 stages:
   - build
   - test
 
-unitTests:
-  stage: test
+before_script:
+    - export GRADLE_USER_HOME=`pwd`/.gradle
+    - mkdir -p $GRADLE_USER_HOME
+    - chmod +x ./gradlew
+
+cache:
+  paths:
+     - .gradle/wrapper
+     - .gradle/caches
+
+build:
+  stage: build
   script:
-    - ./gradlew testDebugUnitTestCoverage
+      - ./gradlew assembleDebug
+      - ./gradlew assembleDebugAndroidTest
   artifacts:
     paths:
-      - app/build/reports/jacoco/
-
+      - app/build/outputs/
+    expire_in: 1 week
 
+test:
+  stage: test
+  script:
+      - echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n test2 -k "system-images;android-24;default;armeabi-v7a"
+      - echo "no" | $ANDROID_HOME/emulator/emulator -avd test2  -wipe-data -noaudio -no-window -gpu off -verbose -no-accel && /helpers/wait-for-avd-boot.sh
+      
\ No newline at end of file
diff --git a/app/src/androidTest/java/id/ac/ui/cs/myui/LoginInstrumentedTest.java b/app/src/androidTest/java/id/ac/ui/cs/myui/LoginInstrumentedTest.java
index 34a62115952619e1f4b6964cfc9cc31e8f855094..2db9647dc6d828e299d0fe110a1aef8a9340a0de 100644
--- a/app/src/androidTest/java/id/ac/ui/cs/myui/LoginInstrumentedTest.java
+++ b/app/src/androidTest/java/id/ac/ui/cs/myui/LoginInstrumentedTest.java
@@ -42,10 +42,4 @@ public class LoginInstrumentedTest {
         // Type text and then press the button.
         onView(withId(R.id.login)).check(matches(withText(mButtonTextExpected)));
     }
-
-    @Test
-    public void clickLogin_showHomeActivity(){
-        onView(withId(R.id.login)).perform(click());
-        onView(withId(R.id.bottomBar)).check(matches(isDisplayed()));
-    }
 }
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b58af5fb25737ec695ab2dba356af5a38c1c1528..affe87655f7825df6826523196f35f14a8643e1c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="id.ac.ui.cs.myui">
-
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
@@ -13,6 +14,13 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data
+                    android:host="localhost"
+                    android:scheme="akuncs"
+                    android:path="/"/>
             </intent-filter>
         </activity>
         <activity android:name=".activity.HomeActivity"/>
diff --git a/app/src/main/java/id/ac/ui/cs/myui/AccessToken.java b/app/src/main/java/id/ac/ui/cs/myui/AccessToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a7808575171c59f2e9337523b9c054fcf3f4a35
--- /dev/null
+++ b/app/src/main/java/id/ac/ui/cs/myui/AccessToken.java
@@ -0,0 +1,25 @@
+package id.ac.ui.cs.myui;
+
+/**
+ * Created by hafiyyansayyidfadhlillah on 7/25/17.
+ */
+
+public class AccessToken {
+
+    private String access_token;
+    private String refresh_token;
+    private String token_type;
+
+    public String getAccessToken() {
+        return access_token;
+    }
+
+    public String getTokenType() {
+        return token_type;
+    }
+
+    @Override
+    public String toString(){
+        return access_token;
+    }
+}
diff --git a/app/src/main/java/id/ac/ui/cs/myui/AuthenticationInterceptor.java b/app/src/main/java/id/ac/ui/cs/myui/AuthenticationInterceptor.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2517b54a3572530ff228b08fde623571023cc9a
--- /dev/null
+++ b/app/src/main/java/id/ac/ui/cs/myui/AuthenticationInterceptor.java
@@ -0,0 +1,31 @@
+package id.ac.ui.cs.myui;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+
+/**
+ * Created by hafiyyansayyidfadhlillah on 7/25/17.
+ */
+
+public class AuthenticationInterceptor implements Interceptor {
+
+    private String authToken;
+
+    public AuthenticationInterceptor(String token) {
+        this.authToken = token;
+    }
+
+    @Override
+    public Response intercept(Chain chain) throws IOException {
+        Request original = chain.request();
+
+        Request.Builder builder = original.newBuilder()
+                .header("Authorization", authToken);
+
+        Request request = builder.build();
+        return chain.proceed(request);
+    }
+}
diff --git a/app/src/main/java/id/ac/ui/cs/myui/LoginService.java b/app/src/main/java/id/ac/ui/cs/myui/LoginService.java
new file mode 100644
index 0000000000000000000000000000000000000000..172e0a0a1f6961737c6714f4cd4c879334de8dbd
--- /dev/null
+++ b/app/src/main/java/id/ac/ui/cs/myui/LoginService.java
@@ -0,0 +1,21 @@
+package id.ac.ui.cs.myui;
+
+import java.util.List;
+
+import retrofit2.Call;
+import retrofit2.http.Field;
+import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.GET;
+import retrofit2.http.POST;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
+
+/**
+ * Created by hafiyyansayyidfadhlillah on 7/25/17.
+ */
+
+public interface LoginService {
+
+    @GET("token")
+    Call<AccessToken> getAccessToken(@Query("code") String code);
+}
diff --git a/app/src/main/java/id/ac/ui/cs/myui/ServiceGenerator.java b/app/src/main/java/id/ac/ui/cs/myui/ServiceGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf6c26956859d111518d023adfb9c2dacea7c459
--- /dev/null
+++ b/app/src/main/java/id/ac/ui/cs/myui/ServiceGenerator.java
@@ -0,0 +1,90 @@
+package id.ac.ui.cs.myui;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.google.gson.Gson;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.IOException;
+
+import id.ac.ui.cs.myui.activity.HomeActivity;
+import okhttp3.Credentials;
+import okhttp3.OkHttpClient;
+import retrofit2.Call;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+/**
+ * Created by hafiyyansayyidfadhlillah on 7/25/17.
+ */
+
+public class ServiceGenerator extends AsyncTask<Object, Object, AccessToken> {
+
+    private Context context;
+    private String code;
+
+    public ServiceGenerator(Context context, String code){
+        this.context = context;
+        this.code = code;
+    }
+
+    public static final String API_BASE_URL = "https://akun.cs.ui.ac.id/";
+    public static final String BACKEND_BASE_URL = "http://10.0.2.2/";
+
+    @Override
+    protected AccessToken doInBackground(Object... objects) {
+        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
+        AccessToken data = null;
+        Retrofit.Builder builder =
+                new Retrofit.Builder()
+                        .baseUrl(BACKEND_BASE_URL)
+                        .addConverterFactory(GsonConverterFactory.create());
+
+        Retrofit retrofit = builder.build();
+        LoginService loginService = retrofit.create(LoginService.class);
+        Call<AccessToken> call = loginService.getAccessToken(code);
+        Response<AccessToken> body = null;
+        Log.i("CALL",call.request().url().toString());
+        try{
+            Log.i("FORM",call.request().body().contentType().toString());
+        }
+        catch (Exception e){
+
+        }
+        try{
+            body = call.execute();
+            String isSuccess = Integer.toString(body.code());
+            Log.i("SUCCESS", isSuccess);
+            Log.i("REASON", body.message());
+            JSONObject jsonResult = new JSONObject(new Gson().toJson(body.body()));
+            //JSONObject access_token = jsonResult.getJSONObject("access_token");
+            Log.i("TOKEN", jsonResult.toString());
+        }
+        catch (IOException e){
+            e.printStackTrace();
+        }
+        catch (JSONException e){
+            e.printStackTrace();
+        }
+
+        return data;
+
+    }
+
+    @Override
+    protected void onPostExecute(AccessToken accessToken) {
+        if(!(accessToken == null)){
+            Intent i = new Intent(context, HomeActivity.class);
+            context.startActivity(i);
+        }
+    }
+
+}
diff --git a/app/src/main/java/id/ac/ui/cs/myui/activity/LoginActivity.java b/app/src/main/java/id/ac/ui/cs/myui/activity/LoginActivity.java
index 8b6b2ae1969840e53a4668d41e88a3d5f4b95407..8738352a0e43282d0bacaf0b7c52bc605ef9211a 100644
--- a/app/src/main/java/id/ac/ui/cs/myui/activity/LoginActivity.java
+++ b/app/src/main/java/id/ac/ui/cs/myui/activity/LoginActivity.java
@@ -4,13 +4,23 @@ package id.ac.ui.cs.myui.activity;
  * Created by hafiyyansayyidfadhlillah on 7/12/17.
  */
 
+import android.content.Context;
+import android.net.Uri;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.View;
 import android.widget.Button;
 import android.content.Intent;
 
+import java.io.IOException;
+
+import id.ac.ui.cs.myui.AccessToken;
+import id.ac.ui.cs.myui.LoginService;
 import id.ac.ui.cs.myui.R;
+import id.ac.ui.cs.myui.ServiceGenerator;
+import retrofit2.Call;
+import retrofit2.http.Field;
 
 /**
  * This class defining Login page Logic
@@ -18,8 +28,11 @@ import id.ac.ui.cs.myui.R;
  */
 public class LoginActivity extends AppCompatActivity {
 
+    private final String clientId = "2bfJDNTlHhR9TJO6kQ5OsINqeMpNqFrudWOC8Vg9";
+    private final String redirectUri = "akuncs://localhost/";
+
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    protected void  onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_login);
 
@@ -30,9 +43,36 @@ public class LoginActivity extends AppCompatActivity {
         Button loginButton = (Button) findViewById(R.id.login);
         loginButton.setOnClickListener(new View.OnClickListener(){
             public void onClick(View v){
-                Intent i = new  Intent(LoginActivity.this, HomeActivity.class);
-                startActivity(i);
+                Intent intent = new Intent(
+                        Intent.ACTION_VIEW,
+                        Uri.parse(ServiceGenerator.API_BASE_URL + "" + "oauth/authorize/?response_type=code&client_id=" + clientId + "&state=random_state_string"));
+                startActivity(intent);
             }
         });
     }
+
+    protected void onResume(){
+        super.onResume();
+        Log.i("MASUK","Masuk");
+        // the intent filter defined in AndroidManifest will handle the return from ACTION_VIEW intent
+        Uri uri = getIntent().getData();
+        if (uri != null && uri.toString().startsWith(redirectUri)) {
+            Log.i("URI",uri.toString());
+            // use the parameter your API exposes for the code (mostly it's "code")
+            String code = uri.getQueryParameter("code");
+            Log.i("CODE",code);
+            if (code != null) {
+                // get access token
+                try{
+                    ServiceGenerator serviceGenerator = new ServiceGenerator(getApplicationContext(),code);
+                    serviceGenerator.execute();
+                }
+                catch (Exception e){
+                    e.printStackTrace();
+                }
+            } else if (uri.getQueryParameter("error") != null) {
+                // show an error message here
+            }
+        }
+    }
 }