diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..d5518c1 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index 40bdc1f..6b2c910 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # TimetableView [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![API](https://img.shields.io/badge/API-19%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=19) -[![](https://jitpack.io/v/tlaabs/TimetableView.svg)](https://jitpack.io/#tlaabs/TimetableView) +[![](https://jitpack.io/v/omarb1989/TimetableView.svg)](https://jitpack.io/#omarb1989/TimetableView) Android Library that creates simple time table. +![dark](https://user-images.githubusercontent.com/9026030/128323499-f8562b86-8f18-4cc3-a6b5-3165b03ad88b.jpg) +![light](https://user-images.githubusercontent.com/9026030/128323528-678ceab1-4dd8-40e1-a09b-e66b98ed0343.jpg) -![img0](https://postfiles.pstatic.net/MjAxOTAxMjdfMTUz/MDAxNTQ4NTcyNTU5NTk4.M9hWyDvljjkoBDW-naLrTRqRAXUM8WRUyZXptTLKbs8g.b0FN12d8Cmxp5OWZqlQcusL_mJYNKgx6a_XLe_1ALOog.JPEG.tlaabs/Screenshot_Air.jpg?type=w773) -![img1](https://user-images.githubusercontent.com/8165219/62833150-b88d3180-bc74-11e9-9b20-02a0ad03e778.jpg) ## How to import @@ -23,7 +23,7 @@ allprojects { Add the dependency ```gradle dependencies { - implementation 'com.github.tlaabs:TimetableView:1.0.3-fx1' + implementation 'omarb1989:TimetableView:1.0.4-fx5' } ``` @@ -36,7 +36,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" ### TimetableView in layout ```xml - schedules) { + + } + }); +``` ### Add schdule ```java ArrayList schedules = new ArrayList(); @@ -103,6 +120,7 @@ schedule.setClassPlace("IT-601"); // sets place schedule.setProfessorName("Won Kim"); // sets professor schedule.setStartTime(new Time(10,0)); // sets the beginning of class time (hour,minute) schedule.setEndTime(new Time(13,30)); // sets the end of class time (hour,minute) +int uniqueId = schedule.get_id();// you can use it later on wherever you get schedule object to identify it schedules.add(schedule); //.. add one or more schedules timetable.add(schedules); @@ -123,7 +141,7 @@ timetable.removeAll(); // remove all items ### Highlight header **1.Color type(Default)** ```xml - + package="com.github.omarb1989.timetableviewdemo"> - + - + \ No newline at end of file diff --git a/app/src/main/java/com/github/tlaabs/timetableviewdemo/EditActivity.java b/app/src/main/java/com/github/omarb1989/timetableviewdemo/EditActivity.java similarity index 96% rename from app/src/main/java/com/github/tlaabs/timetableviewdemo/EditActivity.java rename to app/src/main/java/com/github/omarb1989/timetableviewdemo/EditActivity.java index f98b153..ec64517 100644 --- a/app/src/main/java/com/github/tlaabs/timetableviewdemo/EditActivity.java +++ b/app/src/main/java/com/github/omarb1989/timetableviewdemo/EditActivity.java @@ -1,9 +1,9 @@ -package com.github.tlaabs.timetableviewdemo; +package com.github.omarb1989.timetableviewdemo; import android.app.TimePickerDialog; import android.content.Context; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; @@ -13,8 +13,8 @@ import android.widget.TextView; import android.widget.TimePicker; -import com.github.tlaabs.timetableview.Schedule; -import com.github.tlaabs.timetableview.Time; +import com.github.omarb1989.timetableview.Schedule; +import com.github.omarb1989.timetableview.Time; import java.util.ArrayList; diff --git a/app/src/main/java/com/github/tlaabs/timetableviewdemo/MainActivity.java b/app/src/main/java/com/github/omarb1989/timetableviewdemo/MainActivity.java similarity index 57% rename from app/src/main/java/com/github/tlaabs/timetableviewdemo/MainActivity.java rename to app/src/main/java/com/github/omarb1989/timetableviewdemo/MainActivity.java index 75cce12..f9329a1 100644 --- a/app/src/main/java/com/github/tlaabs/timetableviewdemo/MainActivity.java +++ b/app/src/main/java/com/github/omarb1989/timetableviewdemo/MainActivity.java @@ -1,18 +1,20 @@ -package com.github.tlaabs.timetableviewdemo; +package com.github.omarb1989.timetableviewdemo; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.preference.PreferenceManager; import android.view.View; import android.widget.Button; import android.widget.Toast; -import com.github.tlaabs.timetableview.Schedule; -import com.github.tlaabs.timetableview.TimetableView; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.res.ResourcesCompat; + +import com.github.omarb1989.timetableview.Schedule; +import com.github.omarb1989.timetableview.TimetableView; import java.util.ArrayList; @@ -27,15 +29,24 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe private Button loadBtn; private TimetableView timetable; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); + timetable.setOnStickerSelectEventListener(new TimetableView.OnStickerSelectedLongClickListener() { + @Override + public void OnStickerSelectedLongClick(int idx, ArrayList schedules) { + //Toast.makeText(context, "LongClick idx = " + idx, Toast.LENGTH_SHORT).show(); + } + }); + // timetable.setBackgroundColor(ResourcesCompat.getColor(getResources(),R.color.default_sticker_font_color)); + } - private void init(){ + private void init() { this.context = this; addBtn = findViewById(R.id.add_btn); clearBtn = findViewById(R.id.clear_btn); @@ -47,7 +58,7 @@ private void init(){ initView(); } - private void initView(){ + private void initView() { addBtn.setOnClickListener(this); clearBtn.setOnClickListener(this); saveBtn.setOnClickListener(this); @@ -56,22 +67,23 @@ private void initView(){ timetable.setOnStickerSelectEventListener(new TimetableView.OnStickerSelectedListener() { @Override public void OnStickerSelected(int idx, ArrayList schedules) { + //Toast.makeText(context, "idx = " + idx, Toast.LENGTH_SHORT).show(); Intent i = new Intent(context, EditActivity.class); - i.putExtra("mode",REQUEST_EDIT); + i.putExtra("mode", REQUEST_EDIT); i.putExtra("idx", idx); i.putExtra("schedules", schedules); - startActivityForResult(i,REQUEST_EDIT); + startActivityForResult(i, REQUEST_EDIT); } }); } @Override public void onClick(View v) { - switch (v.getId()){ + switch (v.getId()) { case R.id.add_btn: - Intent i = new Intent(this,EditActivity.class); - i.putExtra("mode",REQUEST_ADD); - startActivityForResult(i,REQUEST_ADD); + Intent i = new Intent(this, EditActivity.class); + i.putExtra("mode", REQUEST_ADD); + startActivityForResult(i, REQUEST_ADD); break; case R.id.clear_btn: timetable.removeAll(); @@ -87,45 +99,49 @@ public void onClick(View v) { @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - switch (requestCode){ + switch (requestCode) { case REQUEST_ADD: - if(resultCode == EditActivity.RESULT_OK_ADD){ - ArrayList item = (ArrayList)data.getSerializableExtra("schedules"); + if (resultCode == EditActivity.RESULT_OK_ADD) { + ArrayList item = (ArrayList) data.getSerializableExtra("schedules"); timetable.add(item); } break; case REQUEST_EDIT: /** Edit -> Submit */ - if(resultCode == EditActivity.RESULT_OK_EDIT){ - int idx = data.getIntExtra("idx",-1); - ArrayList item = (ArrayList)data.getSerializableExtra("schedules"); - timetable.edit(idx,item); + if (resultCode == EditActivity.RESULT_OK_EDIT) { + int idx = data.getIntExtra("idx", -1); + ArrayList item = (ArrayList) data.getSerializableExtra("schedules"); + timetable.edit(idx, item); } /** Edit -> Delete */ - else if(resultCode == EditActivity.RESULT_OK_DELETE){ - int idx = data.getIntExtra("idx",-1); + else if (resultCode == EditActivity.RESULT_OK_DELETE) { + int idx = data.getIntExtra("idx", -1); timetable.remove(idx); } break; } } - /** save timetableView's data to SharedPreferences in json format */ - private void saveByPreference(String data){ + /** + * save timetableView's data to SharedPreferences in json format + */ + private void saveByPreference(String data) { SharedPreferences mPref = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = mPref.edit(); - editor.putString("timetable_demo",data); + editor.putString("timetable_demo", data); editor.commit(); - Toast.makeText(this,"saved!",Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "saved!", Toast.LENGTH_SHORT).show(); } - /** get json data from SharedPreferences and then restore the timetable */ - private void loadSavedData(){ + /** + * get json data from SharedPreferences and then restore the timetable + */ + private void loadSavedData() { timetable.removeAll(); SharedPreferences mPref = PreferenceManager.getDefaultSharedPreferences(this); - String savedData = mPref.getString("timetable_demo",""); - if(savedData == null && savedData.equals("")) return; + String savedData = mPref.getString("timetable_demo", ""); + if (savedData == null && savedData.equals("")) return; timetable.load(savedData); - Toast.makeText(this,"loaded!",Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "loaded!", Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index aeafffd..a5d8ab8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -41,13 +41,21 @@ - + app:header_title="@array/header_title"/> + + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/github/tlaabs/timetableviewdemo/ExampleUnitTest.java b/app/src/test/java/com/github/omarb1989/timetableviewdemo/ExampleUnitTest.java similarity index 87% rename from app/src/test/java/com/github/tlaabs/timetableviewdemo/ExampleUnitTest.java rename to app/src/test/java/com/github/omarb1989/timetableviewdemo/ExampleUnitTest.java index 0eae514..ff041b6 100644 --- a/app/src/test/java/com/github/tlaabs/timetableviewdemo/ExampleUnitTest.java +++ b/app/src/test/java/com/github/omarb1989/timetableviewdemo/ExampleUnitTest.java @@ -1,4 +1,4 @@ -package com.github.tlaabs.timetableviewdemo; +package com.github.omarb1989.timetableviewdemo; import org.junit.Test; diff --git a/gradle.properties b/gradle.properties index 82618ce..d546dea 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,6 +6,8 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. +android.enableJetifier=true +android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit diff --git a/timetableview/build.gradle b/timetableview/build.gradle index eb6f9e6..36e30d1 100644 --- a/timetableview/build.gradle +++ b/timetableview/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 28 + compileSdkVersion 30 defaultConfig { minSdkVersion 19 - targetSdkVersion 28 - versionCode 3 - versionName "1.0.3" + targetSdkVersion 30 + versionCode 11 + versionName "1.0.4-fx5" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } @@ -25,12 +25,12 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'androidx.appcompat:appcompat:1.0.0' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' implementation 'com.google.code.gson:gson:2.8.5' } apply plugin: 'com.github.dcendents.android-maven' -group='com.github.tlaabs' \ No newline at end of file +group='com.github.omarb1989' \ No newline at end of file diff --git a/timetableview/src/androidTest/java/com/github/tlaabs/timetableview/ExampleInstrumentedTest.java b/timetableview/src/androidTest/java/com/github/omarb1989/timetableview/ExampleInstrumentedTest.java similarity index 68% rename from timetableview/src/androidTest/java/com/github/tlaabs/timetableview/ExampleInstrumentedTest.java rename to timetableview/src/androidTest/java/com/github/omarb1989/timetableview/ExampleInstrumentedTest.java index 60498f1..226c2e2 100644 --- a/timetableview/src/androidTest/java/com/github/tlaabs/timetableview/ExampleInstrumentedTest.java +++ b/timetableview/src/androidTest/java/com/github/omarb1989/timetableview/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ -package com.github.tlaabs.timetableview; +package com.github.omarb1989.timetableview; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; @@ -19,7 +19,7 @@ public class ExampleInstrumentedTest { @Test public void useAppContext() { // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); assertEquals("com.github.devsim.timetableview.test", appContext.getPackageName()); } diff --git a/timetableview/src/main/AndroidManifest.xml b/timetableview/src/main/AndroidManifest.xml index 908ce02..65f8816 100644 --- a/timetableview/src/main/AndroidManifest.xml +++ b/timetableview/src/main/AndroidManifest.xml @@ -1,2 +1,2 @@ + package="com.github.omarb1989.timetableview" /> diff --git a/timetableview/src/main/java/com/github/omarb1989/timetableview/BorderWidth.java b/timetableview/src/main/java/com/github/omarb1989/timetableview/BorderWidth.java new file mode 100644 index 0000000..becfe28 --- /dev/null +++ b/timetableview/src/main/java/com/github/omarb1989/timetableview/BorderWidth.java @@ -0,0 +1,5 @@ +package com.github.omarb1989.timetableview; + +public enum BorderWidth { + NO_WIDTH,LIGHT,NORMAL,THICK,EXTRA_THICK +} diff --git a/timetableview/src/main/java/com/github/tlaabs/timetableview/HighlightMode.java b/timetableview/src/main/java/com/github/omarb1989/timetableview/HighlightMode.java similarity index 54% rename from timetableview/src/main/java/com/github/tlaabs/timetableview/HighlightMode.java rename to timetableview/src/main/java/com/github/omarb1989/timetableview/HighlightMode.java index dfa98a2..31b92de 100644 --- a/timetableview/src/main/java/com/github/tlaabs/timetableview/HighlightMode.java +++ b/timetableview/src/main/java/com/github/omarb1989/timetableview/HighlightMode.java @@ -1,4 +1,4 @@ -package com.github.tlaabs.timetableview; +package com.github.omarb1989.timetableview; public enum HighlightMode { COLOR, diff --git a/timetableview/src/main/java/com/github/tlaabs/timetableview/SaveManager.java b/timetableview/src/main/java/com/github/omarb1989/timetableview/SaveManager.java similarity index 96% rename from timetableview/src/main/java/com/github/tlaabs/timetableview/SaveManager.java rename to timetableview/src/main/java/com/github/omarb1989/timetableview/SaveManager.java index de62c9a..05945d7 100644 --- a/timetableview/src/main/java/com/github/tlaabs/timetableview/SaveManager.java +++ b/timetableview/src/main/java/com/github/omarb1989/timetableview/SaveManager.java @@ -1,6 +1,4 @@ -package com.github.tlaabs.timetableview; - -import android.util.Log; +package com.github.omarb1989.timetableview; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -23,6 +21,7 @@ public static String saveSticker(HashMap stickers){ ArrayList schedules = stickers.get(idx).getSchedules(); for(Schedule schedule : schedules){ JsonObject obj3 = new JsonObject(); + obj3.addProperty("_id",schedule._id); obj3.addProperty("classTitle",schedule.classTitle); obj3.addProperty("classPlace",schedule.classPlace); obj3.addProperty("professorName",schedule.getProfessorName()); @@ -57,6 +56,7 @@ public static HashMap loadSticker(String json){ for(int k = 0 ; k < arr2.size(); k++){ Schedule schedule = new Schedule(); JsonObject obj3 = (JsonObject)arr2.get(k); + schedule.set_id(obj3.get("_id").getAsInt()); schedule.setClassTitle(obj3.get("classTitle").getAsString()); schedule.setClassPlace(obj3.get("classPlace").getAsString()); schedule.setProfessorName(obj3.get("professorName").getAsString()); diff --git a/timetableview/src/main/java/com/github/tlaabs/timetableview/Schedule.java b/timetableview/src/main/java/com/github/omarb1989/timetableview/Schedule.java similarity index 81% rename from timetableview/src/main/java/com/github/tlaabs/timetableview/Schedule.java rename to timetableview/src/main/java/com/github/omarb1989/timetableview/Schedule.java index 64c7815..e4cc168 100644 --- a/timetableview/src/main/java/com/github/tlaabs/timetableview/Schedule.java +++ b/timetableview/src/main/java/com/github/omarb1989/timetableview/Schedule.java @@ -1,4 +1,4 @@ -package com.github.tlaabs.timetableview; +package com.github.omarb1989.timetableview; import java.io.Serializable; @@ -11,9 +11,11 @@ public class Schedule implements Serializable { static final int SAT = 5; static final int SUN = 6; - String classTitle=""; - String classPlace=""; - String professorName=""; + + int _id; + String classTitle = ""; + String classPlace = ""; + String professorName = ""; private int day = 0; private Time startTime; private Time endTime; @@ -21,6 +23,15 @@ public class Schedule implements Serializable { public Schedule() { this.startTime = new Time(); this.endTime = new Time(); + _id = (int) System.currentTimeMillis(); + } + + public int get_id() { + return _id; + } + + public void set_id(int _id) { + this._id = _id; } public String getProfessorName() { diff --git a/timetableview/src/main/java/com/github/tlaabs/timetableview/Sticker.java b/timetableview/src/main/java/com/github/omarb1989/timetableview/Sticker.java similarity index 93% rename from timetableview/src/main/java/com/github/tlaabs/timetableview/Sticker.java rename to timetableview/src/main/java/com/github/omarb1989/timetableview/Sticker.java index 6a32e39..17382b1 100644 --- a/timetableview/src/main/java/com/github/tlaabs/timetableview/Sticker.java +++ b/timetableview/src/main/java/com/github/omarb1989/timetableview/Sticker.java @@ -1,4 +1,4 @@ -package com.github.tlaabs.timetableview; +package com.github.omarb1989.timetableview; import android.widget.TextView; diff --git a/timetableview/src/main/java/com/github/tlaabs/timetableview/Time.java b/timetableview/src/main/java/com/github/omarb1989/timetableview/Time.java similarity index 92% rename from timetableview/src/main/java/com/github/tlaabs/timetableview/Time.java rename to timetableview/src/main/java/com/github/omarb1989/timetableview/Time.java index e9272e1..6f213d4 100644 --- a/timetableview/src/main/java/com/github/tlaabs/timetableview/Time.java +++ b/timetableview/src/main/java/com/github/omarb1989/timetableview/Time.java @@ -1,4 +1,4 @@ -package com.github.tlaabs.timetableview; +package com.github.omarb1989.timetableview; import java.io.Serializable; diff --git a/timetableview/src/main/java/com/github/tlaabs/timetableview/TimetableView.java b/timetableview/src/main/java/com/github/omarb1989/timetableview/TimetableView.java similarity index 71% rename from timetableview/src/main/java/com/github/tlaabs/timetableview/TimetableView.java rename to timetableview/src/main/java/com/github/omarb1989/timetableview/TimetableView.java index 8f1644f..8bdd5a8 100644 --- a/timetableview/src/main/java/com/github/tlaabs/timetableview/TimetableView.java +++ b/timetableview/src/main/java/com/github/omarb1989/timetableview/TimetableView.java @@ -1,14 +1,15 @@ -package com.github.tlaabs.timetableview; +package com.github.omarb1989.timetableview; -import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.Point; import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.support.v7.content.res.AppCompatResources; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.ShapeDrawable; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; @@ -23,6 +24,9 @@ import android.widget.TableRow; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.res.ResourcesCompat; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -32,7 +36,7 @@ public class TimetableView extends LinearLayout { private static final int DEFAULT_COLUMN_COUNT = 6; private static final int DEFAULT_CELL_HEIGHT_DP = 50; private static final int DEFAULT_SIDE_CELL_WIDTH_DP = 30; - private static final int DEFAULT_START_TIME = 9; + private static final int DEFAULT_START_TIME = 8; private static final int DEFAULT_SIDE_HEADER_FONT_SIZE_DP = 13; private static final int DEFAULT_HEADER_FONT_SIZE_DP = 15; @@ -48,6 +52,12 @@ public class TimetableView extends LinearLayout { private String[] stickerColors; private int startTime; private int headerHighlightColor; + private int colorSurface; + private int colorBorders; + private int sideColorText; + private int sideColor; + private int sideAndHeaderTextColor; + private int borderWidth; private RelativeLayout stickerBox; TableLayout tableHeader; @@ -59,6 +69,7 @@ public class TimetableView extends LinearLayout { private int stickerCount = -1; private OnStickerSelectedListener stickerSelectedListener = null; + private OnStickerSelectedLongClickListener stickerSelectedLongClickListener = null; private HighlightMode highlightMode = HighlightMode.COLOR; private int headerHighlightImageSize; @@ -92,11 +103,17 @@ private void getAttrs(AttributeSet attrs) { stickerColors = a.getResources().getStringArray(colorsId); startTime = a.getInt(R.styleable.TimetableView_start_time, DEFAULT_START_TIME); headerHighlightColor = a.getColor(R.styleable.TimetableView_header_highlight_color, getResources().getColor(R.color.default_header_highlight_color)); - int highlightTypeValue = a.getInteger(R.styleable.TimetableView_header_highlight_type,0); - if(highlightTypeValue == 0) highlightMode = HighlightMode.COLOR; - else if(highlightTypeValue == 1) highlightMode = HighlightMode.IMAGE; + int highlightTypeValue = a.getInteger(R.styleable.TimetableView_header_highlight_type, 0); + if (highlightTypeValue == 0) highlightMode = HighlightMode.COLOR; + else if (highlightTypeValue == 1) highlightMode = HighlightMode.IMAGE; headerHighlightImageSize = a.getDimensionPixelSize(R.styleable.TimetableView_header_highlight_image_size, dp2Px(24)); headerHighlightImage = a.getDrawable(R.styleable.TimetableView_header_highlight_image); + colorSurface = a.getColor(R.styleable.TimetableView_color_surface, getResources().getColor(R.color.default_color_surface)); + colorBorders = a.getColor(R.styleable.TimetableView_color_borders, getResources().getColor(R.color.colorBorders)); + sideColorText = a.getColor(R.styleable.TimetableView_side_color_text, getResources().getColor(R.color.default_color_side_text)); + sideColor = a.getColor(R.styleable.TimetableView_color_side, getResources().getColor(R.color.colorSideHeader)); + sideAndHeaderTextColor = a.getColor(R.styleable.TimetableView_color_side_header_text, getResources().getColor(R.color.default_color_side_header_text)); + borderWidth = a.getInt(R.styleable.TimetableView_border_width, BorderWidth.NORMAL.ordinal()); a.recycle(); } @@ -109,6 +126,7 @@ private void init() { tableHeader = view.findViewById(R.id.table_header); tableBox = view.findViewById(R.id.table_box); + createTable(); } @@ -116,6 +134,11 @@ public void setOnStickerSelectEventListener(OnStickerSelectedListener listener) stickerSelectedListener = listener; } + public void setOnStickerSelectEventListener(OnStickerSelectedLongClickListener listener) { + stickerSelectedLongClickListener = listener; + } + + /** * date : 2019-02-08 * get all schedules TimetableView has. @@ -166,10 +189,19 @@ private void add(final ArrayList schedules, int specIdx) { tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - if(stickerSelectedListener != null) + if (stickerSelectedListener != null) stickerSelectedListener.OnStickerSelected(count, schedules); } }); + tv.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (stickerSelectedLongClickListener != null) + stickerSelectedLongClickListener.OnStickerSelectedLongClick(count, schedules); + return true; + } + }); + sticker.addTextView(tv); sticker.addSchedule(schedule); @@ -221,30 +253,29 @@ public void remove(int idx) { } public void setHeaderHighlight(int idx) { - if(idx < 0)return; + if (idx < 0) return; TableRow row = (TableRow) tableHeader.getChildAt(0); View element = row.getChildAt(idx); - if(highlightMode == HighlightMode.COLOR) { - TextView tx = (TextView)element; + if (highlightMode == HighlightMode.COLOR) { + TextView tx = (TextView) element; tx.setTextColor(Color.parseColor("#FFFFFF")); tx.setBackgroundColor(headerHighlightColor); tx.setTypeface(null, Typeface.BOLD); tx.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_HEADER_HIGHLIGHT_FONT_SIZE_DP); - } - else if(highlightMode == HighlightMode.IMAGE){ + } else if (highlightMode == HighlightMode.IMAGE) { RelativeLayout outer = new RelativeLayout(context); outer.setLayoutParams(createTableRowParam(cellHeight)); ImageView iv = new ImageView(context); - RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(headerHighlightImageSize,headerHighlightImageSize); - params.addRule(RelativeLayout.CENTER_IN_PARENT,RelativeLayout.TRUE); + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(headerHighlightImageSize, headerHighlightImageSize); + params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); iv.setLayoutParams(params); iv.setScaleType(ImageView.ScaleType.CENTER_CROP); row.removeViewAt(idx); outer.addView(iv); - row.addView(outer,idx); + row.addView(outer, idx); - if(headerHighlightImage != null) { + if (headerHighlightImage != null) { iv.setImageDrawable(headerHighlightImage); } @@ -279,16 +310,29 @@ private void createTable() { for (int k = 0; k < columnCount; k++) { TextView tv = new TextView(context); tv.setLayoutParams(createTableRowParam(cellHeight)); + tv.setTextColor(sideColorText); if (k == 0) { tv.setText(getHeaderTime(i)); - tv.setTextColor(getResources().getColor(R.color.colorHeaderText)); tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_SIDE_HEADER_FONT_SIZE_DP); - tv.setBackgroundColor(getResources().getColor(R.color.colorHeader)); + tv.setBackgroundColor(sideColor); tv.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL); tv.setLayoutParams(createTableRowParam(sideCellWidth, cellHeight)); } else { tv.setText(""); - tv.setBackground(getResources().getDrawable(R.drawable.item_border)); + /* ------------set shape color and Stroke of item_border.xml ---------- */ + Resources res = getResources(); + Log.i("createTable", "color surface: " + String.valueOf(colorSurface)); + tv.setBackground(ResourcesCompat.getDrawable(res, R.drawable.item_border, null)); + Drawable background = tv.getBackground(); + if (background instanceof ShapeDrawable) { + ((ShapeDrawable) background).getPaint().setColor(colorSurface); + } else if (background instanceof GradientDrawable) { + ((GradientDrawable) background).setColor(colorSurface); + ((GradientDrawable) background).setStroke(borderWidth, colorBorders); + } else if (background instanceof ColorDrawable) { + ((ColorDrawable) background).setColor(colorSurface); + } + /* --------------------- Finish set ----------------------- */ tv.setGravity(Gravity.RIGHT); } tableRow.addView(tv); @@ -308,7 +352,7 @@ private void createTableHeader() { } else { tv.setLayoutParams(createTableRowParam(cellHeight)); } - tv.setTextColor(getResources().getColor(R.color.colorHeaderText)); + tv.setTextColor(sideAndHeaderTextColor); tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_HEADER_FONT_SIZE_DP); tv.setText(headerTitle[i]); tv.setGravity(Gravity.CENTER); @@ -329,11 +373,11 @@ private RelativeLayout.LayoutParams createStickerParam(Schedule schedule) { return param; } - private int calCellWidth(){ - Display display = ((Activity) context).getWindowManager().getDefaultDisplay(); + private int calCellWidth() { + Display display = ((AppCompatActivity) context).getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); - int cell_w = (size.x-getPaddingLeft() - getPaddingRight()- sideCellWidth) / (columnCount - 1); + int cell_w = (size.x - getPaddingLeft() - getPaddingRight() - sideCellWidth) / (columnCount - 1); return cell_w; } @@ -365,7 +409,11 @@ private TableRow.LayoutParams createTableRowParam(int w_px, int h_px) { private String getHeaderTime(int i) { int p = (startTime + i) % 24; int res = p <= 12 ? p : p - 12; - return res + ""; + if ((res >= 8) && (res < 12)) { + return res + "\nAM"; + } else if (((res >= 1) && (res <= 7))||(res == 12)) { + return res + "\nPM"; + } else return res + " outOfBoundTime"; } static private int dp2Px(int dp) { @@ -381,6 +429,12 @@ private void onCreateByBuilder(Builder builder) { this.stickerColors = builder.stickerColors; this.startTime = builder.startTime; this.headerHighlightColor = builder.headerHighlightColor; + this.colorSurface = builder.colorSurface; + this.colorBorders = builder.colorBorders; + this.sideColorText = builder.sideColorText; + this.sideColor = builder.sideColor; + this.sideAndHeaderTextColor = builder.sideAndHeaderTextColor; + this.borderWidth = builder.borderWidth; init(); } @@ -390,6 +444,10 @@ public interface OnStickerSelectedListener { void OnStickerSelected(int idx, ArrayList schedules); } + public interface OnStickerSelectedLongClickListener { + void OnStickerSelectedLongClick(int idx, ArrayList schedules); + } + static class Builder { private Context context; private int rowCount; @@ -400,6 +458,12 @@ static class Builder { private String[] stickerColors; private int startTime; private int headerHighlightColor; + private int colorSurface; + private int colorBorders; + private int sideColorText; + private int sideColor; + private int sideAndHeaderTextColor; + private int borderWidth; public Builder(Context context) { this.context = context; @@ -411,6 +475,12 @@ public Builder(Context context) { stickerColors = context.getResources().getStringArray(R.array.default_sticker_color); startTime = DEFAULT_START_TIME; headerHighlightColor = context.getResources().getColor(R.color.default_header_highlight_color); + colorSurface = context.getResources().getColor(R.color.default_color_surface); + colorBorders = context.getResources().getColor(R.color.colorBorders); + sideColorText = context.getResources().getColor(R.color.default_color_side_text); + sideColor = context.getResources().getColor(R.color.colorSideHeader); + sideAndHeaderTextColor = context.getResources().getColor(R.color.default_color_side_header_text); + borderWidth = BorderWidth.NORMAL.ordinal(); } public Builder setRowCount(int n) { @@ -453,6 +523,36 @@ public Builder setHeaderHighlightColor(int c) { return this; } + public Builder setColorSurface(int c) { + this.colorSurface = c; + return this; + } + + public Builder setColorBorders(int c) { + this.colorBorders = c; + return this; + } + + public Builder setColorText(int c) { + this.sideColorText = c; + return this; + } + + public Builder setSideColorText(int c) { + this.sideColor = c; + return this; + } + + public Builder setSideAndHeaderTextColor(int c) { + this.sideAndHeaderTextColor = c; + return this; + } + + public Builder setBorderWidth(int b) { + this.borderWidth = b; + return this; + } + public TimetableView build() { TimetableView timetableView = new TimetableView(context); timetableView.onCreateByBuilder(this); diff --git a/timetableview/src/main/res/drawable/item_border.xml b/timetableview/src/main/res/drawable/item_border.xml index de89ee8..c7a9ca4 100644 --- a/timetableview/src/main/res/drawable/item_border.xml +++ b/timetableview/src/main/res/drawable/item_border.xml @@ -1,7 +1,7 @@ - + + android:color="@color/colorBorders" /> \ No newline at end of file diff --git a/timetableview/src/main/res/layout/table_header.xml b/timetableview/src/main/res/layout/table_header.xml index faf08c4..d282a87 100644 --- a/timetableview/src/main/res/layout/table_header.xml +++ b/timetableview/src/main/res/layout/table_header.xml @@ -1,9 +1,9 @@ + - + /> \ No newline at end of file diff --git a/timetableview/src/main/res/layout/view_timetable.xml b/timetableview/src/main/res/layout/view_timetable.xml index a7ec1a4..1254e9c 100644 --- a/timetableview/src/main/res/layout/view_timetable.xml +++ b/timetableview/src/main/res/layout/view_timetable.xml @@ -1,24 +1,23 @@ - - + android:orientation="vertical"> + + + android:layout_weight="1"> - + diff --git a/timetableview/src/main/res/values/attrs_timetable.xml b/timetableview/src/main/res/values/attrs_timetable.xml index 9260988..192d93e 100644 --- a/timetableview/src/main/res/values/attrs_timetable.xml +++ b/timetableview/src/main/res/values/attrs_timetable.xml @@ -1,19 +1,31 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - + + - - + + \ No newline at end of file diff --git a/timetableview/src/main/res/values/colors.xml b/timetableview/src/main/res/values/colors.xml index 19c69f5..4d0b4e1 100644 --- a/timetableview/src/main/res/values/colors.xml +++ b/timetableview/src/main/res/values/colors.xml @@ -1,8 +1,9 @@ - #fcfcfc - #7d7d7d - #efefef + #ffffff + #D9000000 + @color/default_color_side_header_text + #F5F5F5 #f08676 @@ -16,9 +17,6 @@ #d397ed - #7d7d7d - #7d7d7d - #ffffff #74a4f3 - #ffffff + #ffffff diff --git a/timetableview/src/test/java/com/github/tlaabs/timetableview/ExampleUnitTest.java b/timetableview/src/test/java/com/github/omarb1989/timetableview/ExampleUnitTest.java similarity index 88% rename from timetableview/src/test/java/com/github/tlaabs/timetableview/ExampleUnitTest.java rename to timetableview/src/test/java/com/github/omarb1989/timetableview/ExampleUnitTest.java index f3b41e4..2b3559c 100644 --- a/timetableview/src/test/java/com/github/tlaabs/timetableview/ExampleUnitTest.java +++ b/timetableview/src/test/java/com/github/omarb1989/timetableview/ExampleUnitTest.java @@ -1,4 +1,4 @@ -package com.github.tlaabs.timetableview; +package com.github.omarb1989.timetableview; import org.junit.Test;