Skip to content

Commit 749de5d

Browse files
committed
[material design] added material buttons, user-defined components
1 parent a519ed8 commit 749de5d

23 files changed

+365
-174
lines changed

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
[Read more](https://developer.android.com/reference/android/support/design/widget/Snackbar)
2424

2525

26+
## BottomSheet
27+
28+
## Create your own ui components
29+
30+
31+
2632
# Localization
2733
List all resource directories you should take care of:
2834
1. animator/

app/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ android {
99
versionCode Integer.parseInt(project.VERSION_CODE)
1010
versionName project.VERSION_NAME
1111
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
12+
vectorDrawables.useSupportLibrary = true
1213
}
1314
buildTypes {
1415
debug {

app/src/main/java/com/catherine/materialdesignapp/activities/AppComponentsActivity.java

+93-10
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,29 @@
88
import android.content.Intent;
99
import android.os.Build;
1010
import android.os.Bundle;
11+
import android.support.annotation.NonNull;
1112
import android.support.annotation.Nullable;
13+
import android.support.design.button.MaterialButton;
14+
import android.support.design.widget.BottomSheetBehavior;
15+
import android.support.design.widget.BottomSheetDialog;
1216
import android.support.v7.widget.Toolbar;
1317
import android.util.Log;
1418
import android.view.View;
1519
import android.view.View.OnClickListener;
1620
import android.widget.Button;
1721
import android.widget.RadioButton;
1822
import android.widget.RadioGroup;
23+
import android.widget.TextView;
1924

2025
import com.catherine.materialdesignapp.R;
26+
import com.catherine.materialdesignapp.components.BottomSheetItem;
2127
import com.catherine.materialdesignapp.content_providers.CallLogDao;
22-
import com.catherine.materialdesignapp.content_providers.UserDictionaryDao;
2328
import com.catherine.materialdesignapp.listeners.OnRequestPermissionsListener;
24-
import com.catherine.materialdesignapp.models.Word;
2529
import com.catherine.materialdesignapp.services.MusicPlayerJobScheduler;
2630
import com.catherine.materialdesignapp.services.MusicPlayerService;
2731

2832
import java.util.List;
33+
import java.util.Locale;
2934

3035
import static com.catherine.materialdesignapp.services.BusyJobs.JOB_MUSIC_PLAYER;
3136

@@ -37,6 +42,9 @@ private enum ServiceType {
3742
}
3843

3944
private ServiceType selectedServiceType = ServiceType.BACKGROUND;
45+
// private BottomSheetBehavior behavior;
46+
private BottomSheetDialog bottomSheetDialog;
47+
private CallLogDao callLogDao;
4048

4149
@Override
4250
protected void onCreate(Bundle savedInstanceState) {
@@ -57,6 +65,7 @@ protected void onCreate(Bundle savedInstanceState) {
5765
btn_content_providers.setOnClickListener(this);
5866

5967

68+
// radio buttons
6069
RadioGroup rg_service_switch = findViewById(R.id.rg_service_switch);
6170
RadioButton rbn_foreground_service = findViewById(R.id.rbn_foreground_service);
6271
RadioButton rbn_job_scheduler = findViewById(R.id.rbn_job_scheduler);
@@ -81,12 +90,62 @@ public void onCheckedChanged(RadioGroup group, int checkedId) {
8190
}
8291

8392
});
93+
94+
95+
// bottom sheet dialog
96+
bottomSheetDialog = new BottomSheetDialog(this);
97+
View view = getLayoutInflater().inflate(R.layout.bottom_sheet_app_components, null);
98+
bottomSheetDialog.setContentView(view);
99+
100+
String[] titles = getResources().getStringArray(R.array.app_components_bottom_sheet_array);
101+
BottomSheetItem item_create = bottomSheetDialog.findViewById(R.id.item_create);
102+
item_create.setTitle(titles[0]);
103+
item_create.setOnClickListener(this);
104+
BottomSheetItem item_read = bottomSheetDialog.findViewById(R.id.item_read);
105+
item_read.setTitle(titles[1]);
106+
item_read.setOnClickListener(this);
107+
BottomSheetItem item_update = bottomSheetDialog.findViewById(R.id.item_update);
108+
item_update.setTitle(titles[2]);
109+
item_update.setOnClickListener(this);
110+
BottomSheetItem item_delete = bottomSheetDialog.findViewById(R.id.item_delete);
111+
item_delete.setTitle(titles[3]);
112+
item_delete.setOnClickListener(this);
113+
114+
// bottom sheet another version
115+
// View bottomSheet = findViewById(R.id.bottom_sheet);
116+
// behavior = BottomSheetBehavior.from(bottomSheet);
117+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
118+
// behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
119+
// @Override
120+
// public void onStateChanged(@NonNull View bottomSheet, int newState) {
121+
// Log.d(TAG, String.format(Locale.US, "bottomSheet: %d", newState));
122+
// }
123+
//
124+
// @Override
125+
// public void onSlide(@NonNull View bottomSheet, float slideOffset) {
126+
// }
127+
// });
128+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
129+
// String[] titles = getResources().getStringArray(R.array.app_components_bottom_sheet_array);
130+
// TextView tv_create = findViewById(R.id.tv_create);
131+
// tv_create.setText(titles[0]);
132+
// tv_create.setOnClickListener(this);
133+
// TextView tv_read = findViewById(R.id.tv_read);
134+
// tv_read.setText(titles[1]);
135+
// tv_read.setOnClickListener(this);
136+
// TextView tv_update = findViewById(R.id.tv_update);
137+
// tv_update.setText(titles[2]);
138+
// tv_update.setOnClickListener(this);
139+
// TextView tv_delete = findViewById(R.id.tv_delete);
140+
// tv_delete.setText(titles[3]);
141+
// tv_delete.setOnClickListener(this);
84142
}
85143

86144
@Override
87145
public void onClick(View v) {
88146
switch (v.getId()) {
89147
case R.id.btn_start_service:
148+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
90149
if (selectedServiceType == ServiceType.BACKGROUND) {
91150
startService(true);
92151
} else if (selectedServiceType == ServiceType.FOREGROUND) {
@@ -96,6 +155,7 @@ public void onClick(View v) {
96155
}
97156
break;
98157
case R.id.btn_stop_service:
158+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
99159
if (selectedServiceType == ServiceType.BACKGROUND) {
100160
stopService();
101161
} else if (selectedServiceType == ServiceType.FOREGROUND) {
@@ -105,21 +165,26 @@ public void onClick(View v) {
105165
}
106166
break;
107167
case R.id.btn_broadcast_receivers:
168+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
108169
// TODO add one more broadcast receiver
109170
break;
110171
case R.id.btn_content_providers:
111-
// UserDictionaryDao dao = new UserDictionaryDao();
112-
// dao.query();
113-
//
114-
// Word word = new Word("new word", 999, "new shortcut", "en_US");
115-
// dao.insert(word);
116-
117172
String[] permissions = {Manifest.permission.READ_CALL_LOG, Manifest.permission.WRITE_CALL_LOG};
118173
getPermissions(permissions, new OnRequestPermissionsListener() {
119174
@Override
120175
public void onGranted() {
121-
CallLogDao callLogDao = new CallLogDao();
122-
callLogDao.read();
176+
// if (behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
177+
// callLogDao = new CallLogDao();
178+
// behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
179+
// } else
180+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
181+
182+
if (bottomSheetDialog.isShowing()) {
183+
bottomSheetDialog.closeOptionsMenu();
184+
} else {
185+
callLogDao = new CallLogDao();
186+
bottomSheetDialog.show();
187+
}
123188
}
124189

125190
@Override
@@ -132,6 +197,24 @@ public void onRetry() {
132197
Log.d(TAG, "onRetry");
133198
}
134199
});
200+
break;
201+
case R.id.item_create:
202+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
203+
bottomSheetDialog.closeOptionsMenu();
204+
break;
205+
case R.id.item_read:
206+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
207+
bottomSheetDialog.closeOptionsMenu();
208+
callLogDao.read();
209+
break;
210+
case R.id.item_update:
211+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
212+
bottomSheetDialog.closeOptionsMenu();
213+
break;
214+
case R.id.item_delete:
215+
// behavior.setState(BottomSheetBehavior.STATE_HIDDEN);
216+
bottomSheetDialog.closeOptionsMenu();
217+
135218
break;
136219
}
137220
}

app/src/main/java/com/catherine/materialdesignapp/activities/BaseActivity.java

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.support.v4.app.ActivityCompat;
1414
import android.support.v4.widget.DrawerLayout;
1515
import android.support.v7.app.AppCompatActivity;
16+
import android.support.v7.app.AppCompatDelegate;
1617
import android.util.Log;
1718
import android.view.Gravity;
1819
import android.view.LayoutInflater;
@@ -51,6 +52,7 @@ public class BaseActivity extends AppCompatActivity {
5152
@Override
5253
protected void onCreate(Bundle savedInstanceState) {
5354
super.onCreate(savedInstanceState);
55+
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
5456

5557
// with the app theme is "NoActionBar", this bunch of code help to update statusBar style
5658
try {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.catherine.materialdesignapp.components;
2+
3+
import android.content.Context;
4+
import android.content.res.ColorStateList;
5+
import android.os.Build;
6+
import android.support.annotation.RequiresApi;
7+
import android.util.AttributeSet;
8+
import android.view.View;
9+
import android.widget.ImageView;
10+
import android.widget.RelativeLayout;
11+
import android.widget.TextView;
12+
13+
import com.catherine.materialdesignapp.R;
14+
15+
public class BottomSheetItem extends RelativeLayout {
16+
private ImageView iv_icon;
17+
private TextView tv_title;
18+
19+
public BottomSheetItem(Context context) {
20+
super(context);
21+
initView(context);
22+
}
23+
24+
public BottomSheetItem(Context context, AttributeSet attrs) {
25+
super(context, attrs);
26+
initView(context, attrs);
27+
}
28+
29+
public BottomSheetItem(Context context, AttributeSet attrs, int defStyleAttr) {
30+
super(context, attrs, defStyleAttr);
31+
initView(context, attrs);
32+
}
33+
34+
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
35+
public BottomSheetItem(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
36+
super(context, attrs, defStyleAttr, defStyleRes);
37+
initView(context, attrs);
38+
}
39+
40+
private void initView(Context ctx) {
41+
View view = View.inflate(ctx, R.layout.bottom_sheet_item, this);
42+
iv_icon = view.findViewById(R.id.iv_icon);
43+
tv_title = view.findViewById(R.id.tv_title);
44+
}
45+
46+
47+
private void initView(Context ctx, AttributeSet attrs) {
48+
initView(ctx);
49+
50+
String androidPath = "http://schemas.android.com/apk/";
51+
String packageName = ctx.getPackageName();
52+
String title = attrs.getAttributeValue(String.format("%s%s", androidPath, packageName), "c_title");
53+
int icon = attrs.getAttributeResourceValue(String.format("%s%s", androidPath, packageName), "c_icon", -1);
54+
if (icon != -1) {
55+
setIcon(icon);
56+
}
57+
setTitle(title);
58+
}
59+
60+
public void setTitle(String title) {
61+
tv_title.setText(title);
62+
}
63+
64+
public void setIcon(int resId) {
65+
iv_icon.setImageResource(resId);
66+
}
67+
}

app/src/main/java/com/catherine/materialdesignapp/content_providers/UserDictionaryDao.java

-81
This file was deleted.

app/src/main/java/com/catherine/materialdesignapp/models/Word.java

-19
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:color="@color/colorAccent" android:state_focused="true" android:state_pressed="false" />
4+
<item android:color="@color/colorAccent" android:state_focused="true" android:state_pressed="true" />
5+
<item android:color="@color/colorAccent" android:state_focused="false" android:state_pressed="true" />
6+
<item android:color="@color/dark_gray" />
7+
</selector>

0 commit comments

Comments
 (0)