├── .gitignore ├── .idea ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ ├── app-release.apk │ └── output.json └── src │ ├── androidTest │ └── java │ │ └── id │ │ └── sch │ │ └── smkn2cikbar │ │ └── exambrowser │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ │ └── id │ │ │ └── sch │ │ │ └── smkn2cikbar │ │ │ └── exambrowser │ │ │ ├── DetectConnection.java │ │ │ ├── InputAddress.java │ │ │ ├── MainActivity.java │ │ │ ├── MyDialogFragment.java │ │ │ ├── SplashScreen.java │ │ │ └── progressDialogModel.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── gradient.xml │ │ ├── ic_launcher_background.xml │ │ └── offline.png │ │ ├── layout │ │ ├── activity_input_address.xml │ │ ├── activity_main.xml │ │ └── activity_splash_screen.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── id │ └── sch │ └── smkn2cikbar │ └── exambrowser │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ExamBrowser-Android 2 | Aplikasi Exam Browser untuk Android 3 | 4 | Demo Aplikasi : https://goo.gl/Q1c6PK 5 | Link Aplikasi : https://goo.gl/gtK42j 6 | 7 | Fitur Aplikasi : 8 | - Ketika aplikasi sudah masuk tampilan web ujian, tidak bisa untuk pidah ke aplikasi lain. 9 | - Tidak bisa ke home 10 | - Tidak bisa screenshot 11 | - Swipe to Refresh 12 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 26 5 | defaultConfig { 6 | applicationId "id.sch.smkn2cikbar.exambrowser" 7 | minSdkVersion 14 8 | targetSdkVersion 26 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.android.support:appcompat-v7:26.1.0' 24 | implementation 'com.android.support:design:26.1.0' 25 | implementation 'com.android.support.constraint:constraint-layout:1.0.2' 26 | testImplementation 'junit:junit:4.12' 27 | androidTestImplementation 'com.android.support.test:runner:1.0.1' 28 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vianziro/ExamBrowser-Android/2b3732ccc75e4efe5bdc09e23a8c95b2c28b3a05/app/release/app-release.apk -------------------------------------------------------------------------------- /app/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"id.sch.smkn2cikbar.exambrowser","split":"","minSdkVersion":"14"}}] -------------------------------------------------------------------------------- /app/src/androidTest/java/id/sch/smkn2cikbar/exambrowser/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package id.sch.smkn2cikbar.exambrowser; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("id.sch.smkn2cikbar.exambrowser", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vianziro/ExamBrowser-Android/2b3732ccc75e4efe5bdc09e23a8c95b2c28b3a05/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/id/sch/smkn2cikbar/exambrowser/DetectConnection.java: -------------------------------------------------------------------------------- 1 | package id.sch.smkn2cikbar.exambrowser; 2 | 3 | import android.content.Context; 4 | import android.net.ConnectivityManager; 5 | import android.net.NetworkInfo; 6 | 7 | /** 8 | * Created by robby on 21/11/17. 9 | */ 10 | 11 | public class DetectConnection { 12 | 13 | public static boolean isNetworkStatusAvialable (Context context) { 14 | ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 15 | if (connectivityManager != null) 16 | { 17 | NetworkInfo netInfos = connectivityManager.getActiveNetworkInfo(); 18 | if(netInfos != null) 19 | if(netInfos.isConnected()) 20 | return true; 21 | } 22 | return false; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/id/sch/smkn2cikbar/exambrowser/InputAddress.java: -------------------------------------------------------------------------------- 1 | package id.sch.smkn2cikbar.exambrowser; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.content.DialogInterface; 6 | import android.content.Intent; 7 | import android.content.SharedPreferences; 8 | import android.net.ConnectivityManager; 9 | import android.net.NetworkInfo; 10 | import android.os.Bundle; 11 | import android.preference.PreferenceManager; 12 | import android.support.design.widget.TextInputLayout; 13 | import android.text.Editable; 14 | import android.text.TextWatcher; 15 | import android.view.KeyEvent; 16 | import android.view.View; 17 | import android.widget.Button; 18 | import android.widget.EditText; 19 | import android.widget.Toast; 20 | 21 | public class InputAddress extends Activity { 22 | private Button btnLanjut; 23 | private EditText inputAddress; 24 | private TextInputLayout inputLayoutAddress; 25 | private String s = "online"; 26 | 27 | private class MyTextWatcher implements TextWatcher { 28 | private View view; 29 | 30 | private MyTextWatcher(View view) { 31 | this.view = view; 32 | } 33 | 34 | public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 35 | } 36 | 37 | public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 38 | } 39 | 40 | public void afterTextChanged(Editable editable) { 41 | switch (this.view.getId()) { 42 | case R.id.input_address /*2131230805*/: 43 | InputAddress.this.validateAddress(); 44 | return; 45 | default: 46 | return; 47 | } 48 | } 49 | } 50 | 51 | @Override 52 | protected void onCreate(Bundle savedInstanceState) { 53 | super.onCreate(savedInstanceState); 54 | setContentView(R.layout.activity_input_address); 55 | try { 56 | s = getIntent().getStringExtra("valid"); 57 | if (s.equals("offline")){ 58 | Toast.makeText(InputAddress.this, "Url tidak valid/offline", Toast.LENGTH_LONG).show(); 59 | } 60 | } catch (Exception e){ 61 | e.printStackTrace(); 62 | } 63 | this.inputLayoutAddress = findViewById(R.id.input_layout_address); 64 | this.inputAddress = findViewById(R.id.input_address); 65 | this.inputAddress.setOnFocusChangeListener(new View.OnFocusChangeListener() { 66 | public void onFocusChange(View v, boolean hasFocus) { 67 | if (hasFocus) { 68 | InputAddress.this.inputAddress.setSelection(InputAddress.this.inputAddress.getText().length()); 69 | } 70 | } 71 | }); 72 | this.btnLanjut = findViewById(R.id.btn_lanjut); 73 | this.inputAddress.addTextChangedListener(new MyTextWatcher(this.inputAddress)); 74 | this.btnLanjut.setOnClickListener(new View.OnClickListener() { 75 | public void onClick(View view) { 76 | InputAddress.this.submitForm(); 77 | } 78 | }); 79 | if (!isNetworkAvailable()) { 80 | new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Peringatan").setMessage("Tidak ada koneksi").setPositiveButton("Close", new DialogInterface.OnClickListener() { 81 | public void onClick(DialogInterface dialog, int which) { 82 | InputAddress.this.finish(); 83 | System.exit(0); 84 | } 85 | }).show(); 86 | } 87 | final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 88 | this.inputAddress.setText(prefs.getString("autoSave", BuildConfig.FLAVOR)); 89 | this.inputAddress.addTextChangedListener(new TextWatcher() { 90 | public void onTextChanged(CharSequence s, int start, int before, int count) { 91 | } 92 | 93 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 94 | } 95 | 96 | public void afterTextChanged(Editable s) { 97 | prefs.edit().putString("autoSave", s.toString()).commit(); 98 | } 99 | }); 100 | this.inputAddress.setOnKeyListener(new View.OnKeyListener() { 101 | public boolean onKey(View v, int keyCode, KeyEvent event) { 102 | if (event.getAction() == 0) { 103 | switch (keyCode) { 104 | case R.styleable.Toolbar_titleMarginEnd /*23*/: 105 | case R.styleable.AppCompatTheme_editTextColor /*66*/: 106 | InputAddress.this.submitForm(); 107 | return true; 108 | } 109 | } 110 | return false; 111 | } 112 | }); 113 | } 114 | 115 | private void submitForm() { 116 | if (validateAddress()) { 117 | Intent intent = new Intent(getBaseContext(), MainActivity.class); 118 | intent.putExtra("url", this.inputAddress.getText().toString()); 119 | startActivity(intent); 120 | finish(); 121 | } 122 | } 123 | 124 | private boolean validateAddress() { 125 | if (this.inputAddress.getText().toString().trim().isEmpty()) { 126 | this.inputLayoutAddress.setError(getString(R.string.err_msg_name)); 127 | requestFocus(this.inputAddress); 128 | return false; 129 | } 130 | this.inputLayoutAddress.setErrorEnabled(false); 131 | return true; 132 | } 133 | 134 | private void requestFocus(View view) { 135 | if (view.requestFocus()) { 136 | getWindow().setSoftInputMode(5); 137 | } 138 | } 139 | 140 | public boolean isNetworkAvailable() { 141 | NetworkInfo networkInfo = ((ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 142 | if (networkInfo == null || !networkInfo.isConnected()) { 143 | return false; 144 | } 145 | return true; 146 | } 147 | 148 | public void onBackPressed() { 149 | AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 150 | alertDialogBuilder.setTitle("Keluar"); 151 | alertDialogBuilder.setMessage("Yakin keluar dari aplikasi ?").setCancelable(false).setPositiveButton("Ya", new DialogInterface.OnClickListener() { 152 | public void onClick(DialogInterface dialog, int id) { 153 | System.exit(0); 154 | } 155 | }).setNegativeButton("Tidak", new DialogInterface.OnClickListener() { 156 | public void onClick(DialogInterface dialog, int id) { 157 | dialog.cancel(); 158 | } 159 | }); 160 | alertDialogBuilder.create().show(); 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /app/src/main/java/id/sch/smkn2cikbar/exambrowser/MainActivity.java: -------------------------------------------------------------------------------- 1 | package id.sch.smkn2cikbar.exambrowser; 2 | 3 | import android.app.AlertDialog; 4 | import android.app.KeyguardManager; 5 | import android.app.PendingIntent; 6 | import android.content.Context; 7 | import android.content.DialogInterface; 8 | import android.content.Intent; 9 | import android.graphics.Bitmap; 10 | import android.graphics.Color; 11 | import android.support.v4.widget.SwipeRefreshLayout; 12 | import android.support.v7.app.AppCompatActivity; 13 | import android.os.Bundle; 14 | import android.support.v7.widget.Toolbar; 15 | import android.util.Log; 16 | import android.view.Menu; 17 | import android.view.MenuItem; 18 | import android.view.ViewGroup; 19 | import android.view.WindowManager; 20 | import android.webkit.WebView; 21 | import android.webkit.WebViewClient; 22 | import android.widget.Toast; 23 | 24 | import java.util.Timer; 25 | import java.util.TimerTask; 26 | 27 | import static id.sch.smkn2cikbar.exambrowser.DetectConnection.isNetworkStatusAvialable; 28 | 29 | public class MainActivity extends AppCompatActivity { 30 | MyTimerTask myTimerTask; 31 | Timer timer; 32 | private SwipeRefreshLayout swipeRefreshLayout; 33 | 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | setContentView(R.layout.activity_main); 37 | setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); 38 | getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); 39 | final String s = getIntent().getStringExtra("url"); 40 | final WebView view = findViewById(R.id.activity_main_webview); 41 | view.getSettings().setJavaScriptEnabled(true); 42 | view.getSettings().setUseWideViewPort(true); 43 | view.getSettings().setLoadWithOverviewMode(true); 44 | view.getSettings().setSupportZoom(true); 45 | view.getSettings().setBuiltInZoomControls(true); 46 | view.getSettings().setDisplayZoomControls(false); 47 | view.setWebViewClient(new ExamWebView()); 48 | view.loadUrl("http://" + s); 49 | swipeRefreshLayout = findViewById(R.id.swipe_refresh_layout); 50 | swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE, Color.CYAN); 51 | swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 52 | @Override 53 | public void onRefresh() { 54 | if(isNetworkStatusAvialable (MainActivity.this)) { 55 | view.reload(); 56 | view.getSettings().setDomStorageEnabled(true); 57 | } else { 58 | Toast.makeText(MainActivity.this, "Url tidak valid/offline", Toast.LENGTH_LONG).show(); 59 | view.loadDataWithBaseURL(null, "", "text/html", "UTF-8", null); 60 | progressDialogModel.hideProgressDialog(); 61 | swipeRefreshLayout.setRefreshing(false); 62 | Intent i = new Intent(getBaseContext(), InputAddress.class); 63 | startActivity(i); 64 | finish(); 65 | } 66 | } 67 | }); 68 | } 69 | 70 | class MyTimerTask extends TimerTask { 71 | @Override 72 | public void run() { 73 | bringApplicationToFront(); 74 | } 75 | } 76 | 77 | private class ExamWebView extends WebViewClient { 78 | private ExamWebView() { 79 | } 80 | 81 | public void onPageStarted(WebView view, String url, Bitmap favicon) { 82 | super.onPageStarted(view, url, favicon); 83 | } 84 | 85 | public boolean shouldOverrideUrlLoading(WebView view, String url) { 86 | if(isNetworkStatusAvialable (MainActivity.this)) { 87 | view.loadUrl(url); 88 | progressDialogModel.pdMenyiapkanDataLogin(MainActivity.this); 89 | } else { 90 | Toast.makeText(MainActivity.this, "Url tidak valid/offline", Toast.LENGTH_LONG).show(); 91 | view.loadDataWithBaseURL(null, "", "text/html", "UTF-8", null); 92 | progressDialogModel.hideProgressDialog(); 93 | swipeRefreshLayout.setRefreshing(false); 94 | Intent i = new Intent(getBaseContext(), InputAddress.class); 95 | startActivity(i); 96 | finish(); 97 | } 98 | return true; 99 | } 100 | 101 | public void onPageFinished(WebView view, String url) { 102 | progressDialogModel.hideProgressDialog(); 103 | swipeRefreshLayout.setRefreshing(false); 104 | super.onPageFinished(view, url); 105 | } 106 | 107 | public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 108 | swipeRefreshLayout.setRefreshing(false); 109 | Intent i = new Intent(getBaseContext(), InputAddress.class); 110 | i.putExtra("valid", "offline"); 111 | startActivity(i); 112 | System.exit(0); 113 | } 114 | } 115 | 116 | public boolean onCreateOptionsMenu(Menu menu) { 117 | getMenuInflater().inflate(R.menu.menu_main, menu); 118 | return true; 119 | } 120 | 121 | public boolean onOptionsItemSelected(MenuItem item) { 122 | int id = item.getItemId(); 123 | if (id == R.id.action_settings) { 124 | new MyDialogFragment().show(getSupportFragmentManager(), "MyDialogFragmentTag"); 125 | } 126 | if (id == R.id.action_exit) { 127 | System.exit(0); 128 | } 129 | return super.onOptionsItemSelected(item); 130 | } 131 | 132 | public void onBackPressed() { 133 | AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 134 | alertDialogBuilder.setTitle("Keluar"); 135 | alertDialogBuilder.setMessage("Yakin keluar dari aplikasi ?").setCancelable(false).setPositiveButton("Ya", new DialogInterface.OnClickListener() { 136 | public void onClick(DialogInterface dialog, int id) { 137 | System.exit(0); 138 | } 139 | }).setNegativeButton("Tidak", new DialogInterface.OnClickListener() { 140 | public void onClick(DialogInterface dialog, int id) { 141 | dialog.cancel(); 142 | } 143 | }); 144 | alertDialogBuilder.create().show(); 145 | } 146 | 147 | @Override 148 | protected void onResume() { 149 | super.onResume(); 150 | if (timer != null) { 151 | timer.cancel(); 152 | timer = null; 153 | } 154 | } 155 | 156 | @Override 157 | protected void onPause() { 158 | if (timer == null) { 159 | myTimerTask = new MyTimerTask(); 160 | timer = new Timer(); 161 | timer.schedule(myTimerTask, 100, 100); 162 | } 163 | super.onPause(); 164 | } 165 | 166 | private void bringApplicationToFront() { 167 | KeyguardManager myKeyManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 168 | if (myKeyManager.inKeyguardRestrictedInputMode()) 169 | return; 170 | Log.d("TAG", "====Bringging Application to Front===="); 171 | Intent notificationIntent = new Intent(this, MainActivity.class); 172 | notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 173 | PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 174 | try { 175 | pendingIntent.send(); 176 | } catch (PendingIntent.CanceledException e) { 177 | e.printStackTrace(); 178 | } 179 | } 180 | } -------------------------------------------------------------------------------- /app/src/main/java/id/sch/smkn2cikbar/exambrowser/MyDialogFragment.java: -------------------------------------------------------------------------------- 1 | package id.sch.smkn2cikbar.exambrowser; 2 | 3 | import android.app.AlertDialog; 4 | import android.app.Dialog; 5 | import android.content.DialogInterface; 6 | import android.os.Bundle; 7 | import android.support.v4.app.DialogFragment; 8 | 9 | /** 10 | * Created by robby on 21/11/17. 11 | */ 12 | 13 | public class MyDialogFragment extends DialogFragment { 14 | public Dialog onCreateDialog(Bundle savedInstanceState) { 15 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 16 | builder.setTitle("Tentang"); 17 | builder.setMessage("Programmed by\nRobby Akbar\n\nCopyright © 2017\nICT SMKN 2 Cikarang Barat"); 18 | builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 19 | public void onClick(DialogInterface dialog, int id) { 20 | } 21 | }); 22 | return builder.create(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/id/sch/smkn2cikbar/exambrowser/SplashScreen.java: -------------------------------------------------------------------------------- 1 | package id.sch.smkn2cikbar.exambrowser; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.os.Handler; 7 | 8 | public class SplashScreen extends Activity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_splash_screen); 14 | int SPLASH_DISPLAY_LENGTH = 3000; 15 | new Handler().postDelayed(new Runnable() { 16 | @Override 17 | public void run() { 18 | Intent intent = new Intent(SplashScreen.this, InputAddress.class); 19 | startActivity(intent); 20 | finish(); 21 | } 22 | }, SPLASH_DISPLAY_LENGTH); 23 | } 24 | 25 | protected void onPause() { 26 | super.onPause(); 27 | finish(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/id/sch/smkn2cikbar/exambrowser/progressDialogModel.java: -------------------------------------------------------------------------------- 1 | package id.sch.smkn2cikbar.exambrowser; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Context; 5 | 6 | /** 7 | * Created by robby on 21/11/17. 8 | */ 9 | 10 | public class progressDialogModel { 11 | 12 | static ProgressDialog progressDialog; 13 | 14 | public static void pdMenyiapkanDataLogin(Context context){ 15 | progressDialog=new ProgressDialog(context, R.style.AppCompatAlertDialogStyle); 16 | progressDialog.setMessage("Menyiapkan Data...."); 17 | progressDialog.setTitle("Silahkan Tunggu"); 18 | progressDialog.show(); 19 | } 20 | 21 | public static void hideProgressDialog(){ 22 | if (progressDialog != null) { 23 | progressDialog.dismiss(); 24 | progressDialog = null; 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 | 62 | 64 | 66 | 68 | 70 | 72 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vianziro/ExamBrowser-Android/2b3732ccc75e4efe5bdc09e23a8c95b2c28b3a05/app/src/main/res/drawable/offline.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_input_address.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | 15 | 20 | 21 | 29 | 30 | 31 |