diff --git a/app/build.gradle b/app/build.gradle index 45326db..990e471 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,7 +19,7 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' @@ -27,4 +27,6 @@ dependencies { androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation 'com.android.support:design:27.1.1' implementation 'com.android.support:cardview-v7:27.1.1' + implementation 'com.android.support:recyclerview-v7:27.1.1' + implementation 'com.github.chenupt.android:springindicator:1.0.2@aar' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a68942c..ef1da85 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,9 @@ + + + - + + + - + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/AsyncTaskActivity.java b/app/src/main/java/com/example/tanphirum/uikitapplication/AsyncTaskActivity.java new file mode 100644 index 0000000..e36caed --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/AsyncTaskActivity.java @@ -0,0 +1,105 @@ +package com.example.tanphirum.uikitapplication; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +public class AsyncTaskActivity extends AppCompatActivity { + + private static final String EXT_TEXT = "ext_text"; + private TextView mTxtLabel; + private Button mBtnStartTask; + private View mViewProgress; + + private StaticAsyncTask mTask; + + private static final String TAG = AsyncTaskActivity.class.getSimpleName(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_async_task); + + mViewProgress = findViewById(R.id.view_progress); + mTxtLabel = findViewById(R.id.txt_label); + mBtnStartTask = findViewById(R.id.btn_start_task); + + mTask = new StaticAsyncTask(mViewProgress); + + mBtnStartTask.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mTask.execute("query..."); + } + }); + + if (savedInstanceState != null) { + mTxtLabel.setText(savedInstanceState.getString(EXT_TEXT)); + } + + //sleepThread(); + } + + private void sleepThread() { + /*Random r = new Random(); + int n = r.nextInt(11);*/ + int s = 60000; + + try { + Thread.sleep(s); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private class StaticAsyncTask extends AsyncTask { + + private View mLocalProgress; + + public StaticAsyncTask(View viewProgress) { + super(); + this.mLocalProgress = viewProgress; + } + + @Override + protected void onPreExecute() { + mLocalProgress.setVisibility(View.VISIBLE); + super.onPreExecute(); + } + + @Override + protected String doInBackground(String... strings) { + try { + Thread.sleep(600); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "Hello asynctask " + strings[0]; + } + + @Override + protected void onPostExecute(String s) { + super.onPostExecute(s); + mLocalProgress.setVisibility(View.GONE); + mTxtLabel.setText(s); + Log.d(TAG, "handle string from doInBackgroun = " + s); + } + } + + @Override + protected void onDestroy() { + mTask.cancel(true); + Log.d(TAG, "onDestroy called"); + super.onDestroy(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString(EXT_TEXT, mTxtLabel.getText().toString()); + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/AsyncTaskLoaderActivity.java b/app/src/main/java/com/example/tanphirum/uikitapplication/AsyncTaskLoaderActivity.java new file mode 100644 index 0000000..8a6e079 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/AsyncTaskLoaderActivity.java @@ -0,0 +1,93 @@ +package com.example.tanphirum.uikitapplication; + +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.TextInputEditText; +import android.support.design.widget.TextInputLayout; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.Loader; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.Toast; + +import com.example.tanphirum.uikitapplication.task.AsyncTaskLoader; + +import org.json.JSONException; +import org.json.JSONObject; + +public class AsyncTaskLoaderActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks{ + + private static final String TAG = AsyncTaskLoaderActivity.class.getSimpleName(); + + private TextInputLayout mTxtInput; + private TextInputEditText mEdtUsername; + private Button mBtnGetData; + + private View mViewProgress; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_async_task_loader); + + mTxtInput = findViewById(R.id.txt_input_username); + mEdtUsername = findViewById(R.id.edt_username); + mBtnGetData = findViewById(R.id.btn_get_data); + + mViewProgress = findViewById(R.id.view_progress); + + if (getSupportLoaderManager().getLoader(0) != null) + getSupportLoaderManager().initLoader(0, null, this); + + mBtnGetData.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = null; + if (connectivityManager != null) { + networkInfo = connectivityManager.getActiveNetworkInfo(); + } + + if (networkInfo != null && networkInfo.isConnected()) { + getSupportLoaderManager().restartLoader(0, null, AsyncTaskLoaderActivity.this); + } else + Toast.makeText(v.getContext(), "No internet connection!!!", Toast.LENGTH_SHORT).show(); + + } + }); + } + + @NonNull + @Override + public Loader onCreateLoader(int id, @Nullable Bundle args) { + mViewProgress.setVisibility(View.VISIBLE); + return new AsyncTaskLoader(this); + } + + @Override + public void onLoadFinished(@NonNull Loader loader, String data) { + mViewProgress.setVisibility(View.GONE); + Log.d(TAG, "data return =" + data); + try { + JSONObject jsonObject = new JSONObject(data); + if (jsonObject.optBoolean("status")) { + JSONObject objResponse = jsonObject.optJSONObject("response"); + mEdtUsername.setText(objResponse.optString("fullname")); + Log.d(TAG, "objResponse = " + objResponse); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + @Override + public void onLoaderReset(@NonNull Loader loader) { + + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/BroadcastActivity.java b/app/src/main/java/com/example/tanphirum/uikitapplication/BroadcastActivity.java new file mode 100644 index 0000000..94d6160 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/BroadcastActivity.java @@ -0,0 +1,70 @@ +package com.example.tanphirum.uikitapplication; + +import android.content.ComponentName; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.support.v4.content.LocalBroadcastManager; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.ToggleButton; + +public class BroadcastActivity extends AppCompatActivity { + + private ToggleButton mTgbOnOff; + private Button mBtnSend; + + private CustomReceiver mReceiver; + + private ComponentName mReceiverConComponentName; + private PackageManager mPackageManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_broadcast); + + mTgbOnOff = findViewById(R.id.tgb_on_off); + mBtnSend = findViewById(R.id.btn_send_broad); + + mReceiver = new CustomReceiver(); + + mReceiverConComponentName = new ComponentName(this, CustomReceiver.class); + mPackageManager = getPackageManager(); + + LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, new IntentFilter(CustomReceiver.ACTION_CUSTOM_BROADCAST)); + registerGlobalReceiver(true); + + mBtnSend.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(CustomReceiver.ACTION_CUSTOM_BROADCAST); + LocalBroadcastManager.getInstance(v.getContext()).sendBroadcast(intent); + } + }); + + mTgbOnOff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + registerGlobalReceiver(isChecked); + } + }); + } + + @Override + protected void onDestroy() { + LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver); + super.onDestroy(); + } + + private void registerGlobalReceiver(boolean isRegister) { + if (isRegister) { + mPackageManager.setComponentEnabledSetting(mReceiverConComponentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + } else { + mPackageManager.setComponentEnabledSetting(mReceiverConComponentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + } + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/CustomReceiver.java b/app/src/main/java/com/example/tanphirum/uikitapplication/CustomReceiver.java new file mode 100644 index 0000000..4c32566 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/CustomReceiver.java @@ -0,0 +1,34 @@ +package com.example.tanphirum.uikitapplication; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.widget.Toast; + +public class CustomReceiver extends BroadcastReceiver { + + public static final String ACTION_CUSTOM_BROADCAST = BuildConfig.APPLICATION_ID + ".ACTION_CUSTOM_BROADCAST"; + + @Override + public void onReceive(Context context, Intent intent) { + String message = null; + String intentAction = intent.getAction(); + if (intentAction == null) return; + + switch (intentAction) { + case Intent.ACTION_POWER_CONNECTED: + message = context.getString(R.string.power_connected); + break; + case Intent.ACTION_POWER_DISCONNECTED: + message = context.getString(R.string.power_disconnected); + break; + case Intent.ACTION_BATTERY_CHANGED: + message = context.getString(R.string.power_changed); + break; + case ACTION_CUSTOM_BROADCAST: + message = context.getString(R.string.local_broadcast_call); + break; + } + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/RecyclerViewActivity.java b/app/src/main/java/com/example/tanphirum/uikitapplication/RecyclerViewActivity.java new file mode 100644 index 0000000..5379ee4 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/RecyclerViewActivity.java @@ -0,0 +1,91 @@ +package com.example.tanphirum.uikitapplication; + +import android.os.Bundle; +import android.os.Handler; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.widget.Button; + +import com.example.tanphirum.uikitapplication.adapter.ListAdapter; +import com.example.tanphirum.uikitapplication.callback.EndlessRecyclerViewScrollListener; + +import java.util.LinkedList; + +public class RecyclerViewActivity extends AppCompatActivity /*implements MyItemClickListener*/{ + + private static final String TAG = RecyclerViewActivity.class.getSimpleName(); + + private EndlessRecyclerViewScrollListener mListener; + + private RecyclerView mRcv; + private ListAdapter adapter; + private LinearLayoutManager manager; + private LinkedList mListData; + + private Button mBtnTest; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recycler_view); + + mListData = new LinkedList<>(); + + mBtnTest = findViewById(R.id.btn_test); + + mRcv = findViewById(R.id.rcv); + //adapter = new ListAdapter(this, createList(20), this); + adapter = new ListAdapter(this, createList(20)); + manager = new LinearLayoutManager(this); + //manager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); + //manager = new GridLayoutManager(this, 3); + //manager = new GridLayoutManager(this, 4, LinearLayoutManager.HORIZONTAL, false); + //manager = new GridLayoutManager(this, 3, LinearLayoutManager.VERTICAL, false); + //StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); + //StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL); + mRcv.setLayoutManager(manager); + + adapter.setListener(new ListAdapter.MyItemClickListener() { + @Override + public void myItemClick(int pos, String item) { + mBtnTest.setText("new callback : Pos " + pos + " item " + item); + } + }); + + mListener = new EndlessRecyclerViewScrollListener(manager) { + @Override + public void onLoadMore(final int page, int totalItemsCount, RecyclerView view) { + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + int totalCurrentSize = adapter.getItemCount(); + adapter.insertItem(createList(10)); + adapter.notifyItemRangeChanged(totalCurrentSize, adapter.getItemCount()); + Log.d(TAG, "Page " + page); + } + }, 500); + + } + }; + + mRcv.addOnScrollListener(mListener); + + mRcv.setAdapter(adapter); + } + + private Handler mHandler = new Handler(); + + private LinkedList createList(int amount) { + for (int i=0; i < amount; i++) { + mListData.add("item " + i); + } + return mListData; + } + + /*@Override + public void MyItemClick(int pos, String item) { + Log.d(TAG, "Pos " + pos + " item " + item); + ((Button)findViewById(R.id.btn_test)).setText("Pos " + pos + " item " + item); + }*/ +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/RegisterActivity.java b/app/src/main/java/com/example/tanphirum/uikitapplication/RegisterActivity.java index 0a0f2aa..c1f15a7 100644 --- a/app/src/main/java/com/example/tanphirum/uikitapplication/RegisterActivity.java +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/RegisterActivity.java @@ -1,29 +1,37 @@ package com.example.tanphirum.uikitapplication; import android.content.DialogInterface; +import android.os.Bundle; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; +import android.telephony.PhoneNumberFormattingTextWatcher; import android.text.TextUtils; import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.Spinner; import android.widget.Toast; +import com.example.tanphirum.uikitapplication.fragment.DatePickerFragment; +import com.example.tanphirum.uikitapplication.fragment.TimePickerFragment; + public class RegisterActivity extends AppCompatActivity { private TextInputLayout mTxtInputUsername, mTxtInputPass, mTxtInputConfPass; - private TextInputEditText mEdtUsername, mEdtPass, mEdtConfPass; - private Button mBtnRegister; + private TextInputEditText mEdtUsername, mEdtPass, mEdtConfPass, mEdtPhone; + private Button mBtnRegister, mBtnDob, mBtnTime; private String pass, confPass; + private Spinner mSpPnone; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); - mTxtInputUsername = findViewById(R.id.txt_input_username); + this.mTxtInputUsername = findViewById(R.id.txt_input_username); mTxtInputPass = findViewById(R.id.txt_input_pass); mTxtInputConfPass = findViewById(R.id.txt_input_conf_pass); @@ -33,6 +41,12 @@ protected void onCreate(Bundle savedInstanceState) { mBtnRegister = findViewById(R.id.btn_register); + mEdtPhone = findViewById(R.id.edt_phone); + mSpPnone = findViewById(R.id.sp_phone); + + mBtnDob = findViewById(R.id.btn_dob); + mBtnTime = findViewById(R.id.btn_time); + mBtnRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { @@ -68,5 +82,52 @@ public void onClick(DialogInterface dialog, int which) { } } }); + + final ArrayAdapter phoneAdapter = ArrayAdapter.createFromResource(this, R.array.array_phone, + android.R.layout.simple_spinner_item); + phoneAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + mSpPnone.setAdapter(phoneAdapter); + + mSpPnone.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + Toast.makeText(view.getContext(), "item click =" + phoneAdapter.getItem(position), Toast.LENGTH_SHORT).show(); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + + mEdtPhone.addTextChangedListener(new PhoneNumberFormattingTextWatcher()); + + mBtnDob.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + DatePickerFragment dialog = new DatePickerFragment(); + dialog.setCancelable(false); + dialog.show(getSupportFragmentManager(), "datePicker"); + } + }); + + mBtnTime.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + new TimePickerFragment().show(getSupportFragmentManager(), "timePicker"); + } + }); + } + + public void handleDatePickerValue(int year, int month, int dayOfMonth) { + int localMonth = month + 1; + Toast.makeText(this, "date :" + dayOfMonth +"/" + localMonth + "/" + year, Toast.LENGTH_SHORT).show(); } + + public void handlerTimePickerValue(int hourOfDay, int minute) { + Toast.makeText(this, "Time :" + hourOfDay +"/" + minute, Toast.LENGTH_SHORT).show(); + } + + } diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/ViewPagerActivity.java b/app/src/main/java/com/example/tanphirum/uikitapplication/ViewPagerActivity.java new file mode 100644 index 0000000..233153a --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/ViewPagerActivity.java @@ -0,0 +1,60 @@ +package com.example.tanphirum.uikitapplication; + +import android.os.Bundle; +import android.support.design.widget.TabLayout; +import android.support.v4.view.ViewPager; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; + +import com.example.tanphirum.uikitapplication.adapter.MyFragmentPagerAdapter; + +public class ViewPagerActivity extends AppCompatActivity { + + private ViewPager mPager; + //private MyPagerAdapter adapter; + + private MyFragmentPagerAdapter adapter; + private static final String TAG = ViewPagerActivity.class.getSimpleName(); + + + private TabLayout mTabBar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_pager); + + mPager = findViewById(R.id.pager); + + mTabBar = findViewById(R.id.tab_bar); + + //adapter = new MyPagerAdapter(this); + //mPager.setOffscreenPageLimit(3); + + adapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); + mPager.setAdapter(adapter); + + mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + Log.d(TAG, "onPageScrolled " + position); + } + + @Override + public void onPageSelected(int position) { + Log.d(TAG, "onPageSelected " + position); + } + + @Override + public void onPageScrollStateChanged(int state) { + //Log.d(TAG, "onPageScrollStateChanged " + State); + } + }); + mTabBar.setupWithViewPager(mPager); + + for (int i=0; i < adapter.getCount(); i++) { + mTabBar.getTabAt(i).setIcon(R.mipmap.ic_launcher); + } + + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/WebViewActivity.java b/app/src/main/java/com/example/tanphirum/uikitapplication/WebViewActivity.java new file mode 100644 index 0000000..0180781 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/WebViewActivity.java @@ -0,0 +1,100 @@ +package com.example.tanphirum.uikitapplication; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ProgressBar; +import android.widget.Toast; + +public class WebViewActivity extends AppCompatActivity { + + private WebView mWebview; + private ProgressBar mProgressBar; + + @SuppressLint("SetJavaScriptEnabled") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_web_view); + + mProgressBar = findViewById(R.id.pb); + mWebview = findViewById(R.id.wv); + + mProgressBar.setMax(100); + + mWebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); + + mWebview.getSettings().setJavaScriptEnabled(true); + mWebview.setWebChromeClient(new WebChromeClient() { + public void onProgressChanged(WebView view, int progress) { + // Activities and WebViews measure progress with different scales. + // The progress meter will automatically disappear when we reach 100% + //activity.setProgress(progress * 1000); + mProgressBar.setProgress(progress); + } + + + }); + mWebview.setWebViewClient(new WebViewClient() { + + public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { + Toast.makeText(view.getContext(), "Oh no! " + description, Toast.LENGTH_SHORT).show(); + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + mProgressBar.setVisibility(View.GONE); + } + }); + JavaScriptInterface javaInterface = new JavaScriptInterface(this); + mWebview.addJavascriptInterface(javaInterface, "JSInterface"); + + + //mWebview.loadUrl("https://developers.google.com/"); + + String summary = "You scored 192 points."; + mWebview.loadData(htmlTest, "text/html", null); + //mWebview.loadDataWithBaseURL("""my.sabay.com/"); + + } + + public class JavaScriptInterface { + Context mContext; + + /** Instantiate the interface and set the context */ + JavaScriptInterface(Context c) { + mContext = c; + } + + @android.webkit.JavascriptInterface + public void changeActivity() + { + Toast.makeText(mContext, "Handle click event", Toast.LENGTH_SHORT).show(); + } + } + + private String htmlTest = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
\n" + + "\n" + + "
\n" + + "\n" + + ""; + +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/ListAdapter.java b/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/ListAdapter.java new file mode 100644 index 0000000..f496bdb --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/ListAdapter.java @@ -0,0 +1,138 @@ +package com.example.tanphirum.uikitapplication.adapter; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.tanphirum.uikitapplication.R; + +import java.util.LinkedList; + +public class ListAdapter extends RecyclerView.Adapter{ + + private LayoutInflater mInflater; + + private LinkedList mListData; + + private final int VIEW_PROG = 0; + private final int VIEW_LAYOUT = 1; + /*private static MyItemClickListener mListener; + + public ListAdapter(Context context, LinkedList list, MyItemClickListener listener) { + super(); + mInflater = LayoutInflater.from(context); + mListData = list; + mListener = listener; + }*/ + + public ListAdapter(Context context, LinkedList list) { + super(); + mInflater = LayoutInflater.from(context); + mListData = list; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + RecyclerView.ViewHolder v; + if (viewType == VIEW_PROG) { + v = new MyProgressViewHolder(mInflater.inflate(R.layout.layout_progres_bar, parent, false)); + } else { + v = new MyViewHolder(mInflater.inflate(R.layout.layout_list_item, parent, false)); + } + return v; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder instanceof MyViewHolder) { + ((MyViewHolder) holder).mTxtItemName.setText(mListData.get(position)); + } + } + + @Override + public int getItemViewType(int position) { + if (position == (mListData.size() - 1)) { + return VIEW_PROG; + } + return VIEW_LAYOUT; + } + + /*@NonNull + @Override + public ListAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new MyViewHolder(mInflater.inflate(R.layout.layout_list_item, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ListAdapter.MyViewHolder holder, int position) { + holder.mTxtItemName.setText(mListData.get(position)); + }*/ + + @Override + public int getItemCount() { + return mListData.size(); + } + + public void insertItem(String item) { + mListData.add(item); + } + + public void insertItem(LinkedList items) { + mListData.addAll(items); + } + + public void updateItem(int pos, String item) { + mListData.set(pos, item); + } + + public void clearItem() { + mListData.clear(); + } + + class MyProgressViewHolder extends RecyclerView.ViewHolder { + private TextView mTxtProgress; + public MyProgressViewHolder(View itemView) { + super(itemView); + mTxtProgress = itemView.findViewById(R.id.txt_progress); + } + } + + class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ + + private ImageView mImgIcon; + private TextView mTxtItemName; + + public MyViewHolder(View itemView) { + super(itemView); + mImgIcon = itemView.findViewById(R.id.img_icon); + mTxtItemName = itemView.findViewById(R.id.txt_item_name); + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + if (mListener != null) + mListener.myItemClick(getLayoutPosition(), mTxtItemName.getText().toString()); + + Toast.makeText(v.getContext(), "Item click on pos " + getLayoutPosition(), Toast.LENGTH_SHORT).show(); + } + } + + private MyItemClickListener mListener; + + public interface MyItemClickListener { + public void myItemClick(int pos, String item); + } + + public void setListener(MyItemClickListener listener) { + this.mListener = listener; + } + +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/MyFragmentPagerAdapter.java b/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/MyFragmentPagerAdapter.java new file mode 100644 index 0000000..e87d2e2 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/MyFragmentPagerAdapter.java @@ -0,0 +1,40 @@ +package com.example.tanphirum.uikitapplication.adapter; + +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; + +import com.example.tanphirum.uikitapplication.fragment.EmptyFragment; +import com.example.tanphirum.uikitapplication.fragment.MainFragment; +import com.example.tanphirum.uikitapplication.fragment.RegisterFragment; + +public class MyFragmentPagerAdapter extends FragmentPagerAdapter{ + + public MyFragmentPagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + switch (position) { + case 0: + return new RegisterFragment(); + case 1: + return new MainFragment(); + default: + return new EmptyFragment(); + } + } + + @Nullable + @Override + public CharSequence getPageTitle(int position) { + return null; + } + + @Override + public int getCount() { + return 5; + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/MyPagerAdapter.java b/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/MyPagerAdapter.java new file mode 100644 index 0000000..47b0c60 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/adapter/MyPagerAdapter.java @@ -0,0 +1,65 @@ +package com.example.tanphirum.uikitapplication.adapter; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.view.PagerAdapter; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.example.tanphirum.uikitapplication.R; + +public class MyPagerAdapter extends PagerAdapter{ + + private Context mContext; + private LayoutInflater mInflater; + + private int[] resValues = new int[]{ + R.mipmap.ic_launcher, android.R.mipmap.sym_def_app_icon, R.mipmap.ic_profile_image + }; + + public MyPagerAdapter(Context context) { + super(); + mContext = context; + mInflater = LayoutInflater.from(context); + } + + public MyPagerAdapter(Context context, String st) { + super(); + mContext = context; + mInflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return resValues.length; + } + + @NonNull + @Override + public Object instantiateItem(@NonNull ViewGroup container, int position) { + View itemView = mInflater.inflate(R.layout.layout_list_item, container, false); + ImageView img = itemView.findViewById(R.id.img_icon); + img.setImageDrawable(mContext.getDrawable(resValues[position])); + container.addView(itemView); + return itemView; + } + + @Override + public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { + return view == (View) object; + } + + @Override + public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { + container.removeView((View) object); + } + + @Nullable + @Override + public CharSequence getPageTitle(int position) { + return "Title " +position; + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/callback/EndlessRecyclerViewScrollListener.java b/app/src/main/java/com/example/tanphirum/uikitapplication/callback/EndlessRecyclerViewScrollListener.java new file mode 100644 index 0000000..116f065 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/callback/EndlessRecyclerViewScrollListener.java @@ -0,0 +1,109 @@ +package com.example.tanphirum.uikitapplication.callback; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; + +public abstract class EndlessRecyclerViewScrollListener extends RecyclerView.OnScrollListener { + // The minimum amount of items to have below your current scroll position + // before loading more. + private int visibleThreshold = 2; + // The current offset index of data you have loaded + private int currentPage = 0; + // The total number of items in the dataset after the last load + private int previousTotalItemCount = 0; + // True if we are still waiting for the last set of data to load. + private boolean loading = true; + // Sets the starting page index + private int startingPageIndex = 0; + + RecyclerView.LayoutManager mLayoutManager; + + public EndlessRecyclerViewScrollListener(LinearLayoutManager layoutManager) { + this.mLayoutManager = layoutManager; + } + + public EndlessRecyclerViewScrollListener(GridLayoutManager layoutManager) { + this.mLayoutManager = layoutManager; + visibleThreshold = visibleThreshold * layoutManager.getSpanCount(); + } + + public EndlessRecyclerViewScrollListener(StaggeredGridLayoutManager layoutManager) { + this.mLayoutManager = layoutManager; + visibleThreshold = visibleThreshold * layoutManager.getSpanCount(); + } + + public int getLastVisibleItem(int[] lastVisibleItemPositions) { + int maxSize = 0; + for (int i = 0; i < lastVisibleItemPositions.length; i++) { + if (i == 0) { + maxSize = lastVisibleItemPositions[i]; + } + else if (lastVisibleItemPositions[i] > maxSize) { + maxSize = lastVisibleItemPositions[i]; + } + } + return maxSize; + } + + // This happens many times a second during a scroll, so be wary of the code you place here. + // We are given a few useful parameters to help us work out if we need to load some more data, + // but first we check if we are waiting for the previous load to finish. + @Override + public void onScrolled(RecyclerView view, int dx, int dy) { + int lastVisibleItemPosition = 0; + int totalItemCount = mLayoutManager.getItemCount(); + + if (mLayoutManager instanceof StaggeredGridLayoutManager) { + int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) mLayoutManager).findLastVisibleItemPositions(null); + // get maximum element within the list + lastVisibleItemPosition = getLastVisibleItem(lastVisibleItemPositions); + } else if (mLayoutManager instanceof GridLayoutManager) { + lastVisibleItemPosition = ((GridLayoutManager) mLayoutManager).findLastVisibleItemPosition(); + } else if (mLayoutManager instanceof LinearLayoutManager) { + lastVisibleItemPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition(); + } + + // If the total item count is zero and the previous isn't, assume the + // list is invalidated and should be reset back to initial state + if (totalItemCount < previousTotalItemCount) { + this.currentPage = this.startingPageIndex; + this.previousTotalItemCount = totalItemCount; + if (totalItemCount == 0) { + this.loading = true; + } + } + // If it’s still loading, we check to see if the dataset count has + // changed, if so we conclude it has finished loading and update the current page + // number and total item count. + if (loading && (totalItemCount > previousTotalItemCount)) { + loading = false; + previousTotalItemCount = totalItemCount; + } + + // If it isn’t currently loading, we check to see if we have breached + // the visibleThreshold and need to reload more data. + // If we do need to reload some more data, we execute onLoadMore to fetch the data. + // threshold should reflect how many total columns there are too + if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) { + currentPage++; + onLoadMore(currentPage, totalItemCount, view); + loading = true; + } + } + + // Call this method whenever performing new searches + public void resetState() { + this.currentPage = this.startingPageIndex; + this.previousTotalItemCount = 0; + this.loading = true; + } + + // Defines the process for actually loading more data based on page + public abstract void onLoadMore(int page, int totalItemsCount, RecyclerView view); + +} + + + diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/callback/MyItemClickListener.java b/app/src/main/java/com/example/tanphirum/uikitapplication/callback/MyItemClickListener.java new file mode 100644 index 0000000..62c8b65 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/callback/MyItemClickListener.java @@ -0,0 +1,6 @@ +package com.example.tanphirum.uikitapplication.callback; + +public interface MyItemClickListener { + + public void MyItemClick(int pos, String item); +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/DatePickerFragment.java b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/DatePickerFragment.java new file mode 100644 index 0000000..03db232 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/DatePickerFragment.java @@ -0,0 +1,36 @@ +package com.example.tanphirum.uikitapplication.fragment; + +import android.app.DatePickerDialog; +import android.app.Dialog; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.widget.DatePicker; + +import com.example.tanphirum.uikitapplication.RegisterActivity; + +import java.util.Calendar; + +public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + int day = calendar.get(Calendar.DAY_OF_MONTH); + if (getActivity() == null) + return null; + return new DatePickerDialog(getActivity(), this, year, month, day); + } + + @Override + public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { + if (getActivity() == null) { + return; + } + if (getActivity() instanceof RegisterActivity) { + RegisterActivity registerActivity = (RegisterActivity) getActivity(); + registerActivity.handleDatePickerValue(year, month, dayOfMonth); + } + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/EmptyFragment.java b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/EmptyFragment.java new file mode 100644 index 0000000..b234543 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/EmptyFragment.java @@ -0,0 +1,25 @@ +package com.example.tanphirum.uikitapplication.fragment; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.example.tanphirum.uikitapplication.R; + +public class EmptyFragment extends Fragment { + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.framment_empty, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/MainFragment.java b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/MainFragment.java new file mode 100644 index 0000000..4fb9e31 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/MainFragment.java @@ -0,0 +1,37 @@ +package com.example.tanphirum.uikitapplication.fragment; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.example.tanphirum.uikitapplication.R; + +public class MainFragment extends Fragment{ + + private TextView mTxtPagerItem; + + public MainFragment() { + super(); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.activity_main, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + mTxtPagerItem = view.findViewById(R.id.txt_pager_item); + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/RegisterFragment.java b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/RegisterFragment.java new file mode 100644 index 0000000..2a5e9de --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/RegisterFragment.java @@ -0,0 +1,46 @@ +package com.example.tanphirum.uikitapplication.fragment; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import com.example.tanphirum.uikitapplication.R; + +public class RegisterFragment extends Fragment{ + + private TextView mTxtPagerItem; + + public RegisterFragment() { + super(); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.activity_register, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + + ((Button) view.findViewById(R.id.btn_dob)).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + DatePickerFragment dialog = new DatePickerFragment(); + dialog.setCancelable(false); + dialog.show(getFragmentManager(), "datePicker"); + } + }); + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/TimePickerFragment.java b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/TimePickerFragment.java new file mode 100644 index 0000000..c02b84a --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/fragment/TimePickerFragment.java @@ -0,0 +1,35 @@ +package com.example.tanphirum.uikitapplication.fragment; + +import android.app.Dialog; +import android.app.TimePickerDialog; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.widget.TimePicker; + +import com.example.tanphirum.uikitapplication.RegisterActivity; + +import java.util.Calendar; + +public class TimePickerFragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener { + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + // Use the current time as the default values for the picker. + final Calendar c = Calendar.getInstance(); + int hour = c.get(Calendar.HOUR_OF_DAY); + int minute = c.get(Calendar.MINUTE); + // Create a new instance of TimePickerDialog and return it. + return new TimePickerDialog(getActivity(), this, hour, minute, false); + } + + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + if (getActivity() == null) + return; + + if (getActivity() instanceof RegisterActivity) { + RegisterActivity registerActivity = (RegisterActivity) getActivity(); + registerActivity.handlerTimePickerValue(hourOfDay, minute); + } + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/task/AsyncTaskLoader.java b/app/src/main/java/com/example/tanphirum/uikitapplication/task/AsyncTaskLoader.java new file mode 100644 index 0000000..1b9143e --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/task/AsyncTaskLoader.java @@ -0,0 +1,25 @@ +package com.example.tanphirum.uikitapplication.task; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.example.tanphirum.uikitapplication.webservice.NetworkUtils; + +public class AsyncTaskLoader extends android.support.v4.content.AsyncTaskLoader{ + + public AsyncTaskLoader(@NonNull Context context) { + super(context); + } + + @Override + protected void onStartLoading() { + forceLoad(); + } + + @Nullable + @Override + public String loadInBackground() { + return NetworkUtils.getDataFromServer(null); + } +} diff --git a/app/src/main/java/com/example/tanphirum/uikitapplication/webservice/NetworkUtils.java b/app/src/main/java/com/example/tanphirum/uikitapplication/webservice/NetworkUtils.java new file mode 100644 index 0000000..2b745e7 --- /dev/null +++ b/app/src/main/java/com/example/tanphirum/uikitapplication/webservice/NetworkUtils.java @@ -0,0 +1,48 @@ +package com.example.tanphirum.uikitapplication.webservice; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class NetworkUtils { + + public static String getDataFromServer(String param){ + + HttpURLConnection httpURLConnection; + + BufferedReader reader; + + String jsonResponse = null; + + try { + URL requestUrl = new URL("http://www.mocky.io/v2/5b1ffaf0310000bf2d230aae"); + + httpURLConnection = (HttpURLConnection) requestUrl.openConnection(); + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.connect(); + + InputStream inputStream = httpURLConnection.getInputStream(); + + StringBuilder builder = new StringBuilder(); + + reader = new BufferedReader(new InputStreamReader(inputStream)); + + String line; + while ((line = reader.readLine()) != null) { + builder.append(line + "\n"); + } + + if (builder.length() == 0) + return null; + + jsonResponse = builder.toString(); + + } catch (IOException e) { + e.printStackTrace(); + } + return jsonResponse; + } +} diff --git a/app/src/main/res/layout/activity_async_task.xml b/app/src/main/res/layout/activity_async_task.xml new file mode 100644 index 0000000..a3b9c85 --- /dev/null +++ b/app/src/main/res/layout/activity_async_task.xml @@ -0,0 +1,33 @@ + + + + + +