diff --git a/app/build.gradle b/app/build.gradle index d706ca8..84f4994 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,7 @@ plugins { id 'com.android.application' + id 'kotlin-android' + id 'kotlin-android-extensions' } android { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 365eccc..98c71e5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,18 +24,27 @@ android:exported="true" /> - + + + + + + + - - - - + (Contants.BASE_URL) { - }.addHeader("Token", kv.decodeString(Contants.TOKEN)).build(); + }.addHeader("Token", kv.decodeString(Contants.TOKEN)); + ErrorToken.intercept(this, concise); concise.request(ClassActivity.this, concise.api.getClass(id), new CallBack>>() { @Override public void onSuccess(BaseBean> listBaseBean) { diff --git a/app/src/main/java/com/skipping/activity/detail/DetailActivity.java b/app/src/main/java/com/skipping/activity/detail/DetailActivity.java index faa4366..d425a82 100644 --- a/app/src/main/java/com/skipping/activity/detail/DetailActivity.java +++ b/app/src/main/java/com/skipping/activity/detail/DetailActivity.java @@ -1,7 +1,7 @@ package com.skipping.activity.detail; -import android.content.Intent; -import android.os.Bundle; +import android.view.View; +import android.widget.Button; import android.widget.TextView; import androidx.recyclerview.widget.LinearLayoutManager; @@ -12,15 +12,15 @@ import com.libs.network.CallBack; import com.libs.network.Concise; import com.skipping.Contants; import com.skipping.R; -import com.skipping.activity.NetActivity; -import com.skipping.activity.clasz.ClassActivity; -import com.skipping.activity.grade.GradeActivity; -import com.skipping.activity.grade.GradeAdapter; import com.skipping.net.API; import com.skipping.net.BaseBean; import com.skipping.net.DetailActivityBean; +import com.skipping.utils.ConnectManager; +import com.skipping.utils.ErrorToken; +import com.skipping.utils.ThreadPoolUtil; import com.tencent.mmkv.MMKV; +import java.util.ArrayList; import java.util.List; /** @@ -32,6 +32,8 @@ public class DetailActivity extends BaseActivity { private TextView name, idTV; private RecyclerView recyclerview; private DetailAdapter adapter; + private Button open, connect, msg; + private ConnectManager connectManager; @Override protected int getContentViewResId() { @@ -43,32 +45,98 @@ public class DetailActivity extends BaseActivity { idTV = findViewById(R.id.id); name = findViewById(R.id.name); recyclerview = findViewById(R.id.recyclerview); + open = findViewById(R.id.open); + connect = findViewById(R.id.connect); + msg = findViewById(R.id.msg); } @Override protected void initData() { + connectManager = new ConnectManager(this); String id = (String) getIntent().getBundleExtra("id").get("id"); recyclerview.setLayoutManager(new LinearLayoutManager(this)); adapter = new DetailAdapter(recyclerview); recyclerview.setAdapter(adapter); - + adapter.setOnClickListener(new DetailAdapter.OnClick() { + @Override + public void click(int position) { + connectManager.pairDevice(position); + } + }); MMKV kv = MMKV.defaultMMKV(); concise = new Concise(Contants.BASE_URL) { - }.addHeader("Token", kv.decodeString(Contants.TOKEN)).build(); - concise.request(DetailActivity.this, concise.api.detailActivity(id), new CallBack>() { - @Override - public void onSuccess(BaseBean listBaseBean) { - idTV.setText(listBaseBean.getData().getId() + ""); - name.setText(listBaseBean.getData().getActivityName() + ""); - adapter.setData(listBaseBean.getData().getCandidates().get(0)); - adapter.notifyDataSetChanged(); + }.addHeader("Token", kv.decodeString(Contants.TOKEN)); + ErrorToken.intercept(this, concise); +// concise.request(DetailActivity.this, concise.api.detailActivity(id), new CallBack>() { +// @Override +// public void onSuccess(BaseBean listBaseBean) { +// idTV.setText(listBaseBean.getData().getId() + ""); +// name.setText(listBaseBean.getData().getActivityName() + ""); +// adapter.setData(listBaseBean.getData().getCandidates().get(0)); +// adapter.notifyDataSetChanged(); +// +// } +// +// @Override +// public void onFailed(Throwable e) { +// +// } +// }); + List list = new ArrayList<>(); + DetailActivityBean.CandidatesBean bean1 = new DetailActivityBean.CandidatesBean(); + bean1.setName("1111"); + bean1.setPersonID("11111"); + bean1.setScore(1); + bean1.setStudentID("111"); + list.add(bean1); + DetailActivityBean.CandidatesBean bean2 = new DetailActivityBean.CandidatesBean(); + bean2.setName("1111"); + bean2.setPersonID("11111"); + bean2.setScore(1); + bean2.setStudentID("111"); + list.add(bean2); + adapter.setData(list); + adapter.notifyDataSetChanged(); + open.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + connectManager.getHostInfo(); + connectManager.openPairMode(); } + }); + connect.setOnClickListener(new View.OnClickListener() { @Override - public void onFailed(Throwable e) { + public void onClick(View v) { + connectManager.closePairMode(); + connectManager.connectDevice(); + } + }); + msg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ThreadPoolUtil.getSingleton().scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + connectManager.getpower(); + } + }, 0, 20); } }); } + + @Override + protected void onResume() { + super.onResume(); + connectManager.resume(); + } + + + @Override + protected void onPause() { + super.onPause(); + connectManager.pause(); + } } diff --git a/app/src/main/java/com/skipping/activity/detail/DetailAdapter.java b/app/src/main/java/com/skipping/activity/detail/DetailAdapter.java index a05db4d..b1b3c1e 100644 --- a/app/src/main/java/com/skipping/activity/detail/DetailAdapter.java +++ b/app/src/main/java/com/skipping/activity/detail/DetailAdapter.java @@ -44,6 +44,12 @@ public class DetailAdapter extends RecyclerView.Adapter(Contants.BASE_URL) { - }.addHeader("Token", kv.decodeString(Contants.TOKEN)).build(); + }.addHeader("Token", kv.decodeString(Contants.TOKEN)); + ErrorToken.intercept(this, concise); concise.request(GradeActivity.this, concise.api.getGrade(), new CallBack>>() { @Override public void onSuccess(BaseBean> listBaseBean) { diff --git a/app/src/main/java/com/skipping/activity/home/HomeActivity.kt b/app/src/main/java/com/skipping/activity/home/HomeActivity.kt new file mode 100644 index 0000000..9a3fae4 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/home/HomeActivity.kt @@ -0,0 +1,35 @@ +package com.skipping.activity.home + +import android.content.Intent +import android.os.Bundle +import com.libs.fragment.BaseActivity +import com.skipping.R +import com.skipping.activity.setting.SettingActivity +import com.skipping.utils.ScreenUtil +import kotlinx.android.synthetic.main.activity_home.* + +/** + * @author Ming + * 3/24/22 + * + */ +class HomeActivity : BaseActivity() { + override fun getContentViewResId(): Int { + return R.layout.activity_home + } + + override fun initView() { + initPresnter() + } + + override fun initData() { + setting_btn.setOnClickListener { + startActivity(Intent(this@HomeActivity, SettingActivity::class.java)) + } + } + + override fun initStart() { + ScreenUtil.setCustomDensity(this) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/home/HomePresenter.kt b/app/src/main/java/com/skipping/activity/home/HomePresenter.kt new file mode 100644 index 0000000..a36cf5a --- /dev/null +++ b/app/src/main/java/com/skipping/activity/home/HomePresenter.kt @@ -0,0 +1,15 @@ +package com.skipping.activity.home + +import android.os.Parcel +import android.os.Parcelable +import com.libs.fragment.BasePresenter +import com.skipping.activity.IView + +/** + * @author Ming + * 3/24/22 + * + */ +class HomePresenter() :BasePresenter() { + +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/list/ListActivity.java b/app/src/main/java/com/skipping/activity/list/ListActivity.java index 67f2845..b8927d9 100644 --- a/app/src/main/java/com/skipping/activity/list/ListActivity.java +++ b/app/src/main/java/com/skipping/activity/list/ListActivity.java @@ -21,6 +21,7 @@ import com.skipping.net.ActivityBean; import com.skipping.net.ActivityReqBean; import com.skipping.net.BaseBean; import com.skipping.net.GradleBean; +import com.skipping.utils.ErrorToken; import com.tencent.mmkv.MMKV; import java.util.List; @@ -63,7 +64,8 @@ public class ListActivity extends BaseActivity { MMKV kv = MMKV.defaultMMKV(); concise = new Concise(Contants.BASE_URL) { - }.addHeader("Token", kv.decodeString(Contants.TOKEN)).build(); + }.addHeader("Token", kv.decodeString(Contants.TOKEN)); + ErrorToken.intercept(this, concise); ActivityReqBean bean = new ActivityReqBean(); bean.setGenre(Contants.CLASS); bean.setActivityType("timing"); diff --git a/app/src/main/java/com/skipping/activity/setting/SettingActivity.kt b/app/src/main/java/com/skipping/activity/setting/SettingActivity.kt new file mode 100644 index 0000000..6094129 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/setting/SettingActivity.kt @@ -0,0 +1,68 @@ +package com.skipping.activity.setting + +import androidx.fragment.app.Fragment +import com.libs.fragment.BaseActivity +import com.skipping.R +import com.skipping.fragment.login.LoginFragment +import com.skipping.fragment.pair.PairFragment +import kotlinx.android.synthetic.main.activity_setting.* + +/** + * @author Ming + * 3/24/22 + * + */ +class SettingActivity : BaseActivity() { + var position = -1; + lateinit var fragment: Fragment + + override fun getContentViewResId(): Int { + return R.layout.activity_setting + } + + override fun initView() { + } + + override fun initData() { + clickPair() + pair.setOnClickListener { + clickPair() + } + login.setOnClickListener { + clickLogin() + } + back.setOnClickListener { + finish() + } + } + + private fun clickPair(){ + if (position == 0) { + return + } + position = 0 + pair.setBackgroundResource(R.color.color_434343) + login.setBackgroundResource(R.color.color_2C2C2C) + showFragment() + } + + private fun clickLogin(){ + if (position == 1) { + return + } + position = 1 + login.setBackgroundResource(R.color.color_434343) + pair.setBackgroundResource(R.color.color_2C2C2C) + showFragment() + } + + + private fun showFragment() { + if (position == 0) { + fragment = PairFragment() + } else if (position == 1) { + fragment = LoginFragment() + } + supportFragmentManager.beginTransaction().replace(R.id.fragment, fragment).commitAllowingStateLoss(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/activity/setting/SettingPresenter.kt b/app/src/main/java/com/skipping/activity/setting/SettingPresenter.kt new file mode 100644 index 0000000..b114611 --- /dev/null +++ b/app/src/main/java/com/skipping/activity/setting/SettingPresenter.kt @@ -0,0 +1,15 @@ +package com.skipping.activity.setting + +import android.os.Parcel +import android.os.Parcelable +import com.libs.fragment.BasePresenter +import com.skipping.activity.IView + +/** + * @author Ming + * 3/24/22 + * + */ +class SettingPresenter() :BasePresenter() { + +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/fragment/login/LoginFragment.kt b/app/src/main/java/com/skipping/fragment/login/LoginFragment.kt new file mode 100644 index 0000000..6784ceb --- /dev/null +++ b/app/src/main/java/com/skipping/fragment/login/LoginFragment.kt @@ -0,0 +1,33 @@ +package com.skipping.fragment.login + +import android.os.Bundle +import android.view.View +import com.libs.fragment.BaseFragment +import com.libs.utils.ToastUtil +import com.skipping.R +import kotlinx.android.synthetic.main.fragment_login.* + +/** + * @author Ming + * 3/24/22 + * + */ +class LoginFragment : BaseFragment() { + override fun getLayoutId(): Int { + return R.layout.fragment_login; + } + + override fun initView(view: View?, savedInstanceState: Bundle?) { + initPresnter() + } + + override fun initData() { + login.setOnClickListener { + p.login(account.text.toString(), password.text.toString()) + } + } + + fun loginResult() { + connectStatusTV.visibility = View.VISIBLE + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/fragment/login/LoginPresenter.kt b/app/src/main/java/com/skipping/fragment/login/LoginPresenter.kt new file mode 100644 index 0000000..05ac89c --- /dev/null +++ b/app/src/main/java/com/skipping/fragment/login/LoginPresenter.kt @@ -0,0 +1,49 @@ +package com.skipping.fragment.login + +import android.provider.SyncStateContract +import com.libs.fragment.BasePresenter +import com.libs.network.CallBack +import com.libs.network.Concise +import com.libs.utils.LogUtil +import com.libs.utils.ToastUtil +import com.skipping.* +import com.skipping.net.API +import com.skipping.net.BaseBean +import com.skipping.net.TokenBean +import com.skipping.net.TokenReqBean +import com.tencent.mmkv.MMKV + + +/** + * @author Ming + * 3/24/22 + * + */ +class LoginPresenter : BasePresenter() { + companion object { + + } + + fun login(key: String, value: String) { + val tokenConcise: Concise = object : Concise(BASE_URL) {}.build() as Concise + val tokenReqBean = TokenReqBean() + tokenReqBean.deviceID = "466e9c" + tokenReqBean.logName = key + tokenReqBean.logPwd = value + tokenConcise.request(v, tokenConcise.api.token(tokenReqBean), object : CallBack> { + override fun onSuccess(k: BaseBean?) { + val mmkv = MMKV.defaultMMKV() + mmkv?.encode(ACCOUNT, key) + mmkv?.encode(PASSWORD, value) + mmkv?.encode(TOKEN, k?.data?.token) + v.loginResult() + } + + override fun onFailed(e: Throwable?) { + ToastUtil.longToast("连接失败") + } + + }) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/fragment/pair/PairFragment.kt b/app/src/main/java/com/skipping/fragment/pair/PairFragment.kt new file mode 100644 index 0000000..90ad28d --- /dev/null +++ b/app/src/main/java/com/skipping/fragment/pair/PairFragment.kt @@ -0,0 +1,48 @@ +package com.skipping.fragment.pair + +import android.os.Bundle +import android.view.View +import androidx.core.content.ContextCompat +import com.libs.fragment.BaseFragment +import com.skipping.R +import kotlinx.android.synthetic.main.fragment_pair.* + +/** + * @author Ming + * 3/24/22 + * + */ +class PairFragment : BaseFragment() { + var position = 0 + override fun getLayoutId(): Int { + return R.layout.fragment_pair; + } + + override fun initView(view: View?, savedInstanceState: Bundle?) { + + pair_btn.setOnClickListener { + if (position == 0) { + return@setOnClickListener + } + position = 0 + pair_btn.setBackgroundResource(R.drawable.pair_btn_clicked) + pair_btn.setTextColor(ContextCompat.getColor(activity!!, R.color.black)) + connect_btn.setBackgroundResource(R.drawable.connect_btn_unclicked) + connect_btn.setTextColor(ContextCompat.getColor(activity!!, R.color.white)) + } + + connect_btn.setOnClickListener { + if (position == 1) { + return@setOnClickListener + } + position = 1 + pair_btn.setBackgroundResource(R.drawable.pair_btn_unclicked) + pair_btn.setTextColor(ContextCompat.getColor(activity!!, R.color.white)) + connect_btn.setBackgroundResource(R.drawable.connect_btn_clicked) + connect_btn.setTextColor(ContextCompat.getColor(activity!!, R.color.black)) + } + } + + override fun initData() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/fragment/pair/PairPresenter.kt b/app/src/main/java/com/skipping/fragment/pair/PairPresenter.kt new file mode 100644 index 0000000..20988a1 --- /dev/null +++ b/app/src/main/java/com/skipping/fragment/pair/PairPresenter.kt @@ -0,0 +1,12 @@ +package com.skipping.fragment.pair + +import com.libs.fragment.BasePresenter +import com.skipping.activity.IView + +/** + * @author Ming + * 3/24/22 + * + */ +class PairPresenter :BasePresenter(){ +} \ No newline at end of file diff --git a/app/src/main/java/com/skipping/utils/ConnectManager.java b/app/src/main/java/com/skipping/utils/ConnectManager.java new file mode 100644 index 0000000..fb6aadc --- /dev/null +++ b/app/src/main/java/com/skipping/utils/ConnectManager.java @@ -0,0 +1,228 @@ +package com.skipping.utils; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import com.libs.utils.LogUtil; +import com.libs.utils.ToastUtil; +import com.loop.loopminisdk.LoopDevice; +import com.loop.loopminisdk.LoopHost; +import com.loop.loopminisdk.LoopMessage; +import com.loop.loopminisdk.LoopMini; +import com.skipping.R; +import com.skipping.activity.HostActivity; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ScheduledFuture; +import java.util.stream.Collectors; + +/** + * @author Ming + * 3/21/22 + */ +public class ConnectManager { + private LoopMini loopMax; + private Set loopDeviceSet = new HashSet<>(); + private LoopDevice loopDevice; + private EditText editText; + private LoopHost loopHost; + private Activity activity; + private MyHandler mHandler; + private int position; + private ScheduledFuture scheduledFuture; + private Button btn, btn2, btn3, btn4, btn5; + private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + switch (intent.getAction()) { + case LoopMini.ACTION_USB_PERMISSION_GRANTED: + ToastUtil.longToast("确认设备权限"); + break; + case LoopMini.ACTION_USB_PERMISSION_NOT_GRANTED: + ToastUtil.longToast("取消设备权限"); + break; + case LoopMini.ACTION_NO_USB: + ToastUtil.longToast("没有插入设备"); + break; + case LoopMini.ACTION_USB_DISCONNECTED: + ToastUtil.longToast("拔出设备"); + break; + case LoopMini.ACTION_USB_NOT_SUPPORTED: + ToastUtil.longToast("设备无法识别"); + break; + } + } + }; + + public ConnectManager(Activity activity) { + this.activity = activity; + mHandler = new MyHandler(); + } + + private final ServiceConnection usbConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName arg0, IBinder arg1) { + loopMax = ((LoopMini.UsbBinder) arg1).getService(); + loopMax.setHandler(mHandler); + } + + @Override + public void onServiceDisconnected(ComponentName arg0) { + loopMax = null; + } + }; + + + /** + * 连接主机 + */ + public void getHostInfo() { + loopMax.getHostInfo(); + } + + /** + * 开启配对模式 + */ + public void openPairMode() { + loopMax.openPairMode(); + } + + /** + * 获取电量 + */ + public void getpower() { + loopMax.getPower(); + } + + /** + * 关闭配对模式 + */ + public void closePairMode() { + loopMax.closePairMode(); + } + + /** + * 匹配设备到指定id + * + * @param id + */ + public void pairDevice(int id) { + loopMax.pairDevice(id); + } + + /** + * 连接设备 + */ + public void connectDevice() { + connectDeviceInner(loopDevice -> loopMax.connectDevice(loopDevice)); + } + + public void disconnectDevice() { + connectDeviceInner(loopDevice -> loopMax.disconnectDevice(loopDevice)); + } + + + public void connectDeviceInner(HostActivity.ConnectInterface connectInterface) { + if (loopDeviceSet.size() == 0) { + return; + } + if (scheduledFuture != null) { + scheduledFuture.cancel(false); + } + List deviceList = loopDeviceSet.stream().collect(Collectors.toList()); + position = 0; + scheduledFuture = ThreadPoolUtil.getSingleton().scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + if (position > deviceList.size()) { + scheduledFuture.cancel(false); + } + connectInterface.connect(deviceList.get(position)); + position++; + } + }, 0, 10); + } + + public interface ConnectInterface { + void connect(LoopDevice loopDevice); + } + + + public void resume(){ + setFilters(); + startService(usbConnection); + } + + + public void pause(){ + activity.unregisterReceiver(mUsbReceiver); + activity.unbindService(usbConnection); + } + + + private void startService(ServiceConnection serviceConnection) { + if (!LoopMini.SERVICE_CONNECTED) { + Intent startService = new Intent(activity, LoopMini.class); + activity.startService(startService); + } + Intent bindingIntent = new Intent(activity, LoopMini.class); + activity.bindService(bindingIntent, serviceConnection, Context.BIND_AUTO_CREATE); + } + + private void setFilters() { + IntentFilter filter = new IntentFilter(); + filter.addAction(LoopMini.ACTION_USB_PERMISSION_GRANTED); + filter.addAction(LoopMini.ACTION_NO_USB); + filter.addAction(LoopMini.ACTION_USB_DISCONNECTED); + filter.addAction(LoopMini.ACTION_USB_NOT_SUPPORTED); + filter.addAction(LoopMini.ACTION_USB_PERMISSION_NOT_GRANTED); + activity.registerReceiver(mUsbReceiver, filter); + } + + + private class MyHandler extends Handler { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case LoopMini.LOOP_PAIR_DEVICE_INFO: + loopDevice = (LoopDevice) msg.obj; + addDevice(loopDevice); + LogUtil.e("连接LoopDevice", loopDevice.toString()); + break; + case LoopMini.Loop_GET_HOST_INFO: + loopHost = (LoopHost) msg.obj; + LogUtil.e("LoopHost", loopHost.toString()); + break; + case LoopMini.LOOP_GET_DEVICE_INFO: + loopDevice = (LoopDevice) msg.obj; + addDevice(loopDevice); + LogUtil.e("获取LoopDevice", loopDevice.toString()); + break; + case LoopMini.LOOP_MESSAGE: + LoopMessage loopMessage = (LoopMessage) msg.obj; + LogUtil.e("LoopMessage", loopMessage.toString()); + break; + } + } + } + + private void addDevice(LoopDevice loopDevice) { + loopDeviceSet.add(loopDevice); + } + +} + diff --git a/app/src/main/java/com/skipping/utils/ErrorToken.java b/app/src/main/java/com/skipping/utils/ErrorToken.java new file mode 100644 index 0000000..a8b4333 --- /dev/null +++ b/app/src/main/java/com/skipping/utils/ErrorToken.java @@ -0,0 +1,27 @@ +package com.skipping.utils; + +import android.app.Activity; +import android.content.Intent; + +import com.libs.network.Concise; +import com.libs.network.interceptor.ErrorCodeCallBack; +import com.skipping.Contants; +import com.skipping.activity.SplashActivity; +import com.skipping.net.API; + +/** + * @author Ming + * 3/21/22 + */ +public class ErrorToken { + public static void intercept(Activity activity,Concise concise) { + concise.setErrCodeListener("token无效", new ErrorCodeCallBack() { + @Override + public void token() { + Intent intent = new Intent(activity, SplashActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(intent); + } + }).build(); + } +} diff --git a/app/src/main/java/com/skipping/utils/ScreenUtil.kt b/app/src/main/java/com/skipping/utils/ScreenUtil.kt new file mode 100644 index 0000000..ad6e7f3 --- /dev/null +++ b/app/src/main/java/com/skipping/utils/ScreenUtil.kt @@ -0,0 +1,19 @@ +package com.skipping.utils + +import android.app.Activity + +/** + * @author Ming + * 3/24/22 + * + */ +object ScreenUtil { + fun setCustomDensity(activity: Activity) { + activity.resources.displayMetrics.apply { + val targetDensity = (widthPixels / 1680).toFloat() + density = targetDensity + scaledDensity = targetDensity + densityDpi = 160 * targetDensity.toInt() + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_bg.xml b/app/src/main/res/drawable/btn_bg.xml new file mode 100644 index 0000000..35656ce --- /dev/null +++ b/app/src/main/res/drawable/btn_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_bg_login.xml b/app/src/main/res/drawable/btn_bg_login.xml new file mode 100644 index 0000000..9ee877d --- /dev/null +++ b/app/src/main/res/drawable/btn_bg_login.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_bg_login2.xml b/app/src/main/res/drawable/btn_bg_login2.xml new file mode 100644 index 0000000..07135d8 --- /dev/null +++ b/app/src/main/res/drawable/btn_bg_login2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/connect_btn_clicked.xml b/app/src/main/res/drawable/connect_btn_clicked.xml new file mode 100644 index 0000000..65bbfe6 --- /dev/null +++ b/app/src/main/res/drawable/connect_btn_clicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/connect_btn_unclicked.xml b/app/src/main/res/drawable/connect_btn_unclicked.xml new file mode 100644 index 0000000..01ae7a3 --- /dev/null +++ b/app/src/main/res/drawable/connect_btn_unclicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/edittext_bg.xml b/app/src/main/res/drawable/edittext_bg.xml new file mode 100644 index 0000000..4efe55d --- /dev/null +++ b/app/src/main/res/drawable/edittext_bg.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/left_bg.xml b/app/src/main/res/drawable/left_bg.xml new file mode 100644 index 0000000..dca7224 --- /dev/null +++ b/app/src/main/res/drawable/left_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/pair_btn_clicked.xml b/app/src/main/res/drawable/pair_btn_clicked.xml new file mode 100644 index 0000000..995661f --- /dev/null +++ b/app/src/main/res/drawable/pair_btn_clicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/pair_btn_unclicked.xml b/app/src/main/res/drawable/pair_btn_unclicked.xml new file mode 100644 index 0000000..e7c8c31 --- /dev/null +++ b/app/src/main/res/drawable/pair_btn_unclicked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index f05ae48..68bdb7a 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -7,6 +7,24 @@ android:orientation="vertical" tools:context=".activity.MainActivity"> +